Skip to content

Adicionar importação de reservas em massa via CSV com modal de pesquisa de IDs no painel admin#152

Draft
Copilot wants to merge 18 commits into
mainfrom
copilot/importar-horarios-por-csv
Draft

Adicionar importação de reservas em massa via CSV com modal de pesquisa de IDs no painel admin#152
Copilot wants to merge 18 commits into
mainfrom
copilot/importar-horarios-por-csv

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented May 21, 2026

Este PR implementa a importação de reservas em massa via CSV no script correto da issue original: admin/reservaemmassa.php, incluindo um modal de apoio para pesquisa de IDs via API.

Alterações

  • Adicionado novo bloco de UI em admin/reservaemmassa.php para upload de CSV:
    • link para download do modelo,
    • formulário dedicado de importação.
  • Implementado novo fluxo action=import_csv para:
    • leitura/parsing de CSV com delimitador ;,
    • validação de token CSRF,
    • validação de referências (SalaID, RequisitorID, TempoID),
    • validação de data (YYYY-MM-DD),
    • deteção e ignorar duplicados já existentes em reservas,
    • inserção de reservas com aprovado = 1,
    • feedback agregado de sucesso/avisos/erros.
  • Registo de ação administrativa no padrão existente via acaoexecutada(...).
  • Adicionado template de suporte assets/csvsample_reservas.csv.
  • Adicionado modal de pesquisa de IDs em admin/reservaemmassa.php com 3 tabs:
    • requisitorID,
    • tempoID,
    • salaID.
  • Adicionados endpoints dedicados em /admin/api para suportar a pesquisa no modal:
    • admin/api/requisitor_lookup.php,
    • admin/api/tempo_lookup.php,
    • admin/api/sala_lookup.php.
  • Pesquisa no modal com:
    • placeholders/skeletons Bootstrap durante carregamento,
    • filtro mínimo obrigatório (2 caracteres),
    • limite de 10 resultados por pesquisa para reduzir carga na base de dados.

Resultado

A importação CSV fica disponível no módulo de reservas em massa (admin/reservaemmassa.php), alinhada com o escopo correto da issue, e passa a ter apoio de pesquisa rápida de IDs (requisitor, tempo e sala) para facilitar a preparação dos ficheiros CSV.

Copilot AI requested review from Copilot and removed request for Copilot May 21, 2026 21:47
Copilot AI linked an issue May 21, 2026 that may be closed by this pull request
Agent-Logs-Url: https://github.com/marpisco/ClassLink/sessions/c15f61c7-4d55-40de-b428-433cbce7baa9

Co-authored-by: marpisco <162377105+marpisco@users.noreply.github.com>
Copilot AI requested review from Copilot and removed request for Copilot May 21, 2026 21:48
Copilot AI requested review from Copilot and removed request for Copilot May 21, 2026 21:50
Copilot AI changed the title [WIP] Add horarios importação por CSV Adicionar importação de horários (tempos) via CSV no painel admin May 21, 2026
Copilot AI requested a review from marpisco May 21, 2026 21:51
Copy link
Copy Markdown
Owner

@marpisco marpisco left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot Anula, não estou a falar da importação de tempos na minha issue original, estou a referir me às importações de reservas (script atual admin/reservaemmassa.php)

Agent-Logs-Url: https://github.com/marpisco/ClassLink/sessions/3ff397cc-c4ca-405e-846d-9e183bfa8375

Co-authored-by: marpisco <162377105+marpisco@users.noreply.github.com>
Copilot AI requested review from Copilot and removed request for Copilot May 21, 2026 22:00
Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 21, 2026

@copilot Anula, não estou a falar da importação de tempos na minha issue original, estou a referir me às importações de reservas (script atual admin/reservaemmassa.php)

Reverti totalmente essas alterações fora de escopo no commit 99cf827 (removida a importação CSV de tempos e o ficheiro de exemplo). Screenshot de verificação da UI revertida: /tmp/playwright-logs/page-2026-05-21T21-59-53-748Z.png.

Se quiseres, avanço já com a implementação correta da importação CSV nas reservas em massa (admin/reservaemmassa.php).

Copilot AI changed the title Adicionar importação de horários (tempos) via CSV no painel admin Reverter importação de horários (tempos) via CSV no painel admin May 21, 2026
Copilot AI requested a review from marpisco May 21, 2026 22:00
@marpisco
Copy link
Copy Markdown
Owner

@copilot Sim, podes avançar com a implementação do correto.

Agent-Logs-Url: https://github.com/marpisco/ClassLink/sessions/4b49d234-7d64-4371-9ed8-1404a6bdde04

Co-authored-by: marpisco <162377105+marpisco@users.noreply.github.com>
Copilot AI requested review from Copilot and removed request for Copilot May 21, 2026 22:04
Copilot AI requested review from Copilot and removed request for Copilot May 21, 2026 22:24
Copilot AI requested review from Copilot and removed request for Copilot May 21, 2026 22:25
Copilot AI requested review from Copilot and removed request for Copilot May 21, 2026 22:26
Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 21, 2026

@copilot Adiciona um modal que te permita pesquisar via API (penso que consegues até reaproveitar os endpoints do requisitorID, mas usa /admin/api para criar as APIs de busca) pelo requisitorID, temp...

Feito no commit 45815ec (inclui os anteriores d711f8f, 3dfce7d e 5c61670): adicionei o modal com 3 tabs (requisitorID, tempoID, salaID) com pesquisa via APIs em /admin/api, skeleton placeholders durante carregamento, e limite de 10 resultados com filtro mínimo obrigatório.

Screenshot: /tmp/playwright-logs/page-2026-05-21T22-22-36-016Z.png.

