Files
artes/sistema-arte.php
2025-08-08 22:19:01 -03:00

160 lines
6.4 KiB
PHP

<?php
/**
* Plugin Name: Sistema Arte
* Description: Plugin de gerenciamento de tarefas integrado à API Vikunja.
* Shortcode disponível: [Sistema-Arte]
* Version: 1.0
* Author: Marco Antonio Vivas
* Text Domain: sistema-arte
*/
if (!defined('ABSPATH')) {
exit; // Exit if accessed directly
}
// Define plugin path
define('SISTEMA_ARTE_PATH', plugin_dir_path(__FILE__));
// Verify and include necessary files
$required_files = [
SISTEMA_ARTE_PATH . 'includes/config.php',
SISTEMA_ARTE_PATH . 'includes/api.php',
SISTEMA_ARTE_PATH . 'includes/templates/form.php',
SISTEMA_ARTE_PATH . 'includes/templates/tasks.php'
];
foreach ($required_files as $file) {
if (file_exists($file)) {
require_once $file;
} else {
wp_die('Erro fatal: Arquivo necessário não encontrado - ' . esc_html($file));
}
}
// Enqueue styles and scripts
function sistema_arte_enqueue_assets() {
// Enqueue Tailwind CSS via CDN
wp_enqueue_style('sistema-arte-tailwind', 'https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css', [], '2.2.19');
// Enqueue custom script
wp_enqueue_script('sistema-arte-script', plugins_url('/includes/assets/script.js', __FILE__), ['jquery'], '1.0.1', true);
// Localize script for form validation
wp_localize_script('sistema-arte-script', 'sistemaArte', [
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('sistema_arte_nonce')
]);
}
add_action('wp_enqueue_scripts', 'sistema_arte_enqueue_assets');
// Register shortcode
function sistema_arte_shortcode($atts) {
// Start output buffering
ob_start();
// Load config variables
global $apiBase, $token, $projectId;
// Process form submission
$message = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['sistema_arte_nonce']) && wp_verify_nonce($_POST['sistema_arte_nonce'], 'sistema_arte_nonce')) {
$title = isset($_POST['title']) ? sanitize_text_field(trim($_POST['title'])) : '';
$full_name = isset($_POST['full_name']) ? sanitize_text_field(trim($_POST['full_name'])) : '';
$department = isset($_POST['department']) ? sanitize_text_field(trim($_POST['department'])) : '';
$phone = isset($_POST['phone']) ? sanitize_text_field(trim($_POST['phone'])) : '';
$additional_info = isset($_POST['additional_info']) ? sanitize_textarea_field(trim($_POST['additional_info'])) : '';
$due_date = isset($_POST['due_date']) ? sanitize_text_field(trim($_POST['due_date'])) : '';
$priority = isset($_POST['priority']) ? absint($_POST['priority']) : null;
// Validações
$errors = [];
if (empty($title)) {
$errors[] = 'O título é obrigatório.';
}
if (empty($full_name)) {
$errors[] = 'O nome completo é obrigatório.';
}
if (empty($department)) {
$errors[] = 'A secretaria é obrigatória.';
}
if (empty($phone)) {
$errors[] = 'O telefone/WhatsApp é obrigatório.';
}
if (empty($additional_info)) {
$errors[] = 'Os detalhes da solicitação são obrigatórios.';
}
if ($due_date) {
try {
$date = new DateTime($due_date);
$due_date = $date->format('c'); // Formato ISO 8601
} catch (Exception $e) {
$errors[] = 'Data de vencimento inválida.';
}
}
if ($priority !== null && ($priority < 1 || $priority > 5)) {
$errors[] = 'Prioridade deve ser entre 1 e 5.';
}
if (empty($errors)) {
// Format description
$description = "<div style='font-family: Arial, sans-serif;'>" .
"<h3 style='color: #2563eb; border-bottom: 1px solid #ddd; padding-bottom: 5px;'>SOLICITAÇÃO</h3>" .
"<ul style='list-style-type: none; padding-left: 0;'>" .
"<li><strong>Solicitante:</strong> " . esc_html($full_name) . "</li>" .
"<li><strong>Secretaria:</strong> " . esc_html($department) . "</li>" .
"<li><strong>Contato:</strong> " . esc_html($phone) . "</li>" .
"</ul>" .
"<h3 style='color: #2563eb; border-bottom: 1px solid #ddd; padding-bottom: 5px;'>DETALHES</h3>" .
"<p style='white-space: pre-line;'>" . esc_html($additional_info) . "</p>" .
"</div>";
$task = [
'title' => $title,
'project_id' => $projectId,
'description' => $description,
];
if ($due_date) {
$task['due_date'] = $due_date;
}
if ($priority !== null) {
$task['priority'] = $priority;
}
$result = addTask($apiBase, $token, $task, $projectId);
if ($result['success']) {
$message = "Tarefa criada com sucesso! ID: {$result['data']['id']}";
} else {
$message = "Erro ao criar tarefa: {$result['error']} (HTTP {$result['http_code']})";
if ($result['http_code'] == 403) {
$message .= "<br>Permissão negada. Verifique se o usuário do token tem acesso de escrita no projeto.";
} elseif ($result['http_code'] == 400) {
$message .= "<br>Dados inválidos. Verifique o formato dos campos da tarefa.";
} elseif ($result['http_code'] == 404) {
$message .= "<br>Projeto não encontrado. Confirme se o project_id é válido.";
}
}
} else {
$message = 'Erros no formulário:<ul><li>' . implode('</li><li>', array_map('esc_html', $errors)) . '</li></ul>';
}
}
// List tasks
$tasks = listTasks($apiBase, $token, $projectId);
// Load templates
?>
<div class="container mx-auto px-4 py-8"></br>
<h1 class="text-3xl font-bold text-gray-800 mb-8 text-center">Sistema de gerenciamento de artes</h1>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<?php
sistema_arte_form_template($message);
sistema_arte_tasks_template($tasks);
?>
</div>
</div>
<?php
return ob_get_clean();
}
add_shortcode('Sistema-Arte', 'sistema_arte_shortcode');
?>