- Implemented InviteDoctorModal component for inviting doctors to clinics. - Updated ClinicDashboard to include a button for inviting doctors and handle modal state. - Added createAppointment API endpoint in AdminApiController for scheduling appointments. - Enhanced ClinicInvitationController to check user access when inviting doctors. - Updated MyAppointmentsController to ensure unique appointment records. - Added seed_test_data.php for populating test data including doctors, clinics, and appointments. - Refactored styles to include new appointment status badges and updated font imports.
262 lines
13 KiB
PHP
262 lines
13 KiB
PHP
<?php
|
|
require __DIR__ . '/vendor/autoload.php';
|
|
(new Symfony\Component\Dotenv\Dotenv())->bootEnv(__DIR__ . '/.env');
|
|
$kernel = new App\Kernel($_SERVER['APP_ENV'], (bool)$_SERVER['APP_DEBUG']);
|
|
$kernel->boot();
|
|
$em = $kernel->getContainer()->get('doctrine')->getManager();
|
|
|
|
$conn = $em->getConnection();
|
|
$now = time();
|
|
|
|
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
|
|
function slot(string $date, int $hour, int $minute = 0): int {
|
|
return mktime($hour, $minute, 0, (int)date('m', strtotime($date)), (int)date('d', strtotime($date)), (int)date('Y', strtotime($date)));
|
|
}
|
|
|
|
function today(int $daysOffset = 0): string {
|
|
return date('Y-m-d', strtotime(($daysOffset >= 0 ? "+$daysOffset" : "$daysOffset") . ' days'));
|
|
}
|
|
|
|
// ── Load entities ────────────────────────────────────────────────────────────
|
|
|
|
$doctor1 = $em->getRepository(\App\Doctor\Entity\Doctor::class)->find(1184); // آرمان رضایی
|
|
$doctor4 = $em->getRepository(\App\Doctor\Entity\Doctor::class)->find(1185); // سامان علوی
|
|
$clinic2 = $em->getRepository(\App\Clinic\Entity\Clinic::class)->find(203); // کلینیک تست پگاه
|
|
$clinic4 = $em->getRepository(\App\Clinic\Entity\Clinic::class)->find(204); // کلینیک تخصصی علوی
|
|
|
|
$spec3 = $em->getRepository(\App\Specialty\Entity\Specialty::class)->find(3); // قلب و عروق
|
|
$spec10 = $em->getRepository(\App\Specialty\Entity\Specialty::class)->find(10); // نورولوژی
|
|
$spec110= $em->getRepository(\App\Specialty\Entity\Specialty::class)->find(110); // ارتوپدی
|
|
$spec111= $em->getRepository(\App\Specialty\Entity\Specialty::class)->find(111); // ارتوپدی عمومی
|
|
|
|
// ── کاربر ۱: دکتر آرمان رضایی ───────────────────────────────────────────────
|
|
|
|
$doctor1->setGender('man')
|
|
->setDegree('specialist')
|
|
->setMedicalSystemCode('IR-12345')
|
|
->setMobileNumber('09100000011')
|
|
->setActivityTime(mktime(0,0,0,1,1,2010))
|
|
->setInfo('متخصص قلب و عروق با بیش از ۱۴ سال سابقه بالینی. فارغالتحصیل دانشگاه علوم پزشکی تهران. عضو انجمن قلب ایران.')
|
|
->setDoctorRate(4.5)
|
|
->setDoctorRatePercentage(90.0)
|
|
->setActiveDoctorAppointment(true);
|
|
|
|
// تخصصها
|
|
$doctor1->getSpecialties()->clear();
|
|
if ($spec3) $doctor1->getSpecialties()->add($spec3);
|
|
if ($spec10) $doctor1->getSpecialties()->add($spec10);
|
|
|
|
$em->flush();
|
|
|
|
// خدمات
|
|
$conn->executeStatement('DELETE FROM doctor_expertise WHERE doctor_id = ?', [1184]);
|
|
foreach ([101, 102, 103, 104, 105] as $svcId) {
|
|
$conn->executeStatement('INSERT IGNORE INTO doctor_expertise (doctor_id, service_id) VALUES (?, ?)', [1184, $svcId]);
|
|
}
|
|
|
|
echo "✅ دکتر آرمان رضایی بروزرسانی شد\n";
|
|
|
|
// ── کاربر ۴: دکتر سامان علوی ────────────────────────────────────────────────
|
|
|
|
$doctor4->setGender('man')
|
|
->setDegree('specialist')
|
|
->setMedicalSystemCode('IR-67890')
|
|
->setMobileNumber('09100000044')
|
|
->setActivityTime(mktime(0,0,0,1,1,2012))
|
|
->setInfo('متخصص ارتوپدی و جراحی مفاصل. فارغالتحصیل دانشگاه شهید بهشتی. تخصص ویژه در جراحی آرتروسکوپی زانو و تعویض مفصل.')
|
|
->setDoctorRate(4.7)
|
|
->setDoctorRatePercentage(94.0)
|
|
->setActiveDoctorAppointment(true);
|
|
|
|
$doctor4->getSpecialties()->clear();
|
|
if ($spec110) $doctor4->getSpecialties()->add($spec110);
|
|
if ($spec111) $doctor4->getSpecialties()->add($spec111);
|
|
|
|
$em->flush();
|
|
|
|
$conn->executeStatement('DELETE FROM doctor_expertise WHERE doctor_id = ?', [1185]);
|
|
foreach ([11101, 11105, 11201, 11401] as $svcId) {
|
|
$conn->executeStatement('INSERT IGNORE INTO doctor_expertise (doctor_id, service_id) VALUES (?, ?)', [1185, $svcId]);
|
|
}
|
|
|
|
echo "✅ دکتر سامان علوی بروزرسانی شد\n";
|
|
|
|
// ── کلینیک تست پگاه (clinic_id=203) ────────────────────────────────────────
|
|
|
|
$clinic2->setName('کلینیک تخصصی قلب پگاه')
|
|
->setInfo('کلینیک تخصصی قلب و عروق با مجهزترین تجهیزات تشخیصی. ارائه خدمات نوار قلب، اکو، تست ورزش و مشاوره تخصصی.')
|
|
->setAddress('تهران، خیابان ولیعصر، بالاتر از پارک ساعی، پلاک ۱۲۰')
|
|
->setTelephone('02188001234')
|
|
->setCityId(108)
|
|
->setProvinceId(8)
|
|
->setLatitude(35.7219)
|
|
->setLongitude(51.3347)
|
|
->setIsActive(true)
|
|
->setIs247(false)
|
|
->setWorkingDays('شنبه تا چهارشنبه ۸-۱۶، پنجشنبه ۸-۱۲');
|
|
|
|
$em->flush();
|
|
|
|
// تخصص کلینیک
|
|
$conn->executeStatement('DELETE FROM clinic_specialties WHERE clinic_id = ?', [203]);
|
|
foreach ([3, 10] as $sId) {
|
|
$conn->executeStatement('INSERT IGNORE INTO clinic_specialties (clinic_id, specialty_id) VALUES (?, ?)', [203, $sId]);
|
|
}
|
|
|
|
// دکتر آرمان را به این کلینیک اضافه کن (علاوه بر clinic id=1,2 که از قبل هست)
|
|
$conn->executeStatement('INSERT IGNORE INTO clinic_doctors (clinic_id, doctor_id) VALUES (?, ?)', [203, 1184]);
|
|
|
|
echo "✅ کلینیک تخصصی قلب پگاه بروزرسانی شد\n";
|
|
|
|
// ── کلینیک تخصصی علوی (clinic_id=204) ─────────────────────────────────────
|
|
|
|
$clinic4->setName('کلینیک تخصصی ارتوپدی علوی')
|
|
->setInfo('کلینیک تخصصی ارتوپدی با امکانات جراحی آرتروسکوپی. ویزیت، رادیولوژی دیجیتال، MRI، فیزیوتراپی.')
|
|
->setAddress('تهران، سعادتآباد، میدان کاج، خیابان ۲۴ متری، پلاک ۸۵')
|
|
->setTelephone('02122345678')
|
|
->setCityId(108)
|
|
->setProvinceId(8)
|
|
->setLatitude(35.8065)
|
|
->setLongitude(51.3822)
|
|
->setIsActive(true)
|
|
->setIs247(false)
|
|
->setWorkingDays('شنبه تا پنجشنبه ۸-۱۸');
|
|
|
|
$em->flush();
|
|
|
|
$conn->executeStatement('DELETE FROM clinic_specialties WHERE clinic_id = ?', [204]);
|
|
foreach ([110, 111] as $sId) {
|
|
$conn->executeStatement('INSERT IGNORE INTO clinic_specialties (clinic_id, specialty_id) VALUES (?, ?)', [204, $sId]);
|
|
}
|
|
|
|
// دکتر سامان را به کلینیک خودش اضافه کن
|
|
$conn->executeStatement('INSERT IGNORE INTO clinic_doctors (clinic_id, doctor_id) VALUES (?, ?)', [204, 1185]);
|
|
|
|
echo "✅ کلینیک تخصصی ارتوپدی علوی بروزرسانی شد\n";
|
|
|
|
// ── نوبتها ─────────────────────────────────────────────────────────────────
|
|
|
|
// بیمارانی که از قبل وجود دارن
|
|
$patientIds = [789, 790, 791, 792, 793, 794, 795, 796, 797, 798];
|
|
|
|
$uuid = fn() => sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
|
|
mt_rand(0, 0xffff), mt_rand(0, 0xffff),
|
|
mt_rand(0, 0xffff),
|
|
mt_rand(0, 0x0fff) | 0x4000,
|
|
mt_rand(0, 0x3fff) | 0x8000,
|
|
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
|
|
);
|
|
|
|
$insertAppt = function(int $doctorId, int $userId, int $slotStart, int $slotEnd, string $status) use ($conn, $uuid, $now): void {
|
|
$conn->executeStatement(
|
|
'INSERT INTO appointments (uuid, slot_start, slot_end, status, doctor_id, user_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
|
|
[$uuid(), $slotStart, $slotEnd, $status, $doctorId, $userId, $now, $now]
|
|
);
|
|
};
|
|
|
|
// ── نوبتهای گذشته — دکتر آرمان رضایی (doctor_id=1184) ──────────────────
|
|
|
|
$pastAppts = [
|
|
// [-7 تا -1 روز گذشته]
|
|
[today(-7), 9, 0, 'visited', 789],
|
|
[today(-7), 10, 0, 'visited', 790],
|
|
[today(-6), 9, 0, 'cancelled_by_user', 791],
|
|
[today(-6), 11, 0, 'visited', 792],
|
|
[today(-5), 9, 0, 'visited', 793],
|
|
[today(-5), 14, 0, 'no_show', 794],
|
|
[today(-4), 9, 0, 'visited', 795],
|
|
[today(-4), 10, 0, 'visited', 796],
|
|
[today(-3), 9, 0, 'cancelled_by_doctor', 797],
|
|
[today(-3), 11, 0, 'visited', 798],
|
|
[today(-2), 9, 0, 'visited', 789],
|
|
[today(-2), 10, 0, 'visited', 790],
|
|
[today(-1), 9, 0, 'visited', 791],
|
|
[today(-1), 11, 0, 'no_show', 792],
|
|
];
|
|
|
|
foreach ($pastAppts as [$date, $h, $m, $status, $patId]) {
|
|
$start = slot($date, $h, $m);
|
|
$insertAppt(1184, $patId, $start, $start + 1800, $status);
|
|
}
|
|
|
|
echo "✅ نوبتهای گذشته دکتر آرمان ساخته شد (" . count($pastAppts) . " نوبت)\n";
|
|
|
|
// ── نوبتهای آینده — دکتر آرمان رضایی (doctor_id=1184) ───────────────────
|
|
|
|
$futureAppts = [
|
|
[today(1), 9, 0, 'reserved', 793],
|
|
[today(1), 10, 0, 'reserved', 794],
|
|
[today(1), 11, 0, 'reserved', 795],
|
|
[today(2), 9, 0, 'reserved', 796],
|
|
[today(2), 10, 0, 'reserved', 797],
|
|
[today(3), 9, 0, 'reserved', 798],
|
|
[today(3), 14, 0, 'reserved', 789],
|
|
[today(5), 9, 0, 'reserved', 790],
|
|
[today(7), 10, 0, 'reserved', 791],
|
|
[today(10),9, 0, 'reserved', 792],
|
|
];
|
|
|
|
foreach ($futureAppts as [$date, $h, $m, $status, $patId]) {
|
|
$start = slot($date, $h, $m);
|
|
$insertAppt(1184, $patId, $start, $start + 1800, $status);
|
|
}
|
|
|
|
echo "✅ نوبتهای آینده دکتر آرمان ساخته شد (" . count($futureAppts) . " نوبت)\n";
|
|
|
|
// ── نوبتهای گذشته — دکتر سامان علوی (doctor_id=1185) ───────────────────
|
|
|
|
$pastAppts4 = [
|
|
[today(-10), 10, 0, 'visited', 793],
|
|
[today(-10), 11, 0, 'visited', 794],
|
|
[today(-8), 9, 0, 'visited', 795],
|
|
[today(-8), 14, 0, 'cancelled_by_user', 796],
|
|
[today(-6), 9, 0, 'visited', 797],
|
|
[today(-6), 10, 0, 'visited', 798],
|
|
[today(-4), 9, 0, 'no_show', 789],
|
|
[today(-4), 11, 0, 'visited', 790],
|
|
[today(-2), 10, 0, 'visited', 791],
|
|
[today(-1), 9, 0, 'visited', 792],
|
|
];
|
|
|
|
foreach ($pastAppts4 as [$date, $h, $m, $status, $patId]) {
|
|
$start = slot($date, $h, $m);
|
|
$insertAppt(1185, $patId, $start, $start + 2700, $status); // 45 دقیقه برای ارتوپد
|
|
}
|
|
|
|
echo "✅ نوبتهای گذشته دکتر سامان ساخته شد (" . count($pastAppts4) . " نوبت)\n";
|
|
|
|
// ── نوبتهای آینده — دکتر سامان علوی (doctor_id=1185) ────────────────────
|
|
|
|
$futureAppts4 = [
|
|
[today(1), 10, 0, 'reserved', 793],
|
|
[today(1), 11, 0, 'reserved', 794],
|
|
[today(2), 9, 0, 'reserved', 795],
|
|
[today(2), 14, 0, 'reserved', 796],
|
|
[today(3), 10, 0, 'reserved', 797],
|
|
[today(4), 9, 0, 'reserved', 798],
|
|
[today(6), 11, 0, 'reserved', 789],
|
|
[today(8), 9, 0, 'reserved', 790],
|
|
];
|
|
|
|
foreach ($futureAppts4 as [$date, $h, $m, $status, $patId]) {
|
|
$start = slot($date, $h, $m);
|
|
$insertAppt(1185, $patId, $start, $start + 2700, $status);
|
|
}
|
|
|
|
echo "✅ نوبتهای آینده دکتر سامان ساخته شد (" . count($futureAppts4) . " نوبت)\n";
|
|
|
|
echo "\n=== همه دادهها با موفقیت ساخته شدند ===\n\n";
|
|
|
|
// ── خلاصه نهایی ──────────────────────────────────────────────────────────────
|
|
|
|
echo "┌─────────────────────────────────────────────────────────────────────┐\n";
|
|
echo "│ خلاصه کاربران تستی │\n";
|
|
echo "├─────────────────────────────────────────────────────────────────────┤\n";
|
|
echo "│ ادمین: 09120671713 / admin123 │\n";
|
|
echo "│ دکتر چند کلینیک: 09100000011 / Test1234 (دکتر آرمان رضایی) │\n";
|
|
echo "│ صاحب کلینیک: 09100000022 / Test1234 (کلینیک قلب پگاه) │\n";
|
|
echo "│ منشی: 09100000033 / Test1234 (منشی دکتر مهناز) │\n";
|
|
echo "│ دکتر+کلینیک: 09100000044 / Test1234 (دکتر سامان + کلینیک علوی)│\n";
|
|
echo "└─────────────────────────────────────────────────────────────────────┘\n";
|