From c13312a14c2c6fec626bfd50a2e8fafe3d8045f2 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Thu, 20 Nov 2025 02:21:39 +0000 Subject: [PATCH] Nov 19,2025 --- .perm_test_apache | 0 .perm_test_exec | 0 ai/LocalAIApi.php | 311 ++++++++++ ai/config.php | 52 ++ api/chat.php | 67 ++ assets/css/custom.css | 271 +++++++++ assets/js/main.js | 74 +++ assets/pasted-20251111-052937-ae05f6a6.jpg | Bin 0 -> 50483 bytes assets/pasted-20251111-062128-0e3cd006.jpg | Bin 0 -> 18674 bytes assets/vm-shot-2025-11-11T05-29-19-670Z.jpg | Bin 0 -> 50483 bytes assets/vm-shot-2025-11-11T06-19-43-142Z.jpg | Bin 0 -> 18674 bytes auth.php | 86 +++ chat.php | 164 +++++ dashboard.php | 460 ++++++++++++++ db/config.php | 42 +- db/migrate.php | 21 + db/migrations/001_create_candidates_table.sql | 10 + db/migrations/002_create_tasks_table.sql | 10 + ...03_create_roles_and_permissions_tables.sql | 42 ++ db/migrations/004_create_users_table.sql | 9 + db/migrations/005_create_workflows_table.sql | 6 + .../006_create_workflow_actions_table.sql | 8 + db/migrations/007_add_role_id_to_users.sql | 1 + db/migrations/008_create_tasks_table.sql | 8 + .../009_add_candidates_permissions.sql | 6 + db/migrations/010_add_tasks_permissions.sql | 11 + .../011_create_workflow_logs_table.sql | 7 + db/migrations/012_add_updated_at_to_tasks.sql | 1 + db/migrations/013_add_delete_permissions.sql | 1 + delete_candidate.php | 20 + delete_task.php | 20 + edit_candidate.php | 126 ++++ edit_role.php | 142 +++++ edit_task.php | 133 ++++ index.php | 574 +++++++++++++----- login.php | 68 +++ logout.php | 7 + register.php | 63 ++ roles.php | 128 ++++ workflow_actions.php | 230 +++++++ workflow_engine.php | 65 ++ workflows.php | 144 +++++ 42 files changed, 3239 insertions(+), 149 deletions(-) create mode 100644 .perm_test_apache create mode 100644 .perm_test_exec create mode 100644 ai/LocalAIApi.php create mode 100644 ai/config.php create mode 100644 api/chat.php create mode 100644 assets/css/custom.css create mode 100644 assets/js/main.js create mode 100644 assets/pasted-20251111-052937-ae05f6a6.jpg create mode 100644 assets/pasted-20251111-062128-0e3cd006.jpg create mode 100644 assets/vm-shot-2025-11-11T05-29-19-670Z.jpg create mode 100644 assets/vm-shot-2025-11-11T06-19-43-142Z.jpg create mode 100644 auth.php create mode 100644 chat.php create mode 100644 dashboard.php create mode 100644 db/migrate.php create mode 100644 db/migrations/001_create_candidates_table.sql create mode 100644 db/migrations/002_create_tasks_table.sql create mode 100644 db/migrations/003_create_roles_and_permissions_tables.sql create mode 100644 db/migrations/004_create_users_table.sql create mode 100644 db/migrations/005_create_workflows_table.sql create mode 100644 db/migrations/006_create_workflow_actions_table.sql create mode 100644 db/migrations/007_add_role_id_to_users.sql create mode 100644 db/migrations/008_create_tasks_table.sql create mode 100644 db/migrations/009_add_candidates_permissions.sql create mode 100644 db/migrations/010_add_tasks_permissions.sql create mode 100644 db/migrations/011_create_workflow_logs_table.sql create mode 100644 db/migrations/012_add_updated_at_to_tasks.sql create mode 100644 db/migrations/013_add_delete_permissions.sql create mode 100644 delete_candidate.php create mode 100644 delete_task.php create mode 100644 edit_candidate.php create mode 100644 edit_role.php create mode 100644 edit_task.php create mode 100644 login.php create mode 100644 logout.php create mode 100644 register.php create mode 100644 roles.php create mode 100644 workflow_actions.php create mode 100644 workflow_engine.php create mode 100644 workflows.php diff --git a/.perm_test_apache b/.perm_test_apache new file mode 100644 index 0000000..e69de29 diff --git a/.perm_test_exec b/.perm_test_exec new file mode 100644 index 0000000..e69de29 diff --git a/ai/LocalAIApi.php b/ai/LocalAIApi.php new file mode 100644 index 0000000..00b1b00 --- /dev/null +++ b/ai/LocalAIApi.php @@ -0,0 +1,311 @@ + [ +// ['role' => 'system', 'content' => 'You are a helpful assistant.'], +// ['role' => 'user', 'content' => 'Tell me a bedtime story.'], +// ], +// ]); +// if (!empty($response['success'])) { +// $decoded = LocalAIApi::decodeJsonFromResponse($response); +// } + +class LocalAIApi +{ + /** @var array|null */ + private static ?array $configCache = null; + + /** + * Signature compatible with the OpenAI Responses API. + * + * @param array $params Request body (model, input, text, reasoning, metadata, etc.). + * @param array $options Extra options (timeout, verify_tls, headers, path, project_uuid). + * @return array{ + * success:bool, + * status?:int, + * data?:mixed, + * error?:string, + * response?:mixed, + * message?:string + * } + */ + public static function createResponse(array $params, array $options = []): array + { + $cfg = self::config(); + $payload = $params; + + if (empty($payload['input']) || !is_array($payload['input'])) { + return [ + 'success' => false, + 'error' => 'input_missing', + 'message' => 'Parameter "input" is required and must be an array.', + ]; + } + + if (!isset($payload['model']) || $payload['model'] === '') { + $payload['model'] = $cfg['default_model']; + } + + return self::request($options['path'] ?? null, $payload, $options); + } + + /** + * Snake_case alias for createResponse (matches the provided example). + * + * @param array $params + * @param array $options + * @return array + */ + public static function create_response(array $params, array $options = []): array + { + return self::createResponse($params, $options); + } + + /** + * Perform a raw request to the AI proxy. + * + * @param string $path Endpoint (may be an absolute URL). + * @param array $payload JSON payload. + * @param array $options Additional request options. + * @return array + */ + public static function request(?string $path = null, array $payload = [], array $options = []): array + { + if (!function_exists('curl_init')) { + return [ + 'success' => false, + 'error' => 'curl_missing', + 'message' => 'PHP cURL extension is missing. Install or enable it on the VM.', + ]; + } + + $cfg = self::config(); + + $projectUuid = $cfg['project_uuid']; + if (empty($projectUuid)) { + return [ + 'success' => false, + 'error' => 'project_uuid_missing', + 'message' => 'PROJECT_UUID is not defined; aborting AI request.', + ]; + } + + $defaultPath = $cfg['responses_path'] ?? null; + $resolvedPath = $path ?? ($options['path'] ?? $defaultPath); + if (empty($resolvedPath)) { + return [ + 'success' => false, + 'error' => 'project_id_missing', + 'message' => 'PROJECT_ID is not defined; cannot resolve AI proxy endpoint.', + ]; + } + + $url = self::buildUrl($resolvedPath, $cfg['base_url']); + $baseTimeout = isset($cfg['timeout']) ? (int) $cfg['timeout'] : 30; + $timeout = isset($options['timeout']) ? (int) $options['timeout'] : $baseTimeout; + if ($timeout <= 0) { + $timeout = 30; + } + + $baseVerifyTls = array_key_exists('verify_tls', $cfg) ? (bool) $cfg['verify_tls'] : true; + $verifyTls = array_key_exists('verify_tls', $options) + ? (bool) $options['verify_tls'] + : $baseVerifyTls; + + $projectHeader = $cfg['project_header']; + + $headers = [ + 'Content-Type: application/json', + 'Accept: application/json', + ]; + $headers[] = $projectHeader . ': ' . $projectUuid; + if (!empty($options['headers']) && is_array($options['headers'])) { + foreach ($options['headers'] as $header) { + if (is_string($header) && $header !== '') { + $headers[] = $header; + } + } + } + + if (!empty($projectUuid) && !array_key_exists('project_uuid', $payload)) { + $payload['project_uuid'] = $projectUuid; + } + + $body = json_encode($payload, JSON_UNESCAPED_UNICODE); + if ($body === false) { + return [ + 'success' => false, + 'error' => 'json_encode_failed', + 'message' => 'Failed to encode request body to JSON.', + ]; + } + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $body); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $verifyTls); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $verifyTls ? 2 : 0); + curl_setopt($ch, CURLOPT_FAILONERROR, false); + + $responseBody = curl_exec($ch); + if ($responseBody === false) { + $error = curl_error($ch) ?: 'Unknown cURL error'; + curl_close($ch); + return [ + 'success' => false, + 'error' => 'curl_error', + 'message' => $error, + ]; + } + + $status = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + $decoded = null; + if ($responseBody !== '' && $responseBody !== null) { + $decoded = json_decode($responseBody, true); + if (json_last_error() !== JSON_ERROR_NONE) { + $decoded = null; + } + } + + if ($status >= 200 && $status < 300) { + return [ + 'success' => true, + 'status' => $status, + 'data' => $decoded ?? $responseBody, + ]; + } + + $errorMessage = 'AI proxy request failed'; + if (is_array($decoded)) { + $errorMessage = $decoded['error'] ?? $decoded['message'] ?? $errorMessage; + } elseif (is_string($responseBody) && $responseBody !== '') { + $errorMessage = $responseBody; + } + + return [ + 'success' => false, + 'status' => $status, + 'error' => $errorMessage, + 'response' => $decoded ?? $responseBody, + ]; + } + + /** + * Extract plain text from a Responses API payload. + * + * @param array $response Result of LocalAIApi::createResponse|request. + * @return string + */ + public static function extractText(array $response): string + { + $payload = $response['data'] ?? $response; + if (!is_array($payload)) { + return ''; + } + + if (!empty($payload['output']) && is_array($payload['output'])) { + $combined = ''; + foreach ($payload['output'] as $item) { + if (!isset($item['content']) || !is_array($item['content'])) { + continue; + } + foreach ($item['content'] as $block) { + if (is_array($block) && ($block['type'] ?? '') === 'output_text' && !empty($block['text'])) { + $combined .= $block['text']; + } + } + } + if ($combined !== '') { + return $combined; + } + } + + if (!empty($payload['choices'][0]['message']['content'])) { + return (string) $payload['choices'][0]['message']['content']; + } + + return ''; + } + + /** + * Attempt to decode JSON emitted by the model (handles markdown fences). + * + * @param array $response + * @return array|null + */ + public static function decodeJsonFromResponse(array $response): ?array + { + $text = self::extractText($response); + if ($text === '') { + return null; + } + + $decoded = json_decode($text, true); + if (is_array($decoded)) { + return $decoded; + } + + $stripped = preg_replace('/^```json|```$/m', '', trim($text)); + if ($stripped !== null && $stripped !== $text) { + $decoded = json_decode($stripped, true); + if (is_array($decoded)) { + return $decoded; + } + } + + return null; + } + + /** + * Load configuration from ai/config.php. + * + * @return array + */ + private static function config(): array + { + if (self::$configCache === null) { + $configPath = __DIR__ . '/config.php'; + if (!file_exists($configPath)) { + throw new RuntimeException('AI config file not found: ai/config.php'); + } + $cfg = require $configPath; + if (!is_array($cfg)) { + throw new RuntimeException('Invalid AI config format: expected array'); + } + self::$configCache = $cfg; + } + + return self::$configCache; + } + + /** + * Build an absolute URL from base_url and a path. + */ + private static function buildUrl(string $path, string $baseUrl): string + { + $trimmed = trim($path); + if ($trimmed === '') { + return $baseUrl; + } + if (str_starts_with($trimmed, 'http://') || str_starts_with($trimmed, 'https://')) { + return $trimmed; + } + if ($trimmed[0] === '/') { + return $baseUrl . $trimmed; + } + return $baseUrl . '/' . $trimmed; + } +} + +// Legacy alias for backward compatibility with the previous class name. +if (!class_exists('OpenAIService')) { + class_alias(LocalAIApi::class, 'OpenAIService'); +} diff --git a/ai/config.php b/ai/config.php new file mode 100644 index 0000000..1ba1596 --- /dev/null +++ b/ai/config.php @@ -0,0 +1,52 @@ + $baseUrl, + 'responses_path' => $responsesPath, + 'project_id' => $projectId, + 'project_uuid' => $projectUuid, + 'project_header' => 'project-uuid', + 'default_model' => 'gpt-5', + 'timeout' => 30, + 'verify_tls' => true, +]; diff --git a/api/chat.php b/api/chat.php new file mode 100644 index 0000000..b084fc0 --- /dev/null +++ b/api/chat.php @@ -0,0 +1,67 @@ + 'No message provided.']); + exit; +} + +// --- Context Gathering --- +$context = ""; + +try { + $pdo = db(); + + // Fetch candidates + $stmt = $pdo->query("SELECT name, status, email FROM candidates ORDER BY created_at DESC LIMIT 10"); + $candidates = $stmt->fetchAll(PDO::FETCH_ASSOC); + $context .= "\n\nRecent Candidates:\n" . json_encode($candidates, JSON_PRETTY_PRINT); + + // Fetch tasks + $stmt = $pdo->query("SELECT t.task_name, c.name as assigned_to, t.status, t.due_date FROM tasks t JOIN candidates c ON t.candidate_id = c.id ORDER BY t.created_at DESC LIMIT 10"); + $tasks = $stmt->fetchAll(PDO::FETCH_ASSOC); + $context .= "\n\nRecent Tasks:\n" . json_encode($tasks, JSON_PRETTY_PRINT); + +} catch (PDOException $e) { + // Don't expose DB errors to the user, but log them. + error_log("AI Chat Context Error: " . $e->getMessage()); + // Provide a fallback context + $context = "\n\nCould not fetch real-time data. Please rely on general knowledge."; +} + + +// --- AI Interaction --- +$systemPrompt = << 'system', 'content' => $systemPrompt], + ['role' => 'user', 'content' => $userMessage] +]; + +$response = LocalAIApi::createResponse([ + 'input' => $messages, +]); + +if (!empty($response['success'])) { + $decoded = LocalAIApi::decodeJsonFromResponse($response); + $aiReply = $decoded['choices'][0]['message']['content'] ?? 'Sorry, I could not process that.'; + echo json_encode(['reply' => $aiReply]); +} else { + error_log('AI error: ' . ($response['error'] ?? 'unknown')); + echo json_encode(['error' => 'Failed to get a response from the AI.']); +} + +?> \ No newline at end of file diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 0000000..23678e4 --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1,271 @@ +@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap'); + +:root { + --primary-color: #3B82F6; + --secondary-color: #10B981; + --background-color: #F3F4F6; + --surface-color: #FFFFFF; + --text-color: #1F2937; + --text-color-light: #6B7280; + --border-color: #D1D5DB; + --border-radius: 0.75rem; +} + +body { + font-family: 'Poppins', sans-serif; + background-color: var(--background-color); + color: var(--text-color); +} + +.header { + background-color: var(--surface-color); + border-bottom: 1px solid var(--border-color); + padding: 1.5rem 2.5rem; +} + +.logo { + font-weight: 700; + font-size: 1.75rem; + color: var(--text-color); +} + +.logo .dot { + color: var(--primary-color); +} + +.main-content { + padding: 2.5rem; +} + +.page-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; +} + +.page-title { + font-size: 2.25rem; + font-weight: 700; +} + +.btn-primary { + background-color: var(--primary-color); + border-color: var(--primary-color); + border-radius: var(--border-radius); + padding: 0.75rem 1.5rem; + font-weight: 600; + transition: all 0.2s ease-in-out; +} + +.btn-primary:hover { + background-color: #2563EB; + border-color: #2563EB; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +.card { + border: 1px solid var(--border-color); + border-radius: var(--border-radius); + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); + transition: all 0.2s ease-in-out; +} + +.card:hover { + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); + transform: translateY(-2px); +} + +.table { + border-collapse: separate; + border-spacing: 0; +} + +.table th { + color: var(--text-color-light); + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + font-size: 0.875rem; + border-bottom: 2px solid var(--border-color) !important; + padding: 1rem 1.5rem; +} + +.table td { + vertical-align: middle; + padding: 1.25rem 1.5rem; +} + +.table tbody tr { + transition: all 0.2s ease-in-out; +} + +.table tbody tr:hover { + background-color: #F9FAFB; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); +} + +.table tbody tr:last-child td { + border-bottom: none; +} + +.avatar { + width: 48px; + height: 48px; + border-radius: 50%; + margin-right: 1.25rem; + object-fit: cover; +} + +.candidate-name { + font-weight: 600; + font-size: 1.125rem; +} + +.candidate-email { + color: var(--text-color-light); + font-size: 1rem; +} + +.status-badge { + display: inline-block; + padding: 0.35em 0.75em; + font-size: .875em; + font-weight: 600; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.5rem; +} + +.status-new { background-color: #DBEAFE; color: #2563EB; } +.status-interview { background-color: #FEF3C7; color: #D97706; } +.status-hired { background-color: #D1FAE5; color: #059669; } +.status-rejected { background-color: #FEE2E2; color: #DC2626; } + +.action-icon { + color: var(--text-color-light); + cursor: pointer; + transition: all 0.2s ease-in-out; +} +.action-icon:hover { + color: var(--text-color); + transform: scale(1.1); +} + +.status-todo { background-color: #E0E7FF; color: #4338CA; } +.status-in-progress { background-color: #FEF9C3; color: #A16207; } +.status-done { background-color: #D1FAE5; color: #059669; } + +/* Chat Interface Styles */ +.chat-toggle-button { + position: fixed; + bottom: 2.5rem; + right: 2.5rem; + width: 64px; + height: 64px; + border-radius: 50%; + background-color: var(--primary-color); + color: white; + border: none; + display: flex; + justify-content: center; + align-items: center; + box-shadow: 0 8px 16px rgba(0,0,0,0.2); + cursor: pointer; + z-index: 1000; + transition: all 0.2s ease-in-out; +} + +.chat-toggle-button:hover { + transform: scale(1.05); + box-shadow: 0 12px 24px rgba(0,0,0,0.2); +} + +.chat-container { + position: fixed; + bottom: 7rem; + right: 2.5rem; + width: 375px; + max-width: 90%; + background-color: var(--surface-color); + border-radius: var(--border-radius); + box-shadow: 0 8px 24px rgba(0,0,0,0.15); + display: none; /* Hidden by default */ + flex-direction: column; + z-index: 1000; +} + +.chat-header { + padding: 1.25rem; + background-color: var(--primary-color); + color: white; + display: flex; + justify-content: space-between; + align-items: center; + border-top-left-radius: var(--border-radius); + border-top-right-radius: var(--border-radius); +} + +.chat-body { + padding: 1.25rem; + height: 350px; + overflow-y: auto; +} + +.chat-input-container { + display: flex; + padding: 1.25rem; + border-top: 1px solid var(--border-color); +} + +#chat-input { + flex-grow: 1; + margin-right: 0.75rem; + border-radius: var(--border-radius); +} + +.chat-message { + padding: 0.75rem 1.25rem; + border-radius: 1.25rem; + margin-bottom: 0.75rem; + max-width: 85%; + line-height: 1.5; +} + +.chat-message-user { + background-color: var(--primary-color); + color: white; + align-self: flex-end; + margin-left: auto; +} + +.chat-message-ai { + background-color: #E5E7EB; + color: var(--text-color); + align-self: flex-start; +} + +/* Dashboard Specific Styles */ +.dashboard-card { + margin-bottom: 1.5rem; +} + +.card-title { + font-weight: 600; +} + +.pagination { + justify-content: center; +} + +.table-responsive { + margin-top: 1rem; +} + +.badge { + font-size: 0.9em; + padding: 0.5em 0.75em; +} \ No newline at end of file diff --git a/assets/js/main.js b/assets/js/main.js new file mode 100644 index 0000000..802412a --- /dev/null +++ b/assets/js/main.js @@ -0,0 +1,74 @@ +// FinMox Flow main.js + +document.addEventListener('DOMContentLoaded', function() { + const chatContainer = document.getElementById('chat-container'); + const chatToggle = document.getElementById('chat-toggle'); + const closeChat = document.getElementById('close-chat'); + const chatInput = document.getElementById('chat-input'); + const sendChat = document.getElementById('send-chat'); + const chatBody = document.getElementById('chat-body'); + + // Toggle chat window + if (chatToggle) { + chatToggle.addEventListener('click', function() { + chatContainer.style.display = (chatContainer.style.display === 'flex') ? 'none' : 'flex'; + }); + } + + // Close chat window + if (closeChat) { + closeChat.addEventListener('click', function() { + chatContainer.style.display = 'none'; + }); + } + + // Send message + const sendMessage = () => { + const message = chatInput.value.trim(); + if (message === '') return; + + appendMessage(message, 'user'); + chatInput.value = ''; + + fetch('api/chat.php', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ message: message }) + }) + .then(response => response.json()) + .then(data => { + if (data.reply) { + appendMessage(data.reply, 'ai'); + } else { + appendMessage('Sorry, something went wrong.', 'ai'); + } + }) + .catch(error => { + console.error('Error:', error); + appendMessage('Sorry, something went wrong.', 'ai'); + }); + }; + + if (sendChat) { + sendChat.addEventListener('click', sendMessage); + } + + if (chatInput) { + chatInput.addEventListener('keypress', function(e) { + if (e.key === 'Enter') { + sendMessage(); + } + }); + } + + // Append message to chat body + const appendMessage = (message, sender) => { + const messageElement = document.createElement('div'); + messageElement.classList.add('chat-message', `chat-message-${sender}`); + messageElement.textContent = message; + chatBody.appendChild(messageElement); + chatBody.scrollTop = chatBody.scrollHeight; // Scroll to bottom + }; +}); diff --git a/assets/pasted-20251111-052937-ae05f6a6.jpg b/assets/pasted-20251111-052937-ae05f6a6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b1e34d69833cc54489984d181b5bdb190f59050 GIT binary patch literal 50483 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 II?K}k1FC1YRsaA1 literal 0 HcmV?d00001 diff --git a/assets/vm-shot-2025-11-11T05-29-19-670Z.jpg b/assets/vm-shot-2025-11-11T05-29-19-670Z.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b1e34d69833cc54489984d181b5bdb190f59050 GIT binary patch literal 50483 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 II?K}k1FC1YRsaA1 literal 0 HcmV?d00001 diff --git a/auth.php b/auth.php new file mode 100644 index 0000000..ea1d589 --- /dev/null +++ b/auth.php @@ -0,0 +1,86 @@ +prepare("SELECT id FROM roles WHERE name = 'Admin'"); + $stmt->execute(); + $role = $stmt->fetch(); + $default_role_id = $role ? $role['id'] : null; + + try { + $stmt = $pdo->prepare("INSERT INTO users (username, password, role_id, email) VALUES (?, ?, ?, ?)"); + return $stmt->execute([$username, $password_hash, $default_role_id, $email]); + } catch (PDOException $e) { + // Handle duplicate username + error_log($e->getMessage()); + return false; + } +} + +function login_user($username, $password) { + $pdo = db(); + $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); + $stmt->execute([$username]); + $user = $stmt->fetch(); + + if ($user && password_verify($password, $user['password'])) { + $_SESSION['user_id'] = $user['id']; + $_SESSION['username'] = $user['username']; + $_SESSION['role_id'] = $user['role_id']; + return true; + } + return false; +} + +function is_logged_in() { + return isset($_SESSION['user_id']); +} + +function logout_user() { + session_unset(); + session_destroy(); +} + +function get_user_role_id() { + return $_SESSION['role_id'] ?? null; +} + +function hasPermission($permission) { + if (!is_logged_in()) { + return false; + } + + $role_id = get_user_role_id(); + if (!$role_id) { + return false; + } + + // Super admin (role_id 1) has all permissions + if ($role_id == 1) { + return true; + } + + $pdo = db(); + + // Get the permission ID from the permission name + $stmt = $pdo->prepare("SELECT id FROM permissions WHERE name = ?"); + $stmt->execute([$permission]); + $permission_id = $stmt->fetchColumn(); + + if (!$permission_id) { + return false; // Permission not found + } + + // Check if the role has the permission + $stmt = $pdo->prepare("SELECT 1 FROM role_permissions WHERE role_id = ? AND permission_id = ?"); + $stmt->execute([$role_id, $permission_id]); + + return $stmt->fetchColumn() !== false; +} + +?> \ No newline at end of file diff --git a/chat.php b/chat.php new file mode 100644 index 0000000..9feab1d --- /dev/null +++ b/chat.php @@ -0,0 +1,164 @@ + + + + + + + + + AI Chat - FinMox + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +
+
+
+ + + + + \ No newline at end of file diff --git a/dashboard.php b/dashboard.php new file mode 100644 index 0000000..875111d --- /dev/null +++ b/dashboard.php @@ -0,0 +1,460 @@ +query('SELECT status, COUNT(*) as count FROM candidates GROUP BY status'); +$candidate_stats = $stmt->fetchAll(PDO::FETCH_ASSOC); +$total_candidates = array_sum(array_column($candidate_stats, 'count')); + +// Task stats +$stmt = $pdo->query('SELECT status, COUNT(*) as count FROM tasks GROUP BY status'); +$task_stats = $stmt->fetchAll(PDO::FETCH_ASSOC); +$total_tasks = array_sum(array_column($task_stats, 'count')); +$completed_tasks = 0; +foreach ($task_stats as $stat) { + if ($stat['status'] === 'Completed') { + $completed_tasks = $stat['count']; + break; + } +} + +$candidate_status_labels = json_encode(array_column($candidate_stats, 'status')); +$candidate_status_data = json_encode(array_column($candidate_stats, 'count')); + +$task_status_labels = json_encode(array_column($task_stats, 'status')); +$task_status_data = json_encode(array_column($task_stats, 'count')); + +// Candidates per day +$stmt = $pdo->query("SELECT DATE(created_at) as date, COUNT(*) as count FROM candidates GROUP BY DATE(created_at) ORDER BY DATE(created_at) ASC"); +$candidates_per_day = $stmt->fetchAll(PDO::FETCH_ASSOC); +$candidates_per_day_labels = json_encode(array_column($candidates_per_day, 'date')); +$candidates_per_day_data = json_encode(array_column($candidates_per_day, 'count')); + +// Tasks per day +$stmt = $pdo->query("SELECT DATE(created_at) as date, COUNT(*) as count FROM tasks GROUP BY DATE(created_at) ORDER BY DATE(created_at) ASC"); +$tasks_per_day = $stmt->fetchAll(PDO::FETCH_ASSOC); +$tasks_per_day_labels = json_encode(array_column($tasks_per_day, 'date')); +$tasks_per_day_data = json_encode(array_column($tasks_per_day, 'count')); + +// Tasks completed per day +$stmt = $pdo->query("SELECT DATE(updated_at) as date, COUNT(*) as count FROM tasks WHERE status = 'Done' GROUP BY DATE(updated_at) ORDER BY DATE(updated_at) ASC"); +$tasks_completed_per_day = $stmt->fetchAll(PDO::FETCH_ASSOC); +$tasks_completed_per_day_labels = json_encode(array_column($tasks_completed_per_day, 'date')); +$tasks_completed_per_day_data = json_encode(array_column($tasks_completed_per_day, 'count')); + +// Fetch candidates for table +$page = isset($_GET['page']) ? (int)$_GET['page'] : 1; +$limit = 5; +$offset = ($page - 1) * $limit; +$stmt = $pdo->prepare("SELECT * FROM candidates LIMIT :limit OFFSET :offset"); +$stmt->bindParam(':limit', $limit, PDO::PARAM_INT); +$stmt->bindParam(':offset', $offset, PDO::PARAM_INT); +$stmt->execute(); +$candidates = $stmt->fetchAll(PDO::FETCH_ASSOC); +$stmt = $pdo->query("SELECT COUNT(*) FROM candidates"); +$total_candidates_records = $stmt->fetchColumn(); +$total_candidate_pages = ceil($total_candidates_records / $limit); + +// Fetch tasks for table +$stmt = $pdo->prepare("SELECT * FROM tasks LIMIT :limit OFFSET :offset"); +$stmt->bindParam(':limit', $limit, PDO::PARAM_INT); +$stmt->bindParam(':offset', $offset, PDO::PARAM_INT); +$stmt->execute(); +$tasks = $stmt->fetchAll(PDO::FETCH_ASSOC); +$stmt = $pdo->query("SELECT COUNT(*) FROM tasks"); +$total_tasks_records = $stmt->fetchColumn(); +$total_task_pages = ceil($total_tasks_records / $limit); + +?> + + + + + + Analytics Dashboard + + + + + +
+ + +
+ +
+

Analytics Dashboard

+ + + + + +
+ +
+ +
+ +
+
+
+
Total Candidates
+

+
+
+
+ + +
+
+
+
Total Tasks
+

+
+
+
+
+
+
+
Completed Tasks
+

+
+
+
+ +
+ + +
+ +
+
+
+
Candidates by Status
+ +
+
+
+ + +
+
+
+
Tasks by Status
+ +
+
+
+ + +
+
+
+
Candidates per Day
+ +
+
+
+ +
+
+ +
+
+
+
Tasks Created per Day
+ +
+
+
+ + +
+
+
+
Tasks Completed per Day
+ +
+
+
+ +
+
+ + + +
+
+
+
+
+
+
Recent Candidates
+ Add Candidate +
+
+ + + + + + + + + + + + + + + + + + + +
NameEmailStatusActions
+ Edit + Delete +
+
+ +
+
+
+
+
+ + + + +
+
+
+
+
+
+
Recent Tasks
+ Add Task +
+
+ + + + + + + + + + + + + + + + + + + +
TitleStatusAssigned ToActions
+ Edit + Delete +
+
+ +
+
+
+
+
+ +
+
+ + + + + \ No newline at end of file diff --git a/db/config.php b/db/config.php index f12ebaf..f2db299 100644 --- a/db/config.php +++ b/db/config.php @@ -6,12 +6,38 @@ define('DB_USER', 'app_31009'); define('DB_PASS', '2c66b530-2a65-423a-a106-6760b49ad1a2'); function db() { - static $pdo; - if (!$pdo) { - $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8mb4', DB_USER, DB_PASS, [ - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, - ]); - } - return $pdo; + static $pdo; + if ($pdo) { + return $pdo; + } + + try { + $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8mb4', DB_USER, DB_PASS, [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + ]); + } catch (PDOException $e) { + if ($e->getCode() === 1049) { // SQLSTATE[HY000] [1049] Unknown database + try { + $tempPdo = new PDO('mysql:host='.DB_HOST, DB_USER, DB_PASS, [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + ]); + $tempPdo->exec('CREATE DATABASE IF NOT EXISTS `'.DB_NAME.'`'); + + // Now, reconnect to the newly created database + $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8mb4', DB_USER, DB_PASS, [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + ]); + } catch (PDOException $e) { + // If database creation also fails, re-throw the exception + throw $e; + } + } else { + // For any other PDO exception, re-throw it + throw $e; + } + } + + return $pdo; } diff --git a/db/migrate.php b/db/migrate.php new file mode 100644 index 0000000..53228e8 --- /dev/null +++ b/db/migrate.php @@ -0,0 +1,21 @@ +exec($sql); + echo "Migration successful: " . basename($file) . "\n"; + } catch (PDOException $e) { + echo "Migration failed for " . basename($file) . ": " . $e->getMessage() . "\n"; + } + } +} + +run_migrations(); + diff --git a/db/migrations/001_create_candidates_table.sql b/db/migrations/001_create_candidates_table.sql new file mode 100644 index 0000000..c91caa5 --- /dev/null +++ b/db/migrations/001_create_candidates_table.sql @@ -0,0 +1,10 @@ + +CREATE TABLE IF NOT EXISTS `candidates` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `name` VARCHAR(255) NOT NULL, + `email` VARCHAR(255) NOT NULL, + `phone` VARCHAR(50), + `status` ENUM('Applied', 'Interviewing', 'Offered', 'Hired', 'Rejected') NOT NULL DEFAULT 'Applied', + `notes` TEXT, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); diff --git a/db/migrations/002_create_tasks_table.sql b/db/migrations/002_create_tasks_table.sql new file mode 100644 index 0000000..d7ba52f --- /dev/null +++ b/db/migrations/002_create_tasks_table.sql @@ -0,0 +1,10 @@ +CREATE TABLE IF NOT EXISTS `tasks` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `candidate_id` INT, + `task_name` VARCHAR(255) NOT NULL, + `description` TEXT, + `due_date` DATE, + `status` VARCHAR(50) DEFAULT 'To Do', + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`candidate_id`) REFERENCES `candidates`(`id`) ON DELETE CASCADE +); diff --git a/db/migrations/003_create_roles_and_permissions_tables.sql b/db/migrations/003_create_roles_and_permissions_tables.sql new file mode 100644 index 0000000..a141aee --- /dev/null +++ b/db/migrations/003_create_roles_and_permissions_tables.sql @@ -0,0 +1,42 @@ +CREATE TABLE IF NOT EXISTS `roles` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `name` VARCHAR(255) NOT NULL UNIQUE +); + +INSERT INTO `roles` (name) VALUES ('Admin'), ('HR'), ('Manager'), ('Employee'); + +CREATE TABLE IF NOT EXISTS `permissions` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `name` VARCHAR(255) NOT NULL UNIQUE +); + +INSERT INTO `permissions` (name) VALUES +('view_dashboard'), +('manage_candidates'), +('manage_tasks'), +('manage_users'), +('view_reports'); + +CREATE TABLE IF NOT EXISTS `role_permissions` ( + `role_id` INT, + `permission_id` INT, + PRIMARY KEY (role_id, permission_id), + FOREIGN KEY (role_id) REFERENCES roles(id), + FOREIGN KEY (permission_id) REFERENCES permissions(id) +); + +-- Admin permissions +INSERT INTO `role_permissions` (role_id, permission_id) VALUES +(1, 1), (1, 2), (1, 3), (1, 4), (1, 5); + +-- HR permissions +INSERT INTO `role_permissions` (role_id, permission_id) VALUES +(2, 1), (2, 2), (2, 3), (2, 5); + +-- Manager permissions +INSERT INTO `role_permissions` (role_id, permission_id) VALUES +(3, 1), (3, 3); + +-- Employee permissions +INSERT INTO `role_permissions` (role_id, permission_id) VALUES +(4, 3); \ No newline at end of file diff --git a/db/migrations/004_create_users_table.sql b/db/migrations/004_create_users_table.sql new file mode 100644 index 0000000..abef335 --- /dev/null +++ b/db/migrations/004_create_users_table.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS `users` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `username` VARCHAR(255) NOT NULL UNIQUE, + `password` VARCHAR(255) NOT NULL, + `email` VARCHAR(255) NOT NULL UNIQUE, + `role_id` INT, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (role_id) REFERENCES roles(id) +); \ No newline at end of file diff --git a/db/migrations/005_create_workflows_table.sql b/db/migrations/005_create_workflows_table.sql new file mode 100644 index 0000000..f711c10 --- /dev/null +++ b/db/migrations/005_create_workflows_table.sql @@ -0,0 +1,6 @@ +CREATE TABLE IF NOT EXISTS `workflows` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `name` VARCHAR(255) NOT NULL, + `trigger` VARCHAR(255) NOT NULL, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); \ No newline at end of file diff --git a/db/migrations/006_create_workflow_actions_table.sql b/db/migrations/006_create_workflow_actions_table.sql new file mode 100644 index 0000000..7caf35e --- /dev/null +++ b/db/migrations/006_create_workflow_actions_table.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS `workflow_actions` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `workflow_id` INT NOT NULL, + `action_type` VARCHAR(255) NOT NULL, + `config` JSON, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON DELETE CASCADE +); \ No newline at end of file diff --git a/db/migrations/007_add_role_id_to_users.sql b/db/migrations/007_add_role_id_to_users.sql new file mode 100644 index 0000000..5d3721c --- /dev/null +++ b/db/migrations/007_add_role_id_to_users.sql @@ -0,0 +1 @@ +ALTER TABLE users ADD COLUMN role_id INT, ADD FOREIGN KEY (role_id) REFERENCES roles(id); \ No newline at end of file diff --git a/db/migrations/008_create_tasks_table.sql b/db/migrations/008_create_tasks_table.sql new file mode 100644 index 0000000..ed28ad6 --- /dev/null +++ b/db/migrations/008_create_tasks_table.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS tasks ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + assignee_id INT, + status VARCHAR(50) NOT NULL DEFAULT 'pending', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (assignee_id) REFERENCES users(id) +); diff --git a/db/migrations/009_add_candidates_permissions.sql b/db/migrations/009_add_candidates_permissions.sql new file mode 100644 index 0000000..72c2297 --- /dev/null +++ b/db/migrations/009_add_candidates_permissions.sql @@ -0,0 +1,6 @@ +INSERT INTO permissions (name) VALUES ('manage_candidates'); + +INSERT INTO role_permissions (role_id, permission_id) +SELECT + (SELECT id FROM roles WHERE name = 'Admin'), + (SELECT id FROM permissions WHERE name = 'manage_candidates'); diff --git a/db/migrations/010_add_tasks_permissions.sql b/db/migrations/010_add_tasks_permissions.sql new file mode 100644 index 0000000..571a77f --- /dev/null +++ b/db/migrations/010_add_tasks_permissions.sql @@ -0,0 +1,11 @@ +INSERT INTO permissions (name) VALUES ('manage_tasks'), ('view_tasks'); + +INSERT INTO role_permissions (role_id, permission_id) +SELECT + (SELECT id FROM roles WHERE name = 'Admin'), + (SELECT id FROM permissions WHERE name = 'manage_tasks'); + +INSERT INTO role_permissions (role_id, permission_id) +SELECT + (SELECT id FROM roles WHERE name = 'Admin'), + (SELECT id FROM permissions WHERE name = 'view_tasks'); diff --git a/db/migrations/011_create_workflow_logs_table.sql b/db/migrations/011_create_workflow_logs_table.sql new file mode 100644 index 0000000..86b2450 --- /dev/null +++ b/db/migrations/011_create_workflow_logs_table.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS workflow_logs ( + id INT AUTO_INCREMENT PRIMARY KEY, + workflow_id INT NOT NULL, + status VARCHAR(50) NOT NULL, + executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (workflow_id) REFERENCES workflows(id) +); diff --git a/db/migrations/012_add_updated_at_to_tasks.sql b/db/migrations/012_add_updated_at_to_tasks.sql new file mode 100644 index 0000000..398f441 --- /dev/null +++ b/db/migrations/012_add_updated_at_to_tasks.sql @@ -0,0 +1 @@ +ALTER TABLE `tasks` ADD `updated_at` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; \ No newline at end of file diff --git a/db/migrations/013_add_delete_permissions.sql b/db/migrations/013_add_delete_permissions.sql new file mode 100644 index 0000000..0a144df --- /dev/null +++ b/db/migrations/013_add_delete_permissions.sql @@ -0,0 +1 @@ +INSERT INTO permissions (name) VALUES ('delete_candidates'), ('delete_tasks'); diff --git a/delete_candidate.php b/delete_candidate.php new file mode 100644 index 0000000..e139489 --- /dev/null +++ b/delete_candidate.php @@ -0,0 +1,20 @@ +prepare("DELETE FROM candidates WHERE id = :id"); + $stmt->bindParam(':id', $id, PDO::PARAM_INT); + $stmt->execute(); +} + +header('Location: dashboard.php'); +exit; diff --git a/delete_task.php b/delete_task.php new file mode 100644 index 0000000..c37ab47 --- /dev/null +++ b/delete_task.php @@ -0,0 +1,20 @@ +prepare("DELETE FROM tasks WHERE id = :id"); + $stmt->bindParam(':id', $id, PDO::PARAM_INT); + $stmt->execute(); +} + +header('Location: dashboard.php'); +exit; diff --git a/edit_candidate.php b/edit_candidate.php new file mode 100644 index 0000000..cf7b3c9 --- /dev/null +++ b/edit_candidate.php @@ -0,0 +1,126 @@ +prepare("SELECT * FROM candidates WHERE id = ?"); +$stmt->execute([$candidate_id]); +$candidate = $stmt->fetch(); + +if (!$candidate) { + header('Location: index.php'); + exit; +} + +// Handle form submission +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_candidate'])) { + $name = $_POST['name'] ?? ''; + $email = $_POST['email'] ?? ''; + $phone = $_POST['phone'] ?? ''; + $status = $_POST['status'] ?? 'Applied'; + $notes = $_POST['notes'] ?? ''; + + if (!empty($name) && !empty($email)) { + try { + $stmt = $pdo->prepare("UPDATE candidates SET name = ?, email = ?, phone = ?, status = ?, notes = ? WHERE id = ?"); + $stmt->execute([$name, $email, $phone, $status, $notes, $candidate_id]); + header('Location: index.php'); + exit; + } catch (PDOException $e) { + error_log("Error updating candidate: " . $e->getMessage()); + } + } +} +?> + + + + + + Edit Candidate + + + + +
+ + +
+ +
+

Edit Candidate

+
+
+
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + Cancel +
+
+
+
+ + + + \ No newline at end of file diff --git a/edit_role.php b/edit_role.php new file mode 100644 index 0000000..340bd73 --- /dev/null +++ b/edit_role.php @@ -0,0 +1,142 @@ +prepare("SELECT * FROM roles WHERE id = ?"); +$stmt->execute([$role_id]); +$role = $stmt->fetch(); + +if (!$role) { + header('Location: roles.php'); + exit; +} + +// Define all available permissions +$available_permissions = [ + 'manage_candidates', + 'view_candidates', + 'manage_tasks', + 'view_tasks', + 'manage_workflows', + 'view_workflows', + 'manage_roles', + 'view_roles', + 'manage_users', + 'view_users' +]; + +// Fetch current permissions for the role +$stmt = $pdo->prepare("SELECT permission_name FROM role_permissions WHERE role_id = ?"); +$stmt->execute([$role_id]); +$current_permissions = $stmt->fetchAll(PDO::FETCH_COLUMN); + +// Handle form submission +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_permissions'])) { + $selected_permissions = $_POST['permissions'] ?? []; + + try { + // Start a transaction + $pdo->beginTransaction(); + + // Delete existing permissions for the role + $delete_stmt = $pdo->prepare("DELETE FROM role_permissions WHERE role_id = ?"); + $delete_stmt->execute([$role_id]); + + // Insert new permissions + $insert_stmt = $pdo->prepare("INSERT INTO role_permissions (role_id, permission_name) VALUES (?, ?)"); + foreach ($selected_permissions as $permission) { + if (in_array($permission, $available_permissions)) { + $insert_stmt->execute([$role_id, $permission]); + } + } + + // Commit the transaction + $pdo->commit(); + + header("Location: roles.php"); + exit; + } catch (PDOException $e) { + $pdo->rollBack(); + error_log("Error updating permissions: " . $e->getMessage()); + } +} + +?> + + + + + + Edit Role + + + + +
+ + +
+ +
+

Edit Role:

+ +
+
+
+ +
+ + +
+ > + +
+ +
+ + Cancel +
+
+
+
+ + + + \ No newline at end of file diff --git a/edit_task.php b/edit_task.php new file mode 100644 index 0000000..909562f --- /dev/null +++ b/edit_task.php @@ -0,0 +1,133 @@ +prepare("SELECT * FROM tasks WHERE id = ?"); +$stmt->execute([$task_id]); +$task = $stmt->fetch(); + +if (!$task) { + header('Location: index.php'); + exit; +} + +// Fetch candidates for the dropdown +$stmt = $pdo->query("SELECT id, name FROM candidates"); +$candidates = $stmt->fetchAll(); + +// Handle form submission +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_task'])) { + $task_name = $_POST['task_name'] ?? ''; + $candidate_id = $_POST['candidate_id'] ?? null; + $due_date = $_POST['due_date'] ?? null; + $status = $_POST['status'] ?? 'To Do'; + $description = $_POST['description'] ?? ''; + + if (!empty($task_name) && !empty($candidate_id)) { + try { + $stmt = $pdo->prepare("UPDATE tasks SET task_name = ?, candidate_id = ?, due_date = ?, status = ?, description = ? WHERE id = ?"); + $stmt->execute([$task_name, $candidate_id, $due_date, $status, $description, $task_id]); + header('Location: index.php'); + exit; + } catch (PDOException $e) { + error_log("Error updating task: " . $e->getMessage()); + } + } +} +?> + + + + + + Edit Task + + + + +
+ + +
+ +
+

Edit Task

+
+
+
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + Cancel +
+
+
+
+ + + + \ No newline at end of file diff --git a/index.php b/index.php index 7205f3d..64055ee 100644 --- a/index.php +++ b/index.php @@ -1,150 +1,442 @@ prepare("DELETE FROM tasks WHERE id = ?"); + $stmt->execute([$task_id]); + header("Location: " . $_SERVER['PHP_SELF']); + exit; + } catch (PDOException $e) { + error_log("Error deleting task: " . $e->getMessage()); + } + } +} + +// Handle delete candidate +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_candidate']) && hasPermission('manage_candidates')) { + $candidate_id = $_POST['delete_candidate_id'] ?? null; + + if (!empty($candidate_id)) { + try { + $pdo = db(); + $stmt = $pdo->prepare("DELETE FROM candidates WHERE id = ?"); + $stmt->execute([$candidate_id]); + header("Location: " . $_SERVER['PHP_SELF']); + exit; + } catch (PDOException $e) { + error_log("Error deleting candidate: " . $e->getMessage()); + } + } +} + +// Handle form submission for new candidate +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_candidate']) && hasPermission('manage_candidates')) { + $name = $_POST['name'] ?? ''; + $email = $_POST['email'] ?? ''; + $phone = $_POST['phone'] ?? ''; + $status = $_POST['status'] ?? 'Applied'; + $notes = $_POST['notes'] ?? ''; + + if (!empty($name) && !empty($email)) { + try { + $pdo = db(); + $stmt = $pdo->prepare("INSERT INTO candidates (name, email, phone, status, notes) VALUES (?, ?, ?, ?, ?)"); + $stmt->execute([$name, $email, $phone, $status, $notes]); + require_once 'workflow_engine.php'; + trigger_workflow('candidate_created', ['candidate.id' => $pdo->lastInsertId(), 'candidate.name' => $name, 'candidate.email' => $email]); + // Redirect to avoid form resubmission + header("Location: " . $_SERVER['PHP_SELF']); + exit; + } catch (PDOException $e) { + // Handle error, e.g., show an error message + error_log("Error adding candidate: " . $e->getMessage()); + } + } +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['complete_task']) && hasPermission('manage_tasks')) { + $task_id = $_POST['task_id'] ?? null; + + if (!empty($task_id)) { + try { + $pdo = db(); + $stmt = $pdo->prepare("UPDATE tasks SET status = 'Done' WHERE id = ?"); + $stmt->execute([$task_id]); + + // Fetch task details to pass to the workflow + $stmt = $pdo->prepare("SELECT * FROM tasks WHERE id = ?"); + $stmt->execute([$task_id]); + $task = $stmt->fetch(); + + require_once 'workflow_engine.php'; + trigger_workflow('task_completed', ['task.id' => $task['id'], 'task.name' => $task['task_name'], 'task.status' => $task['status']]); + + header("Location: " . $_SERVER['PHP_SELF']); + exit; + } catch (PDOException $e) { + error_log("Error completing task: " . $e->getMessage()); + } + } +} + +// Handle form submission for new task +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_task']) && hasPermission('manage_tasks')) { + $task_name = $_POST['task_name'] ?? ''; + $candidate_id = $_POST['candidate_id'] ?? null; + $due_date = $_POST['due_date'] ?? null; + $status = $_POST['status'] ?? 'To Do'; + $description = $_POST['description'] ?? ''; + + if (!empty($task_name) && !empty($candidate_id)) { + try { + $pdo = db(); + $stmt = $pdo->prepare("INSERT INTO tasks (task_name, candidate_id, due_date, status, description) VALUES (?, ?, ?, ?, ?)"); + $stmt->execute([$task_name, $candidate_id, $due_date, $status, $description]); + header("Location: " . $_SERVER['PHP_SELF']); + exit; + } catch (PDOException $e) { + error_log("Error adding task: " . $e->getMessage()); + } + } +} + +// Fetch tasks from the database +try { + $pdo = db(); + $stmt = $pdo->query("SELECT tasks.*, candidates.name as candidate_name FROM tasks JOIN candidates ON tasks.candidate_id = candidates.id ORDER BY created_at DESC"); + $tasks = $stmt->fetchAll(); +} catch (PDOException $e) { + error_log("Error fetching tasks: " . $e->getMessage()); + $tasks = []; // Ensure $tasks is an array +} + +// Fetch candidates from the database +try { + $pdo = db(); + $stmt = $pdo->query("SELECT * FROM candidates ORDER BY created_at DESC"); + $candidates = $stmt->fetchAll(); +} catch (PDOException $e) { + // Handle error, e.g., show an error message + error_log("Error fetching candidates: " . $e->getMessage()); + $candidates = []; // Ensure $candidates is an array +} + +function getStatusClass($status) { + switch ($status) { + case 'Applied': return 'status-new'; + case 'Interviewing': return 'status-interview'; + case 'Hired': return 'status-hired'; + case 'Rejected': return 'status-rejected'; + case 'Offered': return 'status-offered'; + case 'To Do': return 'status-todo'; + case 'In Progress': return 'status-in-progress'; + case 'Done': return 'status-done'; + default: return ''; + } +} ?> - + - - - New Style - - - - - - - - - - - - - - - - - - - + + + + + FinMox Flow + + + + + + + + + + + + + + -
-
-

