[add] расписание + печать

This commit is contained in:
Петрищев Алексей 2025-11-24 19:40:30 +03:00
parent c303e7526c
commit 70e6f304bb
15 changed files with 338 additions and 93 deletions

View File

@ -1,11 +1,11 @@
<link rel="stylesheet" href="/admin/assets/css/bootstrap.css?1728913930">
<link rel="stylesheet" href="/admin/assets/css/chosen.min.css?1728913930">
<link rel="stylesheet" href="/admin/assets/css/fonts_full.css?1728913930">
<link rel="stylesheet" href="/admin/assets/css/jquery-ui.css?1728913930">
<link rel="stylesheet" href="/admin/assets/css/jquery-ui.structure.min.css?1728913930">
<link rel="stylesheet" href="/admin/assets/css/jquery-ui.theme.min.css?1728913930">
<link rel="stylesheet" href="/admin/assets/css/jquery.autocomplete.css?1728913930">
<link rel="stylesheet" href="/admin/assets/css/jquery.fancybox.min.css?1728913930">
<link rel="stylesheet" href="/admin/assets/css/jquery.periodpicker.min.css?1728913930">
<link rel="stylesheet" href="/admin/assets/css/redactor.css?1728913930">
<link rel="stylesheet" href="/admin/assets/css/custom.css?1728913930">
<link rel="stylesheet" href="/admin/assets/css/bootstrap.css?1764002032">
<link rel="stylesheet" href="/admin/assets/css/chosen.min.css?1764002032">
<link rel="stylesheet" href="/admin/assets/css/fonts_full.css?1764002032">
<link rel="stylesheet" href="/admin/assets/css/jquery-ui.css?1764002032">
<link rel="stylesheet" href="/admin/assets/css/jquery-ui.structure.min.css?1764002032">
<link rel="stylesheet" href="/admin/assets/css/jquery-ui.theme.min.css?1764002032">
<link rel="stylesheet" href="/admin/assets/css/jquery.autocomplete.css?1764002032">
<link rel="stylesheet" href="/admin/assets/css/jquery.fancybox.min.css?1764002032">
<link rel="stylesheet" href="/admin/assets/css/jquery.periodpicker.min.css?1764002032">
<link rel="stylesheet" href="/admin/assets/css/redactor.css?1764002032">
<link rel="stylesheet" href="/admin/assets/css/custom.css?1764002032">

View File

@ -1,15 +1,15 @@
<script src="/admin/assets/js/jquery.js?1728913930"></script>
<script src="/admin/assets/js/bootstrap4.min.js?1728913930"></script>
<script src="/admin/assets/js/chosen.jquery.min.js?1728913930"></script>
<script src="/admin/assets/js/clipboard.min.js?1728913930"></script>
<script src="/admin/assets/js/jquery.fancybox.min.js?1728913930"></script>
<script src="/admin/assets/js/jquery-ui.min.js?1728913930"></script>
<script src="/admin/assets/js/jquery.autocomplete.js?1728913930"></script>
<script src="/admin/assets/js/jquery.form.js?1728913930"></script>
<script src="/admin/assets/js/jquery.input.counter.js?1728913930"></script>
<script src="/admin/assets/js/jquery.maskedinput-1.3.min.js?1728913930"></script>
<script src="/admin/assets/js/jquery.periodpicker.full.min.js?1728913930"></script>
<script src="/admin/assets/js/jquery.tablesorter.min.js?1728913930"></script>
<script src="/admin/assets/js/jquery.utils.min.js?1728913930"></script>
<script src="/admin/assets/js/redactor.js?1728913930"></script>
<script src="/admin/assets/js/bootstrap4.utils.js?1728913930"></script>
<script src="/admin/assets/js/jquery.js?1764002032"></script>
<script src="/admin/assets/js/bootstrap4.min.js?1764002032"></script>
<script src="/admin/assets/js/chosen.jquery.min.js?1764002032"></script>
<script src="/admin/assets/js/clipboard.min.js?1764002032"></script>
<script src="/admin/assets/js/jquery.fancybox.min.js?1764002032"></script>
<script src="/admin/assets/js/jquery-ui.min.js?1764002032"></script>
<script src="/admin/assets/js/jquery.autocomplete.js?1764002032"></script>
<script src="/admin/assets/js/jquery.form.js?1764002032"></script>
<script src="/admin/assets/js/jquery.input.counter.js?1764002032"></script>
<script src="/admin/assets/js/jquery.maskedinput-1.3.min.js?1764002032"></script>
<script src="/admin/assets/js/jquery.periodpicker.full.min.js?1764002032"></script>
<script src="/admin/assets/js/jquery.tablesorter.min.js?1764002032"></script>
<script src="/admin/assets/js/jquery.utils.min.js?1764002032"></script>
<script src="/admin/assets/js/redactor.js?1764002032"></script>
<script src="/admin/assets/js/bootstrap4.utils.js?1764002032"></script>

