public static function getItens($id_venda, $offset, $limit)
 {
     $ItemVendaDao = new ItemVendaDao();
     if (is_numeric($id_venda)) {
         $Fornecedor = $ItemVendaDao->getItens($id_venda, $offset, $limit, $_GET);
         if ($Fornecedor) {
             Flight::json($Fornecedor);
         } else {
             Flight::halt(404, 'Não à resultado para a busca');
         }
     } else {
         Flight::halt(406, 'parametro recusado');
     }
 }
 public static function getComanda($id_comanda)
 {
     $VendaDao = new VendaDao();
     $ItemVendaDao = new ItemVendaDao();
     $UsuarioDao = new UsuarioDao();
     $comanda = $VendaDao->getVenda($id_comanda, array("tv.venda_confirmada" => 0));
     $cliente = $UsuarioDao->getUsuario($comanda['id_empreendimento'], $comanda['id_cliente']);
     $itens = $ItemVendaDao->getItensOrcamento($id_comanda, 'new');
     if ($comanda && $cliente) {
         $comanda['itens'] = is_array($itens) ? $itens : array();
         Flight::json(array("comanda" => $comanda, "cliente" => $cliente));
     } else {
         Flight::halt(404, 'Comanda não encontrada');
     }
 }
<?php

$EmpreendimentoDao = new EmpreendimentoDao();
$ItemVendaDao = new ItemVendaDao();
$VendaDao = new VendaDao();
$UsuarioDao = new UsuarioDao();
$CidadeDao = new CidadeDao();
$EstadoDao = new EstadoDao();
$Conexao = new Conexao();
$aux = json_decode($dados['json']);
$vlr_saldo_devedor = 0;
$empreendimento = $EmpreendimentoDao->getEmpreendimentoById($aux->id_empreendimento);
if (!$aux->pagamento_fulso) {
    $venda = $VendaDao->getVenda($aux->id_venda);
    $produtos = $ItemVendaDao->getItens($aux->id_venda);
    $vlr_saldo_devedor = !empty($venda['vlr_saldo_anterior']) ? (double) $venda['vlr_saldo_anterior'] : 0;
    $id_venda = $aux->id_venda;
    $queryPagamentos = "SELECT tpv.id_forma_pagamento,if(tpv.id_forma_pagamento = 6,COUNT(*),NULL) n_parcelas, ROUND(SUM(tpv.valor_pagamento),2) AS valor_pagamento,tfp.descricao_forma_pagamento\n\t\t\tFROM tbl_movimentacao_caixa AS tmc  \n\t\t\tINNER JOIN tbl_pagamentos_venda AS tpv ON tmc.id_lancamento_entrada = tpv.id \n\t\t\tINNER JOIN tbl_forma_pagamento AS tfp ON tpv.id_forma_pagamento = tfp.id\n\t\t\tINNER JOIN tbl_conta_bancaria AS tcb ON tpv.id_conta_bancaria = tcb.id\n\t\t\tWHERE tmc.id_venda = {$id_venda}\n\t\t\tAND (tcb.id_tipo_conta  <> 5 OR (tcb.id_tipo_conta =5 AND (tpv.flg_caixa_fechado = 0 OR tpv.flg_caixa_fechado IS NULL ) ))\n\t\t\tGROUP BY if(tpv.id_parcelamento IS NULL \n\t\t\tAND tpv.id_forma_pagamento = 6,tpv.id, if(tpv.id_forma_pagamento <> 6,tpv.id, (if(tpv.id_forma_pagamento <> 6,tpv.id,tpv.id_parcelamento))))";
    $pagamentos = parse_arr_values($Conexao->select($queryPagamentos, true, null, null), 'all');
    $pagamentos = is_array($pagamentos) ? $pagamentos : array();
} else {
    $id_controle_pagamento = $aux->id_controle_pagamento;
    $queryPagamentos = "SELECT tpv.id_forma_pagamento,if(tpv.id_forma_pagamento = 6,COUNT(*),NULL) n_parcelas, ROUND(SUM(tpv.valor_pagamento),2) AS valor_pagamento,tfp.descricao_forma_pagamento \n\t\t\tFROM tbl_pagamentos_venda AS tpv \n\t\t\tINNER JOIN tbl_forma_pagamento AS tfp ON tpv.id_forma_pagamento = tfp.id\n\t\t\tINNER JOIN tbl_conta_bancaria AS tcb ON tpv.id_conta_bancaria = tcb.id\n\t\t\tWHERE tpv.id_controle_pagamento = {$id_controle_pagamento}\n\t\t\tAND (tcb.id_tipo_conta  <> 5 OR (tcb.id_tipo_conta =5 AND (tpv.flg_caixa_fechado = 0 OR tpv.flg_caixa_fechado IS NULL ) ))\n\t\t\tGROUP BY if(tpv.id_parcelamento IS NULL \n\t\t\tAND tpv.id_forma_pagamento = 6,tpv.id, if(tpv.id_forma_pagamento <> 6,tpv.id, (if(tpv.id_forma_pagamento <> 6,tpv.id,tpv.id_parcelamento))))";
    $produtos = array();
    $vlr_saldo_devedor = $aux->vlr_saldo_devedor;
    $pagamentos = parse_arr_values($Conexao->select($queryPagamentos, true, null, null), 'all');
    $venda = array("venda_confirmada" => null);
}
$id_cliente = $aux->id_cliente;
$cliente = $UsuarioDao->getUsuario($aux->id_empreendimento, $id_cliente);
$estado = array('uf' => '', 'nome' => '');
 public static function getDadosCnf($id_venda, $id_caixa)
 {
     $vendaDao = new VendaDao();
     $venda = $vendaDao->getVenda($id_venda);
     $itemVendaDao = new ItemVendaDao();
     $itensVenda = $itemVendaDao->getItens($id_venda, null, null, null);
     $empreendimentoDao = new EmpreendimentoDao();
     $empreendimento = $empreendimentoDao->getEmpreendimentoById($venda['id_empreendimento']);
     $contaBancariaDao = new ContaBancariaDao();
     $caixa = $contaBancariaDao->getContaBancaria($id_caixa);
     $usuarioDao = new UsuarioDao();
     $saldoDevedor = $usuarioDao->getSaldoDevedor($venda['id_empreendimento'], $venda['id_cliente']);
     $configuracaoDao = new ConfiguracaoDao();
     $config = $configuracaoDao->getConfiguracoes($venda['id_empreendimento']);
     Flight::json(array('venda' => $venda, 'itensVenda' => $itensVenda, 'empreendimento' => $empreendimento, 'printerModel' => $caixa['mod_impressora'], 'saldoDevedor' => $saldoDevedor['vlr_saldo_devedor']));
 }
 public function finalizarPedido($id_pedido_venda, $caixa)
 {
     $ItemPedidoVendaDao = new ItemPedidoVendaDao();
     $pedido_venda = $this->getPedidoVenda($id_pedido_venda);
     $pedido_venda['itens'] = $ItemPedidoVendaDao->getItens($id_pedido_venda, null, null);
     $pedido_gerado = $this->getPedidoMaster($pedido_venda['id']);
     $pedido_gerado['itens'] = $ItemPedidoVendaDao->getItens($pedido_gerado['id'], null, null);
     $id_empreendimento = $pedido_venda['id_empreendimento'];
     $produtos_venda = array();
     $Dao = new Dao();
     $out = array();
     $Dao->setTimeZone($id_empreendimento);
     $dta = date('Y-m-d H:i:s');
     $EstoqueDao = new EstoqueDao();
     $EstoqueTO = new EstoqueTO();
     $VendaTO = new VendaTO();
     $VendaDao = new VendaDao();
     $ItemVendaTO = new ItemVendaTO();
     $ItemVendaDao = new ItemVendaDao();
     $EstoqueEntradaTO = new EstoqueEntradaTO();
     $EstoqueEntradaDao = new EstoqueEntradaDao();
     $EstoqueEntradaTO->id_empreendimento = $id_empreendimento;
     $EstoqueEntradaTO->id_deposito = $caixa['id_deposito'];
     $EstoqueEntradaTO->id_pedido_venda = $id_pedido_venda;
     $EstoqueEntradaTO->dta_entrada = $dta;
     $id_estoque_entrada = $EstoqueEntradaDao->saveEstoqueEntrada($EstoqueEntradaTO);
     if ($id_estoque_entrada) {
         $ItemEstoqueEntradaTO = new ItemEstoqueEntradaTO();
         $ItemEstoqueEntradaDao = new ItemEstoqueEntradaDao();
         foreach ($pedido_gerado['itens'] as $key => $value) {
             $ItemEstoqueEntradaTO->id_estoque_entrada = $id_estoque_entrada;
             $ItemEstoqueEntradaTO->id_produto = $value['id_produto'];
             $ItemEstoqueEntradaTO->qtd_item = $value['qtd'];
             $ItemEstoqueEntradaTO->vlr_custo = NULL;
             $ItemEstoqueEntradaTO->perc_imposto = NULL;
             $ItemEstoqueEntradaTO->perc_desconto = NULL;
             $ItemEstoqueEntradaTO->dta_validade = '2099-12-31';
             if ($ItemEstoqueEntradaDao->saveItemEstoqueEntrada($ItemEstoqueEntradaTO)) {
                 $EstoqueTO = new EstoqueTO();
                 $EstoqueDao = new EstoqueDao();
                 $PrecoProdutoTO = new PrecoProdutoTO();
                 $PrecoProdutoDao = new PrecoProdutoDao();
                 $EstoqueTO->id_deposito = $EstoqueEntradaTO->id_deposito;
                 $EstoqueTO->id_produto = $ItemEstoqueEntradaTO->id_produto;
                 $EstoqueTO->qtd_item = $ItemEstoqueEntradaTO->qtd_item;
                 $EstoqueTO->dta_validade = $ItemEstoqueEntradaTO->dta_validade;
                 if (!$EstoqueDao->atualizaEstoque($EstoqueTO)) {
                     Flight::halt(500, 'erro ao atualizar estoque');
                 }
             } else {
                 Flight::halt(500, 'erro ao inserir itens da entrada');
             }
         }
     } else {
         Flight::halt(500, 'erro ao inserir entrada no estoque');
     }
     $VendaTO->id_usuario = $pedido_venda['id_usuario'];
     $VendaTO->id_cliente = $pedido_venda['id_cliente'];
     $VendaTO->venda_confirmada = 1;
     $VendaTO->id_empreendimento = $pedido_venda['id_empreendimento'];
     $VendaTO->id_status_venda = 2;
     $VendaTO->id_pedido_venda = $pedido_venda['id'];
     $id_venda = $VendaDao->saveVenda($VendaTO);
     if (!$id_venda) {
         Flight::halt(500, 'erro ao inserir venda');
     }
     foreach ($pedido_gerado['itens'] as $key => $value) {
         $ItemVendaTO->id_venda = $id_venda;
         $ItemVendaTO->id_produto = $value['id_produto'];
         $ItemVendaTO->desconto_aplicado = $value['desconto_aplicado'];
         $ItemVendaTO->valor_desconto = $value['valor_desconto'];
         $ItemVendaTO->qtd = $value['qtd'];
         $ItemVendaTO->valor_real_item = $value['valor_real_item'];
         $ItemVendaTO->vlr_custo = $value['vlr_custo'];
         $ItemVendaTO->perc_imposto_compra = $value['perc_imposto_compra'];
         $ItemVendaTO->perc_desconto_compra = $value['perc_desconto_compra'];
         $ItemVendaTO->perc_margem_aplicada = $value['perc_margem_aplicada'];
         if (!$ItemVendaDao->saveItemVenda($ItemVendaTO)) {
             Flight::halt(500, 'erro ao inserir os itens da venda');
         }
         if (!$EstoqueDao->baixaEstoquePDV($id_empreendimento, $id_venda, $value['id_produto'], $caixa['id_deposito'], $value['qtd'])) {
             Flight::halt(500, 'error ao atualizar estoque');
         }
     }
     $this->changeStatusPedido($id_pedido_venda, 3);
     Flight::halt(201);
 }
 public static function requestSaveVenda()
 {
     try {
         $dados = $_POST;
         $VendaDao = new VendaDao();
         $VendaTO = new VendaTO();
         $ReferenciaIntegracaoDao = new ReferenciaIntegracaoDao();
         $PrestaShopDao = new PrestaShopDao($dados['id_empreendimento']);
         $ProdutoCombinacaoDao = new ProdutoCombinacaoDao();
         $ItemVendaDao = new ItemVendaDao();
         $ItemVendaTO = new ItemVendaTO();
         $refCliente = $ReferenciaIntegracaoDao->get(array('sistema_integrado' => 'PrestaShop', 'tabela' => 'tbl_usuarios', 'id_item_referencia' => $dados['customer']['id'], 'tipo' => 'usuario', 'id_empreendimento' => $dados['id_empreendimento'], 'flg_excluido' => 0));
         if ($refCliente) {
             $id_cliente = $refCliente['id_item'];
         } else {
             $id_cliente = NULL;
         }
         $PagamentoClienteTO = new PagamentoClienteTO();
         $PagamentoClienteDao = new PagamentoClienteDao();
         $ControlePagamentoVendaTO = new ControlePagamentoVendaTO();
         $ControlePagamentoVendaDao = new ControlePagamentoVendaDao();
         $ConfiguracaoDao = new ConfiguracaoDao();
         $config = $ConfiguracaoDao->getConfiguracoes($dados['id_empreendimento']);
         $id_controle_pagamento = $ControlePagamentoVendaDao->saveControlePagamento();
         $PagamentoClienteTO->id_usuario = $config['prestashop_id_usuario_padrao'];
         $PagamentoClienteTO->id_cliente = $id_cliente;
         $PagamentoClienteTO->id_controle_pagamento = $id_controle_pagamento;
         $PagamentoClienteTO->obs_pagamento = 'Pagamento PrestaShop';
         $PagamentoClienteTO->valor_pagamento = $dados['order']['total_products_wt'];
         $PagamentoClienteTO->status_pagamento = 0;
         $PagamentoClienteTO->id_empreendimento = $dados['id_empreendimento'];
         $PagamentoClienteTO->id_plano_conta = $config['prestashop_id_plano_conta_padrao'];
         $PagamentoClienteTO->id_conta_bancaria = $config['prestashop_id_conta_bancaria_padrao'];
         $PagamentoClienteTO->data_pagamento = date('Y-m-d H:i:s');
         if (strtolower($dados['order']['payment']) == 'cheque') {
             $PagamentoClienteTO->id_forma_pagamento = 2;
         } else {
             $PagamentoClienteTO->id_forma_pagamento = 8;
         }
         $id_lancamento_entrada = $PagamentoClienteDao->savePagamentoCliente($PagamentoClienteTO);
         $ReferenciaIntegracaoPagTO = new ReferenciaIntegracaoTO();
         $ReferenciaIntegracaoPagTO->sistema_integrado = 'PrestaShop';
         $ReferenciaIntegracaoPagTO->tabela = 'tbl_pagamentos_venda';
         $ReferenciaIntegracaoPagTO->id_item = $id_lancamento_entrada;
         $ReferenciaIntegracaoPagTO->id_item_referencia = $dados['cart']['id'];
         $ReferenciaIntegracaoPagTO->tipo = 'pagamento';
         $ReferenciaIntegracaoPagTO->id_empreendimento = $dados['id_empreendimento'];
         $ReferenciaIntegracaoDao->save($ReferenciaIntegracaoPagTO);
         $produtos = array();
         $VendaTO->id_usuario = $config['prestashop_id_usuario_padrao'];
         $VendaTO->id_cliente = $id_cliente;
         $VendaTO->venda_confirmada = 0;
         $VendaTO->id_empreendimento = $dados['id_empreendimento'];
         $VendaTO->id_status_venda = 1;
         $VendaTO->dta_venda = $dados['order']['date_add'];
         $VendaTO->vlr_saldo_anterior = NULL;
         $id_venda = $VendaDao->saveVenda($VendaTO);
         $ReferenciaIntegracaoTO = new ReferenciaIntegracaoTO();
         $ReferenciaIntegracaoTO->sistema_integrado = 'PrestaShop';
         $ReferenciaIntegracaoTO->tabela = 'tbl_vendas';
         $ReferenciaIntegracaoTO->id_item = $id_venda;
         $ReferenciaIntegracaoTO->id_item_referencia = $dados['cart']['id'];
         $ReferenciaIntegracaoTO->tipo = 'venda';
         $ReferenciaIntegracaoTO->id_empreendimento = $dados['id_empreendimento'];
         $ReferenciaIntegracaoDao->save($ReferenciaIntegracaoTO);
         foreach ($dados['order']['product_list'] as $value) {
             if (isset($value['id_product_attribute'])) {
                 $refCombinacao = $ReferenciaIntegracaoDao->get(array('sistema_integrado' => 'PrestaShop', 'tabela' => 'tbl_produto_combinacao', 'id_item_referencia' => $value['id_product_attribute'], 'tipo' => 'combinacao', 'id_empreendimento' => $dados['id_empreendimento'], 'flg_excluido' => 0));
                 if ($refCombinacao) {
                     $comb = $ProdutoCombinacaoDao->get(null, null, array('tpc.id' => $refCombinacao['id_item']));
                     if ($comb) {
                         $id_produto = $comb[0]['id_combinacao'];
                     }
                 } else {
                     $refProduto = $ReferenciaIntegracaoDao->get(array('sistema_integrado' => 'PrestaShop', 'tabela' => 'tbl_produtos', 'id_item_referencia' => $value['id_product'], 'tipo' => 'produto', 'id_empreendimento' => $dados['id_empreendimento'], 'flg_excluido' => 0));
                     if ($refProduto) {
                         $id_produto = $refProduto['id_item'];
                     }
                 }
             }
             $ex = (double) $value['price_with_reduction_without_tax'] - (double) $value['wholesale_price'];
             $perc_venda_varejo = $ex * 100 / (double) $value['wholesale_price'];
             $perc_venda_varejo = $perc_venda_varejo / 100;
             $ItemVendaTO->id_venda = $id_venda;
             $ItemVendaTO->id_produto = $id_produto;
             $ItemVendaTO->valor_real_item = $value['price'];
             $ItemVendaTO->vlr_custo = round($value['wholesale_price'], 2);
             $ItemVendaTO->perc_margem_aplicada = $perc_venda_varejo;
             $ItemVendaTO->desconto_aplicado = 0;
             $ItemVendaTO->valor_desconto = 0;
             $ItemVendaTO->qtd = $value['quantity'];
             $ItemVendaTO->perc_imposto_compra = 0;
             $ItemVendaTO->perc_desconto_compra = 0;
             $ItemVendaDao->saveItemVenda($ItemVendaTO);
         }
     } catch (Exception $e) {
         $log = new KLogger("logs/logErrorPrestaShop.txt", KLogger::DEBUG);
         $log->LogError($e->getMessage() . '- file:' . $e->getFile() . ' - line:' . $e->getLine());
         $log->LogDebug(json_encode($_POST));
         $log->LogJunp();
         Flight::halt(500, $e->getMessage());
     }
 }
 public static function gravarItensVenda()
 {
     $ItemVendaDao = new ItemVendaDao();
     $ItemVendaTO = new ItemVendaTO();
     $EstoqueDao = new EstoqueDao();
     $produtos = $_POST['produtos'];
     $id_empreendimento = $_POST['id_empreendimento'];
     $id_venda = $_POST['id_venda'];
     //var_dump($_POST);die ;
     foreach ($produtos as $key => $value) {
         $ItemVendaTO->id_venda = $id_venda;
         $ItemVendaTO->id_produto = NULL;
         $ItemVendaTO->desconto_aplicado = isset($value['desconto_aplicado']) ? $value['desconto_aplicado'] : 0;
         $ItemVendaTO->valor_desconto = isset($value['valor_desconto']) ? $value['valor_desconto'] : 0;
         $ItemVendaTO->qtd = $value['qtd'];
         $ItemVendaTO->valor_real_item = $value['valor_real_item'];
         $ItemVendaTO->vlr_custo = $value['vlr_custo'];
         $ItemVendaTO->perc_imposto_compra = $value['perc_imposto_compra'];
         $ItemVendaTO->perc_desconto_compra = $value['perc_desconto_compra'];
         $ItemVendaTO->perc_margem_aplicada = $value['perc_margem_aplicada'];
         $ItemVendaTO->id_procedimento = isset($value['id_procedimento']) ? $value['id_procedimento'] : NULL;
         $ItemVendaTO->id_dente = isset($value['id_dente']) ? $value['id_dente'] : NULL;
         $ItemVendaTO->id_regiao = isset($value['id_regiao']) ? $value['id_regiao'] : NULL;
         $ItemVendaTO->id_status_procedimento = isset($value['id_status_procedimento']) ? $value['id_status_procedimento'] : NULL;
         $ItemVendaTO->id_procedimento_principal = isset($value['id_procedimento_principal']) ? $value['id_procedimento_principal'] : NULL;
         $id_item_venda = $ItemVendaDao->saveItemVenda($ItemVendaTO);
         if (!$id_item_venda) {
             Flight::halt(500, 'erro ao inserir os itens da venda');
         }
     }
     Flight::response()->status(201)->header('Content-Type', 'application/json')->write(json_encode(array('id_item_venda' => $id_item_venda)))->send();
 }
 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!');
 }
 public static function calculaNfe()
 {
     $id_empreendimento = $_POST['id_empreendimento'];
     $id_venda = $_POST['id_venda'];
     $cod_operacao = $_POST['cod_operacao'];
     $VendaDao = new VendaDao();
     $UsuarioDao = new UsuarioDao();
     $ItemVendaDao = new ItemVendaDao();
     $EmpreendimentoDao = new EmpreendimentoDao();
     $OperacaoDao = new OperacaoDao();
     $ProdutoDao = new ProdutoDao();
     $EstadoDao = new EstadoDao();
     $CidadeDao = new CidadeDao();
     $ConfiguracaoDao = new ConfiguracaoDao();
     $SerieDocumentoFiscalDao = new SerieDocumentoFiscalDao();
     /**
      * Carregando dados da venda
      **/
     $venda = $VendaDao->getVenda($id_venda);
     $venda['itens'] = $ItemVendaDao->getItens($id_venda);
     $venda['cliente'] = $UsuarioDao->getUsuario($id_empreendimento, $venda['id_cliente']);
     if (isset($venda['cliente']['id_cidade']) && !empty($venda['cliente']['id_cidade'])) {
         $cidadeDestinatario = $CidadeDao->getCidade($venda['cliente']['id_cidade']);
         $estadoDestinatario = $EstadoDao->getEstado($venda['cliente']['id_estado']);
     } else {
         Flight::halt(406, json_encode(array('mensagem' => 'Estado/Cidade não informado no cadastro do cliente!')));
     }
     $venda['empreendimento'] = $EmpreendimentoDao->getEmpreendimentoByIdAndUF($id_empreendimento, $estadoDestinatario['uf']);
     $cidadeEmitente = $CidadeDao->getCidade($venda['empreendimento']['cod_cidade']);
     $estadoEmitente = $EstadoDao->getEstado($venda['empreendimento']['cod_estado']);
     $venda['operacao'] = $OperacaoDao->getOperacao($cod_operacao);
     $configuracoes = $ConfiguracaoDao->getConfiguracoes($id_empreendimento);
     if (!isset($configuracoes['id_serie_padrao_nfe'])) {
         $erros = array("mensagem" => "Configuração \"Modelo Documento/Série Padrão p/ NF-e\" não encontrada");
         Flight::response()->status(406)->header('Content-Type', 'application/json')->write(json_encode($erros))->send();
     }
     $SerieDocumentoFiscal = $SerieDocumentoFiscalDao->getByID($configuracoes['id_serie_padrao_nfe']);
     $dados_emissao = new stdClass();
     $dados_emissao->dsc_operacao = $venda['operacao']['dsc_operacao'];
     $dados_emissao->serie_documento_fiscal = $SerieDocumentoFiscal['serie_documento_fiscal'];
     $dados_emissao->num_documento_fiscal = $SerieDocumentoFiscal['num_ultimo_documento_fiscal']++;
     $dados_emissao->cod_venda = $id_venda;
     $dados_emissao->cod_empreendimento = $id_empreendimento;
     $dados_emissao->nme_modelo_documento = $SerieDocumentoFiscal['dsc_modelo_documento_fiscal'];
     /**
      * Configurando os dados do emitente
      **/
     $emitente = new MotorFiscal\Emitente();
     $emitente->identificador = $venda['empreendimento']['id'];
     $emitente->CNPJ = $venda['empreendimento']['num_cnpj'];
     $emitente->xNome = $venda['empreendimento']['nme_razao_social'];
     $emitente->xFant = $venda['empreendimento']['nme_fantasia'];
     $emitente->IE = $venda['empreendimento']['num_inscricao_estadual'];
     $emitente->IEST = $venda['empreendimento']['num_inscricao_estadual_st'];
     $emitente->CRT = $venda['empreendimento']['num_regime_tributario'];
     $emitente->PercCreditoSimples = $venda['empreendimento']['num_percentual_credito_simples'];
     $emitente->CEP = $venda['empreendimento']['num_cep'];
     $emitente->xLgr = $venda['empreendimento']['nme_logradouro'];
     $emitente->nro = $venda['empreendimento']['num_logradouro'];
     $emitente->xBairro = $venda['empreendimento']['nme_bairro_logradouro'];
     $emitente->cMun = $cidadeEmitente['nome'];
     $emitente->UF = $estadoEmitente['uf'];
     $emitente->id_cidade = $cidadeEmitente['id'];
     $emitente->id_estado = $estadoEmitente['id'];
     $emitente->ContribuinteIPI = $venda['empreendimento']['flg_contribuinte_ipi'];
     $emitente->num_versao_ibpt = $configuracoes['num_versao_ibpt'];
     /**
      * Configurando os dados do destinatário
      **/
     $destinatario = new MotorFiscal\Destinatario();
     $destinatario->identificador = $venda['cliente']['id'];
     $destinatario->CPF = $venda['cliente']['cpf'];
     $destinatario->idEstrangeiro = $venda['cliente']['num_registro_estrangeiro'];
     $destinatario->xNome = $venda['cliente']['nome'];
     $destinatario->email = $venda['cliente']['email'];
     $destinatario->tipo_cadastro = $venda['cliente']['tipo_cadastro'];
     $destinatario->CEP = $venda['cliente']['cep'];
     $destinatario->xLgr = $venda['cliente']['endereco'];
     $destinatario->nro = $venda['cliente']['numero'];
     $destinatario->xBairro = $venda['cliente']['bairro'];
     $destinatario->cMun = $cidadeDestinatario['nome'];
     $destinatario->UF = $estadoDestinatario['uf'];
     $destinatario->id_cidade = $cidadeDestinatario['id'];
     $destinatario->id_estado = $estadoDestinatario['id'];
     if ($venda['cliente']['tipo_cadastro'] === "pj") {
         $destinatario->CNPJ = $venda['cliente']['cnpj'];
         $destinatario->IE = $venda['cliente']['inscricao_estadual'];
         $destinatario->IEST = $venda['cliente']['inscricao_estadual_st'];
         $destinatario->IM = $venda['cliente']['num_inscricao_municipal'];
         $destinatario->xFant = $venda['cliente']['nome_fantasia'];
         if ((int) $venda['cliente']['flg_contribuinte_icms'] === 1) {
             // Se for contribuinte de ICMS
             if ((int) $venda['cliente']['flg_isento_inscricao_estadual'] === 1) {
                 // Se for contribuinte de ICMS ISENTO de incrição
                 $destinatario->indIEDest = 2;
             } else {
                 $destinatario->indIEDest = 1;
             }
             //É contribuinte mas não é ISENTO.
         } else {
             $destinatario->indIEDest = 9;
         }
         // Se não não é contribuinte do ICMS então ele é igual a nove.
     }
     /**
      * Configurando os dados da operação
      **/
     $operacao = new stdClass();
     $operacao->identificador = $venda['operacao']['cod_operacao'];
     $operacao->CFOPMercadoria = $venda['operacao']['num_cfop_mercadoria'];
     $operacao->CFOPMercadoriaST = $venda['operacao']['num_cfop_mercadoria_st'];
     $operacao->CFOPMercadoriaSTSubstituido = $venda['operacao']['num_cfop_mercadoria_st_subst'];
     $operacao->CFOPProduto = $venda['operacao']['num_cfop_produto'];
     $operacao->CFOPProdutoST = $venda['operacao']['num_cfop_produto_st'];
     $operacao->TipoOperacao = 0;
     $operacao->identificacao = 0;
     $operacao->finalidade = 0;
     $operacao->indFinal = 0;
     $operacao->indPres = 0;
     $operacao->NaturezaOperacao = '';
     /**
      * Configurando os parâmetros da NF-e
      **/
     self::$NF = new MotorFiscal\DocumentoFiscal($emitente, $destinatario, $operacao);
     self::$NF->buscaTribFunctionICMS = function ($produto, $operacao, $emitente, $destinatario) {
         return Trib::ICMS($produto, $operacao, $emitente, $destinatario);
     };
     self::$NF->buscaTribFunctionIPI = function ($produto, $operacao, $emitente, $destinatario) {
         return Trib::IPI($produto, $operacao, $emitente, $destinatario);
     };
     self::$NF->buscaTribFunctionPIS = function ($produto, $operacao, $emitente, $destinatario) {
         return Trib::PIS($produto, $operacao, $emitente, $destinatario);
     };
     self::$NF->buscaTribFunctionCOFINS = function ($produto, $operacao, $emitente, $destinatario) {
         return Trib::COFINS($produto, $operacao, $emitente, $destinatario);
     };
     self::$NF->buscaTribFunctionIBPT = function ($produto, $emitente, $detinatario) {
         return Trib::IBPT($produto, $emitente, $detinatario);
     };
     self::$NF->itens = array();
     // Configurando produtos e calculando impostos
     foreach ($venda['itens'] as $key => $item) {
         $item['data'] = $ProdutoDao->getProduto($item['id_produto'], $id_empreendimento);
         $produto = new MotorFiscal\Produto();
         $produto->identificador = $item['data']['id_produto'];
         $produto->cProd = $item['data']['id'];
         $produto->cEAN = $item['data']['codigo_barra'];
         $produto->xProd = $item['data']['nome'];
         $produto->NCM = $item['data']['cod_ncm'];
         $produto->EXTIPI = $item['data']['ex_tipi'];
         $produto->CEST = $item['data']['num_cest'];
         $produto->uCom = $item['data']['dsc_unidade_medida'];
         $produto->qCom = $item['qtd'];
         $produto->vUnCom = $item['vlr_produto'];
         $produto->cEANTrib = $item['data']['codigo_barra'];
         $produto->uTrib = $item['data']['dsc_unidade_medida'];
         $produto->qTrib = $item['qtd'];
         $produto->vUnTrib = $item['vlr_produto'];
         $produto->TipoTributacaoIPI = $item['data']['TipoTributacaoIPI'];
         $produto->FormaAquisicao = $item['data']['FormaAquisicao'];
         $produto->vProd = $item['qtd'] * $item['vlr_produto'];
         $produto->vDesc = $item['qtd'] * $item['valor_desconto_real'];
         // TODO: Dúvidas para sanar com Fischer
         $produto->NVE = 0;
         // Como preencher?
         $produto->CFOP = 0;
         // Como preencher?
         $produto->indTot = 1;
         // Como preencher?
         $produto->vFrete = 0;
         // Como preencher?
         $produto->vOutro = 0;
         // Como preencher?
         $produto->vSeg = 0;
         // Como preencher?
         $item = self::$NF->addItem($produto);
         $venda['itens'][$key] = $item;
     }
     // Consolidando e totalizando
     self::$NF->totalizarDocumento();
     $dadosNf = array('informacoes_adicionais_contribuinte' => $_POST['informacoes_adicionais_contribuinte'], 'dados_emissao' => $dados_emissao, 'emitente' => $emitente, 'destinatario' => $destinatario, 'itens' => self::$NF->itens, 'ICMSTot' => self::$NF->ICMSTot);
     Flight::json($dadosNf);
 }