@php $logoSrc = $logoEmpresaPdfSrc ?? null; $clienteNome = $locacao->cliente->razao_social ?? $locacao->cliente->nome ?? '-'; $clienteDoc = $locacao->cliente->cpf_cnpj ?? '-'; $empresaNome = $empresa->razao_social ?? $empresa->nome_empresa ?? '-'; $empresaDocumento = $empresa->cnpj ?? '-'; $inicioPeriodo = $locacao->data_inicio ? \Carbon\Carbon::parse($locacao->data_inicio) : null; if ($inicioPeriodo && !empty($locacao->hora_inicio)) { $inicioPeriodo->setTimeFromTimeString((string) $locacao->hora_inicio); } $fimPeriodo = $locacao->data_fim ? \Carbon\Carbon::parse($locacao->data_fim) : null; if ($fimPeriodo && !empty($locacao->hora_fim)) { $fimPeriodo->setTimeFromTimeString((string) $locacao->hora_fim); } $ehPorHora = (bool) ($locacao->locacao_por_hora ?? false); if (!$ehPorHora && $inicioPeriodo && $fimPeriodo) { $ehPorHora = $inicioPeriodo->format('Y-m-d') === $fimPeriodo->format('Y-m-d'); } $qtdPeriodo = $ehPorHora ? max(1, (int) ceil(($inicioPeriodo && $fimPeriodo && $fimPeriodo->gte($inicioPeriodo)) ? ($inicioPeriodo->diffInMinutes($fimPeriodo) / 60) : 1)) : max(1, (int) ($locacao->quantidade_dias ?? (($inicioPeriodo && $fimPeriodo) ? $inicioPeriodo->copy()->startOfDay()->diffInDays($fimPeriodo->copy()->startOfDay()) + 1 : 1))); $labelPeriodo = $ehPorHora ? 'hora(s)' : 'dia(s)'; $apiFilesBase = rtrim((string) config('custom.api_files_url', env('API_FILES_URL', 'https://api.gestornow.com')), '/'); $startsWith = function (string $texto, string $prefixo): bool { return strpos($texto, $prefixo) === 0; }; $resolverFotoProduto = function ($produto) use ($apiFilesBase, $locacao, $startsWith) { if (!is_object($produto)) { return null; } $fotoUrl = trim((string) ($produto->foto_url ?? '')); $fotoFilename = trim((string) ($produto->foto_filename ?? '')); if ($fotoFilename !== '') { return $apiFilesBase . '/uploads/produtos/imagens/' . (int) ($locacao->id_empresa ?? 0) . '/' . ltrim($fotoFilename, '/'); } if ($fotoUrl !== '') { if ($startsWith($fotoUrl, 'http://') || $startsWith($fotoUrl, 'https://')) { return $fotoUrl; } $path = '/' . ltrim($fotoUrl, '/'); if ($startsWith($path, '/api/produtos/imagens/')) { $path = '/uploads/produtos/imagens/' . ltrim(substr($path, strlen('/api/produtos/imagens/')), '/'); } elseif ($startsWith($path, '/produtos/imagens/')) { $path = '/uploads/produtos/imagens/' . ltrim(substr($path, strlen('/produtos/imagens/')), '/'); } elseif (!$startsWith($path, '/uploads/produtos/imagens/')) { $path = '/uploads/produtos/imagens/' . (int) ($locacao->id_empresa ?? 0) . '/' . ltrim($path, '/'); } return $apiFilesBase . $path; } return null; }; $linhas = collect(); $totalProdutosProprios = 0.0; foreach ($locacao->produtos as $item) { $qtd = max(1, (int) ($item->quantidade ?? 1)); $unit = (float) ($item->preco_unitario ?? 0); $subtotal = (bool) ($item->valor_fechado ?? false) ? (float) ($item->preco_total ?? 0) : ($unit * $qtd * $qtdPeriodo); $totalProdutosProprios += $subtotal; $linhas->push([ 'sala_id' => (int) ($item->id_sala ?? 0), 'descricao' => $item->produto->nome ?? 'Item', 'qtd' => $qtd, 'periodo' => $qtdPeriodo, 'unit' => $unit, 'subtotal' => $subtotal, 'foto' => $resolverFotoProduto($item->produto ?? null), ]); } $totalProdutosTerceiros = 0.0; foreach ($locacao->produtosTerceiros as $item) { $qtd = max(1, (int) ($item->quantidade ?? 1)); $unit = (float) ($item->preco_unitario ?? 0); $subtotal = (bool) ($item->valor_fechado ?? false) ? (float) ($item->valor_total ?? 0) : ($unit * $qtd * $qtdPeriodo); $totalProdutosTerceiros += $subtotal; $linhas->push([ 'sala_id' => (int) ($item->id_sala ?? 0), 'descricao' => $item->nome_produto ?? 'Produto de Terceiro', 'qtd' => $qtd, 'periodo' => $qtdPeriodo, 'unit' => $unit, 'subtotal' => $subtotal, 'foto' => null, ]); } $totalServicos = 0.0; foreach ($locacao->servicos as $servico) { $idSalaServico = (int) ($servico->id_sala ?? 0); if ($idSalaServico <= 0 && !empty($servico->observacoes) && preg_match('/\[GN_META\](\{.*\})/s', (string) $servico->observacoes, $metaMatch)) { $metaServico = json_decode($metaMatch[1], true); if (is_array($metaServico) && !empty($metaServico['id_sala'])) { $idSalaServico = (int) $metaServico['id_sala']; } } $qtd = max(1, (int) ($servico->quantidade ?? 1)); $unit = (float) ($servico->preco_unitario ?? 0); $subtotal = (float) ($servico->valor_total ?? ($unit * $qtd)); $totalServicos += $subtotal; $linhas->push([ 'sala_id' => $idSalaServico, 'descricao' => $servico->descricao ?? 'Serviço', 'qtd' => $qtd, 'periodo' => 1, 'unit' => $unit, 'subtotal' => $subtotal, 'foto' => null, ]); } $freteEntrega = (float) ($locacao->valor_frete_entrega ?? $locacao->valor_acrescimo ?? 0); $freteRetirada = (float) ($locacao->valor_frete_retirada ?? 0); $freteTotal = $freteEntrega + $freteRetirada; $observacoesOrcamento = trim((string) ($locacao->observacoes_orcamento ?? $locacao->observacoes ?? '')); $clausulasOrcamentoHtml = null; if (!empty($modeloDocumentoOrcamento) && method_exists($modeloDocumentoOrcamento, 'getClausulasHtmlRenderizadas')) { $clausulasOrcamentoHtml = trim((string) $modeloDocumentoOrcamento->getClausulasHtmlRenderizadas()); } $salasOrdenadas = collect($locacao->salas ?? [])->sortBy(function ($sala) { return [ (int) ($sala->ordem ?? 999999), (int) ($sala->id_sala ?? 0), ]; })->values(); $salasNome = $salasOrdenadas->mapWithKeys(function ($sala) { return [(int) ($sala->id_sala ?? 0) => ($sala->nome ?? 'Sala')]; }); $salasPosicao = $salasOrdenadas->values()->pluck('id_sala')->flip(); $linhasAgrupadas = $linhas ->sortBy(function ($linha) use ($salasPosicao) { return [ $linha['sala_id'] === 0 ? 999999 : ((int) ($salasPosicao[$linha['sala_id']] ?? 999998)), $linha['descricao'], ]; }) ->groupBy('sala_id'); $totalFinal = $totalProdutosProprios + $totalProdutosTerceiros + $totalServicos + $freteTotal - (float) ($locacao->valor_desconto ?? 0); @endphp
@if($logoSrc) @endif
Orçamento de Locação
Código: {{ $locacao->numero_contrato }}
Locadora: {{ $empresaNome }} Cliente: {{ $clienteNome }}
Documento: {{ $clienteDoc }} Período: {{ optional($locacao->data_inicio)->format('d/m/Y') }} {{ substr((string) ($locacao->hora_inicio ?? '00:00'), 0, 5) }} até {{ optional($locacao->data_fim)->format('d/m/Y') }} {{ substr((string) ($locacao->hora_fim ?? '23:59'), 0, 5) }}
Totalizando: {{ $qtdPeriodo }} {{ $labelPeriodo }} Responsável: {{ $responsavelContrato ?? ($locacao->responsavel ?? '-') }}
Itens do Orçamento
@if(!empty($imprimirComFoto)) @endif @php $temLinha = false; @endphp @foreach($linhasAgrupadas as $idSala => $linhasSala) @php $temLinha = true; $nomeSala = $idSala > 0 ? ($salasNome[$idSala] ?? ('Sala #' . $idSala)) : 'Sem sala'; @endphp @foreach($linhasSala as $linha) @if(!empty($imprimirComFoto)) @endif @endforeach @endforeach @if(!$temLinha) @endif
FotoDescrição Qtd Período Valor Unit. Subtotal
{{ $nomeSala }}
@if(!empty($linha['foto'])) Foto @else - @endif {{ $linha['descricao'] }} {{ $linha['qtd'] }} {{ $linha['periodo'] }} {{ $linha['periodo'] > 1 ? $labelPeriodo : $labelPeriodo }} R$ {{ number_format((float) $linha['unit'], 2, ',', '.') }} R$ {{ number_format((float) $linha['subtotal'], 2, ',', '.') }}
Sem itens cadastrados.
ProdutosR$ {{ number_format($totalProdutosProprios + $totalProdutosTerceiros, 2, ',', '.') }}
ServiçosR$ {{ number_format($totalServicos, 2, ',', '.') }}
Frete EntregaR$ {{ number_format($freteEntrega, 2, ',', '.') }}
Frete RetiradaR$ {{ number_format($freteRetirada, 2, ',', '.') }}
Desconto- R$ {{ number_format((float) ($locacao->valor_desconto ?? 0), 2, ',', '.') }}
Total FinalR$ {{ number_format(max(0, $totalFinal), 2, ',', '.') }}
@if($observacoesOrcamento !== '')
Observações do Orçamento
{!! nl2br(e($observacoesOrcamento)) !!}
@endif @if(!empty($clausulasOrcamentoHtml))
Cláusulas
{!! $clausulasOrcamentoHtml !!}
@endif
@if(!empty($assinaturaLocadoraPdfSrc ?? null)) Assinatura Locadora @endif
{{ $empresaNome }}
CNPJ: {{ $empresaDocumento }}
@if(!empty($assinaturaClientePdfSrc ?? null)) Assinatura Cliente @endif
{{ $clienteNome }}
CPF/CNPJ: {{ $clienteDoc }}