View File

@ -97,18 +97,19 @@ foreach ($docs as $d) {
$post = db_escape_string($d['post_name']);
$spec = db_escape_string($d['speciality_name']);
$office = db_escape_string($d['office']);
$zoneId = (int)$d['orgStructure_id'];
// zone_id = внешний ID участка
$zoneId = (int)$d['orgStructure_id'];
// Получаем JSON расписания
$scheduleJson = db_escape_string(getDoctorSchedule($src, $id));
echo "[TMP DOC] INSERT id={$id}, name={$name}\n";
if (!$DRY_RUN) {
$dst->q("
INSERT INTO pnd_doctors_tmp
(id, name, post_name, speciality_name, office, zone_id)
(id, name, post_name, speciality_name, office, zone_id, schedule)
VALUES (
{$id}, '{$name}', '{$post}', '{$spec}', '{$office}', {$zoneId}
{$id}, '{$name}', '{$post}', '{$spec}', '{$office}', {$zoneId}, '{$scheduleJson}'
)
");
}
@ -144,4 +145,74 @@ function replaceTables($dst, $DRY_RUN)
replaceTables($dst, $DRY_RUN);
function getDoctorSchedule($src, $doctorId) {
// Генерируем диапазон дат: -3 дня назад и +4 вперёд
$startDate = date('Y-m-d', strtotime('-3 days'));
$endDate = date('Y-m-d', strtotime('+4 days'));
$sql = "
SELECT
DATE(e.execDate) AS day,
MIN(apt.value) AS work_start,
ADDTIME(MAX(apt.value), '00:20:00') AS work_end
FROM Event e
JOIN Action a ON e.id = a.event_id
JOIN ActionType at ON a.actionType_id = at.id
JOIN ActionPropertyType apT1
ON a.actionType_id = apT1.actionType_id AND apT1.name LIKE '%times%'
JOIN ActionProperty ap1
ON a.id = ap1.action_id AND ap1.type_id = apT1.id
JOIN ActionProperty_Time apt ON ap1.id = apt.id
WHERE e.deleted = 0
AND a.deleted = 0
AND ap1.deleted = 0
AND at.code = 'amb'
AND e.eventType_id = 5
AND e.execPerson_id = {$doctorId}
AND DATE(e.execDate) BETWEEN '{$startDate}' AND '{$endDate}'
GROUP BY DATE(e.execDate)
";
$rows = $src->q($sql)->fetchAll();
// Подготовка недели: day1..day7 = Пн..Вс
$week = [
1 => 'day1',
2 => 'day2',
3 => 'day3',
4 => 'day4',
5 => 'day5',
6 => 'day6',
7 => 'day7',
];
// Заполняем пустыми днями
$result = [
'day1' => null,
'day2' => null,
'day3' => null,
'day4' => null,
'day5' => null,
'day6' => null,
'day7' => null,
];
foreach ($rows as $r) {
// 1 воскресенье, нам нужно 1=Пн → 7=Вс
$dayNum = date('N', strtotime($r['day']));
$key = $week[$dayNum];
$result[$key] = [
'start' => $r['work_start'] ?: null,
'end' => $r['work_end'] ?: null,
];
}
return json_encode($result, JSON_UNESCAPED_UNICODE);
}
echo "\n--- DONE (DRY_RUN = " . ($DRY_RUN ? "YES" : "NO") . ") ---\n";

View File

@ -0,0 +1 @@
INSERT INTO `_sys_cat_admin` (`access_group`, `cat_id`, `cat_name`, `data`, `module`, `parent_cat`) VALUES ( "1,2", "core-edit-doctors", "Доктора", "$obj_name=pnd_doctors;", "object_admin.php", "index");

View File

@ -0,0 +1,4 @@
-- [2025-11-24 19:10:57] Создание атрибута;
CREATE TABLE IF NOT EXISTS `pnd_doctors` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `pnd_doctors` ADD `resp` text NOT NULL;
REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("pnd_doctors","resp","json","","","100");

View File

@ -0,0 +1,11 @@
-- [2025-11-24 19:11:00] Удаление атрибута resp;
DELETE FROM `_sys_datatypes` WHERE `obj_name` = 'pnd_doctors' AND `attr_name` = 'resp';
ALTER TABLE `pnd_doctors` DROP `resp`;
-- [2025-11-24 19:11:08] Создание атрибута;
CREATE TABLE IF NOT EXISTS `pnd_doctors` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `pnd_doctors` ADD `schedule` text NOT NULL;
REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("pnd_doctors","schedule","json","","","100");
-- [2025-11-24 19:11:13] Изменение атрибута schedule;
REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("json" , "" , "" , "0" , "0" , "200" , "0" , "pnd_doctors" , "schedule");
-- [2025-11-24 19:11:20] Изменение атрибута schedule;
REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("json" , "" , "График работы" , "0" , "0" , "200" , "0" , "pnd_doctors" , "schedule");

View File

@ -3,37 +3,87 @@
<h2 class="font-weight-bold"><?php echo \htmlentities($zone_name, ENT_QUOTES, 'UTF-8', false); ?></h2>
</div>
<?php
$today = date('N'); // 1..7
?>
<?php $__currentLoopData = $doctors; $this->addLoop($__currentLoopData);$this->getFirstLoop();
foreach($__currentLoopData as $doc): $loop = $this->incrementLoopIndices(); ?>
<div class="card mb-4 shadow-sm" style="border-radius:14px;">
<div class="card mb-4 shadow-sm" style="border-radius:18px;">
<div class="card-body">
<h4 class="mb-3">
<?php echo \htmlentities($doc['post_name'] ?: 'Врач', ENT_QUOTES, 'UTF-8', false); ?>
</h4>
<div class="d-flex align-items-start mb-3">
<div class="mr-3" style="font-size:52px;line-height:52px;">
<i class="fas fa-user-md text-primary"></i>
</div>
<?php /* Левая колонка с аватаром-вставкой по дизайну */ ?>
<div style="font-size:20px;">
<strong><?php echo \htmlentities($doc['name'], ENT_QUOTES, 'UTF-8', false); ?></strong><br>
<?php if(!empty($doc['speciality_name'])): ?>
<?php echo \htmlentities($doc['speciality_name'], ENT_QUOTES, 'UTF-8', false); ?><br>
<div class="mt-1">
<i class="fas fa-stethoscope text-secondary mr-1"></i>
<?php echo \htmlentities($doc['post_name'] ?: 'Врач', ENT_QUOTES, 'UTF-8', false); ?>
</div>
<?php endif; ?>
<?php if(!empty($doc['office'])): ?>
Кабинет: <strong><?php echo \htmlentities($doc['office'], ENT_QUOTES, 'UTF-8', false); ?></strong><br>
<div class="mt-1">
<i class="fas fa-door-closed text-secondary mr-1"></i>
Кабинет: <strong><?php echo \htmlentities($doc['office'], ENT_QUOTES, 'UTF-8', false); ?></strong>
</div>
<?php endif; ?>
</div>
</div>
<h5 class="mt-4 mb-3">Расписание приема</h5>
<?php
$daysMap = [
'day1' => 'Понедельник',
'day2' => 'Вторник',
'day3' => 'Среда',
'day4' => 'Четверг',
'day5' => 'Пятница',
'day6' => 'Суббота',
'day7' => 'Воскресенье',
];
$schedule = json_decode($doc['schedule'] ?? '', true);
?>
<hr class="mt-3 mb-3" style="border-color:#e5e5e5;">
<h5 class="mb-3">Расписание приёма</h5>
<?php if(empty($schedule)): ?>
<div class="text-muted">Расписание не указано</div>
<?php else: ?>
<ul class="list-unstyled mb-0">
<?php $__currentLoopData = $daysMap; $this->addLoop($__currentLoopData);$this->getFirstLoop();
foreach($__currentLoopData as $dayKey => $dayTitle): $loop = $this->incrementLoopIndices(); ?>
<?php
$slot = $schedule[$dayKey] ?? null;
?>
<li class="d-flex justify-content-between py-2 border-bottom"
style="font-size:17px;">
<span><?php echo \htmlentities($dayTitle, ENT_QUOTES, 'UTF-8', false); ?></span>
<?php if($slot && !empty($slot['start']) && !empty($slot['end'])): ?>
<span class="text-dark font-weight-bold">
<?php echo \htmlentities(substr($slot['start'], 0, 5), ENT_QUOTES, 'UTF-8', false); ?> — <?php echo \htmlentities(substr($slot['end'], 0, 5), ENT_QUOTES, 'UTF-8', false); ?>
</span>
<?php else: ?>
<span class="text-muted font-italic">Нет приёма</span>
<?php endif; ?>
</li>
<?php endforeach; $this->popLoop(); $loop = $this->getFirstLoop(); ?>
</ul>
<?php endif; ?>
</div>
</div>
<?php endforeach; $this->popLoop(); $loop = $this->getFirstLoop(); ?>

View File

@ -48,10 +48,10 @@
</div>
</div>
</div>
<?php /* Модальное окно результата */ ?>
<div id="result-modal"
class="modal fade"
@ -60,7 +60,10 @@
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content shadow-lg" style="border-radius:20px;">
<div class="modal-body" id="modal-content-area" style="font-size:20px;"></div>
<div class="modal-footer text-center">
<div class="modal-footer text-center justify-content-between">
<button class="btn btn-secondary btn-lg px-5" onclick="printModal()">
<i class="fas fa-print mr-2"></i> Распечатать
</button>
<button class="btn btn-primary btn-lg px-5" data-dismiss="modal">
Закрыть
</button>
@ -353,3 +356,32 @@
font-size: 20px;
}
</style>
<script>
function printModal() {
let modalBody = document.querySelector("#modal-content-area");
if (!modalBody) return;
// Сохраняем оригинальный DOM
let originalContent = document.body.innerHTML;
// Подменяем HTML на печатный
document.body.innerHTML =
'<div style="padding:20px;">' +
modalBody.innerHTML +
'</div>';
window.print();
// Возвращаем оригинальный DOM
document.body.innerHTML = originalContent;
// Восстанавливаем JS-обработчики (нужно переинициализировать Bootstrap)
setTimeout(function () {
location.reload(); // лёгкий способ всё вернуть без побочных эффектов
}, 200);
}
</script>

View File

@ -3,35 +3,83 @@
<h2 class="font-weight-bold">{{$zone_name}}</h2>
</div>
@php
$today = date('N'); // 1..7
@endphp
@foreach($doctors as $doc)
<div class="card mb-4 shadow-sm" style="border-radius:14px;">
<div class="card mb-4 shadow-sm" style="border-radius:18px;">
<div class="card-body">
<h4 class="mb-3">
{{$doc['post_name'] ?: 'Врач'}}
</h4>
<div class="d-flex align-items-start mb-3">
<div class="mr-3" style="font-size:52px;line-height:52px;">
<i class="fas fa-user-md text-primary"></i>
</div>
{{-- Левая колонка с аватаром-вставкой по дизайну --}}
<div style="font-size:20px;">
<strong>{{$doc['name']}}</strong><br>
@if(!empty($doc['speciality_name']))
{{$doc['speciality_name']}}<br>
<div class="mt-1">
<i class="fas fa-stethoscope text-secondary mr-1"></i>
{{$doc['post_name'] ?: 'Врач'}}
</div>
@endif
@if(!empty($doc['office']))
Кабинет: <strong>{{$doc['office']}}</strong><br>
<div class="mt-1">
<i class="fas fa-door-closed text-secondary mr-1"></i>
Кабинет: <strong>{{$doc['office']}}</strong>
</div>
@endif
</div>
</div>
<h5 class="mt-4 mb-3">Расписание приема</h5>
<div class="text-muted">Расписание не указано</div>
@php
$daysMap = [
'day1' => 'Понедельник',
'day2' => 'Вторник',
'day3' => 'Среда',
'day4' => 'Четверг',
'day5' => 'Пятница',
'day6' => 'Суббота',
'day7' => 'Воскресенье',
];
$schedule = json_decode($doc['schedule'] ?? '', true);
@endphp
<hr class="mt-3 mb-3" style="border-color:#e5e5e5;">
<h5 class="mb-3">Расписание приёма</h5>
@if(empty($schedule))
<div class="text-muted">Расписание не указано</div>
@else
<ul class="list-unstyled mb-0">
@foreach($daysMap as $dayKey => $dayTitle)
@php
$slot = $schedule[$dayKey] ?? null;
@endphp
<li class="d-flex justify-content-between py-2 border-bottom"
style="font-size:17px;">
<span>{{ $dayTitle }}</span>
@if($slot && !empty($slot['start']) && !empty($slot['end']))
<span class="text-dark font-weight-bold">
{{ substr($slot['start'], 0, 5) }} {{ substr($slot['end'], 0, 5) }}
</span>
@else
<span class="text-muted font-italic">Нет приёма</span>
@endif
</li>
@endforeach
</ul>
@endif
</div>
</div>
@endforeach

View File

@ -48,10 +48,10 @@
</div>
</div>
</div>
{{-- Модальное окно результата --}}
<div id="result-modal"
class="modal fade"
@ -60,7 +60,10 @@
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content shadow-lg" style="border-radius:20px;">
<div class="modal-body" id="modal-content-area" style="font-size:20px;"></div>
<div class="modal-footer text-center">
<div class="modal-footer text-center justify-content-between">
<button class="btn btn-secondary btn-lg px-5" onclick="printModal()">
<i class="fas fa-print mr-2"></i> Распечатать
</button>
<button class="btn btn-primary btn-lg px-5" data-dismiss="modal">
Закрыть
</button>
@ -352,3 +355,32 @@
font-size: 20px;
}
</style>
<script>
function printModal() {
let modalBody = document.querySelector("#modal-content-area");
if (!modalBody) return;
// Сохраняем оригинальный DOM
let originalContent = document.body.innerHTML;
// Подменяем HTML на печатный
document.body.innerHTML =
'<div style="padding:20px;">' +
modalBody.innerHTML +
'</div>';
window.print();
// Возвращаем оригинальный DOM
document.body.innerHTML = originalContent;
// Восстанавливаем JS-обработчики (нужно переинициализировать Bootstrap)
setTimeout(function () {
location.reload(); // лёгкий способ всё вернуть без побочных эффектов
}, 200);
}
</script>

