Вы сказали:
Добавить js в каждый блок Chart экспорт excel данных Chart через кнопку Скачать в excel
Подробно объяснить добавления
<?php
/***********************************************************
* CONFIG
**********************************************************/
//$SQLite3 = new SQLite3('database.sqlite'); // <--- путь к твоей базе
$year = date('Y');
$start = $_GET['startDate'] ?? '';//date('Y-m-01');
$end = $_GET['endDate'] ?? '';//date('Y-m-d');
$user = $_GET['byaccount_set'] ?? '';
/***********************************************************
* INPUT FILTERS
**********************************************************/
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'chartGroups') {
$start = $_POST['startDate'] ?? '';//date('Y-m-01');
$end = $_POST['endDate'] ?? '';//date('Y-m-d');
$user = $_POST['byaccount_set'] ?? '';
$valid = '/^\d{4}-\d{2}-\d{2}$/';
if (!preg_match($valid, $start)) $start = '';//date('Y-m-01');
if (!preg_match($valid, $end)) $end = '';//date('Y-m-d');
$userCond = $SetDateManual = "";
if ($user !== "") {
// поле deal_stage.users_order_ids хранит массив, например ["34","40"]
$userCond = " AND deal_stage.users_order_ids LIKE '%\"$user\"%' ";
}
if($start != '' && $end != ''){
// Создаем объекты DateTime для обеих дат
$date1 = new DateTime($start);
$date2 = new DateTime($end);
// Вычисляем разницу между датами с помощью метода diff()
$interval = $date1->diff($date2);
// Получаем количество дней из свойства 'days' объекта DateInterval
$days = $interval->days;
//echo "Количество дней между датами: " . $days;
$daysSet = $days;
$SetDateManual = " date(deal_stage.deal_create) BETWEEN :start AND :end ";
}else{
$daysSet = 484;
$SetDateManual = " deal_stage.deal_create >= date('now', '-$daysSet days') ";//strftime('%Y', deal_stage.deal_create) = :yr
}
/***********************************************************
* MAIN QUERY
**********************************************************/
$sql = "
SELECT *,
deal_stage.id AS ds_id,
deal_stage.status_deal AS ds_status,
deal_stage.deal_create AS ds_date,
deal_stage.order_id AS order_id,
orders.kp_num_out AS kp_num_out,
orders.sum_order AS sum_order,
orders.payment_step AS payment_step,
orders.status_deal AS order_status
FROM deal_stage
LEFT JOIN orders ON orders.id = deal_stage.order_id
WHERE $SetDateManual -- date(deal_stage.deal_create) BETWEEN :start AND :end
$userCond
ORDER BY deal_stage.deal_create DESC
";
$stmt = $SQLite3->prepare($sql);
if($start != '' && $end != ''){
$stmt->bindValue(':start', $start, SQLITE3_TEXT);
$stmt->bindValue(':end', $end, SQLITE3_TEXT);
}
$res = $stmt->execute();
/***********************************************************
* GROUPING
**********************************************************/
$data = [
'dealKP' => ['rows'=>[], 'sum_bill'=>0, 'sum_order'=>0],
'dealKP150' => ['rows'=>[], 'sum_bill'=>0, 'sum_order'=>0],
'dealKP100' => ['rows'=>[], 'sum_bill'=>0, 'sum_order'=>0],
'group1' => ['rows'=>[], 'sum_bill'=>0, 'sum_order'=>0],
'group2' => ['rows'=>[], 'sum_bill'=>0, 'sum_order'=>0],
'group3' => ['rows'=>[], 'sum_bill'=>0, 'sum_order'=>0],
];
/* ======= группировка ======= */
$groups = [
'dealKP' => 0,
'dealKP150' => 0,
'dealKP100' => 0,
'group1' => 0,
'group2' => 0,
'group3' => 0
];
$id_orderArray = [];
while ($r = $res->fetchArray(SQLITE3_ASSOC)) {
//$kp = is_numeric($r['kp_num_out']) ? (int)$r['kp_num_out'] : 0;
$so = is_numeric($r['sum_order']) ? (int)$r['sum_order'] : 0;
$ba = is_numeric($r['bill_amount']) ? (int)$r['bill_amount'] : 0;
//сейчас КП отправленно
if($r['ds_status'] == 3 && $r['order_status']==3 && empty($id_orderArray[$r['order_id']][0])){// && empty($r['deal_finish'])
$id_orderArray[$r['id']][]=$r['order_id'];//???
$id_orderArray[$r['id']][]=3;//???
$groups['dealKP']++;
$data['dealKP']['count']=$groups['dealKP'];
$data['dealKP']['rows'][] = $r;
//$data['dealKP']['sum_kp'] += $kp;
$data['dealKP']['sum_bill'] += $ba;
$data['dealKP']['sum_order'] += $so;
}
// КП отправлено по дате isset($r['deal_finish'])
if($r['ds_status'] == 3 && isset($r['deal_finish']) ){
//$id_orderArray[$r['order_id']][]=$r['order_id'];
// $groups['dealKP']++;
// $data['dealKP']['count']=$groups['dealKP'];
// $id_orderArray2[$r['order_id']][]=$r['order_id'];
}
if($r['order_status']==150 && $r['payment_step'] != 0 && empty($id_orderArray150[$r['order_id']][0])){
$id_orderArray150[$r['id']][]=$r['order_id'];//???
$id_orderArray150[$r['id']][2]='kp150';//???
$groups['dealKP150']++;
$data['dealKP150']['count']=$groups['dealKP150'];
$data['dealKP150']['rows'][] = $r;
//$data['dealKP']['sum_kp'] += $kp;
$data['dealKP150']['sum_bill'] += $ba;
$data['dealKP150']['sum_order'] += $so;
}elseif($r['order_status']==100 && $r['payment_step'] >= 2 && empty($id_orderArray100[$r['order_id']][0])){//payment_step 0 и 1 не учитываем
$id_orderArray100[$r['id']][]=$r['order_id'];//???
$id_orderArray100[$r['id']][2]='kp100';//???
$groups['dealKP100']++;
$data['dealKP100']['count']=$groups['dealKP100'];
$data['dealKP100']['rows'][] = $r;
//$data['dealKP']['sum_kp'] += $kp;
$data['dealKP100']['sum_bill'] += $ba;
$data['dealKP100']['sum_order'] += $so;
}
if ($r['ds_status'] == 150 && $r['order_status']==150 && empty($id_orderArray[$r['order_id']][0])) {//&& ($r['payment_step'] == 1 || $r['payment_step'] == 7) &&
$id_orderArray[$r['id']][]=$r['order_id'];//???
$id_orderArray[$r['id']][]=150;//???
$groups['group1']++;
$data['group1']['count']=$groups['group1'];
$data['group1']['rows'][] = $r;
//$data['group1']['sum_kp'] += $kp;
$data['group1']['sum_bill'] += $ba;
$data['group1']['sum_order'] += $so;
}
if ($r['ds_status'] == 100 && $r['order_status']==100 && $r['payment_step'] != 1 && empty($id_orderArray[$r['order_id']][0])) {//&& empty($id_orderKP[$r['order_id']])
$id_orderArray[$r['id']][]=$r['order_id'];//???
$id_orderArray[$r['id']][]=100;//???
$groups['group2']++;
$data['group2']['count']=$groups['group2'];
$data['group2']['rows'][] = $r;
//$data['group2']['sum_kp'] += $kp;
$data['group2']['sum_bill'] += $ba;
$data['group2']['sum_order'] += $so;
}
if ($r['order_status'] < 99 && $r['order_status']!=3 && empty($id_orderArray[$r['order_id']][0]) ) {
$id_orderArray[$r['order_id']][]=$r['order_id'];
// if($r['ds_status']==3 || $r['ds_status'] == 100 || $r['ds_status'] == 150)
// continue;//echo $r['order_id'];
$groups['group3']++;
$data['group3']['count']=$groups['group3'];
$data['group3']['rows'][] = $r;
//$data['group3']['sum_kp'] += $kp;
$data['group3']['sum_bill'] += $ba;
$data['group3']['sum_order'] += $so;
}/*else{
$id_orderArray1[$r['order_id']][]=$r['order_id'];
$id_orderArray1[$r['order_id']][]=$r['order_status'];
}*/
}
//echo '<pre>',print_r($GLOBALS,1);
//header('Content-Type: application/json');
echo json_encode($data);
exit;
}
// echo '<pre>',print_r($GLOBALS,1);
// exit;
/***********************************************************
* EXTRA QUERIES
**********************************************************/
// === Кварталы ===
//$year = date('Y');
$sqlQ = "
SELECT
strftime('%m', deal_create) AS m,
SUM(CASE WHEN orders.bill_amount GLOB '[0-9]*' THEN orders.bill_amount ELSE 0 END) AS sum_kp,
SUM(orders.sum_order) AS sum_order
FROM deal_stage
LEFT JOIN orders ON orders.id = deal_stage.order_id
WHERE strftime('%Y', deal_stage.deal_create) = :yr
GROUP BY m
";
$stmtQ = $SQLite3->prepare($sqlQ);
$stmtQ->bindValue(':yr', $year, SQLITE3_TEXT);
$resQ = $stmtQ->execute();
$quarters = ['Q1'=>0,'Q2'=>0,'Q3'=>0,'Q4'=>0];
while ($q = $resQ->fetchArray(SQLITE3_ASSOC)) {
$m = (int)$q['m'];
if ($m >= 1 && $m <= 3) $quarters['Q1'] += $q['sum_order'];
if ($m >= 4 && $m <= 6) $quarters['Q2'] += $q['sum_order'];
if ($m >= 7 && $m <= 9) $quarters['Q3'] += $q['sum_order'];
if ($m >= 10 && $m <= 12) $quarters['Q4'] += $q['sum_order'];
}
// === Понедельник–пятница текущей недели ===
$monday = date('Y-m-d', strtotime('monday this week'));
$friday = date('Y-m-d', strtotime('friday this week'));
$sqlW = "
SELECT
SUM(CASE WHEN status_deal = 150 THEN 1 ELSE 0 END) AS s150,
SUM(CASE WHEN status_deal = 100 THEN 1 ELSE 0 END) AS s100
FROM orders
WHERE date(deal_update) BETWEEN :m AND :f
";
$stmtW = $SQLite3->prepare($sqlW);
$stmtW->bindValue(':m', $monday, SQLITE3_TEXT);
$stmtW->bindValue(':f', $friday, SQLITE3_TEXT);
$weekStats = $stmtW->execute()->fetchArray(SQLITE3_ASSOC);
// === Статус 3 ===
$sqlS3 = "
SELECT
SUM(CASE WHEN orders.bill_amount GLOB '[0-9]*' THEN orders.bill_amount ELSE 0 END) AS sum_kp,
SUM(orders.sum_order) AS sum_order,
COUNT(*) AS cnt
FROM deal_stage
LEFT JOIN orders ON orders.id = deal_stage.order_id
WHERE deal_stage.status_deal = 3
AND date(deal_stage.deal_create) BETWEEN :start AND :end
";
$stmt3 = $SQLite3->prepare($sqlS3);
$stmt3->bindValue(':start', $start, SQLITE3_TEXT);
$stmt3->bindValue(':end', $end, SQLITE3_TEXT);
$stats3 = $stmt3->execute()->fetchArray(SQLITE3_ASSOC);
function NumToPrice($num){
$amountFloat = $num / 100; // 123.45
return number_format($amountFloat, 2, '.', ' '); // "123.45"
}
?>
<!-- <!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Отчёт по заявкам</title> -->
<!-- <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"> -->
<!-- <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net@^2.2.0/dist/chartjs-plugin-datalabels.min.js"></script> -->
<!-- </head>
<body class="bg-light"> -->
<div class="container mt-4">
<div class="card shadow-sm mb-4">
<div class="card-header bg-white">
<h5>Фильтр сводки</h5>
</div>
<div class="card-body">
<form id="filterForm" class="row g-3">
<div class="col-md-3">
<label class="form-label">Дата от:</label>
<input type="date" name="startDate" class="form-control" value="<?= $start ?>">
</div>
<div class="col-md-3">
<label class="form-label">Дата до:</label>
<input type="date" name="endDate" class="form-control" value="<?= $end ?>">
</div>
<div class="col-md-3">
<label class="form-label">Сотрудник:</label>
<select name="byaccount_set" class="form-select">
<option value="">Все</option>
<option value="34" <?= $user=="34"?"selected":"" ?>>ID 34</option>
<option value="35" <?= $user=="35"?"selected":"" ?>>ID 35</option>
<option value="40" <?= $user=="40"?"selected":"" ?>>ID 40</option>
<option value="38" <?= $user=="38"?"selected":"" ?>>ID 38</option>
</select>
</div>
<div class="col-md-3 d-flex align-items-end">
<button class="btn btn-primary w-100">Применить</button>
</div>
</form>
</div>
</div>
<div class="row g-4 mb-4">
<!-- РЕЗУЛЬТАТЫ -->
<div class="col-12 col-lg-6">
<!-- === MAIN DATA === -->
<div class="card shadow-sm mb-4 h-100">
<div class="card-header bg-white"><h5>Общий результат сводки</h5></div>
<div class="card-body">
<div id="resultsBlock">
<div class="alert alert-primary" role="alert" style="background-color:#6de3c7">
<h6>КП отправлено</h6>
<p>
Кол-во: <span id="dealKP_count">–</span> <br>
Сумма счета: <b><span id="dealKP_bill">–</span></b> <br>
Сумма заказа: <b><span id="dealKP_order">–</span></b>
</p>
<small class="text-muted">Отправили коммерческих предложений </small>
</div>
<hr>
<div class="alert alert-primary" role="alert" style="background-color:#ffa500">
<h6>Приобретено</h6>
<p>
Кол-во: <span id="group1_count">–</span> <br>
Сумма счета: <b><span id="group1_bill">–</span></b> <br>
Сумма заказа: <b><span id="group1_order">–</span></b>
</p>
<small class="text-muted">Приобрели успешно за выбранное время ранее созданные сделки </small>
</div>
<hr>
<div class="alert alert-primary" role="alert" style="background-color:#ff0000">
<h6>Не приобретено</h6>
<p>
Кол-во: <span id="group2_count">–</span> <br>
Сумма счета: <b><span id="group2_bill">–</span></b> <br>
Сумма заказа: <b><span id="group2_order">–</span></b>
</p>
<small class="text-muted">Не приобрели но закрыты за выбранное время ранее заведенные сделки </small>
</div>
<hr>
<div class="alert alert-primary" role="alert" style="background-color:#79c4f7">
<h6>В работе</h6>
<p>
Кол-во: <span id="group3_count">–</span> <br>
Сумма счета: <b><span id="group3_bill">–</span></b> <br>
Сумма заказа: <b><span id="group3_order">–</span></b>
</p>
<small class="text-muted">В работе оставшиеся сделка на различных этапах без учета КП отправлено </small>
</div>
</div>
<!-- <h6>КП отправлено</h6>
<p>Кол-во: <= count($data['dealKP']['rows']) ?> |
Сумма счета: <b><= NumToPrice($data['dealKP']['sum_bill']) ?></b> |
Сумма заказа: <b><= NumToPrice($data['dealKP']['sum_order']) ?></b></p>
<hr>
<h6>Приобретено</h6>
<p>Кол-во: <= count($data['group1']['rows']) ?> |
Сумма счета: <b><= NumToPrice($data['group1']['sum_bill']) ?></b> |
Сумма заказа: <b><= NumToPrice($data['group1']['sum_order']) ?></b></p>
<hr>
<h6>Не приобретено</h6>
<p>Кол-во: <= count($data['group2']['rows']) ?> |
Сумма счета: <b><= NumToPrice($data['group2']['sum_bill']) ?></b> |
Сумма заказа: <b><= NumToPrice($data['group2']['sum_order']) ?></b></p>
<hr>
<h6>В работе</h6>
<p>Кол-во: <= count($data['group3']['rows']) ?> |
Сумма счета: <b><= NumToPrice($data['group3']['sum_bill']) ?></b> |
Сумма заказа: <b><= NumToPrice($data['group3']['sum_order']) ?></b></p> -->
</div>
</div>
</div>
<!-- ДИАГРАММА ГРУПП -->
<div class="col-12 col-lg-6">
<div class="card shadow-sm mb-1 h-100">
<div class="card-header bg-white">
<h5>Диаграмма сводки</h5>
</div>
<div class="card-body d-flex justify-content-center align-items-center" style="min-height: 350px;">
<canvas id="chartGroups" style="max-height: 350px;"></canvas>
</div>
</div>
</div>
</div>
<div class="card shadow-sm mb-4 chartdeal">
<div class="card-header bg-white"><h5>Завершенные сделки</h5></div>
<div class="card-body">
<div id="resultsBlock2" class="row mb-4">
<div class="col-12 col-lg-6">
<div class="alert alert-primary" role="alert" style="background-color:#ffa500">
<h6>Приобретено</h6>
<p>
Кол-во: <span id="dealKP150_count">–</span> <br>
Сумма счета: <b><span id="dealKP150_bill">–</span></b> <br>
Сумма заказа: <b><span id="dealKP150_order">–</span></b>
</p>
<small class="text-muted">Отправили коммерческих предложений и приобрели и закрыли сделку</small>
</div>
</div>
<div class="col-12 col-lg-6">
<div class="alert alert-primary" role="alert" style="background-color:#ff0000">
<h6>Не приобретено</h6>
<p>
Кол-во: <span id="dealKP100_count">–</span> <br>
Сумма счета: <b><span id="dealKP100_bill">–</span></b> <br>
Сумма заказа: <b><span id="dealKP100_order">–</span></b>
</p>
<small class="text-muted">Отправили коммерческих предложений и не приобрели и закрыли сделку </small>
</div>
</div>
</div>
<canvas id="chartdeal"></canvas>
</div>
</div>
<!-- === CHARTS === -->
<!-- <div class="card shadow-sm mb-4">
<div class="card-header bg-white"><h5>Диаграмма групп</h5></div>
<div class="card-body">
<canvas id="chartGroups"></canvas>
</div>
</div> -->
<div class="card shadow-sm mb-4">
<div class="card-header bg-white"><h5>Сводка за неделю</h5></div>
<div class="card-body">
<canvas id="chartWeek"></canvas>
</div>
</div>
<div class="card shadow-sm mb-4">
<div class="card-header bg-white"><h5>Кварталы сводки</h5></div>
<div class="card-body">
<canvas id="chartQuarters"></canvas>
</div>
</div>
</div>
<!-- Подключение JavaScript -->
<script src="../dashboard/assets/extensions/jquery/jquery.min.js?asd=<?time()?>"></script>
<script src="js/popper.min.js?agsd=<?time()?>"></script>
<script src="/js/bootstrap.bundle.min.js" ></script>
<!-- <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net@^2.2.0/dist/chartjs-plugin-datalabels.min.js"></script> -->
<!-- <link rel="stylesheet" href="css/select2.min.css" />
<link rel="stylesheet" href="css/select2-bootstrap-5-theme.min.css" /> -->
<script src="js/select2.min.js"></script>
<script src="js/vis-timeline-graph2d.min.js"></script>
<script src="js/Sortable.min.js"></script>
<script src="js/chart.js"></script>
<script src="js/chartjs-plugin-datalabels.js"></script>
<!-- <script src="js/tinymce/tinymce.min.js" referrerpolicy="origin"></script> -->
<script src="/js/main.js"></script>
<script>
function formatPrice(num) {
if (!num) return '0.00';
return (num / 100).toLocaleString('ru-RU', {
minimumFractionDigits: 2,
maximumFractionDigits: 2
});
}
function formatSUM(num) {
if (!num) return '0';
return (num / 100);
}
/******** PIE — groups ********/
//new Chart(document.getElementById("chartGroups"), {
/*
const chartGroups = document.getElementById("chartGroups");
const chartGP = new Chart(chartGroups, {
type: "pie",
data: {
labels: ["КП отправлено", "Приобретено", "Не приобретено", "В работе"],
datasets: [{
data: [
< ?= count($data['dealKP']['rows']) ?>,
< ?= count($data['group1']['rows']) ?>,
< ?= count($data['group2']['rows']) ?>,
< ?= count($data['group3']['rows']) ?>
],
sumBill: [
'< ?= NumToPrice($data['dealKP']['sum_bill']) ?>',
"< ?= NumToPrice($data['group1']['sum_bill']) ?>",
"< ?= NumToPrice($data['group2']['sum_bill']) ?>",
"< ?= NumToPrice($data['group3']['sum_bill']) ?>"
],
sumOrder: [
'< ?= NumToPrice($data['dealKP']['sum_order']) ?>',
"< ?= NumToPrice($data['group1']['sum_order']) ?>",
"< ?= NumToPrice($data['group2']['sum_order']) ?>",
"< ?= NumToPrice($data['group3']['sum_order']) ?>"
],
backgroundColor: ['#6de3c7',"#ffa500","#ff0000","#79c4f7"]
}]
},
options: {
plugins: {
tooltip: {
// mode: 'index',
// intersect: false,
callbacks: {
label: function(context) {
const total = context.dataset.data.reduce((a, b) => a + b, 0);
const value = context.raw;
const percent = ((value / total) * 100).toFixed(1);
let sum_bill = context.dataset.sumBill[context.dataIndex];
let sum_order = context.dataset.sumOrder[context.dataIndex];
//return
${context.label}: ${value} (${percent}%) ;
return ${value} (${percent}%) / Счет: ${sum_bill} ₽ | Сумма: ${sum_order} ₽
}
}
}
},
responsive: true,
maintainAspectRatio: false,
legend: { position: 'bottom' }
}
});*/
let chartGP = null;
let chartGPKP = null;
function loadChartGroups(formData = {}) {//async
const fd = new FormData();
fd.append('action', 'chartGroups');
for (const key in formData) {
fd.append(key, formData[key]);
}
//Object.entries(formData).forEach(([k, v]) => fd.append(k, v));
/*const response = fetch('', {//await
method: 'POST',
body: fd
});
const data = response.json();//await*/
fetch(window.location.href, {
method: 'POST',
body: fd
})
.then(response => response.json())
.then(data => {
document.getElementById('dealKP_count').textContent = data.dealKP.count;
document.getElementById('dealKP_bill').textContent = formatPrice(data.dealKP.sum_bill);
document.getElementById('dealKP_order').textContent = formatPrice(data.dealKP.sum_order);
document.getElementById('group1_count').textContent = data.group1.count;
document.getElementById('group1_bill').textContent = formatPrice(data.group1.sum_bill);
document.getElementById('group1_order').textContent = formatPrice(data.group1.sum_order);
document.getElementById('group2_count').textContent = data.group2.count;
document.getElementById('group2_bill').textContent = formatPrice(data.group2.sum_bill);
document.getElementById('group2_order').textContent = formatPrice(data.group2.sum_order);
document.getElementById('group3_count').textContent = data.group3.count;
document.getElementById('group3_bill').textContent = formatPrice(data.group3.sum_bill);
document.getElementById('group3_order').textContent = formatPrice(data.group3.sum_order);
/*const map = [
['dealKP','dealKP'],
['group1','group1'],
['group2','group2'],
['group3','group3']
];
map.forEach(([key, id]) => {
document.getElementById(${id}_count).textContent = data[key].count;
document.getElementById(${id}_bill).textContent = formatPrice(data[key].sum_bill);
document.getElementById(${id}_order).textContent = formatPrice(data[key].sum_order);
});*/
const map2 = [
['dealKP150','dealKP150'],
['dealKP100','dealKP100']
];
map2.forEach(([key, id]) => {
document.getElementById(${id}_count).textContent = data[key].count;
document.getElementById(${id}_bill).textContent = formatPrice(data[key].sum_bill);
document.getElementById(${id}_order).textContent = formatPrice(data[key].sum_order);
});
/*const chartData = [
data.dealKP,
data.group1,
data.group2,
data.group3
];*/
const counts = [
data.dealKP.count,
data.group1.count,
data.group2.count,
data.group3.count
];
const sumBill = [
formatPrice(data.dealKP.sum_bill),
formatPrice(data.group1.sum_bill),
formatPrice(data.group2.sum_bill),
formatPrice(data.group3.sum_bill)
];
const sumOrder = [
formatPrice(data.dealKP.sum_order),
formatPrice(data.group1.sum_order),
formatPrice(data.group2.sum_order),
formatPrice(data.group3.sum_order)
];
if (chartGP) {
chartGP.data.datasets[0].data = counts;
chartGP.data.datasets[0].sumBill = sumBill;
chartGP.data.datasets[0].sumOrder = sumOrder;
chartGP.update();
//return;
}
const counts2 = [
//data.dealKP150.count,
//data.dealKP100.count
formatSUM(data.dealKP150.sum_order),
formatSUM(data.dealKP150.sum_bill),
formatSUM(data.dealKP100.sum_order),
formatSUM(data.dealKP100.sum_bill)
];
const sumallKP = [
formatPrice(data.dealKP150.sum_order),
formatPrice(data.dealKP150.sum_bill),
formatPrice(data.dealKP100.sum_order),
formatPrice(data.dealKP100.sum_bill)
];
if(chartGPKP) {
chartGPKP.data.datasets[0].data = counts2;
chartGPKP.data.datasets[0].sumall = sumallKP;
chartGPKP.update();
//return;
}
/*if (chartGP) {
chartGP.data.datasets[0].data = chartData;
chartGP.update();
return;
}*/
/*chartGP = new Chart(document.getElementById("chartGroups"), {
type: "pie",
data: {
labels: ["КП отправлено", "Приобретено", "Не приобретено", "В работе"],
datasets: [{
data: chartData,
backgroundColor: ['#6de3c7',"#ffa500","#ff0000","#79c4f7"]
}]
}
});*/
chartGP = new Chart(document.getElementById("chartGroups"), {
type: "pie",
data: {
labels: [
"КП отправлено",
"Приобретено",
"Не приобретено",
"В работе"
],
datasets: [{
data: counts,
sumBill: sumBill,
sumOrder: sumOrder,
backgroundColor: [
'#6de3c7',
'#ffa500',
'#ff0000',
'#79c4f7'
]
}]
},
options: {
plugins: {
tooltip: {
callbacks: {
label: function (ctx) {
const total = ctx.dataset.data.reduce((a, b) => a + b, 0);
const value = ctx.raw;
const percent = total
? ((value / total) * 100).toFixed(1)
: 0;
const bill = ctx.dataset.sumBill[ctx.dataIndex];
const order = ctx.dataset.sumOrder[ctx.dataIndex];
return ${value} (${percent}%) / Счёт: ${bill} ₽ | Заказ: ${order} ₽;
}
}
}
}
}
});
chartGPKP = new Chart(document.getElementById("chartdeal"), {
type: "bar",
data: {
labels: ["Приобретено сумма","Приобретено счет","Не приобретено сумма","Не приобретено счет"],
datasets: [{
label: " 111 ",
data: counts2,
sumall: sumallKP,
//sum100: KP100,
//backgroundColor: "#007bff"
backgroundColor: [
'#ffa500',
'#ffa500',
'#ff0000',
'#ff0000'
]
}]
},
options: {
plugins: {
legend: {
display: false // Скрывает 111 полностью
},
tooltip: {
callbacks: {
label: function (ctx) {
// console.log(ctx);
// const total = ctx.dataset.data.reduce((a, b) => a + b, 0);
// const value = ctx.raw;
// const percent = total
// ? ((value / total) * 100).toFixed(1)
// : 0;
const sums = ctx.dataset.sumall[ctx.dataIndex];
//const order2 = ctx.dataset.sum100[ctx.dataIndex];
//return ${value} (${percent}%) / Счёт: ${bill2} ₽ | Заказ: ${order2} ₽;
return ${sums} ₽ ;
}
}
}
},
indexAxis: 'y',
responsive: true
}
});
})
.catch(err => console.error('Ошибка загрузки данных:', err));
}
document.getElementById('filterForm').addEventListener('submit', function(e) {
e.preventDefault();
const formData = {
startDate: this.startDate.value,
endDate: this.endDate.value,
byaccount_set: this.byaccount_set.value
};
loadChartGroups(formData);
});
/******** BAR — quarters ********/
new Chart(document.getElementById("chartQuarters"), {
type: "bar",
data: {
labels: ["Q1","Q2","Q3","Q4"],
datasets: [{
label: "Сумма заказов",
data: [
<?= $quarters['Q1'] ?>,
<?= $quarters['Q2'] ?>,
<?= $quarters['Q3'] ?>,
<?= $quarters['Q4'] ?>
],
backgroundColor: "#007bff"
}]
}
});
/******** BAR — week stats ********/
new Chart(document.getElementById("chartWeek"), {
type: "bar",
data: {
labels: ["Статус 150", "Статус 100"],
datasets: [{
label: "Количество",
data: [
<?= $weekStats['s150'] ?>,
<?= $weekStats['s100'] ?>
],
backgroundColor: ["#28a745","#ffc107"]
}]
}
});
//$(document).ready(function() {
document.addEventListener('DOMContentLoaded', () => {
loadChartGroups(); // первая загрузка
});
</script>