select([ 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome'), DB::raw("DATE_FORMAT(farmacia_receita.created_at, '%d/%m/%Y') AS data_dispensacao"), DB::raw(MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'cadastro_unidade_medida' ) . " AS material_descricao"), 'cadastro_cidadao.nome AS paciente_nome', 'almoxarifado_saida_item_entrada_item.quantidade_saida AS quantidade', ]) ->join('farmacia_receita_item', 'farmacia_receita_item.id', 'farmacia_receita_item_entrega.receita_item_id') ->join('almoxarifado_saida_item_entrada_item', 'almoxarifado_saida_item_entrada_item.saida_item_id', 'farmacia_receita_item_entrega.saida_item_id') ->join('almoxarifado_entrada_item', 'almoxarifado_entrada_item.id', 'almoxarifado_saida_item_entrada_item.entrada_item_id') ->join('farmacia_receita', 'farmacia_receita.id', 'farmacia_receita_item.receita_id') ->join('cadastro_paciente', 'cadastro_paciente.id', 'farmacia_receita.paciente_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_receita.created_centro_custo_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->join('cadastro_material', 'cadastro_material.id', 'farmacia_receita_item.material_id') ->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id') ->leftJoin('cadastro_unidade_medida', 'cadastro_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id') ->where('farmacia_receita.is_remedio_em_casa', true) ->where('farmacia_receita_item_entrega.pendente', false) ->where('farmacia_receita_item_entrega.estornado', false) ->whereBetween('farmacia_receita_item_entrega.created_at', $params->periodo) ->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)) ->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id)) ->when($params->material_id, fn ($q) => $q->where('cadastro_material.id', $params->material_id)) ->when($params->paciente_id, fn ($q) => $q->where('cadastro_paciente.id', $params->paciente_id)); self::setOrderBy($itens); $itens = $itens->get(); return ['itens' => $itens]; } public static function create() { return [ 'additionals' => [ 'data_atual' => Carbon::now()->format('d/m/Y'), ], 'form' => [ 'unidades' => [], 'infraestruturas' => [], ], 'model' => [ 'periodo' => [ 'start' => null, 'end' => null, ], 'unidade_id' => null, 'infraestrutura_id' => null, 'material' => null, 'paciente' => null, ], ]; } public static function list() { $params = self::getParams(); switch (request()->listar) { case 'unidades': { return [ 'unidades' => self::getUnidades($params), 'infraestruturas' => self::getInfraestruturas($params), ]; } case 'infraestruturas': { return [ 'infraestruturas' => self::getInfraestruturas($params), ]; } } } public static function autocompleteMaterial() { $params = self::getParams(); return DB::table('cadastro_material') ->select([ 'cadastro_material.id', DB::raw(MaterialService::getDescricaoCompletaRaw( 'cadastro_material', 'cadastro_apresentacao', 'cadastro_unidade_medida' ) . " as descricao"), ]) ->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id') ->leftJoin('cadastro_unidade_medida', 'cadastro_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id') ->where('cadastro_material.is_programa_remedio_em_casa', true) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('farmacia_receita_item_entrega') ->join('farmacia_receita_item', 'farmacia_receita_item.id', 'farmacia_receita_item_entrega.receita_item_id') ->join('farmacia_receita', 'farmacia_receita.id', 'farmacia_receita_item.receita_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_receita.created_centro_custo_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id') ->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo) ->where('farmacia_receita_item_entrega.pendente', false) ->where('farmacia_receita_item_entrega.estornado', false) ->when($params->unidade_id, fn ($q, $unidadeId) => $q->where('cadastro_infraestrutura.unidade_id', $unidadeId)) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q->where('cadastro_infraestrutura.id', $infraestruturaId)) ->whereColumn('farmacia_receita_item.material_id', 'cadastro_material.id') ); } public static function autocompletePaciente() { $params = self::getParams(); return DB::table('cadastro_paciente') ->select([ 'cadastro_paciente.id', 'cadastro_cidadao.nome', ]) ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('farmacia_receita_item_entrega') ->join('farmacia_receita_item', 'farmacia_receita_item.id', 'farmacia_receita_item_entrega.receita_item_id') ->join('farmacia_receita', 'farmacia_receita.id', 'farmacia_receita_item.receita_id') ->join('cadastro_material', 'cadastro_material.id', 'farmacia_receita_item.material_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_receita.created_centro_custo_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id') ->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo) ->where('cadastro_material.is_programa_remedio_em_casa', true) ->where('farmacia_receita_item_entrega.pendente', false) ->where('farmacia_receita_item_entrega.estornado', false) ->when($params->unidade_id, fn ($q, $unidadeId) => $q->where('cadastro_infraestrutura.unidade_id', $unidadeId)) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q->where('cadastro_infraestrutura.id', $infraestruturaId)) ->when($params->material_id, fn ($q, $materialId) => $q->where('cadastro_material.id', $materialId)) ->whereColumn('farmacia_receita.paciente_id', 'cadastro_paciente.id') ); } private static function getParams() { return (object) [ 'periodo' => [ 'start' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['start'])->setTime(0, 0, 0), 'end' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['end'])->setTime(23, 59, 59) ], 'unidade_id' => request()->get('unidade_id'), 'infraestrutura_id' => request()->get('infraestrutura_id'), 'material_id' => request()->get('material_id'), 'paciente_id' => request()->get('paciente_id'), ]; } private static function getUnidades($params) { return DB::table('cadastro_unidade') ->select([ 'id', 'nome_fantasia' ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('farmacia_receita_item_entrega') ->join('farmacia_receita_item', 'farmacia_receita_item.id', 'farmacia_receita_item_entrega.receita_item_id') ->join('farmacia_receita', 'farmacia_receita.id', 'farmacia_receita_item.receita_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_receita.created_centro_custo_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id') ->join('cadastro_material', 'cadastro_material.id', 'farmacia_receita_item.material_id') ->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo) ->where('cadastro_material.is_programa_remedio_em_casa', true) ->where('farmacia_receita_item_entrega.pendente', false) ->where('farmacia_receita_item_entrega.estornado', false) ->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id') ) ->orderBy('cadastro_unidade.nome_fantasia') ->get(); } private static function getInfraestruturas($params) { return DB::table('cadastro_infraestrutura') ->select([ 'cadastro_infraestrutura.id', DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS nome'), ]) ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->where('cadastro_unidade.id', $params->unidade_id) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('farmacia_receita_item_entrega') ->join('farmacia_receita_item', 'farmacia_receita_item.id', 'farmacia_receita_item_entrega.receita_item_id') ->join('farmacia_receita', 'farmacia_receita.id', 'farmacia_receita_item.receita_id') ->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_receita.created_centro_custo_id') ->join('cadastro_material', 'cadastro_material.id', 'farmacia_receita_item.material_id') ->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo) ->where('cadastro_material.is_programa_remedio_em_casa', true) ->where('farmacia_receita_item_entrega.pendente', false) ->where('farmacia_receita_item_entrega.estornado', false) ->whereColumn('cadastro_centro_custo.infraestrutura_id', 'cadastro_infraestrutura.id') ) ->orderByRaw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)') ->get(); } private static function setOrderBy($builder) { $columns = [ 'unidade_nome_fantasia' => 'unidade_nome_fantasia', 'infraestrutura_nome' => 'infraestrutura_nome', 'data_dispensacao' => 'data_dispensacao', 'material_descricao' => 'material_descricao', 'paciente_nome' => 'paciente_nome', ]; if (is_null(request()->sort_by)) { $builder->orderByRaw(join(', ', $columns)); return; } $column = $columns[request()->sort_by]; $direction = DataUtil::getBooleanValueFromStringBoolean(request()->sort_desc) ? 'DESC' : 'ASC'; unset($columns[request()->sort_by]); $builder->orderByRaw("{$column} {$direction}, " . join(', ', $columns)); } }