generowanie raportów z wyborem preagregatów
This commit is contained in:
177
modules/EcmInvoiceOuts/report_form.php
Normal file
177
modules/EcmInvoiceOuts/report_form.php
Normal file
@@ -0,0 +1,177 @@
|
||||
<?php
|
||||
/**
|
||||
* report_form.php — formularz + uruchomienie analysisAI.py z parametrami
|
||||
* ZGODNE z PHP 5.6 i Sugar 6 (wyciszone E_STRICT/E_DEPRECATED/NOTICE).
|
||||
*/
|
||||
|
||||
// --- wycisz „hałas” Sugar CRM ---
|
||||
error_reporting(E_ALL & ~E_STRICT & ~E_DEPRECATED & ~E_NOTICE);
|
||||
ini_set('display_errors', '0');
|
||||
// (opcjonalnie) loguj do pliku
|
||||
// ini_set('log_errors', '1');
|
||||
// ini_set('error_log', '/var/log/php_form_errors.log');
|
||||
|
||||
// --- ŚCIEŻKI (dostosuj do swojej instalacji) ---
|
||||
$python = '/usr/local/bin/python3';
|
||||
$script = '/var/www/html/modules/EcmInvoiceOuts/ai/analysisAI.py';
|
||||
$baseDir = dirname($script);
|
||||
|
||||
// --- domyślne wartości pól ---
|
||||
$defaultDateTo = date('Y-m-d');
|
||||
$defaultDateFrom = date('Y-m-d', strtotime('-7 days'));
|
||||
|
||||
// --- zbieranie POST (PHP 5.6 friendly) ---
|
||||
$submitted = (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST');
|
||||
$post_date_from = isset($_POST['date_from']) ? $_POST['date_from'] : $defaultDateFrom;
|
||||
$post_date_to = isset($_POST['date_to']) ? $_POST['date_to'] : $defaultDateTo;
|
||||
$post_preaggs = (isset($_POST['preaggs']) && is_array($_POST['preaggs'])) ? $_POST['preaggs'] : array();
|
||||
$post_with_ai = !empty($_POST['with_ai']);
|
||||
|
||||
function h($v) { return htmlspecialchars($v, ENT_QUOTES, 'UTF-8'); }
|
||||
function is_valid_date_yyyy_mm_dd($d) {
|
||||
return (bool)preg_match('/^\d{4}-\d{2}-\d{2}$/', $d);
|
||||
}
|
||||
|
||||
// --- wykonanie skryptu Pythona, jeśli formularz został wysłany ---
|
||||
$ran = false;
|
||||
$ok = false;
|
||||
$rc = 0;
|
||||
$out = '';
|
||||
$err = '';
|
||||
|
||||
if ($submitted) {
|
||||
// prosta walidacja dat
|
||||
if (!is_valid_date_yyyy_mm_dd($post_date_from) || !is_valid_date_yyyy_mm_dd($post_date_to)) {
|
||||
$err = "Nieprawidłowy format daty. Użyj YYYY-MM-DD.";
|
||||
$ran = true;
|
||||
} else {
|
||||
// zbuduj argumenty
|
||||
$args = array(
|
||||
'--date-from', $post_date_from,
|
||||
'--date-to', $post_date_to,
|
||||
'--ai', ($post_with_ai ? 'true' : 'false')
|
||||
);
|
||||
if (!empty($post_preaggs)) {
|
||||
// CSV z zaznaczonych preagregatów
|
||||
$args[] = '--metrics';
|
||||
$args[] = implode(',', $post_preaggs);
|
||||
}
|
||||
|
||||
// komenda: przejdź do katalogu skryptu, uruchom pythona; zbierz stdout+stderr
|
||||
$cmd = 'cd ' . escapeshellarg($baseDir) . ' && ' .
|
||||
escapeshellcmd($python) . ' ' . escapeshellarg($script);
|
||||
|
||||
foreach ($args as $a) {
|
||||
$cmd .= ' ' . escapeshellarg($a);
|
||||
}
|
||||
|
||||
$output = array();
|
||||
$returnVar = 0;
|
||||
exec($cmd . ' 2>&1', $output, $returnVar);
|
||||
|
||||
$ran = true;
|
||||
$rc = $returnVar;
|
||||
$out = implode("\n", $output);
|
||||
$ok = ($returnVar === 0);
|
||||
|
||||
if (!$ok && $err === '') {
|
||||
$err = "Błąd uruchamiania skryptu Python (kod: " . $rc . "):\n" . $out;
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
<!doctype html>
|
||||
<html lang="pl">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Generator raportu sprzedaży</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<style>
|
||||
body { font: 14px/1.4 system-ui, Arial, sans-serif; padding: 20px; }
|
||||
fieldset { margin-bottom: 16px; padding: 12px; border-radius: 6px; border:1px solid #e5e5e5; }
|
||||
.row { display: flex; gap: 16px; flex-wrap: wrap; }
|
||||
.col { min-width: 220px; flex: 1; }
|
||||
label { display:block; margin: 6px 0; }
|
||||
input[type="date"], button { padding: 6px 10px; font-size:14px; }
|
||||
button { margin-top: 10px; cursor: pointer; border:1px solid #0a66c2; background:#0a66c2; color:#fff; border-radius:8px; }
|
||||
.pill { display:inline-block; padding:2px 8px; border-radius:999px; background:#eee; margin:4px 6px 0 0; }
|
||||
.out { white-space: normal; background: #fff; border:1px solid #ddd; padding:12px; border-radius:6px; }
|
||||
.error { white-space: pre-wrap; background: #fff3f3; border:1px solid #f3c2c2; padding:12px; border-radius:6px; color:#b00020; }
|
||||
.muted { color:#666; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>Raport sprzedaży — parametry</h1>
|
||||
|
||||
<form method="post">
|
||||
<!-- zakres dat -->
|
||||
<fieldset>
|
||||
<legend>Zakres dat</legend>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<label>Data od:
|
||||
<input type="date" name="date_from" value="<?php echo h($post_date_from); ?>" required>
|
||||
</label>
|
||||
</div>
|
||||
<div class="col">
|
||||
<label>Data do:
|
||||
<input type="date" name="date_to" value="<?php echo h($post_date_to); ?>" required>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<!-- preagregaty -->
|
||||
<fieldset>
|
||||
<legend>Preagregaty do analizy</legend>
|
||||
<label><input type="checkbox" name="preaggs[]" value="daily_sales" <?php echo in_array('daily_sales', $post_preaggs, true) ? 'checked' : ''; ?>> Dzienne sprzedaże</label>
|
||||
<label><input type="checkbox" name="preaggs[]" value="product_summary" <?php echo in_array('product_summary', $post_preaggs, true) ? 'checked' : ''; ?>> Podsumowanie produktów</label>
|
||||
<label><input type="checkbox" name="preaggs[]" value="customer_summary" <?php echo in_array('customer_summary', $post_preaggs, true) ? 'checked' : ''; ?>> Podsumowanie klientów</label>
|
||||
<label><input type="checkbox" name="preaggs[]" value="product_daily" <?php echo in_array('product_daily', $post_preaggs, true) ? 'checked' : ''; ?>> Sprzedaż produktu dziennie</label>
|
||||
<label><input type="checkbox" name="preaggs[]" value="top10_products_by_sales" <?php echo in_array('top10_products_by_sales', $post_preaggs, true) ? 'checked' : ''; ?>> Top10 produktów</label>
|
||||
<label><input type="checkbox" name="preaggs[]" value="top10_customers_by_sales"<?php echo in_array('top10_customers_by_sales', $post_preaggs, true) ? 'checked' : ''; ?>> Top10 klientów</label>
|
||||
</fieldset>
|
||||
|
||||
<!-- AI -->
|
||||
<fieldset>
|
||||
<legend>Analiza AI</legend>
|
||||
<label>
|
||||
<input type="checkbox" name="with_ai" <?php echo $post_with_ai ? 'checked' : ''; ?>> Dołącz analizę AI
|
||||
</label>
|
||||
</fieldset>
|
||||
|
||||
<button type="submit">Generuj</button>
|
||||
</form>
|
||||
|
||||
<?php if ($submitted): ?>
|
||||
<hr>
|
||||
<h2>Użyte parametry</h2>
|
||||
<p>
|
||||
<span class="pill">Od: <?php echo h($post_date_from); ?></span>
|
||||
<span class="pill">Do: <?php echo h($post_date_to); ?></span>
|
||||
<span class="pill">AI: <?php echo $post_with_ai ? 'tak' : 'nie'; ?></span>
|
||||
</p>
|
||||
<p>Preagregaty:
|
||||
<?php
|
||||
if (!empty($post_preaggs)) {
|
||||
foreach ($post_preaggs as $p) {
|
||||
echo '<span class="pill">'.h($p).'</span>';
|
||||
}
|
||||
} else {
|
||||
echo '<span class="muted">brak</span>';
|
||||
}
|
||||
?>
|
||||
</p>
|
||||
|
||||
<h2>Wynik analizy</h2>
|
||||
<?php if (!$ok): ?>
|
||||
<div class="error"><?php echo h($err); ?></div>
|
||||
<?php else: ?>
|
||||
<!-- Zakładamy, że Python zwraca gotowy HTML -->
|
||||
<div class="out"><?php echo $out; ?></div>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user