529 lines
20 KiB
PHP
529 lines
20 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Reserva;
|
|
use App\Models\Acomodacao;
|
|
use App\Models\HospedeReserva;
|
|
use App\Models\ConsumoReserva;
|
|
use App\Models\NotasReserva;
|
|
use App\Models\FaturaReserva;
|
|
use App\Models\ServicoReserva;
|
|
use App\Models\Servico;
|
|
use App\Models\Empresa;
|
|
use App\Models\Cliente;
|
|
use App\Models\Cidade;
|
|
use App\Models\ContaReceber;
|
|
use App\Models\Nfe;
|
|
use App\Models\PadraoFrigobar;
|
|
use App\Models\Transportadora;
|
|
use App\Models\NaturezaOperacao;
|
|
use Illuminate\Support\Str;
|
|
use Dompdf\Dompdf;
|
|
|
|
class ReservaController extends Controller
|
|
{
|
|
public function __construct()
|
|
{
|
|
$this->middleware('permission:reserva_create', ['only' => ['create', 'store']]);
|
|
$this->middleware('permission:reserva_edit', ['only' => ['edit', 'update']]);
|
|
$this->middleware('permission:reserva_view', ['only' => ['show', 'index']]);
|
|
$this->middleware('permission:reserva_delete', ['only' => ['destroy']]);
|
|
}
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$start_date = $request->get('start_date');
|
|
$end_date = $request->get('end_date');
|
|
$cliente_id = $request->get('cliente_id');
|
|
$estado = $request->get('estado');
|
|
|
|
$data = Reserva::where('empresa_id', request()->empresa_id)
|
|
->when(!empty($start_date), function ($query) use ($start_date) {
|
|
return $query->whereDate('created_at', '>=', $start_date);
|
|
})
|
|
->when(!empty($end_date), function ($query) use ($end_date) {
|
|
return $query->whereDate('created_at', '<=', $end_date);
|
|
})
|
|
->when(!empty($cliente_id), function ($query) use ($cliente_id) {
|
|
return $query->where('cliente_id', $cliente_id);
|
|
})
|
|
->when($estado != "", function ($query) use ($estado) {
|
|
return $query->where('estado', $estado);
|
|
})
|
|
->orderBy('id', 'desc')
|
|
->paginate(__itensPagina());
|
|
|
|
return view('reservas.index', compact('data'));
|
|
}
|
|
|
|
public function create(){
|
|
return view('reservas.create');
|
|
}
|
|
|
|
public function store(Request $request){
|
|
$acomodacao = Acomodacao::findOrFail($request->acomodacao_id);
|
|
try{
|
|
|
|
$last = Reserva::where('empresa_id', $request->empresa_id)
|
|
->orderBy('numero_sequencial', 'desc')->first();
|
|
$codigo = Str::random(25);
|
|
$reserva = Reserva::create([
|
|
'empresa_id' => $request->empresa_id,
|
|
'cliente_id' => $request->cliente_id,
|
|
'acomodacao_id' => $request->acomodacao_id,
|
|
'data_checkin' => $request->data_checkin,
|
|
'data_checkout' => $request->data_checkout,
|
|
'valor_estadia' => __convert_value_bd($request->valor_estadia),
|
|
'observacao' => $request->observacao ?? '',
|
|
'estado' => 'pendente',
|
|
'valor_total' => __convert_value_bd($request->valor_estadia),
|
|
'codigo_reseva' => $codigo,
|
|
'link_externo' => env("APP_URL") . "/reserva-cliente/$codigo",
|
|
'total_hospedes' => $request->qtd_hospedes,
|
|
'numero_sequencial' => $last != null ? ($last->numero_sequencial+1) : 1
|
|
]);
|
|
|
|
for($i=0; $i<$request->qtd_hospedes; $i++){
|
|
$hospede = HospedeReserva::create([
|
|
'reserva_id' => $reserva->id,
|
|
'descricao' => 'Hóspede #'.$i+1
|
|
]);
|
|
|
|
if($i == 0){
|
|
$cliente = Cliente::find($request->cliente_id);
|
|
$hospede->nome_completo = $cliente->razao_social;
|
|
$hospede->cpf = $cliente->cpf_cnpj;
|
|
$hospede->rua = $cliente->rua;
|
|
$hospede->numero = $cliente->numero;
|
|
$hospede->bairro = $cliente->bairro;
|
|
$hospede->cidade_id = $cliente->cidade_id;
|
|
$hospede->telefone = $cliente->telefone;
|
|
$hospede->cep = $cliente->cep;
|
|
$hospede->email = $cliente->email;
|
|
|
|
$hospede->save();
|
|
}
|
|
}
|
|
session()->flash("flash_success", "Reserva criada com sucesso!");
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
return redirect()->route('reservas.index');
|
|
|
|
}
|
|
|
|
public function imprimir($id){
|
|
$item = Reserva::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
$config = Empresa::where('id', $item->empresa_id)->first();
|
|
|
|
$p = view('reservas.imprimir', compact('config', 'item'));
|
|
|
|
$domPdf = new Dompdf(["enable_remote" => true]);
|
|
$domPdf->loadHtml($p);
|
|
$pdf = ob_get_clean();
|
|
$domPdf->setPaper("A4");
|
|
$domPdf->render();
|
|
$domPdf->stream("Reserva #$item->numero_sequencial.pdf", array("Attachment" => false));
|
|
}
|
|
|
|
public function show($id){
|
|
$item = Reserva::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
|
|
return view('reservas.show', compact('item'));
|
|
}
|
|
|
|
public function checkin($id){
|
|
$item = Reserva::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
|
|
return view('reservas.checkin', compact('item'));
|
|
}
|
|
|
|
public function checkinStart(Request $request, $id){
|
|
$item = Reserva::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
|
|
try{
|
|
|
|
for($i=0; $i<sizeof($request->nome_completo); $i++){
|
|
$hospede = HospedeReserva::findOrFail($request->hospede_id[$i]);
|
|
|
|
$hospede->nome_completo = $request->nome_completo[$i];
|
|
$hospede->cpf = $request->cpf[$i];
|
|
$hospede->cep = $request->cep[$i];
|
|
$hospede->rua = $request->rua[$i];
|
|
$hospede->numero = $request->numero[$i];
|
|
$hospede->bairro = $request->bairro[$i];
|
|
$hospede->cidade_id = $request->cidade_id[$i];
|
|
$hospede->telefone = $request->telefone[$i];
|
|
$hospede->email = $request->email[$i];
|
|
|
|
$hospede->save();
|
|
|
|
}
|
|
|
|
$item->data_checkin_realizado = date('Y-m-d H:i:s');
|
|
$item->estado = 'iniciado';
|
|
$item->save();
|
|
session()->flash("flash_success", "Checkin realizado com sucesso!");
|
|
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
return redirect()->route('reservas.show', $id);
|
|
}
|
|
|
|
public function storeProduto(Request $request, $id){
|
|
$item = Reserva::findOrFail($id);
|
|
try{
|
|
ConsumoReserva::create([
|
|
'reserva_id' => $item->id,
|
|
'produto_id' => $request->produto_id,
|
|
'quantidade' => __convert_value_bd($request->quantidade_produto),
|
|
'valor_unitario' => __convert_value_bd($request->valor_unitario_produto),
|
|
'sub_total' => __convert_value_bd($request->sub_total_produto),
|
|
'observacao' => $request->observacao ?? '',
|
|
'frigobar' => $request->frigobar
|
|
]);
|
|
session()->flash("flash_success", "Produto adicionado com sucesso!");
|
|
$this->atualizaTotais($item->id);
|
|
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
return redirect()->route('reservas.show', [$id]);
|
|
}
|
|
|
|
public function storeServico(Request $request, $id){
|
|
$item = Reserva::findOrFail($id);
|
|
try{
|
|
ServicoReserva::create([
|
|
'reserva_id' => $item->id,
|
|
'servico_id' => $request->servico_id,
|
|
'quantidade' => __convert_value_bd($request->quantidade_servico),
|
|
'valor_unitario' => __convert_value_bd($request->valor_unitario_servico),
|
|
'sub_total' => __convert_value_bd($request->sub_total_servico),
|
|
'observacao' => $request->observacao ?? '',
|
|
]);
|
|
session()->flash("flash_success", "Serviço adicionado com sucesso!");
|
|
$this->atualizaTotais($item->id);
|
|
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
return redirect()->route('reservas.show', [$id . '#table-servicos']);
|
|
}
|
|
|
|
public function storeNota(Request $request, $id){
|
|
$item = Reserva::findOrFail($id);
|
|
try{
|
|
NotasReserva::create([
|
|
'reserva_id' => $item->id,
|
|
'texto' => $request->texto,
|
|
]);
|
|
session()->flash("flash_success", "Nota adicionada com sucesso!");
|
|
$this->atualizaTotais($item->id);
|
|
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
return redirect()->route('reservas.show', [$id . '#table-notas']);
|
|
}
|
|
|
|
public function cancelamento(Request $request, $id){
|
|
$item = Reserva::findOrFail($id);
|
|
try{
|
|
$item->estado = 'cancelado';
|
|
$item->valor_total = __convert_value_bd($request->valor_total);
|
|
$item->motivo_cancelamento = $request->motivo_cancelamento;
|
|
$item->save();
|
|
session()->flash("flash_success", "Reserva cancelada com sucesso!");
|
|
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function destroy($id)
|
|
{
|
|
$item = Reserva::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
try {
|
|
$item->consumoProdutos()->delete();
|
|
$item->consumoServicos()->delete();
|
|
$item->notas()->delete();
|
|
$item->hospedes()->delete();
|
|
$item->delete();
|
|
|
|
session()->flash("flash_success", "Reserva removida com sucesso!");
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
return redirect()->route('reservas.index');
|
|
}
|
|
|
|
public function destroyProduto($id)
|
|
{
|
|
$item = ConsumoReserva::findOrFail($id);
|
|
$reservaId = $item->reserva_id;
|
|
try {
|
|
|
|
$item->delete();
|
|
session()->flash("flash_success", "Produto removido com sucesso!");
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
$this->atualizaTotais($reservaId);
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function destroyNota($id)
|
|
{
|
|
$item = NotasReserva::findOrFail($id);
|
|
$reservaId = $item->reserva_id;
|
|
try {
|
|
|
|
$item->delete();
|
|
session()->flash("flash_success", "Nota removida com sucesso!");
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
return redirect()->route('reservas.show', [$reservaId . '#table-notas']);
|
|
}
|
|
|
|
public function destroyServico($id)
|
|
{
|
|
$item = ServicoReserva::findOrFail($id);
|
|
$reservaId = $item->reserva_id;
|
|
try {
|
|
|
|
$item->delete();
|
|
session()->flash("flash_success", "Serviço removido com sucesso!");
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
$this->atualizaTotais($reservaId);
|
|
return redirect()->route('reservas.show', [$reservaId . '#table-servicos']);
|
|
|
|
}
|
|
|
|
private function atualizaTotais($reservaId){
|
|
$item = Reserva::findOrFail($reservaId);
|
|
|
|
$item->valor_total = $item->valor_estadia + $item->consumoProdutos->sum('sub_total')
|
|
+ $item->consumoServicos->sum('sub_total') + $item->valor_outros - $item->desconto;
|
|
$item->save();
|
|
}
|
|
|
|
public function updateHospedes(Request $request, $id){
|
|
$item = Reserva::findOrFail($id);
|
|
try{
|
|
|
|
for($i=0; $i<sizeof($request->nome_completo); $i++){
|
|
$hospede = HospedeReserva::findOrFail($request->hospede_id[$i]);
|
|
|
|
$hospede->nome_completo = $request->nome_completo[$i];
|
|
$hospede->cpf = $request->cpf[$i];
|
|
$hospede->cep = $request->cep[$i];
|
|
$hospede->rua = $request->rua[$i];
|
|
$hospede->numero = $request->numero[$i];
|
|
$hospede->bairro = $request->bairro[$i];
|
|
$hospede->cidade_id = $request->cidade_id[$i];
|
|
$hospede->telefone = $request->telefone[$i];
|
|
$hospede->email = $request->email[$i];
|
|
|
|
$hospede->save();
|
|
}
|
|
|
|
session()->flash("flash_success", "Dados dos hóspede(s) atualizados!");
|
|
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
return redirect()->back();
|
|
|
|
}
|
|
|
|
public function storeFatura(Request $request, $id){
|
|
$item = Reserva::findOrFail($id);
|
|
try{
|
|
|
|
$caixa = __isCaixaAberto();
|
|
if($caixa == null){
|
|
session()->flash("flash_error", 'É necessário o caixa estar aberto para definir fatura!');
|
|
return redirect()->back();
|
|
}
|
|
|
|
$item->desconto = __convert_value_bd($request->desconto);
|
|
$item->valor_outros = __convert_value_bd($request->valor_outros);
|
|
$item->save();
|
|
foreach($item->fatura as $f){
|
|
if($f->contaReceber){
|
|
$f->contaReceber->delete();
|
|
}
|
|
$f->delete();
|
|
}
|
|
|
|
for($i=0; $i<sizeof($request->tipo_pagamento); $i++){
|
|
$fatura = FaturaReserva::create([
|
|
'reserva_id' => $item->id,
|
|
'tipo_pagamento' => $request->tipo_pagamento[$i],
|
|
'data_vencimento' => $request->data_vencimento[$i],
|
|
'valor' => __convert_value_bd($request->valor[$i])
|
|
]);
|
|
if($request->gerar_conta_receber){
|
|
$descricao = "Reserva #".$item->numero_sequencial." - Parcela " .($i+1)." de " . sizeof($request->tipo_pagamento)+1;
|
|
|
|
$data = [
|
|
'venda_id' => null,
|
|
'data_vencimento' => $request->data_vencimento[$i],
|
|
'valor_integral' => __convert_value_bd($request->valor[$i]),
|
|
'valor_recebido' => 0,
|
|
'descricao' => $descricao,
|
|
'status' => 0,
|
|
'empresa_id' => $request->empresa_id,
|
|
'cliente_id' => $item->cliente_id,
|
|
'tipo_pagamento' => $request->tipo_pagamento[$i],
|
|
'local_id' => $caixa->local_id,
|
|
];
|
|
$conta = ContaReceber::create($data);
|
|
|
|
$fatura->conta_receber_id = $conta->id;
|
|
$fatura->save();
|
|
}
|
|
}
|
|
|
|
$this->atualizaTotais($item->id);
|
|
|
|
session()->flash("flash_success", "Fatura gerada!");
|
|
} catch (\Exception $e) {
|
|
echo $e->getMessage();
|
|
die;
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function gerarNfe($id)
|
|
{
|
|
$item = Reserva::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
|
|
$cliente = $item->cliente;
|
|
|
|
$cidades = Cidade::all();
|
|
$transportadoras = Transportadora::where('empresa_id', request()->empresa_id)->get();
|
|
|
|
$naturezas = NaturezaOperacao::where('empresa_id', request()->empresa_id)->get();
|
|
if (sizeof($naturezas) == 0) {
|
|
session()->flash("flash_warning", "Primeiro cadastre um natureza de operação!");
|
|
return redirect()->route('natureza-operacao.create');
|
|
}
|
|
// $produtos = Produto::where('empresa_id', request()->empresa_id)->get();
|
|
$empresa = Empresa::findOrFail(request()->empresa_id);
|
|
|
|
$caixa = __isCaixaAberto();
|
|
if (!__isCaixaAberto()) {
|
|
session()->flash("flash_warning", "Abrir caixa antes de continuar!");
|
|
return redirect()->route('caixa.create');
|
|
}
|
|
$empresa = __objetoParaEmissao($empresa, $caixa->local_id);
|
|
|
|
$numeroNfe = Nfe::lastNumero($empresa);
|
|
|
|
$item->itens = $item->consumoProdutos;
|
|
|
|
$item->fatura = [];
|
|
$isReserva = 1;
|
|
return view('nfe.create', compact('item', 'cidades', 'transportadoras', 'naturezas', 'isReserva', 'numeroNfe',
|
|
'caixa'));
|
|
}
|
|
|
|
public function gerarNfse($id){
|
|
|
|
$reserva = Reserva::findOrFail($id);
|
|
__validaObjetoEmpresa($reserva);
|
|
|
|
$servicoPadrao = Servico::where('empresa_id', $reserva->empresa_id)
|
|
->where('padrao_reserva_nfse', 1)->first();
|
|
|
|
if($servicoPadrao == null){
|
|
session()->flash("flash_warning", 'Cadastre um serviço Padrão reserva NFSe!');
|
|
return redirect()->route('servicos.create');
|
|
}
|
|
|
|
$total = $reserva->valor_estadia + $reserva->consumoServicos->sum('sub_total');
|
|
$descricaoServico = "Reserva de acomodação " . $reserva->acomodacao->info . ", ";
|
|
foreach($reserva->consumoServicos as $s){
|
|
$descricaoServico .= " " . $s->servico->nome . ", ";
|
|
}
|
|
$descricaoServico = substr($descricaoServico, 0, strlen($descricaoServico)-2);
|
|
return view('nota_servico.create', compact('reserva', 'total', 'descricaoServico', 'servicoPadrao'));
|
|
}
|
|
|
|
public function conferirFrigobar(Request $request, $id){
|
|
$item = Reserva::findOrFail($id);
|
|
$frigobar = $item->acomodacao->frigobar;
|
|
if($frigobar == null){
|
|
session()->flash("flash_warning", 'Acomodação sem nenhum frigobar associado!');
|
|
return redirect()->back();
|
|
}
|
|
return view('reservas.conferir_frigobar', compact('item', 'frigobar'));
|
|
|
|
}
|
|
|
|
public function updateEstado(Request $request, $id){
|
|
$item = Reserva::findOrFail($id);
|
|
__validaObjetoEmpresa($item);
|
|
try{
|
|
$item->estado = $request->estado;
|
|
$item->save();
|
|
session()->flash("flash_success", "Estado alterado!");
|
|
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
}
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function conferenciaFrigobarSave(Request $request, $id){
|
|
$item = Reserva::findOrFail($id);
|
|
try{
|
|
$cont = 0;
|
|
for($i=0; $i<sizeof($request->item_id); $i++){
|
|
if(__convert_value_bd($request->quantidade[$i]) > 0){
|
|
$qtd = __convert_value_bd($request->quantidade[$i]);
|
|
$valor = __convert_value_bd($request->valor_unitario[$i]);
|
|
$itemFrigobar = PadraoFrigobar::findOrFail($request->item_id[$i]);
|
|
|
|
ConsumoReserva::create([
|
|
'reserva_id' => $item->id,
|
|
'produto_id' => $itemFrigobar->produto_id,
|
|
'quantidade' => $qtd,
|
|
'valor_unitario' => $valor,
|
|
'sub_total' => $valor * $qtd,
|
|
'observacao' => '',
|
|
'frigobar' => 1
|
|
]);
|
|
$cont++;
|
|
|
|
}
|
|
}
|
|
$item->conferencia_frigobar = 1;
|
|
$item->save();
|
|
session()->flash("flash_success", "Frigobar conferido, $cont itens adicionados no consumo da reserva!");
|
|
return redirect()->route('reservas.show', [$item->id]);
|
|
} catch (\Exception $e) {
|
|
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
|
|
return redirect()->back();
|
|
}
|
|
|
|
}
|
|
|
|
}
|