Redmine/front/entity.form.php
Gemini c8765ca5ff fix: custom fields obrigatórios na criação de projeto + identifier lowercase (1.5.6)
- form das abas Redmine exibe/envia custom_field_values (Tipo de Projeto etc.)
- createProjectFull normaliza o identificador (minúsculas)
- sync da aba de projeto usa syncMetadata completo (não apaga mais o cache)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 09:53:23 -03:00

97 lines
3.9 KiB
PHP

<?php
include ("../../../inc/includes.php");
Session::checkLoginUser();
if (isset($_POST["action"])) {
$action = $_POST["action"];
$entities_id = (int) $_POST["entities_id"];
// Permission check
$entity = new Entity();
if (!$entity->getFromDB($entities_id) || !$entity->can($entities_id, UPDATE)) {
Html::displayRightError();
}
global $DB;
if ($action === 'sync') {
$metadata = PluginRedmineRedmineapi::syncMetadata();
if ($metadata !== false) {
$DB->update('glpi_plugin_redmine_configs', [
'metadata_cache' => json_encode($metadata)
], ['id' => 1]);
PluginRedmineRedmineapi::syncUsers();
Session::addMessageAfterRedirect(__('Metadados sincronizados com sucesso!', 'redmine'));
} else {
Session::addMessageAfterRedirect(__('Erro ao sincronizar com o Redmine.', 'redmine'), false, ERROR);
}
}
elseif ($action === 'set_category') {
$DB->update('glpi_plugin_redmine_entities', [
'default_category_id' => (int) ($_POST['default_category_id'] ?? 0)
], [
'entities_id' => $entities_id
]);
Session::addMessageAfterRedirect(__('Categoria padrão salva com sucesso!', 'redmine'));
}
elseif ($action === 'unlink') {
$DB->delete('glpi_plugin_redmine_entities', ['entities_id' => $entities_id]);
Session::addMessageAfterRedirect(__('Entidade desvinculada do Redmine.', 'redmine'));
}
elseif ($action === 'process') {
$redmine_project_id = $_POST['redmine_project_id'] ?? '';
if (!empty($redmine_project_id)) {
// LINK OPERATION
$DB->insert('glpi_plugin_redmine_entities', [
'entities_id' => $entities_id,
'redmine_project_id' => $redmine_project_id
]);
Session::addMessageAfterRedirect(__('Entidade vinculada com sucesso!', 'redmine'));
} else {
// CREATE OPERATION
$payload = [
'name' => $_POST['name'],
'identifier' => $_POST['identifier'],
'description' => $_POST['description'],
'is_public' => !empty($_POST['is_public'])
];
if (!empty($_POST['parent_id'])) {
$payload['parent_id'] = $_POST['parent_id'];
}
if (!empty($_POST['enabled_module_names'])) {
$payload['enabled_module_names'] = $_POST['enabled_module_names'];
}
// Custom fields de projeto (obrigatórios em alguns Redmine).
// O empty-choice do dropdown envia '0' — descartar junto com vazios.
if (!empty($_POST['custom_field_values']) && is_array($_POST['custom_field_values'])) {
$cfv = [];
foreach ($_POST['custom_field_values'] as $cfid => $cfval) {
if ($cfval !== '' && $cfval !== null && $cfval !== '0' && $cfval !== 0) {
$cfv[(string) (int) $cfid] = $cfval;
}
}
if (!empty($cfv)) {
$payload['custom_field_values'] = $cfv;
}
}
$new_redmine_id = PluginRedmineRedmineapi::createProjectFull($payload);
if ($new_redmine_id) {
$DB->insert('glpi_plugin_redmine_entities', [
'entities_id' => $entities_id,
'redmine_project_id' => $new_redmine_id
]);
Session::addMessageAfterRedirect(__('Projeto criado e vinculado à entidade com sucesso!', 'redmine'));
} else {
Session::addMessageAfterRedirect(__('Erro ao criar projeto no Redmine.', 'redmine'), false, ERROR);
}
}
}
Html::redirect($CFG_GLPI["root_doc"] . "/front/entity.form.php?id=" . $entities_id);
}
Html::displayErrorAndDie("Lost");