@extends('layouts.layoutMaster') @section('title', 'Contratos de Locação') @section('vendor-style') @endsection @section('page-style') @endsection @section('content') @php $podeCriarLocacao = \Perm::pode(auth()->user(), 'locacoes.criar'); $podeEditarLocacao = \Perm::pode(auth()->user(), 'locacoes.editar'); $podeExpedicaoLocacao = \Perm::pode(auth()->user(), 'expedicao.logistica.visualizar'); $podeContratoPdfLocacao = \Perm::pode(auth()->user(), 'locacoes.contrato-pdf'); $podeAssinaturaDigitalLocacao = \Perm::pode(auth()->user(), 'locacoes.assinatura-digital'); $podeAlterarStatusLocacao = \Perm::pode(auth()->user(), 'locacoes.alterar-status'); $podeRetornarLocacao = \Perm::pode(auth()->user(), 'locacoes.retornar'); $podeRenovarLocacao = \Perm::pode(auth()->user(), 'locacoes.renovar'); @endphp
@php $qtdTotal = (int) ($abasContagem['todos'] ?? 0); $qtdAtivos = (int) ($abasContagem['ativos'] ?? 0); $qtdVencidos = (int) ($abasContagem['vencidos'] ?? 0); $qtdFuturos = (int) ($abasContagem['futuros'] ?? 0); $qtdEncerrados = (int) ($abasContagem['encerrados'] ?? 0); $valorTotalCarteira = (float) ($abasValores['todos'] ?? 0); $valorAtivos = (float) ($abasValores['ativos'] ?? 0); $valorEncerrados = (float) ($abasValores['encerrados'] ?? 0); $percentualAtivos = $qtdTotal > 0 ? ($qtdAtivos / $qtdTotal) * 100 : 0; $percentualEncerrados = $qtdTotal > 0 ? ($qtdEncerrados / $qtdTotal) * 100 : 0; @endphp
R$ {{ number_format($valorTotalCarteira, 2, ',', '.') }}
{{ $qtdTotal }} contratos no total
Carteira Total
R$ {{ number_format($valorAtivos, 2, ',', '.') }}
{{ $qtdAtivos }} ativos ({{ number_format($percentualAtivos, 2, ',', '.') }}%)
Operação Ativa
{{ $qtdVencidos + $qtdFuturos }}
{{ $qtdVencidos }} vencidos • {{ $qtdFuturos }} futuros
Atenção de Prazo
R$ {{ number_format($valorEncerrados, 2, ',', '.') }}
{{ $qtdEncerrados }} encerrados ({{ number_format($percentualEncerrados, 2, ',', '.') }}%)
Encerrados
@if($podeContratoPdfLocacao) @endif @if($podeExpedicaoLocacao) Expedição @endif @if($podeCriarLocacao) Novo Contrato @endif
@php $totalGeral = (float) ($abasValores['todos'] ?? 0); $totalBase = $totalGeral > 0 ? $totalGeral : 1; $cardsAba = [ 'ativos' => ['label' => 'Ativos', 'badge' => 'success'], 'vencidos' => ['label' => 'Vencidos', 'badge' => 'danger'], 'futuros' => ['label' => 'Futuros', 'badge' => 'warning'], 'encerrados' => ['label' => 'Encerrados', 'badge' => 'info'], 'todos' => ['label' => 'Todos', 'badge' => 'secondary'], ]; @endphp
@foreach($cardsAba as $key => $card) @php $valorAba = (float) ($abasValores[$key] ?? 0); $qtdAba = (int) ($abasContagem[$key] ?? 0); $percentual = min(100, max(0, round(($valorAba / $totalBase) * 100, 2))); @endphp @endforeach
@forelse($locacoes as $locacao) @php $statusCor = [ 'orcamento' => 'secondary', 'aprovado' => 'success', 'cancelado' => 'danger', 'cancelada' => 'danger', 'encerrado' => 'info', ][$locacao->status] ?? 'secondary'; $venceHoje = $aba === 'ativos' && optional($locacao->data_fim)->format('Y-m-d') === $agora->format('Y-m-d'); $temPatrimonioPendente = $locacao->produtos() ->whereNotNull('id_patrimonio') ->where(function($q){ $q->whereNull('status_retorno')->orWhere('status_retorno', 'pendente'); })->exists(); $qtdPeriodo = (int) ($locacao->quantidade_dias ?? 0); $unidadePeriodo = 'dia(s)'; $dataInicioPeriodo = optional($locacao->data_inicio)->format('Y-m-d'); $dataFimPeriodo = optional($locacao->data_fim)->format('Y-m-d'); $horaInicioPeriodo = (string) ($locacao->hora_inicio ?? ''); $horaFimPeriodo = (string) ($locacao->hora_fim ?? ''); if ( $dataInicioPeriodo && $dataFimPeriodo && !empty($horaInicioPeriodo) && !empty($horaFimPeriodo) ) { $inicioHora = \Carbon\Carbon::parse($dataInicioPeriodo . ' ' . $locacao->hora_inicio); $fimHora = \Carbon\Carbon::parse($dataFimPeriodo . ' ' . $locacao->hora_fim); $diasInclusivos = max(1, $inicioHora->copy()->startOfDay()->diffInDays($fimHora->copy()->startOfDay()) + 1); $ehPorHora = $dataInicioPeriodo === $dataFimPeriodo || $qtdPeriodo > $diasInclusivos; if ($ehPorHora && $fimHora->gte($inicioHora)) { $qtdPeriodo = max(1, (int) ceil($inicioHora->diffInMinutes($fimHora) / 60)); $unidadePeriodo = 'hora(s)'; } } @endphp @empty @endforelse
Ações Editar Código Aditivo Faturado Cliente Período Status Auto-renovação Valor total
@if($podeEditarLocacao) @else - @endif {{ $locacao->codigo_display }} {{ (int) ($locacao->aditivo ?? 1) }} @if((int) ($locacao->faturamentos_ativos_count ?? 0) > 0) Sim @else Não @endif {{ $locacao->cliente->nome ?? 'N/A' }}
{{ optional($locacao->data_inicio)->format('d/m/Y') }} {{ $locacao->hora_inicio ? substr($locacao->hora_inicio,0,5) : '' }} {{ optional($locacao->data_fim)->format('d/m/Y') }} {{ $locacao->hora_fim ? substr($locacao->hora_fim,0,5) : '' }}
{{ $qtdPeriodo }} {{ $unidadePeriodo }}
{{ \App\Domain\Locacao\Models\Locacao::statusList()[$locacao->status] ?? $locacao->status }} @if((bool) ($locacao->renovacao_automatica ?? false)) Sim @else Não @endif R$ {{ number_format((float)($locacao->valor_total_listagem ?? 0), 2, ',', '.') }}
Contrato {{ $locacao->codigo_display }}
{{ $locacao->cliente->nome ?? 'N/A' }} • {{ optional($locacao->data_inicio)->format('d/m/Y') }} {{ $locacao->hora_inicio ? substr($locacao->hora_inicio,0,5) : '' }} até {{ optional($locacao->data_fim)->format('d/m/Y') }} {{ $locacao->hora_fim ? substr($locacao->hora_fim,0,5) : '' }} • R$ {{ number_format((float)($locacao->valor_total_listagem ?? 0), 2, ',', '.') }}
@if($locacao->assinaturaDigital)
{{ ($locacao->assinaturaDigital->status ?? '') === 'assinado' ? 'Contrato assinado' : 'Contrato pendente de assinatura' }}
@endif
@if($locacao->status === 'aprovado') @php $modelosContratoDropdown = $modelosContratoAtivos; $assinaturasContratoAssinadas = ($locacao->assinaturasDigitais ?? collect()) ->filter(function ($assinaturaContrato) { return ($assinaturaContrato->status ?? '') === 'assinado' && !empty($assinaturaContrato->token); }) ->sortByDesc('id_assinatura') ->values(); $assinaturaContratoPadrao = $assinaturasContratoAssinadas->first(function ($assinaturaContrato) { return empty($assinaturaContrato->id_modelo); }) ?: $assinaturasContratoAssinadas->first(); @endphp @if($podeContratoPdfLocacao || $podeAssinaturaDigitalLocacao) @endif @if($podeContratoPdfLocacao) @endif @if($podeAlterarStatusLocacao) @endif @if($podeRenovarLocacao) @endif @if(in_array($aba, ['ativos', 'vencidos'], true)) @if($podeRetornarLocacao) @endif @endif @if($podeRetornarLocacao) @endif @elseif(in_array($locacao->status, ['cancelado', 'cancelada'], true)) @if($podeAlterarStatusLocacao) @endif @elseif($locacao->status === 'encerrado') @php $modelosContratoDropdown = $modelosContratoAtivos; $assinaturasContratoAssinadas = ($locacao->assinaturasDigitais ?? collect()) ->filter(function ($assinaturaContrato) { return ($assinaturaContrato->status ?? '') === 'assinado' && !empty($assinaturaContrato->token); }) ->sortByDesc('id_assinatura') ->values(); $assinaturaContratoPadrao = $assinaturasContratoAssinadas->first(function ($assinaturaContrato) { return empty($assinaturaContrato->id_modelo); }) ?: $assinaturasContratoAssinadas->first(); @endphp @if($podeContratoPdfLocacao || $podeAssinaturaDigitalLocacao) @endif @if($podeContratoPdfLocacao) @endif @else @endif
@php $itensProprios = $locacao->produtos ?? collect(); $itensTerceiros = $locacao->produtosTerceiros ?? collect(); $itensServicos = $locacao->servicos ?? collect(); $itensDespesas = $locacao->despesas ?? collect(); $temItens = $itensProprios->count() > 0 || $itensTerceiros->count() > 0 || $itensServicos->count() > 0 || $itensDespesas->count() > 0; @endphp @if($temItens) @foreach($itensProprios as $item) @php $itemRetornado = (int) ($item->estoque_status ?? 0) === 2 || in_array($item->status_retorno, ['devolvido', 'avariado', 'extraviado'], true); $qtdItem = max(1, (int) ($item->quantidade ?? 1)); $unitItem = (float) ($item->preco_unitario ?? 0); $tipoCobrancaItem = strtolower((string) ($item->tipo_cobranca ?? 'diaria')); $valorFechadoItem = in_array($tipoCobrancaItem, ['fechado', 'valor_fechado'], true) || (int) ($item->valor_fechado ?? 0) === 1; $dataInicioItem = (string) (($item->data_saida ?? $item->data_inicio ?? $locacao->data_inicio) ?: ''); $dataFimItem = (string) (($item->data_retorno ?? $item->data_fim ?? $locacao->data_fim) ?: ''); $horaInicioItem = (string) (($item->hora_saida ?? $item->hora_inicio ?? $locacao->hora_inicio) ?: ''); $horaFimItem = (string) (($item->hora_retorno ?? $item->hora_fim ?? $locacao->hora_fim) ?: ''); $periodoItem = max(1, (int) $qtdPeriodo); if ($unidadePeriodo === 'hora(s)' && $dataInicioItem !== '' && $dataFimItem !== '' && $horaInicioItem !== '' && $horaFimItem !== '') { try { $inicioItem = \Carbon\Carbon::parse($dataInicioItem . ' ' . $horaInicioItem); $fimItem = \Carbon\Carbon::parse($dataFimItem . ' ' . $horaFimItem); if ($fimItem->gte($inicioItem)) { $periodoItem = max(1, (int) ceil($inicioItem->diffInMinutes($fimItem) / 60)); } } catch (\Throwable $e) { $periodoItem = max(1, (int) $qtdPeriodo); } } elseif ($dataInicioItem !== '' && $dataFimItem !== '') { try { $inicioItem = \Carbon\Carbon::parse($dataInicioItem); $fimItem = \Carbon\Carbon::parse($dataFimItem); $periodoItem = max(1, $inicioItem->startOfDay()->diffInDays($fimItem->startOfDay()) + 1); } catch (\Throwable $e) { $periodoItem = max(1, (int) ($item->quantidade_dias ?? $qtdPeriodo)); } } $subtotalCalculadoItem = $valorFechadoItem ? (float) ($item->preco_total ?? 0) : ($unitItem * $qtdItem * $periodoItem); @endphp @endforeach @foreach($itensTerceiros as $item) @php $qtdItem = max(1, (int) ($item->quantidade ?? 1)); $unitItem = (float) ($item->preco_unitario ?? 0); $tipoCobrancaItem = strtolower((string) ($item->tipo_cobranca ?? 'diaria')); $valorFechadoItem = in_array($tipoCobrancaItem, ['fechado', 'valor_fechado'], true) || (int) ($item->valor_fechado ?? 0) === 1; $dataInicioItem = (string) (($item->data_inicio ?? $locacao->data_inicio) ?: ''); $dataFimItem = (string) (($item->data_fim ?? $locacao->data_fim) ?: ''); $horaInicioItem = (string) (($item->hora_inicio ?? $locacao->hora_inicio) ?: ''); $horaFimItem = (string) (($item->hora_fim ?? $locacao->hora_fim) ?: ''); $periodoItem = max(1, (int) $qtdPeriodo); if ($unidadePeriodo === 'hora(s)' && $dataInicioItem !== '' && $dataFimItem !== '' && $horaInicioItem !== '' && $horaFimItem !== '') { try { $inicioItem = \Carbon\Carbon::parse($dataInicioItem . ' ' . $horaInicioItem); $fimItem = \Carbon\Carbon::parse($dataFimItem . ' ' . $horaFimItem); if ($fimItem->gte($inicioItem)) { $periodoItem = max(1, (int) ceil($inicioItem->diffInMinutes($fimItem) / 60)); } } catch (\Throwable $e) { $periodoItem = max(1, (int) $qtdPeriodo); } } elseif ($dataInicioItem !== '' && $dataFimItem !== '') { try { $inicioItem = \Carbon\Carbon::parse($dataInicioItem); $fimItem = \Carbon\Carbon::parse($dataFimItem); $periodoItem = max(1, $inicioItem->startOfDay()->diffInDays($fimItem->startOfDay()) + 1); } catch (\Throwable $e) { $periodoItem = max(1, (int) ($item->quantidade_dias ?? $qtdPeriodo)); } } $subtotalCalculadoItem = $valorFechadoItem ? (float) ($item->valor_total ?? 0) : ($unitItem * $qtdItem * $periodoItem); @endphp @endforeach @foreach($itensServicos as $item) @php $isTerceiro = (($item->tipo_item ?? 'proprio') === 'terceiro'); @endphp @endforeach @foreach($itensDespesas as $item) @endforeach @else @endif
Item Origem Qtd Período Unit. Subtotal
{{ $item->produto->nome ?? 'Produto próprio' }} @if($itemRetornado) Retornado @endif Próprio {{ $qtdItem }} {{ $periodoItem }} {{ $unidadePeriodo === 'hora(s)' ? 'hora(s)' : 'dia(s)' }} R$ {{ number_format((float) ($item->preco_unitario ?? 0), 2, ',', '.') }} R$ {{ number_format($subtotalCalculadoItem, 2, ',', '.') }}
{{ $item->produtoTerceiro->nome ?? $item->nome_produto_manual ?? 'Produto de terceiro' }} Terceiro {{ $qtdItem }} {{ $periodoItem }} {{ $unidadePeriodo === 'hora(s)' ? 'hora(s)' : 'dia(s)' }} R$ {{ number_format((float) ($item->preco_unitario ?? 0), 2, ',', '.') }} R$ {{ number_format($subtotalCalculadoItem, 2, ',', '.') }}
{{ $item->descricao ?? 'Serviço' }} {{ $isTerceiro ? 'Serv. Terceiro' : 'Serviço' }} {{ (int) ($item->quantidade ?? 1) }} 1 un. R$ {{ number_format((float) ($item->preco_unitario ?? 0), 2, ',', '.') }} R$ {{ number_format((float) ($item->valor_total ?? 0), 2, ',', '.') }}
{{ $item->descricao ?? ('Despesa ' . ucfirst((string) ($item->tipo ?? ''))) }} Despesa 1 1 un. R$ {{ number_format((float) ($item->valor ?? 0), 2, ',', '.') }} R$ {{ number_format((float) ($item->valor ?? 0), 2, ',', '.') }}
Sem itens cadastrados para esta locação.
@php $subtotalProdutos = (float) ($locacao->subtotal_produtos_listagem ?? 0); $subtotalServicos = (float) ($locacao->subtotal_servicos_listagem ?? 0); $subtotalDespesas = (float) ($locacao->subtotal_despesas_listagem ?? 0); $valorTotalBase = (float) ($locacao->valor_total_base_listagem ?? ($subtotalProdutos + $subtotalServicos)); $valorFrete = (float) ($locacao->valor_frete ?? 0); $valorAcrescimo = (float) ($locacao->valor_acrescimo ?? 0); $valorImposto = (float) ($locacao->valor_imposto ?? 0); $valorDespesasExtras = (float) ($locacao->valor_despesas_extras ?? 0); $valorDesconto = (float) ($locacao->valor_desconto ?? 0); $totalFinalExpandido = (float) ($locacao->valor_total_listagem ?? 0); @endphp
Subtotal ProdutosR$ {{ number_format($subtotalProdutos, 2, ',', '.') }}
Subtotal ServiçosR$ {{ number_format($subtotalServicos, 2, ',', '.') }}
Despesas OperacionaisR$ {{ number_format($subtotalDespesas, 2, ',', '.') }}
Valor Total (base)R$ {{ number_format($valorTotalBase, 2, ',', '.') }}
FreteR$ {{ number_format($valorFrete, 2, ',', '.') }}
AcréscimoR$ {{ number_format($valorAcrescimo, 2, ',', '.') }}
ImpostoR$ {{ number_format($valorImposto, 2, ',', '.') }}
Despesas ExtrasR$ {{ number_format($valorDespesasExtras, 2, ',', '.') }}
Desconto- R$ {{ number_format($valorDesconto, 2, ',', '.') }}
Total FinalR$ {{ number_format($totalFinalExpandido, 2, ',', '.') }}
Nenhum contrato encontrado.
@if(method_exists($locacoes, 'links') && $locacoes->total() > 0)
Mostrando {{ $locacoes->firstItem() }} até {{ $locacoes->lastItem() }} de {{ $locacoes->total() }} registros
{{ $locacoes->links() }}
@endif
@endsection @section('vendor-script') @endsection @section('page-script') @endsection