Analyzing your requirements and generating your website…

-
- Loading… -
-

AI is collecting your requirements and applying the first changes.

-

This page will update automatically as the plan is implemented.

-

Runtime: PHP — UTC

+ +
+ + +
+ +
+
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + +
NamePhoneStatusActions
+
+
+
+
+
+
+
+ + + + + Edit +
+ + +
+
+
+
+
+ + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
Task NameAssigned ToDue DateStatusActions
+ + + + + Edit +
+ + +
+
+ + +
+
+
+
+
+ +
+
+ + +
-
- Page updated: (UTC) -
+ + + + + + + + + +
+
+ AI Assistant + +
+
+ +
+
+ + +
+
+ + - + \ No newline at end of file diff --git a/login.php b/login.php new file mode 100644 index 0000000..62e18dc --- /dev/null +++ b/login.php @@ -0,0 +1,68 @@ + + + + + + + + Login - FinMox + + + +
+
+
+
+
+

Login

+
+
+ +
+ +
+
+ + +
+
+ + +
+ +
+
+ +
+
+
+
+ + \ No newline at end of file diff --git a/logout.php b/logout.php new file mode 100644 index 0000000..2d3709a --- /dev/null +++ b/logout.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/register.php b/register.php new file mode 100644 index 0000000..9e66efe --- /dev/null +++ b/register.php @@ -0,0 +1,63 @@ + + + + + + + + Register - FinMox + + + +
+
+
+
+
+

