init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,310 @@
<?php
namespace App\Services\Farmacia;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\Grupo\Grupo;
use App\Models\Cadastro\Material\Material;
use App\Services\Cadastro\Material\MaterialService;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class RelatorioPacienteAtendidoService extends Service
{
public static function index()
{
$pacientes = collect();
$totalizadores = (object) ['dispensacoes' => 0];
DB::table('farmacia_receita_item_entrega')
->select([
'cadastro_paciente.id AS paciente_id',
DB::raw("LPAD(cadastro_paciente.prontuario, 7, '0') AS paciente_prontuario"),
'cadastro_cidadao.nome AS paciente_nome',
'farmacia_receita_item_entrega.dispensado_em AS data_dispensacao',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome'),
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'apresentacao_unidade_medida'
) . " AS material_descricao"),
'cadastro_grupo.nome AS grupo_nome',
'farmacia_receita_item_entrega.quantidade',
])
->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_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')
->join('cadastro_grupo', 'cadastro_grupo.id', 'cadastro_material.grupo_id')
->leftJoin(
'cadastro_unidade_medida as apresentacao_unidade_medida',
'apresentacao_unidade_medida.id',
'cadastro_material.apresentacao_unidade_medida_id'
)
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) >= '" . request()->get('start_date') . "'")
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) <= '" . request()->get('end_date') . "'")
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
->when(request()->get('unidade_id'), function ($query) {
$query->where('cadastro_infraestrutura.unidade_id', request()->get('unidade_id'));
})
->when(request()->get('infraestrutura_id'), function ($query) {
$query->where('cadastro_infraestrutura.id', request()->get('infraestrutura_id'));
})
->when(request()->get('grupo_id'), function ($query) {
$query->where('cadastro_material.grupo_id', request()->get('grupo_id'));
})
->when(request()->get('material_id'), function ($query) {
$query->where('cadastro_material.id', request()->get('material_id'));
})
->get()
->each(function($query) use ($pacientes, $totalizadores) {
$paciente = $pacientes->where('paciente_id', $query->paciente_id)->first();
if (is_null($paciente)) {
$paciente = (object) [
'paciente_id' => $query->paciente_id,
'paciente_prontuario' => $query->paciente_prontuario,
'paciente_nome' => $query->paciente_nome,
'dispensacoes' => 0,
'entregas' => collect(),
];
$pacientes->push($paciente);
}
$entrega = (object) [
'data_dispensacao' => $query->data_dispensacao,
'unidade_nome_fantasia' => $query->unidade_nome_fantasia,
'infraestrutura_nome' => $query->infraestrutura_nome,
'material_descricao' => $query->material_descricao,
'grupo_nome' => $query->grupo_nome,
'quantidade' => $query->quantidade,
];
$paciente->entregas->push($entrega);
$paciente->dispensacoes++;
$totalizadores->dispensacoes++;
});
return compact('pacientes', 'totalizadores');
}
public static function create()
{
return [
'additionals' => self::getAdditionals(),
'form' => self::getForm(),
'model' => self::getModel(),
];
}
public static function list()
{
switch (request()->get('listar')) {
case 'unidades':
return self::getUnidades(request()->get('start_date'), request()->get('end_date'));
break;
case 'infraestruturas':
return self::getInfraestruturas(request()->get('start_date'), request()->get('end_date'), request()->get('unidade_id'));
break;
case 'grupos':
return self::getGrupos(request()->get('start_date'), request()->get('end_date'), request()->get('infraestrutura_id'));
break;
default:
return [];
break;
}
}
public static function autocompleteMaterial()
{
return DB::table('cadastro_material')
->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"),
])
->when(request()->get('grupo_id'), function ($query) {
$query->where('cadastro_material.grupo_id', request()->get('grupo_id'));
})
->whereExists(function ($query) {
$query->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')
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) >= '" . request()->get('start_date') . "'")
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) <= '" . request()->get('end_date') . "'")
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
->when(request()->get('unidade_id'), function ($query) {
$query->where('cadastro_infraestrutura.unidade_id', request()->get('unidade_id'));
})
->when(request()->get('infraestrutura_id'), function ($query) {
$query->where('cadastro_infraestrutura.id', request()->get('infraestrutura_id'));
})
->whereColumn('farmacia_receita_item.material_id', 'cadastro_material.id');
});
}
public static function getPrintData()
{
$data = self::index();
$data['pacientes']->each(function ($paciente) {
$paciente->entregas->each(function ($entrega) {
$entrega->data_dispensacao = (new Carbon($entrega->data_dispensacao))->format('d/m/Y');
});
});
$unidade = Unidade::find(request()->get('unidade_id'));
$infraestrutura = Infraestrutura::find(request()->get('infraestrutura_id'));
$grupo = Grupo::find(request()->get('grupo_id'));
$material = Material::find(request()->get('material_id'));
return [
'start_date' => Carbon::create(request()->get('start_date'))->format('d/m/Y'),
'end_date' => Carbon::create(request()->get('end_date'))->format('d/m/Y'),
'unidade_nome_fantasia' => $unidade->nome_fantasia ?? 'Todas',
'infraestrutura_nome' => $infraestrutura->nome ?? 'Todos',
'grupo_nome' => $grupo->nome ?? 'Todos',
'material_descricao' => $material->descricao_completa ?? 'Todos',
'columns' => collect(request()->get('selected_columns')),
'itens' => $data,
];
}
private static function getAdditionals()
{
return [
'data_atual' => Carbon::now()->format('d/m/Y'),
];
}
private static function getForm()
{
return [
'unidades' => [],
'infraestruturas' => [],
'grupos' => [],
];
}
private static function getModel()
{
return [
'periodo' => [
'start' => null,
'end' => null,
],
'unidade_id' => null,
'infraestrutura_id' => null,
'grupo_id' => null,
'material' => [
'id' => null,
'descricao' => null,
],
];
}
private static function getUnidades($startDate, $endDate)
{
return DB::table('cadastro_unidade')
->select([
'id',
'nome_fantasia'
])
->whereExists(function ($query) use ($startDate, $endDate) {
$query->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')
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) >= '" . $startDate . "'")
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) <= '" . $endDate . "'")
->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($startDate, $endDate, $unidadeId)
{
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', $unidadeId)
->whereExists(function ($query) use ($startDate, $endDate) {
$query->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')
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) >= '" . $startDate . "'")
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) <= '" . $endDate . "'")
->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 getGrupos($startDate, $endDate, $infraestruturaId)
{
return DB::table('cadastro_grupo')
->select([
'cadastro_grupo.id',
'cadastro_grupo.nome',
])
->whereExists(function ($query) use ($startDate, $endDate, $infraestruturaId) {
$query->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')
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) >= '" . $startDate . "'")
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) <= '" . $endDate . "'")
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
->where('cadastro_centro_custo.infraestrutura_id', $infraestruturaId)
->whereColumn('cadastro_material.grupo_id', 'cadastro_grupo.id');
})
->orderBy('cadastro_grupo.nome')
->get();
}
}