'token required'])); } try { $db = @new PDO('pgsql:host=10.1.0.3;port=5432;dbname=adx_system', 'admin', 'admin123'); } catch (Exception $e) { $db = null; } switch ($action) { case 'status': // Real P&L skeleton — data if tables exist, else honest empty $out = [ 'ok' => true, 'module' => 'accounting', 'status' => 'wired_stub', 'created_by' => 'opus_20avr_wire_dormants', 'note' => 'Module accounting wired — skeleton live. Fill tables accounting.pnl / accounting.invoices when ready.', 'tables_expected' => ['accounting.invoices', 'accounting.pnl_monthly', 'accounting.expenses', 'accounting.taxes'], 'ui_url' => '/accounting.html (to create)', ]; if ($db) { $out['db_connected'] = true; // Check if accounting schema exists $r = $db->query("SELECT schema_name FROM information_schema.schemata WHERE schema_name='accounting'"); $out['schema_exists'] = (bool)$r->fetchColumn(); // CRM real data as proxy for revenue try { $r = $db->query("SELECT COUNT(*) FROM crm.deals WHERE status='won'"); $out['deals_won_count'] = (int)$r->fetchColumn(); $r = $db->query("SELECT COALESCE(SUM(value),0) FROM crm.deals WHERE status IN ('won','open')"); $out['pipeline_total_eur'] = (float)$r->fetchColumn(); } catch (Exception $e) { $out['crm_err'] = $e->getMessage(); } } else { $out['db_connected'] = false; } $out['ts'] = date('c'); echo json_encode($out, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); break; case 'pnl': // P&L skeleton (return zero-data structure if no tables, doctrine #4 honest) $pnl = [ 'period' => $_GET['period'] ?? 'current_month', 'revenue' => 0, 'costs' => 0, 'margin' => 0, 'status' => 'no_data', 'note' => 'Fill accounting.pnl_monthly to populate. Doctrine #4: returning zeros, not simulations.', ]; if ($db) { try { $r = $db->query("SELECT * FROM accounting.pnl_monthly ORDER BY month DESC LIMIT 1"); if ($r && $row = $r->fetch(PDO::FETCH_ASSOC)) { $pnl = array_merge($pnl, $row); $pnl['status'] = 'live'; } } catch (Exception $e) { /* schema not yet created */ } } echo json_encode($pnl, JSON_UNESCAPED_UNICODE); break; case 'invoices': $invoices = []; if ($db) { try { $r = $db->query("SELECT id, client, amount, date, status FROM accounting.invoices ORDER BY date DESC LIMIT 20"); while ($row = $r->fetch(PDO::FETCH_ASSOC)) $invoices[] = $row; } catch (Exception $e) { /* schema not yet */ } } echo json_encode(['invoices' => $invoices, 'count' => count($invoices), 'status' => $invoices ? 'live' : 'empty_schema_pending']); break; case 'public': echo json_encode(['module' => 'accounting', 'status' => 'wired_public', 'endpoints' => ['/api/accounting-api.php?action=status&token=WEVADS2026']]); break; default: echo json_encode(['error' => 'unknown action', 'actions' => ['status', 'pnl', 'invoices', 'public']]); }