View File

@ -1,16 +1,15 @@
<link rel="stylesheet" href="assets/css/bootstrap.css?1728913930">
<link rel="stylesheet" href="assets/css/custom.css?1728913930">
<link rel="stylesheet" href="assets/css/custom_xxs.css?1728913930">
<link rel="stylesheet" href="assets/css/custom_sm.css?1728913930">
<link rel="stylesheet" href="assets/css/custom_md.css?1728913930">
<link rel="stylesheet" href="assets/css/custom_lg.css?1728913930">
<link rel="stylesheet" href="assets/css/custom_xl.css?1728913930">
<link rel="stylesheet" href="assets/css/custom_xxl.css?1728913930">
<link rel="stylesheet" href="assets/css/animate.css?1728913930">
<link rel="stylesheet" href="assets/css/jquery.fancybox.min.css?1728913930">
<link rel="stylesheet" href="assets/css/jquery.scrollbar.css?1728913930">
<link rel="stylesheet" href="assets/css/slick.css?1728913930">
<link rel="stylesheet" href="assets/css/slick-theme.css?1728913930">
<link rel="stylesheet" href="assets/css/slide-menu.css?1728913930">
<link rel="stylesheet" href="assets/css/fonts_full.css?1728913930">
<link rel="stylesheet" href="assets/css/mmenu.css?1728913930">
<link rel="stylesheet" href="assets/css/bootstrap.css?1764002031">
<link rel="stylesheet" href="assets/css/custom.css?1764002031">
<link rel="stylesheet" href="assets/css/custom_xxs.css?1764002031">
<link rel="stylesheet" href="assets/css/custom_sm.css?1764002031">
<link rel="stylesheet" href="assets/css/custom_md.css?1764002031">
<link rel="stylesheet" href="assets/css/custom_lg.css?1764002031">
<link rel="stylesheet" href="assets/css/custom_xl.css?1764002031">
<link rel="stylesheet" href="assets/css/custom_xxl.css?1764002031">
<link rel="stylesheet" href="assets/css/animate.css?1764002031">
<link rel="stylesheet" href="assets/css/jquery.fancybox.min.css?1764002031">
<link rel="stylesheet" href="assets/css/jquery.scrollbar.css?1764002031">
<link rel="stylesheet" href="assets/css/slick.css?1764002031">
<link rel="stylesheet" href="assets/css/slick-theme.css?1764002031">
<link rel="stylesheet" href="assets/css/slide-menu.css?1764002031">
<link rel="stylesheet" href="assets/css/fonts_full.css?1764002031">

