<?php

$PagamentoClienteDao = new PagamentoClienteDao();
$AtendimentoDao = new AtendimentoDao();
$UsuarioDao = new UsuarioDao();
$usuario = (object) $UsuarioDao->getUsuario($dados['id_empreendimento'], $dados['id_paciente']);
$pagamentos = $PagamentoClienteDao->getPagamentosCliente($dados['id_paciente'], null, null, array('pag.id_empreendimento' => $dados['id_empreendimento']));
$pagamentos = $pagamentos['pagamentos'];
$atendimentos = $AtendimentoDao->getItensVenda($dados['id_paciente'], null, null, null);
$fichaPaciente = array();
if (count($atendimentos) >= count($pagamentos)) {
    foreach ($atendimentos as $key => $value) {
        $item = new stdClass();
        $item->dta_venda = date('d/m/Y', strtotime($value['dta_venda']));
        $item->cod_dente = $value['cod_dente'];
        $item->cod_procedimento = $value['cod_procedimento'];
        $item->nome_profissional = $value['nome_profissional'];
        $item->valor_real_item = $value['valor_real_item'];
        $item->dta_entrada = isset($pagamentos[$key]['dta_entrada']) ? date('d/m/Y', strtotime($pagamentos[$key]['dta_entrada'])) : null;
        $item->descricao_forma_pagamento = isset($pagamentos[$key]['descricao_forma_pagamento']) ? $pagamentos[$key]['descricao_forma_pagamento'] : null;
        $item->data_pagamento = isset($pagamentos[$key]['data_pagamento']) ? $pagamentos[$key]['data_pagamento'] : null;
        $item->valor_pagamento = isset($pagamentos[$key]['valor_pagamento']) ? $pagamentos[$key]['valor_pagamento'] : null;
        $item->id_forma_pagamento = isset($pagamentos[$key]['id_forma_pagamento']) ? $pagamentos[$key]['id_forma_pagamento'] : null;
        $item->num_parcelas = isset($pagamentos[$key]['num_parcelas']) ? $pagamentos[$key]['num_parcelas'] : null;
        $fichaPaciente[] = $item;
    }
} else {
    foreach ($pagamentos as $key => $value) {
        $item = new stdClass();
        $item->dta_venda = isset($atendimentos[$key]['dta_venda']) ? date('d/m/Y', strtotime($atendimentos[$key]['dta_venda'])) : null;
        $item->cod_dente = isset($atendimentos[$key]['cod_dente']) ? $atendimentos[$key]['cod_dente'] : null;
 public static function getAgendaAtendimentos()
 {
     try {
         $AtendimentoDao = new AtendimentoDao();
         $id_empreendimento = $_GET['id_empreendimento'];
         $first_date = $_GET['start'];
         $last_date = $_GET['end'];
         $busca['cplSql'] = " date_format(ta.dta_entrada,'%Y-%m-%d') BETWEEN '{$first_date}' AND '{$last_date}' AND ta.id_empreendimento = {$id_empreendimento}";
         $busca['cplSql'] .= is_numeric($_GET['id_profissional_atendimento']) ? ' AND ta.id_profissional_atendimento = ' . $_GET['id_profissional_atendimento'] : "";
         $dados = $AtendimentoDao->getFilaAtendimento(null, null, $busca);
         $saida = array();
         foreach ($dados as $key => $value) {
             $procedimentos = $AtendimentoDao->getAtendimentoProcedimento($value['id']);
             $aux = $procedimentos ? ' (' . $procedimentos[0]['dsc_procedimento'] . ')' : '';
             $color = $procedimentos ? $procedimentos[0]['hex_cor'] : '#6BAFBD';
             $tma = $procedimentos && !empty($procedimentos[0]['tma_procedimento']) ? $procedimentos[0]['tma_procedimento'] : false;
             $dsc_especialidade = $procedimentos ? $procedimentos[0]['dsc_especialidade'] : '';
             $dsc_procedimento = $procedimentos ? $procedimentos[0]['dsc_procedimento'] : '';
             if ($tma) {
                 $end = date('Y-m-d H:i:s', strtotime("+{$tma} minutes", strtotime($value['dta_entrada'])));
             } else {
                 $end = null;
             }
             $saida[] = array('title' => $value['nome_paciente'] . $aux, 'start' => $value['dta_entrada'], 'end' => $end, 'color' => $color, 'dsc_especialidade' => $dsc_especialidade, 'dsc_procedimento' => $dsc_procedimento, 'nome_paciente' => $value['nome_paciente'], 'nome_profissional' => $value['nome_profissional']);
         }
         if ($saida) {
             Flight::json($saida);
         } else {
             Flight::halt(404, 'Não há resultado para a busca');
         }
     } catch (Exception $e) {
         jsonException($e, 500);
     }
 }
/*Busca Pagamentos aos Profissioais*/
$totalDespesas = 0;
$LancamentosFinanceirosDao = new LancamentosFinanceirosDao();
$where = "(id_tipo_conta  <> 5 OR (id_tipo_conta =5 AND (flg_caixa_fechado = 0 OR flg_caixa_fechado IS NULL ) )  AND flg_tipo_lancamento = 'D' ) AND (flg_transferencia_conta = 0 OR \n\t\t\t flg_transferencia_conta IS NULL) AND id_empreendimento = {$id_empreendimento} AND dta_entrada between '{$now} 00:00:00' and '{$now}  23:59:59' \n\t\t\t AND id_plano_conta = '{$id_plano_conta_pagamento_profissional}' order by \n\t\t     dta_entrada asc";
$aux = $LancamentosFinanceirosDao->getLancamentos(null, null, array('cplSql' => $where));
$comissionados = $aux ? getParcelas($aux['pagamentos']) : array();
usort($comissionados, 'ordenaDta');
/* end */
/*Busca Pagamentos a fornecedores*/
$where = "(id_tipo_conta  <> 5 OR (id_tipo_conta =5 AND (flg_caixa_fechado = 0 OR flg_caixa_fechado IS NULL ) )  AND flg_tipo_lancamento = 'D' ) AND (flg_transferencia_conta = 0 OR \n\t\t\t flg_transferencia_conta IS NULL) AND id_empreendimento = {$id_empreendimento} AND data_pagamento between '{$now} 00:00:00' and '{$now}  23:59:59' \n\t\t\t AND id_plano_conta <> '{$id_plano_conta_pagamento_profissional}' AND id_clienteORfornecedor <> '{$id_fornecedor_movimentacao_caixa}' AND  flg_tipo_lancamento = 'D' AND status_pagamento = 1 order by \n\t\t     dta_entrada asc";
$aux = $LancamentosFinanceirosDao->getLancamentos(null, null, array('cplSql' => $where));
$outrasDespesas = $aux ? getParcelas($aux['pagamentos']) : array();
usort($outrasDespesas, 'ordenaDta');
/*end*/
/*Busca atendimentos*/
$AtendimentoDao = new AtendimentoDao();
$atendimentos = $AtendimentoDao->getFilaAtendimento(null, null, array("cplSql" => "ta.id_empreendimento={$id_empreendimento} AND ta.id_profissional_atendimento IS NOT NULL AND ta.id_atendimento_origem IS NULL AND date_format(ta.dta_entrada,'%Y-%m-%d') = '{$now}' ORDER BY ta.dta_entrada ASC"));
$atendimentos = $atendimentos ? $atendimentos : array();
/*end*/
/*Busca Pagamentos por forma de pagamento*/
$LancamentosFinanceirosDao = new LancamentosFinanceirosDao();
$where = "(id_tipo_conta  <> 5 OR (id_tipo_conta =5 AND (flg_caixa_fechado = 0 OR flg_caixa_fechado IS NULL ) )  AND flg_tipo_lancamento = 'C' ) AND (flg_transferencia_conta = 0 OR \n\t\t\t flg_transferencia_conta IS NULL) AND id_empreendimento = {$id_empreendimento} AND dta_entrada between '{$now} 00:00:00' and '{$now}  23:59:59' AND flg_tipo_lancamento = 'C'\n\t\t\t order by dta_entrada asc";
$aux = $LancamentosFinanceirosDao->getLancamentos(null, null, array('cplSql' => $where));
$pagamentos = $aux ? getParcelas($aux['pagamentos']) : array();
usort($pagamentos, 'ordenaDta');
$pagByformaPagamento = array();
$totalRecebido = 0;
$totalCredito = 0;
foreach ($pagamentos as $key => $value) {
    if ($value['id_forma_pagamento'] == 6 || $value['id_forma_pagamento'] == 2) {
        $totalCredito += $value['valor_pagamento'];
 public static function save()
 {
     $osTO = new OrdemServicoTO();
     $osTO->__setAll($_POST);
     $validator = new DataValidator();
     $validator->set_msg('O campo Cliente é obrigatório')->set('id_cliente', $osTO->cliente)->is_required();
     if (!$validator->validate()) {
         Flight::response()->status(406)->header('Content-Type', 'application/json')->write(json_encode($validator->get_errors()))->send();
         return;
     }
     $cliTO = new UsuarioTO();
     $cliTO->__setAll($osTO->cliente);
     $osTO->cliente = $cliTO;
     $crtTO = new UsuarioTO();
     $crtTO->__setAll($osTO->criador);
     $osTO->criador = $crtTO;
     if (count($osTO->servicos) > 0) {
         foreach ($osTO->servicos as $key => $servico) {
             $newObjTO = new ServicoTO();
             $newObjTO->__setAll($servico);
             $osTO->servicos[$key] = $newObjTO;
         }
     }
     if (count($osTO->produtos) > 0) {
         foreach ($osTO->produtos as $key => $produto) {
             $newObjTO = new ProdutoOSTO();
             $newObjTO->__setAll($produto);
             $osTO->produtos[$key] = $newObjTO;
         }
     }
     if (!$osTO->id) {
         // Grava a venda
         $venTO = new VendaTO();
         $venTO->id_usuario = $osTO->criador->id;
         $venTO->id_cliente = $osTO->cliente->id;
         $venTO->venda_confirmada = $osTO->cod_status_servico == "4" ? 0 : 1;
         $venTO->id_empreendimento = $osTO->id_empreendimento;
         $venTO->id_status_venda = $osTO->cod_status_servico == "4" ? 5 : 6;
         $venDao = new VendaDao();
         $venTO->id = $venDao->saveVenda($venTO);
         if (!$venTO->id) {
             Flight::halt(500, 'Erro ao salvar as informações da venda');
         } else {
             $osTO->id_venda = $venTO->id;
             // Grava os servicos na venda
             if (count($osTO->servicos) > 0) {
                 foreach ($osTO->servicos as $key => $servico) {
                     $itvTO = new ItemVendaTO();
                     $itvTO->id_venda = $venTO->id;
                     $itvTO->id_produto = NULL;
                     $itvTO->desconto_aplicado = 0;
                     $itvTO->valor_desconto = 0;
                     $itvTO->qtd = 1;
                     $itvTO->valor_real_item = $servico->vlr_procedimento;
                     $itvTO->vlr_custo = 0;
                     $itvTO->perc_imposto_compra = 0;
                     $itvTO->perc_desconto_compra = 0;
                     $itvTO->perc_margem_aplicada = 0;
                     $itvTO->id_procedimento = $servico->id;
                     $itvTO->id_status_procedimento = $servico->cod_status_servico;
                     $itvDao = new ItemVendaDao();
                     $osTO->servicos[$key]->id = $itvDao->saveItemVenda($itvTO);
                     if (!$osTO->servicos[$key]->id) {
                         Flight::halt(500, 'Erro ao associar o serviço [' . $servico->dsc_procedimento . '] na venda');
                     }
                 }
             }
             // Grava os produtos na venda
             if (count($osTO->produtos) > 0) {
                 foreach ($osTO->produtos as $key => $produto) {
                     $itvTO = new ItemVendaTO();
                     $itvTO->id_venda = $venTO->id;
                     $itvTO->id_produto = $produto->id_produto;
                     $itvTO->desconto_aplicado = 0;
                     $itvTO->valor_desconto = 0;
                     $itvTO->qtd = $produto->qtd_pedido;
                     $itvTO->valor_real_item = $produto->vlr_venda_varejo;
                     $itvTO->vlr_custo = $produto->vlr_custo;
                     $itvTO->perc_imposto_compra = 0;
                     $itvTO->perc_desconto_compra = 0;
                     $itvTO->perc_margem_aplicada = $produto->margem_varejo;
                     $itvDao = new ItemVendaDao();
                     $osTO->produtos[$key]->id = $itvDao->saveItemVenda($itvTO);
                     if (!$osTO->produtos[$key]->id) {
                         Flight::halt(500, 'Erro ao associar o produto [' . $produto->nome . '] na venda');
                     }
                 }
             }
             // Grava a Ordem de Serviço
             $atdTO = new AtendimentoTO();
             $atdTO->id_empreendimento = $osTO->id_empreendimento;
             $atdTO->id_paciente = $osTO->cliente->id;
             $atdTO->dta_entrada = $osTO->dta_ordem_servico;
             $atdTO->id_usuario_entrada = $osTO->criador->id;
             $atdTO->id_status = $osTO->cod_status_servico;
             $atdDao = new AtendimentoDao();
             $atdTO->id = $atdDao->saveAtendimento($atdTO);
             if (!$atdTO->id) {
                 Flight::halt(500, 'Erro ao salvar as informações do serviço');
             } else {
                 // Associa a Ordem de Serviço a Venda
                 if (count($osTO->servicos) > 0) {
                     foreach ($osTO->servicos as $key => $servico) {
                         if (!$atdDao->gravarAtendimentoVenda($atdTO->id, $venTO->id, $servico->id)) {
                             Flight::halt(500, 'Erro ao associar o serviço a venda');
                         }
                     }
                 }
                 if (count($osTO->produtos) > 0) {
                     foreach ($osTO->produtos as $key => $produto) {
                         if (!$atdDao->gravarAtendimentoVenda($atdTO->id, $venTO->id, $produto->id)) {
                             Flight::halt(500, 'Erro ao associar o produto a venda');
                         }
                     }
                 }
             }
             $status_code = 201;
         }
     } else {
         $venda_confirmada = $osTO->cod_status_servico == "4" ? 0 : 1;
         $id_status_venda = $osTO->cod_status_servico == "4" ? 5 : 6;
         $flg_excluido = $osTO->cod_status_servico == "5" ? 1 : 0;
         // Atualiza os dados da venda
         $venDao = new VendaDao();
         if ($venDao->updateVendaData($osTO->cliente->id, $venda_confirmada, $id_status_venda, $flg_excluido, $osTO->id_venda)) {
             // Remove todos os servicos e produtos da venda
             $itvDao = new ItemVendaDao();
             if ($itvDao->deleteItemsByIdVenda($osTO->id_venda)) {
                 // Grava os servicos na venda
                 if (count($osTO->servicos) > 0) {
                     foreach ($osTO->servicos as $key => $servico) {
                         $itvTO = new ItemVendaTO();
                         $itvTO->id_venda = $osTO->id_venda;
                         $itvTO->id_produto = NULL;
                         $itvTO->desconto_aplicado = 0;
                         $itvTO->valor_desconto = 0;
                         $itvTO->qtd = 1;
                         $itvTO->valor_real_item = $servico->vlr_procedimento;
                         $itvTO->vlr_custo = 0;
                         $itvTO->perc_imposto_compra = 0;
                         $itvTO->perc_desconto_compra = 0;
                         $itvTO->perc_margem_aplicada = 0;
                         $itvTO->id_procedimento = $servico->id;
                         $itvTO->id_status_procedimento = $servico->cod_status_servico;
                         $osTO->servicos[$key]->id = $itvDao->saveItemVenda($itvTO);
                         if (!$osTO->servicos[$key]->id) {
                             Flight::halt(500, 'Erro ao associar o serviço [' . $servico->dsc_procedimento . '] na venda');
                         }
                     }
                 }
                 // Grava os produtos na venda
                 if (count($osTO->produtos) > 0) {
                     foreach ($osTO->produtos as $key => $produto) {
                         $itvTO = new ItemVendaTO();
                         $itvTO->id_venda = $osTO->id_venda;
                         $itvTO->id_produto = $produto->id_produto;
                         $itvTO->desconto_aplicado = 0;
                         $itvTO->valor_desconto = 0;
                         $itvTO->qtd = $produto->qtd_pedido;
                         $itvTO->valor_real_item = $produto->vlr_venda_varejo;
                         $itvTO->vlr_custo = $produto->vlr_custo;
                         $itvTO->perc_imposto_compra = 0;
                         $itvTO->perc_desconto_compra = 0;
                         $itvTO->perc_margem_aplicada = $produto->margem_varejo;
                         $osTO->produtos[$key]->id = $itvDao->saveItemVenda($itvTO);
                         if (!$osTO->produtos[$key]->id) {
                             Flight::halt(500, 'Erro ao associar o produto [' . $produto->nome . '] na venda');
                         }
                     }
                 }
                 // Atualiza os dados da Ordem de Serviço
                 $atdTO = new StdClass();
                 $atdTO->id_paciente = $osTO->cliente->id;
                 $atdTO->id_status = $osTO->cod_status_servico;
                 $atdDao = new AtendimentoDao();
                 if ($atdDao->updateAtendimento($atdTO, 'id=' . $osTO->id)) {
                     // Remove todos os servicos e produtos da ordem de serviço
                     $atdDao->deleteItemsByIdAtendimento($osTO->id);
                     // Associa a Ordem de Serviço a Venda
                     if (count($osTO->servicos) > 0) {
                         foreach ($osTO->servicos as $key => $servico) {
                             if (!$atdDao->gravarAtendimentoVenda($osTO->id, $osTO->id_venda, $servico->id)) {
                                 Flight::halt(500, 'Erro ao associar o serviço a venda');
                             }
                         }
                     }
                     if (count($osTO->produtos) > 0) {
                         foreach ($osTO->produtos as $key => $produto) {
                             if (!$atdDao->gravarAtendimentoVenda($osTO->id, $osTO->id_venda, $produto->id)) {
                                 Flight::halt(500, 'Erro ao associar o produto a venda');
                             }
                         }
                     }
                     $status_code = 200;
                 } else {
                     Flight::halt(500, 'Erro ao atualizar os dados da ordem de serviço');
                 }
             } else {
                 Flight::halt(500, 'Erro ao remover os servicos e produtos da venda');
             }
         } else {
             Flight::halt(500, 'Erro ao atualizar os dados da venda');
         }
     }
     // Grava a movimentação de caixa
     if ($osTO->cod_status_servico == "6") {
         $movCxaTO = new MovimentacaoCaixaTO();
         $movCxaTO->id_abertura_caixa = $osTO->id_abertura_caixa;
         $movCxaTO->id_plano_conta = $osTO->id_plano_conta;
         $movCxaTO->id_tipo_movimentacao = 5;
         $movCxaTO->dsc_movimentacao = 'Venda';
         $movCxaTO->id_venda = $osTO->id_venda;
         $movCxaTO->para_receber = $osTO->vlr_total_os;
         $movCxaTO->dta_movimentacao = $osTO->dta_ordem_servico;
         $movCxaDao = new MovimentacaoCaixaDao();
         if (!$movCxaDao->saveMovimentacao($movCxaTO)) {
             Flight::halt(500, 'erro ao inserir movimentacao');
         }
     }
     Flight::halt($status_code, 'Operação realizada com sucesso!');
 }