Copilot AI changed the title Adicionar importação de reservas em massa via CSV no painel admin Adicionar importação de reservas em massa via CSV com modal de pesquisa de IDs no painel admin May 21, 2026
Copilot AI review requested due to automatic review settings May 21, 2026 22:32
@github-actions
Copy link
Copy Markdown

📝 Manual Update Required? It looks like you've modified core logic. Please check if the user manual needs a refresh! @marpisco

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implementa importação de reservas em massa via CSV no painel de admin (admin/reservaemmassa.php), com um modal para pesquisa rápida de IDs (requisitor/tempo/sala) suportado por endpoints JSON em /admin/api.

Changes:

  • Adiciona UI e fluxo action=import_csv para upload, parsing e importação de reservas a partir de CSV (delimitador ;), com validações e feedback agregado.
  • Introduz modal (tabs) para lookup de IDs e integra chamadas fetch() para endpoints dedicados.
  • Adiciona um ficheiro de modelo CSV para facilitar a preparação de importações.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
assets/csvsample_reservas.csv Adiciona modelo de CSV para importação de reservas em massa.
admin/reservaemmassa.php Implementa fluxo de importação CSV + modal de lookup de IDs no ecrã de reservas em massa.
admin/api/requisitor_lookup.php Endpoint JSON para lookup de requisitores (cache) com filtro mínimo e limite.
admin/api/tempo_lookup.php Endpoint JSON para lookup de tempos com filtro mínimo e limite.
admin/api/sala_lookup.php Endpoint JSON para lookup de salas com filtro mínimo e limite.
Comments suppressed due to low confidence (1)

admin/reservaemmassa.php:444

  • O formulário principal de criação de reservas em massa (massReservationForm) continua sem token CSRF, apesar de já existir helper csrf_token_field() e de o novo fluxo de importação CSV o usar. Como este POST cria reservas (ação sensível de admin), deve incluir o campo CSRF e validar o token antes de processar $_POST.
<form id="massReservationForm" action="reservaemmassa.php" method="POST" class="mt-4">
    <div class="row mb-3">
        <div class="col-md-6">
            <div class="form-floating">
                <select class="form-select" id="sala" name="sala" required>

Comment thread admin/reservaemmassa.php Outdated
Comment on lines +302 to +313
if (count($data) < 5) {
$errorCount++;
$errors[] = "Linha {$lineNumber} inválida (mínimo 5 colunas).";
continue;
}

$salaId = $firstColumn;
$requisitorId = trim($data[1]);
$tempoId = trim($data[2]);
$dataReserva = trim($data[3]);
$motivo = trim($data[4]);
$extra = isset($data[5]) ? trim($data[5]) : '';
Comment thread admin/reservaemmassa.php
Comment on lines +263 to +280
$requisitoresValidos = [];
$stmtRequisitores = $db->prepare("SELECT id FROM cache");
$stmtRequisitores->execute();
$resultRequisitores = $stmtRequisitores->get_result();
while ($row = $resultRequisitores->fetch_assoc()) {
$requisitoresValidos[$row['id']] = true;
}
$stmtRequisitores->close();

$temposValidos = [];
$stmtTempos = $db->prepare("SELECT id FROM tempos");
$stmtTempos->execute();
$resultTempos = $stmtTempos->get_result();
while ($row = $resultTempos->fetch_assoc()) {
$temposValidos[$row['id']] = true;
}
$stmtTempos->close();

Comment thread admin/reservaemmassa.php
Copy link
Copy Markdown
Owner

@marpisco marpisco left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot De acordo com a revisão automática, faz o seguinte:

"O parser CSV rejeita linhas com menos de 5 colunas (count($data) < 5), mas o próprio código trata Motivo como opcional (preenche valor por omissão quando vazio) e a UI indica Extra como opcional. Assim, um CSV válido com apenas 4 colunas (sem Motivo/Extra) vai falhar desnecessariamente. Ajustar a validação para aceitar 4 colunas e tratar data[4]/data[5] como opcionais (default quando ausentes)."

Parece me correto e deve de ser corrigido.

Agent-Logs-Url: https://github.com/marpisco/ClassLink/sessions/7ee34890-325a-4694-af70-b9c8c4869a66

Co-authored-by: marpisco <162377105+marpisco@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 21, 2026

@copilot De acordo com a revisão automática, faz o seguinte:

"O parser CSV rejeita linhas com menos de 5 colunas (count($data) < 5), mas o próprio código trata Motivo como opcional (preenche valo...

Corrigido no commit 9035d51: o parser agora aceita linhas com mínimo de 4 colunas e trata data[4] (Motivo) e data[5] (Extra) como opcionais quando ausentes. Validei com php -l admin/reservaemmassa.php.

Copilot AI requested a review from marpisco May 21, 2026 22:46
Copy link
Copy Markdown
Owner

@marpisco marpisco left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot Fiz no Excel e saiu me um ficheiro com ,. Modifica a lógica do /admin/materiais.php para ler ficheiros com , (porque isto é suposto ser feito no Excel), modifica o csvsample.csv para ser csvsample_materiais.csv (e ser em virgulas), e modifica o csvsample_reservas.csv para ser também com vírgulas e faz com a importação das reservas em massa sejam em vírgulas (e não em ponto e vírgula, refiro a apenas virgula quando falo em ficheiros com virgulas neste pedido).

Agent-Logs-Url: https://github.com/marpisco/ClassLink/sessions/41bc349a-24b5-4d23-a36a-79d2398775f9

Co-authored-by: marpisco <162377105+marpisco@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Horários importação por CSV

3 participants