Register

+
+
+ +
+ +
+
+ + +
+
+ + +
+ +
+
+ +
+
+
+
+ + \ No newline at end of file diff --git a/roles.php b/roles.php new file mode 100644 index 0000000..20810ec --- /dev/null +++ b/roles.php @@ -0,0 +1,128 @@ +prepare("INSERT INTO roles (name) VALUES (?)"); + $stmt->execute([$role_name]); + header("Location: " . $_SERVER['PHP_SELF']); + exit; + } catch (PDOException $e) { + error_log("Error adding role: " . $e->getMessage()); + } + } +} + + +// Fetch roles +$stmt = $pdo->query("SELECT * FROM roles ORDER BY name"); +$roles = $stmt->fetchAll(); + +?> + + + + + + Role Management + + + + +
+ + +
+ +
+
+

Role Management

+ +
+ +
+
+ + + + + + + + + + + + + + + +
Role NameActions
+ Edit +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/workflow_actions.php b/workflow_actions.php new file mode 100644 index 0000000..fa2ebc9 --- /dev/null +++ b/workflow_actions.php @@ -0,0 +1,230 @@ +prepare("SELECT * FROM workflows WHERE id = ?"); +$stmt->execute([$workflow_id]); +$workflow = $stmt->fetch(); + +if (!$workflow) { + header('Location: workflows.php'); + exit; +} + +// Handle form submission for new action +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_action']) && hasPermission('manage_workflows')) { + $action_type = $_POST['action_type'] ?? ''; + $config = []; + + if ($action_type === 'send_email') { + $config['to'] = $_POST['to'] ?? ''; + $config['subject'] = $_POST['subject'] ?? ''; + $config['message'] = $_POST['message'] ?? ''; + } elseif ($action_type === 'create_task') { + $config['task_name'] = $_POST['task_name'] ?? ''; + $config['assign_to'] = $_POST['assign_to'] ?? ''; + } elseif ($action_type === 'send_slack_notification') { + $config['webhook_url'] = $_POST['webhook_url'] ?? ''; + $config['message'] = $_POST['slack_message'] ?? ''; + } elseif ($action_type === 'update_candidate_status') { + $config['new_status'] = $_POST['new_status'] ?? ''; + } + + if (!empty($action_type)) { + try { + $stmt = $pdo->prepare("INSERT INTO workflow_actions (workflow_id, action_type, config) VALUES (?, ?, ?)"); + $stmt->execute([$workflow_id, $action_type, json_encode($config)]); + header("Location: " . $_SERVER['REQUEST_URI']); + exit; + } catch (PDOException $e) { + error_log("Error adding action: " . $e->getMessage()); + } + } +} + +// Fetch actions for the workflow +$stmt = $pdo->prepare("SELECT * FROM workflow_actions WHERE workflow_id = ? ORDER BY created_at DESC"); +$stmt->execute([$workflow_id]); +$actions = $stmt->fetchAll(); + +?> + + + + + + Workflow Actions + + + + +
+ + +
+ +
+
+

