<?php
session_start();
require 'conexao.php';
require 'config.php';
require 'funcoes.php';

$json = (isset($_POST['pedido'])) ? $_POST['pedido'] : '';

if (empty($json)) :
	echo json_encode(['status' => 0, 'mensagem' => 'Pedido não enviado !']);
	http_response_code(406);
	exit();
endif;

$pedido = json_decode($json);

$msg = '';
switch (json_last_error()):
	case JSON_ERROR_DEPTH:
		$msg = ' - Maximum stack depth exceeded';
		break;
	case JSON_ERROR_STATE_MISMATCH:
		$msg = ' - Underflow or the modes mismatch';
		break;
	case JSON_ERROR_CTRL_CHAR:
		$msg = ' - Unexpected control character found';
		break;
	case JSON_ERROR_SYNTAX:
		$msg = ' - Syntax error, malformed JSON';
		break;
	case JSON_ERROR_UTF8:
		$msg = ' - Malformed UTF-8 characters, possibly incorrectly encoded';
		break;
endswitch;

if ($msg != '') :
	echo json_encode(['status' => 0, 'mensagem' => 'Erro no Pedido: ' . $msg]);
	http_response_code(406);
	exit();
endif;

// GRAVA LOG DO PEDIDO
$canal = ($pedido->tipo == 'M') ? 'MESA ' . $pedido->controle : 'COMANDA ' . $pedido->controle;
$venda_log = (empty($pedido->venda)) ? -1 : $pedido->venda;
$sql = "INSERT INTO log_mobile (venda, canal, id_atendente, atendente, json, data_hora)VALUES(:venda, :canal, :id_atendente, :atendente, :json, :data_hora)";
$stm = $pdo->prepare($sql);
$stm->bindValue(':venda', $venda_log);
$stm->bindValue(':canal', $canal);
$stm->bindValue(':id_atendente', $pedido->id_atendente);
$stm->bindValue(':atendente', $pedido->atendente);
$stm->bindValue(':json', $json);
$stm->bindValue(':data_hora', date('Y-m-d H:i:s'));
$retorno = $stm->execute();

if (isset($_SESSION['IDENTIFICADOR']) && $_SESSION['IDENTIFICADOR'] == $pedido->identificador) :
	echo json_encode([
		'status' => -1,
		'mensagem' => "Houve uma falha na conexão WiFi, verifique no caixa se o Pedido foi gravado !"
	]);
	exit();
endif;

if ($pedido->tipo == '') :
	echo json_encode(['status' => 0, 'mensagem' => 'Pedido sem canal de venda !']);
	http_response_code(406);
	exit();
endif;

if ($pedido->tipo == 'M' && ($pedido->id_mesa == '0' || $pedido->id_mesa == '')) :
	echo json_encode(['status' => 0, 'mensagem' => 'Número da Mesa não informado !']);
	http_response_code(406);
	exit();
endif;

if ($pedido->id_atendente == '') :
	echo json_encode(['status' => 0, 'mensagem' => 'Pedido sem atendente !']);
	http_response_code(406);
	exit();
endif;

if (count($pedido->itens) == 0) :
	echo json_encode(['status' => 0, 'mensagem' => 'Pedido sem itens !']);
	http_response_code(406);
	exit();
endif;

$produtoInativo = '';
foreach ($pedido->itens as $item) :
	$sql = 'SELECT mat_003, sit_001 FROM materiais WHERE mat_004 = :produto';
	$stm = $pdo->prepare($sql);
	$stm->bindValue(':produto', $item->codigo);
	$stm->execute();
	$produto = $stm->fetch(PDO::FETCH_OBJ);

	if ($produto->sit_001 != 4) :
		$produtoInativo .= ' - <b>' . $produto->mat_003 . '</b><br>';
	endif;
endforeach;

if ($produtoInativo != '') :
	$produtoInativo = 'Atualize seus Produtos OFFLINE ! <br><br> Existem Produto(s) Inativo(s) no Pedido: <br><br>' . $produtoInativo;
	echo json_encode(['status' => 0, 'mensagem' => $produtoInativo]);
	exit();
endif;

if (BLOQUEIA_VENDA_ESTOQUE) :
	$produtoEsgotado = '';

	foreach ($pedido->itens as $item) :
		$retorno = NotificaEstoqueIndisponivel($item->codigo, $item->quantidade);
		$produtoEsgotado .= ($retorno == '') ? '' : ' - <b>' . $retorno . '</b><br>';
	endforeach;

	if ($produtoEsgotado != '') :
		$produtoEsgotado = 'Existem Produto(s) Esgotado(s): <br><br>' . $produtoEsgotado;
		echo json_encode(['status' => 0, 'mensagem' => $produtoEsgotado]);
		exit();
	endif;
