%PDF- %PDF-
| Direktori : /home/vacivi36/core/app/Http/Controllers/ |
| Current File : /home/vacivi36/core/app/Http/Controllers/VaccineController.php |
<?php
namespace App\Http\Controllers;
use App\Models\Vaccine;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use PhpOffice\PhpSpreadsheet\IOFactory;
use Carbon\Carbon;
class VaccineController extends Controller
{
/**
* Exibir a lista de vacinas.
*/
public function index()
{
$vaccines = Vaccine::with('campaign')->get();
return response()->json($vaccines);
}
/**
* Criar uma nova vacina.
*/
public function store(Request $request)
{
// Verifica se o código da vacina já está cadastrado
if (Vaccine::where('code', $request->code)->exists()) {
return response()->json(['status' => 'error', 'message' => 'Código da vacina já cadastrado no sistema. Por favor, utilize outro código ou verifique as informações.'], 409);
}
// Verifica se o nome da vacina já está cadastrado
if (Vaccine::where('name', $request->name)->exists()) {
return response()->json(['status' => 'error', 'message' => 'Nome da vacina já cadastrado no sistema. Por favor, utilize outro nome ou verifique as informações.'], 409);
}
$vaccine = new Vaccine();
$vaccine->code = $request->code;
$vaccine->name = $request->name;
$vaccine->batch = $request->batch;
$vaccine->quantity = $request->quantity;
$vaccine->due_date = $request->due_date;
$vaccine->doses = $request->doses;
$vaccine->manufacturing_date = $request->manufacturing_date;
$vaccine->campaign_id = $request->campaign_id;
$vaccine->laboratory = $request->laboratory;
$vaccine->application_location = $request->application_location;
$vaccine->notes = $request->notes;
$insert = $vaccine->save();
if ($insert) {
return response()->json(['status' => 'success', 'message' => 'Vacina criada com sucesso!'], 201);
} else {
return response()->json(['status' => 'error', 'message' => 'Erro ao criar vacina.'], 500);
}
}
/**
* Exibir uma vacina específica.
*/
public function show($id)
{
$vaccine = Vaccine::findOrFail($id);
return response()->json($vaccine);
}
/**
* Atualizar uma vacina existente.
*/
public function update(Request $request, $id)
{
$vaccine = Vaccine::findOrFail($id);
$vaccine->code = $request->code;
$vaccine->name = $request->name;
$vaccine->batch = $request->batch;
$vaccine->quantity = $request->quantity;
$vaccine->due_date = $request->due_date;
$vaccine->doses = $request->doses;
$vaccine->manufacturing_date = $request->manufacturing_date;
$vaccine->campaign_id = $request->campaign_id;
$vaccine->laboratory = $request->laboratory;
$vaccine->application_location = $request->application_location;
$vaccine->notes = $request->notes;
$update = $vaccine->save();
if ($update) {
return response()->json(['status' => 'success', 'message' => 'Vacina atualizada com sucesso!'], 200);
} else {
return response()->json(['status' => 'error', 'message' => 'Erro ao atualizar vacina.'], 500);
}
}
/**
* Remover uma vacina.
*/
public function destroy($id)
{
$vaccine = Vaccine::findOrFail($id);
// Verificar se há aplicações de vacina associadas usando o relacionamento
if ($vaccine->vaccineApplications()->exists()) {
return response()->json([
'message' => 'A vacina possui aplicações vinculadas com pacientes e não pode ser excluída.'
], 400);
}
$vaccine->delete();
return response()->json(['message' => 'Vacina excluída com sucesso!']);
}
public function importFromSpreadsheet(Request $request)
{
// Verifica se o arquivo foi enviado
if (!$request->hasFile('file') || !$request->file('file')->isValid()) {
return response()->json(['status' => 'error', 'message' => 'Arquivo inválido ou não enviado.'], 400);
}
// Caminho do arquivo enviado
$filePath = $request->file('file')->getPathname();
// Lê a planilha
$spreadsheet = IOFactory::load($filePath);
$sheet = $spreadsheet->getActiveSheet();
$rows = $sheet->toArray();
// Define os campos obrigatórios com mapeamento para os campos do banco de dados
$requiredFields = [
'Campanha' => 'campaign',
'Vacina' => 'name',
'Data de Fabricação' => 'manufacturing_date',
'Data de Vencimento' => 'due_date',
'Laboratório' => 'laboratory',
'Lote' => 'batch',
'Quantidade' => 'quantity',
'Dose' => 'doses',
'Local Aplicação' => 'application_location'
];
// Validação dos cabeçalhos da planilha
$headers = $rows[0];
foreach (array_keys($requiredFields) as $field) {
if (!in_array($field, $headers)) {
return response()->json(['status' => 'error', 'message' => "Campo obrigatório '{$field}' está ausente na planilha."], 400);
}
}
// Índices dos campos obrigatórios na planilha
$indexes = array_flip($headers);
// Inicializa uma coleção de dados a serem inseridos
$vaccinesData = [];
// Processa cada linha da planilha
foreach (array_slice($rows, 1) as $row) {
$vaccineData = [];
foreach ($requiredFields as $field => $dbField) {
$value = $row[$indexes[$field]] ?? null;
if (is_null($value)) {
return response()->json(['status' => 'error', 'message' => "O campo obrigatório '{$field}' está vazio em alguma linha."], 400);
}
// Verifica e converte as datas para o formato 'yyyy-mm-dd'
if (in_array($field, ['Data de Fabricação', 'Data de Vencimento'])) {
try {
$value = Carbon::createFromFormat('m/d/Y', $value)->format('Y-m-d');
} catch (\Exception $e) {
return response()->json(['status' => 'error', 'message' => "Data inválida no campo '{$field}': {$value}. Use o formato mm/dd/yyyy."], 400);
}
}
// Adiciona o valor ao array com o nome correto do campo no banco de dados
$vaccineData[$dbField] = $value;
}
// Verifica se o nome da vacina já existe no banco de dados
if (Vaccine::where('name', $vaccineData['name'])->exists()) {
return response()->json([
'status' => 'error',
'message' => "A vacina '{$vaccineData['name']}' já existe no sistema."
], 400);
}
$vaccinesData[] = $vaccineData;
}
// Insere os dados no banco de dados
foreach ($vaccinesData as $data) {
Vaccine::create($data);
}
return response()->json(['status' => 'success', 'message' => 'Vacinas importadas com sucesso!']);
}
}