View File

@ -1,12 +1,11 @@
<script src="assets/js/jquery-3.4.1.min.js?1728913930"></script>
<script src="assets/js/bootstrap.bundle.min.js?1728913930"></script>
<script src="assets/js/slick.js?1728913930"></script>
<script src="assets/js/jquery.fancybox.min.js?1728913930"></script>
<script src="assets/js/slide-menu.js?1728913930"></script>
<script src="assets/js/lazy.js?1728913930"></script>
<script src="assets/js/autocomplete.js?1728913930"></script>
<script src="assets/js/jquery.scrollbar.min.js?1728913930"></script>
<script src="assets/js/jquery.mask.js?1728913930"></script>
<script src="assets/js/jquery.ajaxform.js?1728913930"></script>
<script src="assets/js/core-engine.js?1728913930"></script>
<script src="assets/js/mmenu/mmenu.js?1728913930"></script>
<script src="assets/js/jquery-3.4.1.min.js?1764002031"></script>
<script src="assets/js/bootstrap.bundle.min.js?1764002031"></script>
<script src="assets/js/slick.js?1764002031"></script>
<script src="assets/js/jquery.fancybox.min.js?1764002031"></script>
<script src="assets/js/slide-menu.js?1764002031"></script>
<script src="assets/js/lazy.js?1764002031"></script>
<script src="assets/js/autocomplete.js?1764002031"></script>
<script src="assets/js/jquery.scrollbar.min.js?1764002031"></script>
<script src="assets/js/jquery.mask.js?1764002031"></script>
<script src="assets/js/jquery.ajaxform.js?1764002031"></script>
<script src="assets/js/core-engine.js?1764002031"></script>

View File

@ -38,7 +38,6 @@ $css_files = [
'slick-theme.css',
'slide-menu.css',
'fonts_full.css',
'mmenu.css'
];
$js_files = [
@ -53,7 +52,6 @@ $js_files = [
'jquery.mask.js',
'jquery.ajaxform.js',
'core-engine.js',
'mmenu/mmenu.js'
];

View File

@ -66,7 +66,7 @@ services:
- app_network
mariadb:
image: mariadb:10.6
image: mariadb:10.5
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}