Carbon::createFromFormat('d/m/Y', request()->periodo['start'])->setTime(0, 0, 0), 'end' => Carbon::createFromFormat('d/m/Y', request()->periodo['end'])->setTime(23, 59, 59) ]; $movimentacoes = DB::query() ->fromSub(DB::table('almoxarifado_entrada_item as entrada_item') ->join( 'almoxarifado_entrada as entrada', 'entrada.id', 'entrada_item.entrada_id' ) ->where('entrada_item.material_id', request()->material_id) ->where('entrada.finalizada', true) ->where('entrada.centro_custo_id', request()->centro_custo_id) ->whereBetween('entrada.created_at', $periodo) ->select(DB::raw(" entrada.created_at, ( CASE entrada.tipo_id WHEN " . EntradaTipo::REQUISICAO . " THEN 'ENTRADA (REQUISIÇÃO)' WHEN " . EntradaTipo::TRANSFERENCIA . " THEN 'ENTRADA (TRANSFERÊNCIA)' ELSE 'ENTRADA' END ) as tipo, CONCAT( IF(entrada_item.estornado_em IS NULL, '', '(ESTORNADO) '), ( CASE entrada.tipo_id WHEN " . EntradaTipo::REQUISICAO . " THEN ( SELECT CONCAT( 'ORIGEM: ', u.nome_fantasia, ' (Local de atendimento: ', COALESCE(i.nome, u.nome_fantasia), ' - ', 'Setor: ', s.nome, ')' ) FROM almoxarifado_requisicao_resposta_item_entrada_item riei JOIN almoxarifado_requisicao_resposta_item ri ON ri.id = riei.requisicao_resposta_item_id JOIN cadastro_centro_custo as cc ON cc.id = ri.created_centro_custo_id JOIN cadastro_setor s ON s.id = cc.setor_id JOIN cadastro_infraestrutura as i ON i.id = cc.infraestrutura_id JOIN cadastro_unidade as u ON u.id = i.unidade_id WHERE riei.entrada_item_id = entrada_item.id ) WHEN " . EntradaTipo::TRANSFERENCIA . " THEN ( SELECT CONCAT( 'ORIGEM: ', u.nome_fantasia, ' (Local de atendimento: ', COALESCE(i.nome, u.nome_fantasia), ' - ', 'Setor: ', s.nome, ')' ) FROM cadastro_centro_custo as cc JOIN cadastro_setor s ON s.id = cc.setor_id JOIN cadastro_infraestrutura as i ON i.id = cc.infraestrutura_id JOIN cadastro_unidade as u ON u.id = i.unidade_id WHERE cc.id = entrada.created_centro_custo_id ) WHEN " . EntradaTipo::INVENTARIO . " THEN 'AJUSTE DE ESTOQUE' WHEN " . EntradaTipo::ESTORNO . " THEN 'ESTORNO DE SAÍDA' ELSE '' END ) ) as historico, ( SELECT SUM( almoxarifado_entrada_item.quantidade - COALESCE(( SELECT SUM(almoxarifado_saida_item_entrada_item.quantidade_saida) FROM almoxarifado_saida_item_entrada_item JOIN almoxarifado_saida_item ON almoxarifado_saida_item.id = almoxarifado_saida_item_entrada_item.saida_item_id JOIN almoxarifado_saida ON almoxarifado_saida.id = almoxarifado_saida_item.saida_id WHERE almoxarifado_saida_item_entrada_item.entrada_item_id = almoxarifado_entrada_item.id AND almoxarifado_saida.finalizada = 1 AND almoxarifado_saida.centro_custo_id = " . request()->centro_custo_id . " AND almoxarifado_saida.created_at <= entrada.created_at ), 0) ) FROM almoxarifado_entrada_item JOIN almoxarifado_entrada ON almoxarifado_entrada.id = almoxarifado_entrada_item.entrada_id WHERE almoxarifado_entrada.finalizada = 1 AND almoxarifado_entrada.centro_custo_id = " . request()->centro_custo_id . " AND almoxarifado_entrada_item.material_id = entrada_item.material_id AND almoxarifado_entrada.created_at <= entrada.created_at ) as estoque, CONCAT('+ ', entrada_item.quantidade) as quantidade ")) ->unionAll(DB::table('almoxarifado_saida_item as saida_item') ->join( 'almoxarifado_saida as saida', 'saida.id', 'saida_item.saida_id' ) ->where('saida_item.material_id', request()->material_id) ->where('saida.finalizada', true) ->where('saida.centro_custo_id', request()->centro_custo_id) ->whereBetween('saida.created_at', $periodo) ->select(DB::raw(" saida.created_at, ( CASE saida.tipo_id WHEN " . SaidaTipo::REQUISICAO . " THEN 'SAÍDA (REQUISIÇÃO)' WHEN " . SaidaTipo::TRANSFERENCIA . " THEN 'SAÍDA (TRANSFERÊNCIA)' WHEN " . SaidaTipo::DISPENSACAO_FARMACIA . " THEN 'SAÍDA (DISPENSAÇÃO)' WHEN " . SaidaTipo::BAIXA . " THEN 'BAIXA' WHEN " . SaidaTipo::MANUAL . " THEN 'SAÍDA (MANUAL)' ELSE 'SAÍDA' END ) as tipo, CONCAT( IF(saida_item.estornado_em IS NULL, '', '(ESTORNADO) '), ( CASE saida.tipo_id WHEN " . SaidaTipo::REQUISICAO . " THEN ( SELECT CONCAT( 'DESTINO: ', u.nome_fantasia, ' (Local de atendimento: ', COALESCE(i.nome, u.nome_fantasia), ' - ', 'Setor: ', s.nome, ')' ) FROM almoxarifado_requisicao_resposta_item ri JOIN almoxarifado_requisicao_item reqi ON reqi.id = ri.requisicao_item_id JOIN cadastro_centro_custo as cc ON cc.id = reqi.created_centro_custo_id JOIN cadastro_setor s ON s.id = cc.setor_id JOIN cadastro_infraestrutura as i ON i.id = cc.infraestrutura_id JOIN cadastro_unidade as u ON u.id = i.unidade_id WHERE ri.saida_item_id = saida_item.id ) WHEN " . SaidaTipo::TRANSFERENCIA . " THEN ( SELECT CONCAT( 'DESTINO: ', u.nome_fantasia, ' (Local de atendimento: ', COALESCE(i.nome, u.nome_fantasia), ' - ', 'Setor: ', s.nome, ')' ) FROM almoxarifado_saida_transferencia as st JOIN cadastro_centro_custo as cc ON cc.id = st.centro_custo_id JOIN cadastro_setor as s ON s.id = cc.setor_id JOIN cadastro_infraestrutura as i ON i.id = cc.infraestrutura_id JOIN cadastro_unidade as u ON u.id = i.unidade_id WHERE st.saida_id = saida.id ) WHEN " . SaidaTipo::DISPENSACAO_FARMACIA . " THEN ( SELECT c.nome FROM farmacia_receita_item_entrega as rie JOIN farmacia_receita_item as ri ON ri.id = rie.receita_item_id JOIN farmacia_receita as r ON r.id = ri.receita_id JOIN cadastro_paciente as p ON p.id = r.paciente_id JOIN cadastro_cidadao as c ON c.id = p.cidadao_id WHERE rie.saida_item_id = saida_item.id ) WHEN " . SaidaTipo::BAIXA . " THEN ( SELECT m.descricao FROM almoxarifado_saida_baixa as b JOIN almoxarifado_motivo_baixa as m ON m.id = b.motivo_id WHERE b.saida_id = saida.id ) WHEN " . SaidaTipo::MANUAL . " THEN ( SELECT CONCAT( 'DESTINO: ', u.nome_fantasia, ' (Local de atendimento: ', COALESCE(i.nome, u.nome_fantasia), ' - ', 'Setor: ', s.nome, ')' ) FROM almoxarifado_saida_requisicao as sr JOIN cadastro_centro_custo as cc ON cc.id = sr.centro_custo_id JOIN cadastro_setor as s ON s.id = cc.setor_id JOIN cadastro_infraestrutura as i ON i.id = cc.infraestrutura_id JOIN cadastro_unidade as u ON u.id = i.unidade_id WHERE sr.saida_id = saida.id ) WHEN " . SaidaTipo::INVENTARIO . " THEN 'AJUSTE DE ESTOQUE' WHEN " . SaidaTipo::ESTORNO . " THEN 'ESTORNO DE ENTRADA' ELSE '' END ) ) as historico, ( SELECT SUM( almoxarifado_entrada_item.quantidade - COALESCE(( SELECT SUM(almoxarifado_saida_item_entrada_item.quantidade_saida) FROM almoxarifado_saida_item_entrada_item JOIN almoxarifado_saida_item ON almoxarifado_saida_item.id = almoxarifado_saida_item_entrada_item.saida_item_id JOIN almoxarifado_saida ON almoxarifado_saida.id = almoxarifado_saida_item.saida_id WHERE almoxarifado_saida_item_entrada_item.entrada_item_id = almoxarifado_entrada_item.id AND almoxarifado_saida.finalizada = 1 AND almoxarifado_saida.centro_custo_id = " . request()->centro_custo_id . " AND almoxarifado_saida.created_at <= saida.created_at ), 0) ) FROM almoxarifado_entrada_item JOIN almoxarifado_entrada ON almoxarifado_entrada.id = almoxarifado_entrada_item.entrada_id WHERE almoxarifado_entrada.finalizada = 1 AND almoxarifado_entrada.centro_custo_id = " . request()->centro_custo_id . " AND almoxarifado_entrada_item.material_id = saida_item.material_id AND almoxarifado_entrada.created_at <= saida.created_at ) as estoque ")) ->addSelect([ 'quantidade' => function ($query) { $query->select(DB::raw("CONCAT('- ', SUM(saida_item_entrada_item.quantidade_saida))")) ->from('almoxarifado_saida_item_entrada_item as saida_item_entrada_item') ->whereColumn('saida_item_entrada_item.saida_item_id', 'saida_item.id'); } ]) ) , 'sub') ->select(DB::raw(" DATE_FORMAT(sub.created_at, '%d/%m/%Y') as data, sub.tipo, sub.historico, sub.quantidade, sub.estoque ")) ->orderBy('sub.created_at') ->get(); $estoqueAnterior = DB::select(" SELECT COALESCE(SUM( almoxarifado_entrada_item.quantidade - COALESCE(( SELECT SUM(almoxarifado_saida_item_entrada_item.quantidade_saida) FROM almoxarifado_saida_item_entrada_item JOIN almoxarifado_saida_item ON almoxarifado_saida_item.id = almoxarifado_saida_item_entrada_item.saida_item_id JOIN almoxarifado_saida ON almoxarifado_saida.id = almoxarifado_saida_item.saida_id WHERE almoxarifado_saida_item_entrada_item.entrada_item_id = almoxarifado_entrada_item.id AND almoxarifado_saida.finalizada = 1 AND almoxarifado_saida.centro_custo_id = " . request()->centro_custo_id . " AND almoxarifado_saida.created_at < '" . $periodo['start']->format('Y-m-d H:i:s') . "' ), 0) ), 0) as estoque FROM almoxarifado_entrada_item JOIN almoxarifado_entrada ON almoxarifado_entrada.id = almoxarifado_entrada_item.entrada_id WHERE almoxarifado_entrada.finalizada = 1 AND almoxarifado_entrada.centro_custo_id = " . request()->centro_custo_id . " AND almoxarifado_entrada_item.material_id = " . request()->material_id . " AND almoxarifado_entrada.created_at < '" . $periodo['start']->format('Y-m-d H:i:s') . "'; ")[0]->estoque; return [ 'movimentacoes' => $movimentacoes, 'estoque_anterior' => $estoqueAnterior, ]; } public static function list() { $data = (object) [ 'additionals' => [], 'form' => [], 'model' => [], ]; $params = self::getParams(); $sets = [ 'periodo' => function () use ($data) { $data->model['periodo'] = ['start' => null, 'end' => null]; }, 'unidade' => function () use ($data, $params) { $unidadesData = self::getUnidadesData($params); $data->form['unidades'] = $unidadesData['form']; $data->model['unidade_id'] = $params->unidade_id = $unidadesData['model']; }, 'infraestrutura' => function () use ($data, $params) { $infraestruturasData = self::getInfraestruturasData($params); $data->form['infraestruturas'] = $infraestruturasData['form']; $data->model['infraestrutura_id'] = $params->infraestrutura_id = $infraestruturasData['model']; }, 'centro_custo' => function () use ($data, $params) { $centrosDeCustoData = self::getCentrosDeCustoData($params); $data->form['centros_custo'] = $centrosDeCustoData['form']; $data->model['centro_custo_id'] = $params->centro_custo_id = $centrosDeCustoData['model']; }, 'material' => function () use ($data) { $data->model['material'] = null; } ]; $load = is_null(request()->load_from); if ($load) { $data->additionals = [ 'data_atual' => Carbon::now()->format('d/m/Y'), ]; } foreach ($sets as $field => $set) { if ($load) { $set(); } else if ($field === request()->load_from) { $load = true; } } foreach ($data as $property => $itens) { if (empty($itens)) { unset($data->{$property}); } } return $data; } private static function getParams() { $params = (object) request()->only([ 'periodo', 'unidade_id', 'infraestrutura_id', 'centro_custo_id', ]); if (isset($params->periodo) && !is_null($params->periodo['start']) && !is_null($params->periodo['end']) ) { $start = Carbon::createFromFormat('d/m/Y', $params->periodo['start'])->setTime(0, 0, 0); $end = Carbon::createFromFormat('d/m/Y', $params->periodo['end'])->setTime(23, 59, 59); $params->periodo['start'] = $start; $params->periodo['end'] = $end; } else { $params->periodo = null; } return $params; } private static function getUnidadesData($params) { $unidades = collect(); $id = null; if (!is_null($params->periodo)) { $unidades = Unidade::whereHas('infraestruturas', fn ($q) => $q ->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCusto($q, $params)) ) ->orderBy('nome_fantasia') ->get(['id', 'nome_fantasia']); if ($unidades->count() === 1) { $id = $unidades->first()->id; } } return ['form' => $unidades, 'model' => $id]; } private static function getInfraestruturasData($params) { $infraestruturas = collect(); $id = null; if (!is_null($params->periodo) && !is_null($params->unidade_id)) { $infraestruturas = Infraestrutura::where('unidade_id', $params->unidade_id) ->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCusto($q, $params)) ->get(['id', 'nome', 'principal', 'unidade_id']) ->map(fn ($i) => (object) ['id' => $i->id, 'nome' => $i->nome]) ->sortBy('nome') ->values(); if ($infraestruturas->count() === 1) { $id = $infraestruturas->first()->id; } } return ['form' => $infraestruturas, 'model' => $id]; } private static function getCentrosDeCustoData($params) { $centrosCusto = collect(); $id = null; if (!is_null($params->periodo) && !is_null($params->infraestrutura_id)) { $centrosCusto = CentroCusto::where('infraestrutura_id', $params->infraestrutura_id) ->where(fn ($q) => self::setWhereForFilterCentroCusto($q, $params)) ->get(['id', 'setor_id']) ->map(fn ($cc) => (object) ['id' => $cc->id, 'setor_nome' => $cc->setor->nome]) ->sortBy('setor_nome') ->values(); if ($centrosCusto->count() === 1) { $id = $centrosCusto->first()->id; } } return ['form' => $centrosCusto, 'model' => $id]; } private static function setWhereForFilterCentroCusto($query, $params) { $query->whereHas('almoxarifadoEntradas', fn ($q) => $q ->where('finalizada', true) ->whereBetween('created_at', $params->periodo) ->whereHas('itens', fn ($q) => $q ->whereHas('material', fn ($q) => $q ->whereIn('livro_registro_id', LivroPsicotropicoService::$livroRegistroIds) ) ) ) ->orWhereHas('almoxarifadoSaidas', fn ($q) => $q ->where('finalizada', true) ->whereBetween('created_at', $params->periodo) ->whereHas('itens', fn ($q) => $q ->whereHas('material', fn ($q) => $q ->whereIn('livro_registro_id', LivroPsicotropicoService::$livroRegistroIds) ) ) ); } public static function autocompleteMaterial() { $params = self::getParams(); $materiais = Material::whereIn('livro_registro_id', LivroPsicotropicoService::$livroRegistroIds) ->where(fn ($q) => $q ->whereHas('almoxarifadoEntradaItens', fn ($q) => $q ->whereHas('entrada', fn ($q) => $q ->where('finalizada', true) ->where('centro_custo_id', $params->centro_custo_id) ->whereBetween('created_at', $params->periodo) ) ) ->orWhereHas('almoxarifadoSaidaItens', fn ($q) => $q ->whereHas('saida', fn ($q) => $q ->where('finalizada', true) ->where('centro_custo_id', $params->centro_custo_id) ->whereBetween('created_at', $params->periodo) ) ) ) ->getQuery() ->join( 'cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id' ) ->leftJoin( 'cadastro_unidade_medida as apresentacao_unidade_medida', 'apresentacao_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id' ) ->select( 'cadastro_material.id', DB::raw(MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'apresentacao_unidade_medida' ) . " as descricao"), ); return $materiais; } public static function getPrintExportData() { $resultado = self::index(); $itens = $resultado['movimentacoes']; $unidade = Unidade::find(request()->unidade_id); $infraestrutura = Infraestrutura::find(request()->infraestrutura_id); $centroCusto = CentroCusto::find(request()->centro_custo_id); $material = Material::find(request()->material_id); return [ 'inicio' => request()->periodo['start'], 'fim' => request()->periodo['end'], 'unidade' => $unidade->nome_fantasia, 'infraestrutura' => $infraestrutura->nome, 'setor' => $centroCusto->setor->nome, 'material' => $material->descricao_completa, 'colunas' => collect(request()->selectedColumns), 'itens' => $itens, 'estoqueAnterior' => $resultado['estoque_anterior'], ]; } }