endif;

$invalido = false;
foreach ($pedido->itens as $produto) :
	if ($produto->quantidade == '' || $produto->quantidade == '0.000' || $produto->quantidade == 'NaN') :
		$invalido = true;
		break;
	endif;
endforeach;

if ($invalido) :
	echo json_encode(['status' => 0, 'mensagem' => 'Existe(m) Produto(s) sem Quantidade !']);
	exit();
endif;

$invalido = false;
foreach ($pedido->itens as $produto) :
	if ($produto->quantidade <= 0) :
		$invalido = true;
		break;
	endif;
endforeach;

if ($invalido) :
	echo json_encode(['status' => 0, 'mensagem' => 'Existe(m) Produto(s) com Quantidade Negativa !']);
	exit();
endif;


if (!empty($venda_log) && $venda_log != -1) :
	$sql = "SELECT ven_001, sit_001 FROM venda WHERE ven_001 = {$venda_log} and sit_001 <> 8";
	$stm = $pdo->prepare($sql);
	$stm->execute();
	$vendaNaoAberta = $stm->fetch(PDO::FETCH_OBJ);

	if (!empty($vendaNaoAberta)) :

		switch ($vendaNaoAberta->sit_001):
			case 1:
				echo json_encode(['status' => 0, 'mensagem' => "{$canal} já foi FINALIZADA, verifique no Caixa !"]);
				break;
			case 2:
				echo json_encode(['status' => 0, 'mensagem' => "{$canal} foi CANCELADA, verifique no Caixa !"]);
				break;
			case 21:
				echo json_encode(['status' => 0, 'mensagem' => "{$canal} está PRÉ-FECHADA, verifique no Caixa !"]);
				break;
		endswitch;

		exit();
	endif;
endif;

$idMesa  = ($pedido->id_mesa > 0 && $pedido->tipo == 'M') ? $pedido->id_mesa : '0';
$comanda = ($pedido->controle > 0 && $pedido->tipo == 'C') ? $pedido->controle : '0';

if ($pedido->tipo == 'M') :
	$sql = "SELECT ven_001, sit_001 FROM venda WHERE ven_025 = {$idMesa} and sit_001 = 21 AND ven_024 = 'M'";
elseif ($pedido->tipo == 'C') :
	$sql = "SELECT ven_001, sit_001 FROM venda WHERE ven_026 = {$comanda} and sit_001 = 21 AND ven_024 = 'C'";
endif;
$stm = $pdo->prepare($sql);
$stm->execute();
$preFechada = $stm->fetch(PDO::FETCH_OBJ);

if (!empty($preFechada)) :
	echo json_encode(['status' => 0, 'mensagem' => "{$canal} está PRÉ-FECHADA, verifique no Caixa !"]);
	exit();
endif;

$venda       = $pedido->venda;
$tipo_venda  = $pedido->tipo;
$pessoas     = $pedido->pessoas;
$id_cliente  = isset($pedido->id_cliente) ? (int) $pedido->id_cliente : 0;
$cliente     = ($id_cliente > 0) ? '' : $pedido->cliente;
$usuario     = $pedido->id_atendente;
$mesa        = ($pedido->controle > 0 && $tipo_venda == 'M') ? $pedido->controle : '0';
$pdo         = Conexao::getInstance();
$contErro    = 0;
$fracionado  = 0;
$aberturaVenda = true;
$hash_pedido = md5(date('YmdHis'));

