setDay(1)->setTime(0, 0, 0); $mesFechado = BalanceteFechamento::where('ano', $data->year) ->where('mes', (int) $data->month) ->exists(); if (!$mesFechado) { $primeiroBalancete = BalanceteFechamento::orderBy('ano')->orderBy('mes')->first(); if (!is_null($primeiroBalancete)) { $dataPrimeiroBalancete = Carbon::create($primeiroBalancete->ano, $primeiroBalancete->mes); $mesFechado = $data <= $dataPrimeiroBalancete; } } return [ 'mes_fechado' => $mesFechado ]; } public static function index() { $periodo = [ 'inicio' => Carbon::createFromFormat('d/m/Y', request()->inicio)->setTime(0, 0, 0), 'fim' => Carbon::createFromFormat('d/m/Y', request()->fim)->setTime(23, 59, 59), ]; $balancete = self::getBalancete($periodo, request()->grupo_id, request()->subgrupo_id, request()->origem_programatica_id); self::formatarSaldos($balancete); return $balancete; } public static function formatarSaldos($balancete) { $balancete['por_material']->each(function ($balancete) { $balancete->saldo_anterior_financeiro = self::getSaldoFormatado($balancete->saldo_anterior_financeiro); $balancete->saldo_entrada_financeiro = self::getSaldoFormatado($balancete->saldo_entrada_financeiro); $balancete->saldo_saida_financeiro = self::getSaldoFormatado($balancete->saldo_saida_financeiro); $balancete->saldo_atual_financeiro = self::getSaldoFormatado($balancete->saldo_atual_financeiro); unset($balancete->grupo_id, $balancete->subgrupo_id); }); $balancete['por_subgrupo']->each(function ($balancete) { $balancete->saldo_anterior_financeiro = self::getSaldoFormatado($balancete->saldo_anterior_financeiro); $balancete->saldo_entrada_financeiro = self::getSaldoFormatado($balancete->saldo_entrada_financeiro); $balancete->saldo_saida_financeiro = self::getSaldoFormatado($balancete->saldo_saida_financeiro); $balancete->saldo_atual_financeiro = self::getSaldoFormatado($balancete->saldo_atual_financeiro); unset($balancete->grupo_id, $balancete->subgrupo_id); }); $balancete['por_grupo']->each(function ($balancete) { $balancete->saldo_anterior_financeiro = self::getSaldoFormatado($balancete->saldo_anterior_financeiro); $balancete->saldo_entrada_financeiro = self::getSaldoFormatado($balancete->saldo_entrada_financeiro); $balancete->saldo_saida_financeiro = self::getSaldoFormatado($balancete->saldo_saida_financeiro); $balancete->saldo_atual_financeiro = self::getSaldoFormatado($balancete->saldo_atual_financeiro); unset($balancete->grupo_id); }); $balancete['totalizadores']['saldo_anterior_financeiro'] = self::getSaldoFormatado( $balancete['totalizadores']['saldo_anterior_financeiro'] ); $balancete['totalizadores']['saldo_entrada_financeiro'] = self::getSaldoFormatado( $balancete['totalizadores']['saldo_entrada_financeiro'] ); $balancete['totalizadores']['saldo_saida_financeiro'] = self::getSaldoFormatado( $balancete['totalizadores']['saldo_saida_financeiro'] ); $balancete['totalizadores']['saldo_atual_financeiro'] = self::getSaldoFormatado( $balancete['totalizadores']['saldo_atual_financeiro'] ); } private static function getSaldoFormatado($valor) { $precisao = 2; $fator = (int) str_pad('1', $precisao + 1, '0'); return number_format(floor($valor * $fator) / $fator, $precisao, ',', '.'); } public static function list() { $dataUltimoBalanceteFechado = self::getDataUltimoBalanceteFechado(); $dataBalanceteAberto = self::getDataBalanceteAberto(); if (!is_null($dataUltimoBalanceteFechado)) { $dataUltimoBalanceteFechado = $dataUltimoBalanceteFechado->translatedFormat('F \de Y'); } return [ 'additionals' => [ 'data_atual' => Carbon::now()->format('d/m/Y'), 'data_ultimo_balancete_fechado' => $dataUltimoBalanceteFechado, 'data_balancete_aberto' => self::getDataBalanceteAberto()->translatedFormat('F \de Y'), 'permite_fechar' => !$dataBalanceteAberto->isCurrentMonth(), ], 'form' => [ 'grupos' => Grupo::orderBy('nome') ->get() ->map(fn ($grupo) => [ 'id' => $grupo->id, 'nome' => $grupo->nome, 'subgrupos' => $grupo->subgrupos() ->orderBy('nome') ->get(['id', 'nome']) ]), 'origens_programaticas' => OrigemProgramatica::orderBy('nome')->get(['id', 'nome']), ], 'model' => [ 'periodo' => [ 'start' => null, 'end' => null, ], 'grupo_id' => null, 'subgrupo_id' => null, 'origem_programatica_id' => null, ], ]; } public static function store() { $dataBalanceteAberto = self::getDataBalanceteAberto(); $saldo = self::getSaldo($dataBalanceteAberto); if ($dataBalanceteAberto->isCurrentMonth()) { throw new FechamentoBalanceteNaoPermitidoException; } return BalanceteFechamento::create([ 'mes' => $dataBalanceteAberto->month, 'ano' => $dataBalanceteAberto->year, 'saldo_fisico' => $saldo['fisico'], 'saldo_financeiro' => $saldo['financeiro'], ]); } private static function getSaldo($dataBalanceteAberto) { $totais = self::getBalancete([ 'inicio' => $dataBalanceteAberto->modify('first day of this month')->setTime(0, 0, 0), 'fim' => $dataBalanceteAberto->copy()->modify('last day of this month')->setTime(23, 59, 59), ])['totalizadores']; return [ 'fisico' => $totais['saldo_atual_fisico'], 'financeiro' => $totais['saldo_atual_financeiro'], ]; } public static function getBalancete($periodo, $grupoId = null, $subgrupoId = null, $origemProgramaticaId = null) { $inicio = $periodo['inicio']; $fim = $periodo['fim']; $periodo = [$inicio, $fim]; $totalizadores = collect([ 'saldo_anterior_fisico' => 0, 'saldo_anterior_financeiro' => 0.0, 'saldo_entrada_fisico' => 0, 'saldo_entrada_financeiro' => 0.0, 'saldo_saida_fisico' => 0, 'saldo_saida_financeiro' => 0.0, 'saldo_atual_fisico' => 0, 'saldo_atual_financeiro' => 0.0, ]); $balancetePorGrupo = collect(); $balancetePorSubgrupo = collect(); $balancetePorMaterial = DB::table('cadastro_material as material') ->join('cadastro_apresentacao as apresentacao', 'apresentacao.id', 'material.apresentacao_id') ->join('cadastro_grupo as grupo', 'grupo.id', 'material.grupo_id') ->leftJoin( 'cadastro_unidade_medida as apresentacao_unidade_medida', 'apresentacao_unidade_medida.id', 'material.apresentacao_unidade_medida_id' ) ->leftJoin('cadastro_subgrupo as subgrupo', 'subgrupo.id', 'material.subgrupo_id') ->whereNull('material.deleted_at') ->when($grupoId, fn ($q, $id) => $q->where('material.grupo_id', $id)) ->when($subgrupoId, fn ($q, $id) => $q->where('material.subgrupo_id', $id)) ->where(function ($query) use ($periodo, $origemProgramaticaId, $inicio) { $query ->whereExists(function ($query) use ($periodo, $origemProgramaticaId) { $query->select(DB::raw(1)) ->from('almoxarifado_entrada_item as entrada_item') ->join('almoxarifado_entrada as entrada', 'entrada.id', 'entrada_item.entrada_id') ->whereColumn('entrada_item.material_id', 'material.id') ->where('entrada.finalizada', true) ->where(function ($query) use ($periodo, $origemProgramaticaId) { $query ->whereExists(function ($query) use ($periodo, $origemProgramaticaId) { $query->select(DB::raw(1)) ->from('almoxarifado_entrada_documento as documento') ->whereColumn('documento.entrada_id', 'entrada.id') ->whereBetween('documento.data', $periodo) ->when($origemProgramaticaId, fn ($q, $id) => $q->where('documento.origem_programatica_id', $id)); }) ->when(is_null($origemProgramaticaId), function ($query) use ($periodo) { $query ->orWhere(function ($query) use ($periodo) { $query ->whereNotExists(function ($query) { $query->select(DB::raw(1)) ->from('almoxarifado_entrada_documento as documento') ->whereColumn('documento.entrada_id', 'entrada.id'); }) ->whereBetween('entrada.created_at', $periodo); }); }); }); }) ->orWhereExists(function ($query) use ($periodo, $origemProgramaticaId) { $query->select(DB::raw(1)) ->from('almoxarifado_saida_item as saida_item') ->join('almoxarifado_saida as saida', 'saida.id', 'saida_item.saida_id') ->whereColumn('saida_item.material_id', 'material.id') ->where('saida.finalizada', true) ->whereBetween('saida.created_at', $periodo) ->when(!is_null($origemProgramaticaId), function ($query) use ($origemProgramaticaId) { $query->whereExists(fn ($q) => $q ->selectRaw(1) ->from('almoxarifado_saida_item_entrada_item as saida_item_entrada_item') ->join('almoxarifado_entrada_item as entrada_item', 'entrada_item.id', 'saida_item_entrada_item.entrada_item_id') ->join('almoxarifado_entrada as entrada', 'entrada.id', 'entrada_item.entrada_id') ->join('almoxarifado_entrada_documento as entrada_documento', 'entrada_documento.entrada_id', 'entrada.id') ->whereColumn('saida_item_entrada_item.saida_item_id', 'saida_item.id') ->where('entrada_documento.origem_programatica_id', $origemProgramaticaId) ); }); }) ->orWhereExists(function ($query) use ($inicio, $origemProgramaticaId) { $query->select(DB::raw(1)) ->from('almoxarifado_entrada_item as entrada_item') ->join('almoxarifado_entrada as entrada', 'entrada.id', 'entrada_item.entrada_id') ->whereColumn('entrada_item.material_id', 'material.id') ->where('entrada.finalizada', true) ->where(function ($q) use ($inicio, $origemProgramaticaId) { $q->whereExists(function ($q2) use ($inicio, $origemProgramaticaId) { $q2->select(DB::raw(1)) ->from('almoxarifado_entrada_documento as documento') ->whereColumn('documento.entrada_id', 'entrada.id') ->where('documento.data', '<', $inicio) ->when($origemProgramaticaId, fn ($f, $id) => $f->where('documento.origem_programatica_id', $id) ); }) ->when(is_null($origemProgramaticaId), function ($q2) use ($inicio) { $q2->orWhere(function ($q3) use ($inicio) { $q3->whereNotExists(function ($q4) { $q4->select(DB::raw(1)) ->from('almoxarifado_entrada_documento as documento') ->whereColumn('documento.entrada_id', 'entrada.id'); }) ->where('entrada.created_at', '<', $inicio); }); }); }); }); }) ->select( 'material.codigo_material as material_codigo', DB::raw(MaterialService::getDescricaoCompletaRaw( 'material', 'apresentacao', 'apresentacao_unidade_medida' ) . " as material_descricao"), 'grupo.id as grupo_id', 'grupo.nome as grupo_nome', 'subgrupo.id as subgrupo_id', 'subgrupo.nome as subgrupo_nome' ) ->addSelect([ 'saldo_anterior_fisico' => function ($query) use ($inicio, $origemProgramaticaId) { $query->selectRaw("COALESCE(( SELECT SUM(entrada_item.quantidade - COALESCE(( SELECT SUM(COALESCE(saida_item_entrada_item.quantidade_saida, 0)) FROM almoxarifado_saida_item_entrada_item AS saida_item_entrada_item WHERE saida_item_entrada_item.entrada_item_id = entrada_item.id AND EXISTS ( SELECT 1 FROM almoxarifado_saida_item AS saida_item JOIN almoxarifado_saida AS saida ON saida.id = saida_item.saida_id WHERE saida_item.id = saida_item_entrada_item.saida_item_id AND saida.finalizada = 1 AND saida.created_at < '{$inicio}' ) ), 0)) FROM almoxarifado_entrada_item AS entrada_item JOIN almoxarifado_entrada AS entrada ON entrada.id = entrada_item.entrada_id WHERE entrada_item.material_id = material.id AND entrada.finalizada = 1 AND ( EXISTS ( SELECT 1 FROM almoxarifado_entrada_documento AS documento WHERE documento.entrada_id = entrada.id AND documento.data < '{$inicio}' AND documento.data IS NOT NULL " . (is_null($origemProgramaticaId) ? '' : "AND documento.origem_programatica_id = {$origemProgramaticaId}") . " ) " . (is_null($origemProgramaticaId) ? "or ( NOT EXISTS ( SELECT 1 FROM almoxarifado_entrada_documento AS documento WHERE documento.entrada_id = entrada.id AND documento.data IS NOT NULL ) AND entrada.created_at < '{$inicio}' )" : '') . " ) ), 0)"); }, 'saldo_anterior_financeiro' => function ($query) use ($inicio, $origemProgramaticaId) { $query->selectRaw("COALESCE(( SELECT SUM((entrada_item.quantidade * entrada_item.valor_unitario) - COALESCE(( SELECT SUM(COALESCE(saida_item_entrada_item.quantidade_saida * entrada_item.valor_unitario, 0)) FROM almoxarifado_saida_item_entrada_item AS saida_item_entrada_item WHERE saida_item_entrada_item.entrada_item_id = entrada_item.id AND EXISTS ( SELECT 1 FROM almoxarifado_saida_item AS saida_item JOIN almoxarifado_saida AS saida ON saida.id = saida_item.saida_id WHERE saida_item.id = saida_item_entrada_item.saida_item_id AND saida.finalizada = 1 AND saida.created_at < '{$inicio}' ) ), 0)) FROM almoxarifado_entrada_item AS entrada_item JOIN almoxarifado_entrada AS entrada ON entrada.id = entrada_item.entrada_id WHERE entrada_item.material_id = material.id AND entrada.finalizada = 1 AND ( EXISTS ( SELECT 1 FROM almoxarifado_entrada_documento AS documento WHERE documento.entrada_id = entrada.id AND documento.data < '{$inicio}' AND documento.data IS NOT NULL " . (is_null($origemProgramaticaId) ? '' : "AND documento.origem_programatica_id = {$origemProgramaticaId}") . " ) " . (is_null($origemProgramaticaId) ? "or ( NOT EXISTS ( SELECT 1 FROM almoxarifado_entrada_documento AS documento WHERE documento.entrada_id = entrada.id AND documento.data IS NOT NULL ) AND entrada.created_at < '{$inicio}' )" : '') . " ) ), 0)"); }, 'saldo_entrada_fisico' => function ($query) use ($periodo, $origemProgramaticaId) { $query->select(DB::raw('COALESCE(SUM(entrada_item.quantidade), 0)')) ->from('almoxarifado_entrada_item as entrada_item') ->join('almoxarifado_entrada as entrada', 'entrada.id', 'entrada_item.entrada_id') ->whereColumn('entrada_item.material_id', 'material.id') ->where('entrada.finalizada', true) ->where(function ($query) use ($periodo, $origemProgramaticaId) { $query ->whereExists(function ($query) use ($periodo, $origemProgramaticaId) { $query->select(DB::raw(1)) ->from('almoxarifado_entrada_documento as documento') ->whereColumn('documento.entrada_id', 'entrada.id') ->whereBetween('documento.data', $periodo) ->when($origemProgramaticaId, fn ($q, $id) => $q->where('documento.origem_programatica_id', $id)); }) ->when(is_null($origemProgramaticaId), function ($query) use ($periodo) { $query ->orWhere(function ($query) use ($periodo) { $query ->whereNotExists(function ($query) { $query->select(DB::raw(1)) ->from('almoxarifado_entrada_documento as documento') ->whereColumn('documento.entrada_id', 'entrada.id') ->whereNotNull('documento.data'); }) ->whereBetween('entrada.created_at', $periodo); }); }); }); }, 'saldo_entrada_financeiro' => function ($query) use ($periodo, $origemProgramaticaId) { $query->select(DB::raw('COALESCE(SUM(entrada_item.quantidade * entrada_item.valor_unitario), 0)')) ->from('almoxarifado_entrada_item as entrada_item') ->join('almoxarifado_entrada as entrada', 'entrada.id', 'entrada_item.entrada_id') ->whereColumn('entrada_item.material_id', 'material.id') ->where('entrada.finalizada', true) ->where(function ($query) use ($periodo, $origemProgramaticaId) { $query ->whereExists(function ($query) use ($periodo, $origemProgramaticaId) { $query->select(DB::raw(1)) ->from('almoxarifado_entrada_documento as documento') ->whereColumn('documento.entrada_id', 'entrada.id') ->whereBetween('documento.data', $periodo) ->when($origemProgramaticaId, fn ($q, $id) => $q->where('documento.origem_programatica_id', $id)); }) ->when(is_null($origemProgramaticaId), function ($query) use ($periodo) { $query ->orWhere(function ($query) use ($periodo) { $query ->whereNotExists(function ($query) { $query->select(DB::raw(1)) ->from('almoxarifado_entrada_documento as documento') ->whereColumn('documento.entrada_id', 'entrada.id'); }) ->whereBetween('entrada.created_at', $periodo); }); }); }); }, 'saldo_saida_fisico' => function ($query) use ($periodo, $origemProgramaticaId) { $query->select(DB::raw('COALESCE(SUM(saida_item_entrada_item.quantidade_saida), 0)')) ->from('almoxarifado_saida_item_entrada_item as saida_item_entrada_item') ->join( 'almoxarifado_saida_item as saida_item', 'saida_item.id', 'saida_item_entrada_item.saida_item_id' ) ->join('almoxarifado_saida as saida', 'saida.id', 'saida_item.saida_id') ->whereColumn('saida_item.material_id', 'material.id') ->where('saida.finalizada', true) ->whereBetween('saida.created_at', $periodo) ->when(!is_null($origemProgramaticaId), function ($query) use ($origemProgramaticaId) { $query->whereExists(fn ($q) => $q ->selectRaw(1) ->from('almoxarifado_entrada_item as entrada_item') ->join('almoxarifado_entrada as entrada', 'entrada.id', 'entrada_item.entrada_id') ->join('almoxarifado_entrada_documento as entrada_documento', 'entrada_documento.entrada_id', 'entrada.id') ->whereColumn('entrada_item.id', 'saida_item_entrada_item.entrada_item_id') ->where('entrada_documento.origem_programatica_id', $origemProgramaticaId) ); }); }, 'saldo_saida_financeiro' => function ($query) use ($periodo, $origemProgramaticaId) { $query->select(DB::raw( 'COALESCE(SUM(saida_item_entrada_item.quantidade_saida * entrada_item.valor_unitario), 0)' )) ->from('almoxarifado_entrada_item as entrada_item') ->join( 'almoxarifado_saida_item_entrada_item as saida_item_entrada_item', 'saida_item_entrada_item.entrada_item_id', 'entrada_item.id' ) ->join( 'almoxarifado_saida_item as saida_item', 'saida_item.id', 'saida_item_entrada_item.saida_item_id' ) ->join('almoxarifado_saida as saida', 'saida.id', 'saida_item.saida_id') ->whereColumn('saida_item.material_id', 'material.id') ->where('saida.finalizada', true) ->whereBetween('saida.created_at', $periodo) ->when(!is_null($origemProgramaticaId), function ($query) use ($origemProgramaticaId) { $query->whereExists(fn ($q) => $q ->selectRaw(1) ->from('almoxarifado_entrada as entrada') ->join('almoxarifado_entrada_documento as entrada_documento', 'entrada_documento.entrada_id', 'entrada.id') ->whereColumn('entrada.id', 'entrada_item.entrada_id') ->where('entrada_documento.origem_programatica_id', $origemProgramaticaId) ); }); } ]) ->get() ->map(function ($item) use ($balancetePorSubgrupo, $balancetePorGrupo, $totalizadores) { $item->saldo_atual_fisico = $item->saldo_anterior_fisico + $item->saldo_entrada_fisico - $item->saldo_saida_fisico; $item->saldo_atual_financeiro = $item->saldo_anterior_financeiro + $item->saldo_entrada_financeiro - $item->saldo_saida_financeiro; self::addBalancetePorSubgrupo($balancetePorSubgrupo, $item); self::addBalancetePorGrupo($balancetePorGrupo, $item); $totalizadores['saldo_anterior_fisico'] += $item->saldo_anterior_fisico; $totalizadores['saldo_anterior_financeiro'] += $item->saldo_anterior_financeiro; $totalizadores['saldo_entrada_fisico'] += $item->saldo_entrada_fisico; $totalizadores['saldo_entrada_financeiro'] += $item->saldo_entrada_financeiro; $totalizadores['saldo_saida_fisico'] += $item->saldo_saida_fisico; $totalizadores['saldo_saida_financeiro'] += $item->saldo_saida_financeiro; $totalizadores['saldo_atual_fisico'] += $item->saldo_atual_fisico; $totalizadores['saldo_atual_financeiro'] += $item->saldo_atual_financeiro; return $item; }); return collect([ 'por_material' => $balancetePorMaterial, 'por_subgrupo' => $balancetePorSubgrupo, 'por_grupo' => $balancetePorGrupo, 'totalizadores' => $totalizadores, ]); } private static function addBalancetePorSubgrupo($balancetePorSubgrupo, $item) { $balancetePorSubgrupoItem = $balancetePorSubgrupo ->where('grupo_id', $item->grupo_id) ->where('subgrupo_id', $item->subgrupo_id) ->first(); if (is_null($balancetePorSubgrupoItem)) { $balancetePorSubgrupoItem = (object) [ 'grupo_id' => $item->grupo_id, 'subgrupo_id' => $item->subgrupo_id, 'subgrupo_nome' => $item->subgrupo_nome, 'grupo_nome' => $item->grupo_nome, 'saldo_anterior_fisico' => 0, 'saldo_anterior_financeiro' => 0.0, 'saldo_entrada_fisico' => 0, 'saldo_entrada_financeiro' => 0.0, 'saldo_saida_fisico' => 0, 'saldo_saida_financeiro' => 0.0, 'saldo_atual_fisico' => 0, 'saldo_atual_financeiro' => 0.0, ]; $balancetePorSubgrupo->push($balancetePorSubgrupoItem); } $balancetePorSubgrupoItem->saldo_anterior_fisico += $item->saldo_anterior_fisico; $balancetePorSubgrupoItem->saldo_anterior_financeiro += $item->saldo_anterior_financeiro; $balancetePorSubgrupoItem->saldo_entrada_fisico += $item->saldo_entrada_fisico; $balancetePorSubgrupoItem->saldo_entrada_financeiro += $item->saldo_entrada_financeiro; $balancetePorSubgrupoItem->saldo_saida_fisico += $item->saldo_saida_fisico; $balancetePorSubgrupoItem->saldo_saida_financeiro += $item->saldo_saida_financeiro; $balancetePorSubgrupoItem->saldo_atual_fisico += $item->saldo_atual_fisico; $balancetePorSubgrupoItem->saldo_atual_financeiro += $item->saldo_atual_financeiro; } private static function addBalancetePorGrupo($balancetePorGrupo, $item) { $balancetePorGrupoItem = $balancetePorGrupo->firstWhere('grupo_id', $item->grupo_id); if (is_null($balancetePorGrupoItem)) { $balancetePorGrupoItem = (object) [ 'grupo_id' => $item->grupo_id, 'grupo_nome' => $item->grupo_nome, 'saldo_anterior_fisico' => 0, 'saldo_anterior_financeiro' => 0.0, 'saldo_entrada_fisico' => 0, 'saldo_entrada_financeiro' => 0.0, 'saldo_saida_fisico' => 0, 'saldo_saida_financeiro' => 0.0, 'saldo_atual_fisico' => 0, 'saldo_atual_financeiro' => 0.0, ]; $balancetePorGrupo->push($balancetePorGrupoItem); } $balancetePorGrupoItem->saldo_anterior_fisico += $item->saldo_anterior_fisico; $balancetePorGrupoItem->saldo_anterior_financeiro += $item->saldo_anterior_financeiro; $balancetePorGrupoItem->saldo_entrada_fisico += $item->saldo_entrada_fisico; $balancetePorGrupoItem->saldo_entrada_financeiro += $item->saldo_entrada_financeiro; $balancetePorGrupoItem->saldo_saida_fisico += $item->saldo_saida_fisico; $balancetePorGrupoItem->saldo_saida_financeiro += $item->saldo_saida_financeiro; $balancetePorGrupoItem->saldo_atual_fisico += $item->saldo_atual_fisico; $balancetePorGrupoItem->saldo_atual_financeiro += $item->saldo_atual_financeiro; } private static function getDataUltimoBalanceteFechado() { $balancete = self::getUltimoBalanceteFechado(); return is_null($balancete) ? null : Carbon::create($balancete->ano, $balancete->mes); } private static function getDataBalanceteAberto() { $ultimoBalanceteFechado = self::getUltimoBalanceteFechado(); return is_null($ultimoBalanceteFechado) ? Carbon::now()->day(1)->subMonths(3) : Carbon::create($ultimoBalanceteFechado->ano, $ultimoBalanceteFechado->mes) ->modify('last day of this month') ->addDay(); } private static function getUltimoBalanceteFechado() { return BalanceteFechamento::orderByDesc('ano') ->orderByDesc('mes') ->first(); } }