Actions for ""

+ + + +
+ +
+
+ + + + + + + + + + + + + + + +
Action TypeConfiguration
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/workflow_engine.php b/workflow_engine.php new file mode 100644 index 0000000..9af7ac2 --- /dev/null +++ b/workflow_engine.php @@ -0,0 +1,65 @@ +prepare("SELECT * FROM workflows WHERE `trigger` = ?"); + $stmt->execute([$trigger]); + $workflows = $stmt->fetchAll(); + + foreach ($workflows as $workflow) { + // 2. For each workflow, fetch its actions + $stmt = $pdo->prepare("SELECT * FROM workflow_actions WHERE workflow_id = ?"); + $stmt->execute([$workflow['id']]); + $actions = $stmt->fetchAll(); + + foreach ($actions as $action) { + // 3. Execute each action + execute_action($action, $data); + } + } +} + +function execute_action($action, $data) { + $config = json_decode($action['config'], true); + + // Replace placeholders in the config with data + array_walk_recursive($config, function(&$value) use ($data) { + if (is_string($value)) { + foreach ($data as $key => $val) { + if (is_string($val) || is_numeric($val)) { + $value = str_replace('{{candidate.' . $key . '}}', $val, $value); + } + } + } + }); + + switch ($action['action_type']) { + case 'send_email': + MailService::sendMail($config['to'], $config['subject'], $config['message']); + break; + case 'create_task': + $pdo = db(); + $stmt = $pdo->prepare("INSERT INTO tasks (name, assignee_id) VALUES (?, ?)"); + $stmt->execute([$config['task_name'], $config['assign_to']]); + break; + case 'send_slack_notification': + $ch = curl_init($config['webhook_url']); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['text' => $config['message']])); + curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); + curl_exec($ch); + curl_close($ch); + break; + case 'update_candidate_status': + $pdo = db(); + $stmt = $pdo->prepare("UPDATE candidates SET status = ? WHERE id = ?"); + $stmt->execute([$config['new_status'], $data['candidate.id']]); + break; + } +} +?> \ No newline at end of file diff --git a/workflows.php b/workflows.php new file mode 100644 index 0000000..c3ab1d4 --- /dev/null +++ b/workflows.php @@ -0,0 +1,144 @@ +prepare("INSERT INTO workflows (name, `trigger`) VALUES (?, ?)"); + $stmt->execute([$name, $trigger]); + header("Location: " . $_SERVER['PHP_SELF']); + exit; + } catch (PDOException $e) { + error_log("Error adding workflow: " . $e->getMessage()); + } + } +} + +// Fetch workflows from the database +$stmt = $pdo->query("SELECT * FROM workflows ORDER BY created_at DESC"); +$workflows = $stmt->fetchAll(); + +?> + + + + + + Workflows + + + + +
+ + +
+ +
+
+

Workflows

+ + + +
+ +
+
+ + + + + + + + + + + + + + + + + +
NameTriggerActions
+ + Manage Actions + +
+
+
+
+ + + + + + + \ No newline at end of file
+ + +