try {
	if ($tipo_venda == 'M') :
		$sql = "SELECT ven_001 FROM venda WHERE ven_025 = {$idMesa} and sit_001 = 8 AND ven_024 = 'M'";
	elseif ($tipo_venda == 'C') :
		$sql = "SELECT ven_001 FROM venda WHERE ven_026 = {$comanda} and sit_001 = 8 AND ven_024 = 'C'";
	endif;
	$stm = $pdo->prepare($sql);
	$stm->execute();
	$existeVenda = $stm->fetch(PDO::FETCH_OBJ);

	if (!empty($existeVenda) && empty($venda)) :
		$venda = $existeVenda->ven_001;
	endif;

	$pdo->beginTransaction();

	// SENÃO NÃO ACHAR UMA VENDA ABERTA, GERA UM NÚMERO PARA NOVA VENDA
	if (empty($venda)) :

		$aberturaVenda = true;
		$sql = 'SELECT (COALESCE(MAX(ven_001) ,0)+1) as venda FROM venda WHERE emp_001 = 1';
		$stm = $pdo->prepare($sql);
		$stm->execute();
		$contador = $stm->fetch(PDO::FETCH_OBJ);
		$id_venda = $contador->venda;
		$venda = $contador->venda;
		$itens    = 0;

		// SE FOR UMA VENDA DO TIPO COMANDA E ESTIVER CONFIGURADO PARA
		// GERAR O NÚMERO AUTOMATICAMENTE TAMBÉM GERA O NÚMERO DE COMANDA
		if ($tipo_venda == 'C' && TIPO_COMANDA == 0) :
			$sql = 'SELECT (COALESCE(MAX(ven_026) ,0)+1) as comanda FROM venda WHERE sit_001 in (8, 21)';
			$stm = $pdo->prepare($sql);
			$stm->execute();
			$controle = $stm->fetch(PDO::FETCH_OBJ);
			$comanda = $controle->comanda;
		endif;

		$pdo  = Conexao::getInstance();
		$sql = "SELECT b_pdv_coletivo FROM empresas LIMIT 1";
		$stm = $pdo->prepare($sql);
		$stm->execute();
		$empresa = $stm->fetch(PDO::FETCH_OBJ);

		if ($empresa->b_pdv_coletivo) :
			// SELECIONA O ID DE ABERTURA DO CAIXA 
			$sql = "SELECT id_caixa FROM caixa WHERE id_situacao = 4";
			$stm = $pdo->prepare($sql);
			$stm->execute();
			$caixa = $stm->fetch(PDO::FETCH_OBJ);
		else :
			// SELECIONA O ID DE ABERTURA DO CAIXA QUE POSSUI MOBILE ATIVO
			$sql = "SELECT id_caixa FROM caixa WHERE id_situacao = 4 AND (terminal = '" . SERVIDOR . "')";
			$stm = $pdo->prepare($sql);
			$stm->execute();
			$caixa = $stm->fetch(PDO::FETCH_OBJ);
		endif;

		if (empty($caixa)) :
			$pdo->rollBack();
			echo json_encode(['status' => 0, 'mensagem' => 'Não existe Caixa Aberto para gravar esse Pedido !']);
			exit();
		endif;

		// SELECIONA O NÚMERO DO PRÓXIMO PEDIDO
		$sql = "SELECT COALESCE(MAX(ven_029), 0)+1 AS numero FROM venda WHERE DATE(ven_004) = DATE(CURRENT_DATE)";
		$sql = (NUMERO_PEDIDO_POR_CANAL) ? $sql . " AND ven_024 = '{$tipo_venda}' " : $sql;
		$stm = $pdo->prepare($sql);
		$stm->execute();
		$controle_pedido = $stm->fetch(PDO::FETCH_OBJ);

		$qtde_couvert = 0;
		if (($tipo_venda == 'M' && TIPO_COUVERT_MESA == 1) || ($tipo_venda == 'C' && TIPO_COUVERT_COMANDA == 1)) :
			$qtde_couvert = 1;
		endif;

		$sql = 'INSERT INTO venda (ven_001, ven_002, emp_001, dat_001_1, ven_025, cli_001, sit_001, usu_001_1, ';
		$sql .= 'VEN_024, ven_029, ven_004, ven_023, id_caixa_abertura, ven_026, terminal_abertura, ven_027, nro_pessoas, nro_couvert_m)';
		$sql .= 'VALUES(:id_venda, 0, :emp, LOCALTIMESTAMP, :id_mesa, :id_cliente, 8, :id_usuario, ';
		$sql .= ":tipo_venda, :id_venda2, LOCALTIMESTAMP, 'N', :id_caixa_abertura, :comanda, :terminal_abertura, :nome_cliente, :nro_pessoas, :nro_couvert_m)";
		$stm = $pdo->prepare($sql);
		$stm->bindValue(':id_venda', $id_venda);
		$stm->bindValue(':emp', 1);
		$stm->bindValue(':id_mesa', (int) $idMesa);
		$stm->bindValue(':id_cliente', $id_cliente, PDO::PARAM_INT);
		$stm->bindValue(':id_usuario', (int) $usuario);
		$stm->bindValue(':tipo_venda', $tipo_venda);
		$stm->bindValue(':id_venda2', $controle_pedido->numero);
		$stm->bindValue(':id_caixa_abertura', (int) $caixa->id_caixa);
		$stm->bindValue(':comanda', $comanda);
		$stm->bindValue(':terminal_abertura', 'MOBILE');
		$stm->bindValue(':nome_cliente', $cliente);
		$stm->bindValue(':nro_pessoas', $pessoas);
		$stm->bindValue(':nro_couvert_m', $qtde_couvert);
		$stm->execute();

	else :
		$aberturaVenda = false;

		// ATUALIZA O CLIENTE DA VENDA SE INFORMADO
		if ($id_cliente > 0) :
			$sql = 'UPDATE venda SET cli_001 = :id_cliente WHERE ven_001 = :venda';
			$stm = $pdo->prepare($sql);
			$stm->bindValue(':id_cliente', $id_cliente, PDO::PARAM_INT);
			$stm->bindValue(':venda', $venda);
			$stm->execute();
		endif;

		$sql = 'SELECT MAX(ite_001) as itens FROM vendaitem WHERE ven_001 = :venda';
		$stm = $pdo->prepare($sql);
		$stm->bindValue(':venda', $venda);
		$stm->execute();
		$item = $stm->fetch(PDO::FETCH_OBJ);

		$itens    = $item->itens;
		$id_venda = $venda;
	endif;

	// PERCORRE TODOS OS ITENS EM SESSION E PROCESSA A GRAVAÇÃO NO BANCO
	// foreach($_SESSION['PEDIDO'] as $itemPedido):
	foreach ($pedido->itens as $itemPedido) :

		$sql = 'SELECT mat_001, mat_021, COALESCE(valor_tam_p, 0) AS valor_tam_p, COALESCE(valor_tam_m, 0) AS valor_tam_m, b_venda_tamanho, ';
		$sql .= 'COALESCE(valor_tam_g, 0) AS valor_tam_g, COALESCE(valor_tam_gg, 0) AS valor_tam_gg, COALESCE(valor_tam_extra, 0) AS valor_tam_extra ';
		$sql .= ', mat_008, rodizio FROM materiais ';
		$sql .= 'WHERE mat_004 = :produto AND sit_001 = 4';
		$stm = $pdo->prepare($sql);
		$stm->bindValue(':produto', $itemPedido->codigo);
		$stm->execute();
		$produto = $stm->fetch(PDO::FETCH_OBJ);

		if ($itemPedido->vende_tamanho) :
			switch ($itemPedido->tamanho_pedido):
				case 'P':
					$valor_unitario = CapturaValorNormalOuPromocao($produto->mat_001, 'P', $tipo_venda);
					break;
				case 'M':
					$valor_unitario = CapturaValorNormalOuPromocao($produto->mat_001, 'M', $tipo_venda);
					break;
				case 'G':
					$valor_unitario = CapturaValorNormalOuPromocao($produto->mat_001, 'G', $tipo_venda);
					break;
				case 'GG':
					$valor_unitario = CapturaValorNormalOuPromocao($produto->mat_001, 'GG', $tipo_venda);
					break;
				case 'E':
					$valor_unitario = CapturaValorNormalOuPromocao($produto->mat_001, 'E', $tipo_venda);
					break;
			endswitch;
		else :
			$valor_unitario = CapturaValorNormalOuPromocao($produto->mat_001, 'M', $tipo_venda);
		endif;

		$tamanho = ($itemPedido->vende_tamanho) ? $itemPedido->tamanho_pedido : 'M';
		$valor_sem_promocao = CapturaValorNormal($produto->mat_001, $tamanho, $tipo_venda);
		$id_promocao = CapturaIdPromocao($produto->mat_001, $tamanho, $tipo_venda);
		$valor_caculo_item = $valor_unitario;
		$fracionado = null;

		// VERIFICA SE É QUANTIDADE FRACIONADA
		if (
			$itemPedido->quantidade < 1 &&
			!$itemPedido->vende_balanca &&
			$itemPedido->vende_fracionado
		) :

			// SELECIONA O MAIOR ITEM QUE FOI FRACIONADO NA VENDA
			$sql = 'SELECT COALESCE(MAX(item_fracionado), 0) AS item_fracionado FROM vendaitem ';
			$sql .= 'WHERE ven_001 =:venda AND sit_001 = 4 AND (item_fracionado IS NOT NULL AND item_fracionado > 0) ';
			$stm = $pdo->prepare($sql);
			$stm->bindValue(':venda', $id_venda);
			$stm->execute();
			$ultimo_fracionado = $stm->fetch(PDO::FETCH_OBJ);

			if ($ultimo_fracionado->item_fracionado == 0) :
				$fracionado = 1;
			else :
				// SOMA A QUANTIDADE DOS ÚLTIMO ITENS FRACIONADOS E VERIFICA SE A SOMA DÁ UM INTEIRO
				$sql = 'SELECT COALESCE(TRUNC(SUM(ite_002), 1),0) as total FROM vendaitem ';
				$sql .= 'WHERE ven_001 =:venda AND item_fracionado =:fracionado AND sit_001 = 4';
				$stm = $pdo->prepare($sql);
				$stm->bindValue(':venda', $id_venda);
				$stm->bindValue(':fracionado', $ultimo_fracionado->item_fracionado);
				$stm->execute();
				$qtde_fracionada = $stm->fetch(PDO::FETCH_OBJ);

				if ($qtde_fracionada->total >= 0.9) :
					$fracionado = $ultimo_fracionado->item_fracionado + 1;
				else :
					$fracionado = $ultimo_fracionado->item_fracionado;
				endif;

				if (COBRAR_MAIOR_VALOR_FRACIONADO) :

					// SELECIONA O MAIOR VALOR ENTRE OS ITENS FRACIONADOS DO MESMO PEDIDO
					$sql = 'SELECT COALESCE(ite_003, 0.0) as maior_valor FROM vendaitem ';
					$sql .= 'WHERE ven_001 =:venda AND item_fracionado =:fracionado AND sit_001 = 4 ';
					$sql .= 'ORDER BY ite_003 DESC LIMIT 1';
					$stm = $pdo->prepare($sql);
					$stm->bindValue(':venda', $id_venda);
					$stm->bindValue(':fracionado', $fracionado);
					$stm->execute();
					$totalizador = $stm->fetch(PDO::FETCH_OBJ);

					if (!empty($totalizador) && $totalizador->maior_valor > $valor_caculo_item) :
						$valor_caculo_item = $totalizador->maior_valor;
					endif;

					// ATUALIZA AS FRAÇÕES COM O VALOR DA MAIOR PIZZA
					if (!empty($totalizador)) :
						$sql = 'UPDATE vendaitem SET ite_005 = :valor + COALESCE(acrescimo, 0.0) ';
						$sql .= 'WHERE ven_001 =:venda AND item_fracionado =:item ';
						$stm = $pdo->prepare($sql);
						$stm->bindValue(':valor', ($itemPedido->quantidade * $valor_caculo_item));
						$stm->bindValue(':venda', $id_venda);
						$stm->bindValue(':item', $fracionado);
						$stm->execute();
					endif;

				endif;

			endif;
		endif;

		$observacao = '';
		if (!empty($itemPedido->observacao) && !empty($itemPedido->opcao_observacao)) :
			$observacao = $itemPedido->observacao . ', ' . $itemPedido->opcao_observacao;
		elseif (!empty($itemPedido->observacao)) :
			$observacao = $itemPedido->observacao;
		elseif (!empty($itemPedido->opcao_observacao)) :
			$observacao = $itemPedido->opcao_observacao;
		endif;

		switch ($itemPedido->impressora):
			case 1:
				$impressora = (isset($_COOKIE['pBalcao']) && $_COOKIE['pBalcao'] >= 0) ? $_COOKIE['pBalcao'] : $itemPedido->impressora;
				break;
			case 2:
				$impressora = (isset($_COOKIE['pCozinha']) && $_COOKIE['pCozinha'] >= 0) ? $_COOKIE['pCozinha'] : $itemPedido->impressora;
				break;
			case 3:
				$impressora = (isset($_COOKIE['pBar']) && $_COOKIE['pBar'] >= 0) ? $_COOKIE['pBar'] : $itemPedido->impressora;
				break;

			default:
				$impressora = $itemPedido->impressora;
				break;
		endswitch;

		$sql = 'SELECT COALESCE(MAX(ite_001), 0) as itens FROM vendaitem WHERE ven_001 = :venda';
		$stm = $pdo->prepare($sql);
		$stm->bindValue(':venda', $id_venda);
		$stm->execute();
		$item  = $stm->fetch(PDO::FETCH_OBJ);
		$itens = $item->itens;
		$itens++;

		// VERIFICA SE FOI ADICIONADO CATEGORIA COM DESCONTO
		$sql = 'SELECT m.cat_001 FROM categoria c INNER JOIN materiais m ON c.cat_001 = m.cat_001 ';
		$sql .= 'WHERE nao_totaliza_cupom AND mat_001 = :codigo';
		$stm = $pdo->prepare($sql);
		$stm->bindValue(':codigo', $itemPedido->id);
		$stm->execute();
		$categoria_desconto  = $stm->fetch(PDO::FETCH_OBJ);
		$desconto = (empty($categoria_desconto)) ? 0 : ($itemPedido->quantidade * $valor_caculo_item);
		$valor_caculo_item = (empty($categoria_desconto)) ? $valor_caculo_item : 0;

		$sql = 'INSERT INTO vendaitem ';
		$sql .= '(emp_001, ven_001, mat_001, ite_002, ite_003, ite_005, ite_006, ite_009, ite_001, gar_001, ';
		$sql .= 'ite_013, ite_012, sit_001, ite_011, ite_008, tamanho, b_venda_tamanho, item_fracionado,';
		$sql .= 'quantidade_impressao, origem_pedido, mobile_impressao, id_promocao, valor_sem_promocao, desconto, hash_pedido)VALUES ';
		$sql .= '(:emp, :id_venda, :id_material, :quantidade, :valor_unit, :valor_total, :observacao, :hora, :nro_item, ';
		$sql .= ":id_garcom, :cod_impressora, 'N', 4, 'S', 'N', :tamanho, :b_venda_tamanho, :item_fracionado, :quantidade_impressao, ";
		$sql .= "'M', 'N', :id_promocao, :valor_sem_promocao, :desconto, :hash_pedido)";
		$stm = $pdo->prepare($sql);
		$stm->bindValue(':emp', '1');
		$stm->bindValue(':id_venda', $id_venda);
		$stm->bindValue(':id_material', $itemPedido->id);
		$stm->bindValue(':quantidade', $itemPedido->quantidade);
		$stm->bindValue(':valor_unit', $valor_unitario);
		$stm->bindValue(':valor_total', round(($itemPedido->quantidade * $valor_caculo_item), 2));
		$stm->bindValue(':observacao', $observacao);
		$stm->bindValue(':hora', date('H:i:s'));
		$stm->bindValue(':nro_item', $itens);
		$stm->bindValue(':id_garcom', $usuario);
		$stm->bindValue(':cod_impressora', $impressora);
		$stm->bindValue(':tamanho', $itemPedido->tamanho_pedido);
		$stm->bindValue(':b_venda_tamanho', (int) $itemPedido->vende_tamanho);
		$stm->bindValue(':item_fracionado', $fracionado);
		$stm->bindValue(':quantidade_impressao', $itemPedido->quantidade);
		$stm->bindValue(':id_promocao', $id_promocao);
		$stm->bindValue(':valor_sem_promocao', $valor_sem_promocao);
		$stm->bindValue(':desconto', $desconto);
		$stm->bindValue(':hash_pedido', $hash_pedido);
		$retorno = $stm->execute();

		if (!empty($itemPedido->opcional)) :
			$sql = 'SELECT MAX(ite_001) as ultimo_item FROM vendaitem WHERE ven_001 = :venda';
			$stm = $pdo->prepare($sql);
			$stm->bindValue(':venda', $id_venda);
			$stm->execute();
			$item = $stm->fetch(PDO::FETCH_OBJ);

			foreach ($itemPedido->opcional as $opcional) :
				$sql = 'SELECT valor FROM opcional WHERE id_opcional = :opcional';
				$stm = $pdo->prepare($sql);
				$stm->bindValue(':opcional', $opcional->id_opcional);
				$stm->execute();
				$item_opcional = $stm->fetch(PDO::FETCH_OBJ);

				$sql = 'INSERT INTO vendaitemopcional (ordem, id_venda, id_empresa, id_vendaitem, id_opcional, unitario_fracao, imprime_completo, quantidade, valor)VALUES';
				$sql .= '(:ordem, :id_venda, 1, :id_vendaitem, :id_opcional, :unitario_fracao, :imprime_completo, :quantidade, :valor)';
				$stm = $pdo->prepare($sql);
				$stm->bindValue(':ordem', 0);
				$stm->bindValue(':id_venda', $id_venda);
				$stm->bindValue(':id_vendaitem', $item->ultimo_item);
				$stm->bindValue(':id_opcional', $opcional->id_opcional);
				$stm->bindValue(':unitario_fracao', (int) $opcional->fracao);
				$stm->bindValue(':imprime_completo', (int) $opcional->completo);
				$stm->bindValue(':quantidade', (int) ($opcional->quantidade * $itemPedido->quantidade));
				$stm->bindValue(':valor', (($opcional->quantidade * $itemPedido->quantidade) * $item_opcional->valor));
				$stm->execute();
				$opcional = $stm->fetch(PDO::FETCH_OBJ);
			endforeach;
		endif;

		if (!empty($itemPedido->pacote)) :
			$sql = 'SELECT MAX(ite_001) as ultimo_item FROM vendaitem WHERE ven_001 = :venda';
			$stm = $pdo->prepare($sql);
			$stm->bindValue(':venda', $id_venda);
			$stm->execute();
			$item = $stm->fetch(PDO::FETCH_OBJ);

			foreach ($itemPedido->pacote as $pacote) :

				if ($produto->rodizio == 1) :
					$qtde = (int) $pacote->quantidade;
				else :
					$qtde = (int) ($pacote->quantidade * $itemPedido->quantidade);
				endif;

				// if ($pacote->tipo == 'O' && $pacote->valor > 0) :
				if ($pacote->tipo == 'O') :
					$sql = 'INSERT INTO vendaitemopcional (ordem, id_venda, id_empresa, id_vendaitem, id_opcional, unitario_fracao, imprime_completo, quantidade, valor)VALUES';
					$sql .= '(:ordem, :id_venda, 1, :id_vendaitem, :id_opcional, :unitario_fracao, :imprime_completo, :quantidade, :valor)';
					$stm = $pdo->prepare($sql);
					$stm->bindValue(':ordem', $pacote->ordem);
					$stm->bindValue(':id_venda', $id_venda);
					$stm->bindValue(':id_vendaitem', $item->ultimo_item);
					$stm->bindValue(':id_opcional', $pacote->id);
					$stm->bindValue(':unitario_fracao', (int) 0);
					$stm->bindValue(':imprime_completo', 0);
					$stm->bindValue(':quantidade', (int) $qtde);
					$stm->bindValue(':valor', ($qtde * $pacote->valor));
					$stm->execute();
				else :
					// if ( $pacote->tipo == 'P' ):
					// 	$sql = 'SELECT mat_004 FROM materiais WHERE mat_001 = :id';
					// 	$stm = $pdo->prepare($sql);
					// 	$stm->bindValue(':id', $pacote->id);
					// 	$stm->execute();
					// 	$material = $stm->fetch(PDO::FETCH_OBJ);

					// 	$pacote->id = $material->mat_004;
					// endif;

					$sql = 'INSERT INTO vendaitem_pacote (ordem, id_venda, id_item, id_registro, tipo, descricao, quantidade, valor, tamanho)VALUES';
					$sql .= '(:ordem, :id_venda, :id_item, :id_registro, :tipo, :descricao, :quantidade, :valor, :tamanho)';
					$stm = $pdo->prepare($sql);
					$stm->bindValue(':ordem', $pacote->ordem);
					$stm->bindValue(':id_venda', $id_venda);
					$stm->bindValue(':id_item', $item->ultimo_item);
					$stm->bindValue(':id_registro', $pacote->id);
					$stm->bindValue(':tipo', $pacote->tipo);
					$stm->bindValue(':descricao', $pacote->descricao);
					$stm->bindValue(':quantidade', (int) $qtde);
					$stm->bindValue(':valor', $pacote->valor);
					$stm->bindValue(':tamanho', 'M');
					$stm->execute();
				endif;

			endforeach;
		endif;

		// ACERTA OS ITENS OPCIONAIS PARA OS CASOS DE ITENS FRACIONADOS
		$quantidadeSabores = 0;
		if ($fracionado != null) :

			$sql = 'SELECT ite_001, ite_002, ite_003 FROM vendaitem ';
			$sql .= 'WHERE ven_001 = :id_venda AND item_fracionado = :fracionado AND sit_001 = 4 ';
			$sql .= 'ORDER BY ite_001';
			$stm = $pdo->prepare($sql);
			$stm->bindValue(':id_venda', $id_venda);
			$stm->bindValue(':fracionado', $fracionado);
			$stm->execute();
			$itens_fracionado = $stm->fetchAll(PDO::FETCH_OBJ);

			// ACERTA CÁLCULO COM ITENS 3 SABORES
			$quantidadeSabores = count($itens_fracionado);
			if ($quantidadeSabores === 3) :
				$sql = 'UPDATE vendaitem SET ite_005 = :valor ';
				$sql .= 'WHERE ven_001 = :id_venda AND item_fracionado = :fracionado AND sit_001 = 4 ';
				$stm = $pdo->prepare($sql);
				$stm->bindValue(':valor', ($valor_caculo_item / $quantidadeSabores));
				$stm->bindValue(':id_venda', $id_venda);
				$stm->bindValue(':fracionado', $fracionado);
				$stm->execute();
			endif;

			foreach ($itens_fracionado as $item) :

				if (!COBRAR_MAIOR_VALOR_FRACIONADO) :
					$sql = 'UPDATE vendaitem SET ite_005 = :valor ';
					$sql .= 'WHERE ven_001 = :id_venda AND ite_001 = :item AND sit_001 = 4 ';
					$stm = $pdo->prepare($sql);
					$stm->bindValue(':valor', ($item->ite_002 * $item->ite_003));
					$stm->bindValue(':id_venda', $id_venda);
					$stm->bindValue(':item', $item->ite_001);
					$stm->execute();
				endif;

				$sql = 'SELECT id_opcional, id_vendaitem, imprime_completo FROM vendaitemopcional o INNER JOIN vendaitem i ';
				$sql .= 'ON (o.id_vendaitem = i.ite_001 AND o.id_venda = i.ven_001) ';
				$sql .= 'WHERE id_venda = :id_venda AND item_fracionado = :fracionado AND sit_001 = 4 ';
				$sql .= 'AND not o.unitario_fracao ORDER BY ite_001';
				$stm = $pdo->prepare($sql);
				$stm->bindValue(':id_venda', $id_venda);
				$stm->bindValue(':fracionado', $fracionado);
				$stm->execute();
				$opcionais = $stm->fetchAll(PDO::FETCH_OBJ);

				foreach ($opcionais as $opcional) :
					$sql = 'SELECT id_venda FROM vendaitemopcional ';
					$sql .= 'WHERE id_venda = :id_venda AND id_vendaitem = :id_vendaitem AND id_opcional = :id_opcional';
					$stm = $pdo->prepare($sql);
					$stm->bindValue(':id_venda', $id_venda);
					$stm->bindValue(':id_vendaitem', $item->ite_001);
					$stm->bindValue(':id_opcional', $opcional->id_opcional);
					$stm->execute();
					$valida_opcional = $stm->fetch(PDO::FETCH_OBJ);

					if (empty($valida_opcional)) :
						$sql = 'SELECT valor FROM opcional WHERE id_opcional = :opcional';
						$stm = $pdo->prepare($sql);
						$stm->bindValue(':opcional', $opcional->id_opcional);
						$stm->execute();
						$item_opcional = $stm->fetch(PDO::FETCH_OBJ);

						$sql = 'INSERT INTO vendaitemopcional (id_venda, id_empresa, id_vendaitem, id_opcional, imprime_completo)VALUES';
						$sql .= '(:id_venda, 1, :id_vendaitem, :id_opcional, :imprime_completo)';
						$stm = $pdo->prepare($sql);
						$stm->bindValue(':id_venda', $id_venda);
						$stm->bindValue(':id_vendaitem', $item->ite_001);
						$stm->bindValue(':id_opcional', $opcional->id_opcional);
						$stm->bindValue(':imprime_completo', $opcional->imprime_completo);
						$stm->execute();
					endif;

				endforeach;

			endforeach;

		endif;

		$valor_caculo_item = 0;
	endforeach;


	// ATUALIZA DOS TOTALIZADORES DA VENDA | VALORES DOS ACRÉSCIMOS NOS ITENS | VALORES UNITÁRIOS DOS ITENS
	$sql = 'SELECT fn_calcula_total_venda(:idvenda, :idempresa)';
	$stm = $pdo->prepare($sql);
	$stm->bindValue(':idvenda', $id_venda);
	$stm->bindValue(':idempresa', 1);
	$stm->execute();

	// ATUALIZA PENDÊNCIA DE IMPRESSÃO
	$sql =  "UPDATE vendaitem SET mobile_impressao = 'S' ";
	$sql .= "WHERE ven_001 = :venda AND origem_pedido = 'M' AND mobile_impressao = 'N'";
	$stm = $pdo->prepare($sql);
	$stm->bindValue(':venda', $id_venda);
	$retorno = $stm->execute();

	echo json_encode(['status' => 1]);

	$pdo->Commit();

	$_SESSION['IDENTIFICADOR'] = $pedido->identificador;
	// sleep(10);
	$_SESSION['VENDA']   = $id_venda;
	$_SESSION['TIPO']    = $tipo_venda;
	$_SESSION['CLIENTE'] = $cliente;
} catch (Exception $erro) {
	$pdo->rollBack();
	echo json_encode(['status' => 0, 'mensagem' => $erro->getMessage()]);
}
