Remove state data and seed scripts for realistic and test data
This commit is contained in:
Binary file not shown.
-694
@@ -1,694 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "101",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "1",
|
||||
"name": "تبریز",
|
||||
"site_name": "تبریز نوبت",
|
||||
"slogan": "سریعترین سیستم نوبتدهی پزشکی تبریز",
|
||||
"domain": "tabriz-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در تبریز | نوبتدهی آنلاین تبریز | تبریز نوبت",
|
||||
"description": "تبریز نوبت، سامانه تخصصی نوبتدهی پزشکی با سریعترین روش ممکن. دسترسی به پزشکان متخصص و مراکز درمانی معتبر تبریز. با تبریز نوبت، رزرو آنلاین در هر ساعت از شبانهروز امکانپذیر است.",
|
||||
"keywords": "نوبت پزشک تبریز, متخصصان تبریز, رزرو آنلاین پزشک تبریز, مراکز درمانی تبریز, بیمارستانهای تبریز",
|
||||
"contactPhone": "+98 041 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "tabriz_nobat",
|
||||
"telegram": "tabriz_nobat",
|
||||
"whatsapp": "989120000000"
|
||||
},
|
||||
"footerDescription": "تبریز نوبت، اولین سامانه تخصصی نوبتدهی آنلاین پزشکی در شمال غرب کشور. رزرو نوبت از پزشکان و مراکز درمانی معتبر تبریز در کمترین زمان ممکن.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به تبریز نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "102",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "2",
|
||||
"name": "ارومیه",
|
||||
"site_name": "ارومیه نوبت",
|
||||
"slogan": "نوبت پزشک در ارومیه، در سریعترین زمان ممکن",
|
||||
"domain": "urmia-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در ارومیه | نوبتدهی آنلاین ارومیه | ارومیه نوبت",
|
||||
"description": "ارومیه نوبت، امکان رزرو آنلاین پزشکان متخصص و عمومی در ارومیه. بدون نیاز به مراجعه حضوری، نوبت خود را رزرو کنید. ارومیه نوبت همراه شما در مسیر سلامت است.",
|
||||
"keywords": "پزشکان ارومیه, درمانگاههای ارومیه, متخصصین ارومیه, نوبت دهی آنلاین ارومیه, کلینیکهای آذربایجان غربی",
|
||||
"contactPhone": "+98 044 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "urmia_nobat",
|
||||
"telegram": "urmia_nobat",
|
||||
"whatsapp": "989120000001"
|
||||
},
|
||||
"footerDescription": "ارومیه نوبت، سامانه جامع نوبتدهی پزشکی در آذربایجان غربی. رزرو نوبت از پزشکان و مراکز درمانی ارومیه بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به ارومیه نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "103",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "3",
|
||||
"name": "اردبیل",
|
||||
"site_name": "اردبیل نوبت",
|
||||
"slogan": "نوبتدهی آنلاین پزشکی در اردبیل، بدون اتلاف وقت",
|
||||
"domain": "ardabil-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در اردبیل | نوبتدهی آنلاین اردبیل | اردبیل نوبت",
|
||||
"description": "اردبیل نوبت، پیشرفتهترین سیستم نوبتدهی آنلاین پزشکی در اردبیل. انتخاب پزشک براساس تخصص و منطقه. با اردبیل نوبت، خداحافظی با صفهای طولانی و اتلاف وقت.",
|
||||
"keywords": "نوبتدهی پزشکی اردبیل, پزشکان متخصص اردبیل, کلینیکهای اردبیل, خدمات پزشکی استان اردبیل, مراکز درمانی اردبیل",
|
||||
"contactPhone": "+98 045 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "ardabil_nobat",
|
||||
"telegram": "ardabil_nobat",
|
||||
"whatsapp": "989120000002"
|
||||
},
|
||||
"footerDescription": "اردبیل نوبت، سامانه پیشرفته نوبتدهی آنلاین پزشکی در استان اردبیل. رزرو نوبت از پزشکان و مراکز درمانی اردبیل بدون اتلاف وقت.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به اردبیل نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "104",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "4",
|
||||
"name": "اصفهان",
|
||||
"site_name": "اصفهان نوبت",
|
||||
"slogan": "دریافت نوبت از بهترین پزشکان اصفهان، تنها با چند کلیک",
|
||||
"domain": "esf-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در اصفهان | نوبتدهی آنلاین اصفهان | اصفهان نوبت",
|
||||
"description": "اصفهان نوبت، دسترسی به شبکه پزشکان و بیمارستانهای اصفهان. امکان جستجو و رزرو از بهترین متخصصان. با اصفهان نوبت، رزرو آنلاین در کمتر از یک دقیقه ممکن است.",
|
||||
"keywords": "رزرو نوبت اصفهان, پزشکان نصف جهان, مراکز تخصصی اصفهان, بیمارستانهای اصفهان, مشاوره پزشکی اصفهان",
|
||||
"contactPhone": "+98 031 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "esfahan_nobat",
|
||||
"telegram": "esfahan_nobat",
|
||||
"whatsapp": "989120000003"
|
||||
},
|
||||
"footerDescription": "اصفهان نوبت، سامانه جامع نوبتدهی پزشکی در استان اصفهان. رزرو نوبت از پزشکان و مراکز درمانی اصفهان در کمترین زمان ممکن.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به اصفهان نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "105",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "5",
|
||||
"name": "کرج",
|
||||
"site_name": "کرج نوبت",
|
||||
"slogan": "نوبتدهی پزشکی کرج، سریع و آسان",
|
||||
"domain": "karaj-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در کرج | نوبتدهی آنلاین کرج | کرج نوبت",
|
||||
"description": "کرج نوبت، راهکار آسان برای نوبتدهی پزشکی در کرج و حومه. پوشش مراکز درمانی البرز با رزرو آنلاین. کرج نوبت بدون نیاز به تلفن و انتظار در صف خدمت میکند.",
|
||||
"keywords": "نوبتدهی آنلاین کرج, پزشکان البرز, مطبهای کرج, درمانگاههای کرج, مراکز تخصصی البرز",
|
||||
"contactPhone": "+98 026 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "karaj_nobat",
|
||||
"telegram": "karaj_nobat",
|
||||
"whatsapp": "989120000004"
|
||||
},
|
||||
"footerDescription": "کرج نوبت، سامانه تخصصی نوبتدهی پزشکی در استان البرز. رزرو نوبت از پزشکان و مراکز درمانی کرج بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به کرج نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "106",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "6",
|
||||
"name": "ایلام",
|
||||
"site_name": "ایلام نوبت",
|
||||
"slogan": "رزرو آنلاین نوبت پزشکان ایلام، بدون مراجعه حضوری",
|
||||
"domain": "ilam-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در ایلام | نوبتدهی آنلاین ایلام | ایلام نوبت",
|
||||
"description": "ایلام نوبت، اولین سامانه تخصصی نوبتدهی پزشکی در استان ایلام. پوشش گسترده پزشکان با امکان فیلتر تخصص. با ایلام نوبت، نوبتدهی ۲۴ ساعته، آسان و سریع.",
|
||||
"keywords": "دکترهای ایلام, مراکز درمانی ایلام, نوبت آنلاین ایلام, پزشکان متخصص ایلام, کلینیکهای ایلام",
|
||||
"contactPhone": "+98 084 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "ilam_nobat",
|
||||
"telegram": "ilam_nobat",
|
||||
"whatsapp": "989120000005"
|
||||
},
|
||||
"footerDescription": "ایلام نوبت، سامانه جامع نوبتدهی پزشکی در استان ایلام. رزرو نوبت از پزشکان و مراکز درمانی ایلام بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به ایلام نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "107",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "7",
|
||||
"name": "بوشهر",
|
||||
"site_name": "بوشهر نوبت",
|
||||
"slogan": "نوبتدهی هوشمند پزشکی بوشهر، در هر ساعت از شبانهروز",
|
||||
"domain": "bushehr-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در بوشهر | نوبتدهی آنلاین بوشهر | بوشهر نوبت",
|
||||
"description": "بوشهر نوبت، پلتفرم جامع نوبتدهی پزشکی استان بوشهر. دسترسی به پزشکان متخصص و مراکز پاراکلینیکی. با بوشهر نوبت، مدیریت زمان و کاهش هزینههای درمان آسان است.",
|
||||
"keywords": "نوبت پزشک بوشهر, کلینیکهای استان بوشهر, پزشکان جنوب کشور, مراکز تشخیصی بوشهر, خدمات پزشکی بوشهر",
|
||||
"contactPhone": "+98 077 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "bushehr_nobat",
|
||||
"telegram": "bushehr_nobat",
|
||||
"whatsapp": "989120000006"
|
||||
},
|
||||
"footerDescription": "بوشهر نوبت، سامانه تخصصی نوبتدهی پزشکی در استان بوشهر. رزرو نوبت از پزشکان و مراکز درمانی بوشهر بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به بوشهر نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "108",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "8",
|
||||
"name": "تهران",
|
||||
"site_name": "تهران نوبت",
|
||||
"slogan": "دسترسی به هزاران پزشک تهران، با یک سامانه هوشمند",
|
||||
"domain": "tehran-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در تهران | نوبتدهی آنلاین تهران | تهران نوبت",
|
||||
"description": "تهران نوبت، بزرگترین سامانه نوبتدهی پزشکی پایتخت. پوشش هزاران پزشک و بیمارستان با جستجوی پیشرفته. تهران نوبت امکان مشاهده نظرات بیماران و رزرو آنلاین را فراهم میکند.",
|
||||
"keywords": "پزشکان متخصص تهران, کلینیکهای پایتخت, بیمارستانهای تهران, نوبتگیری آنلاین پزشکی تهران, فوق تخصصهای تهران",
|
||||
"contactPhone": "+98 021 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "tehran_nobat",
|
||||
"telegram": "tehran_nobat",
|
||||
"whatsapp": "989120000007"
|
||||
},
|
||||
"footerDescription": "تهران نوبت، سامانه جامع نوبتدهی پزشکی در پایتخت. رزرو نوبت از پزشکان و مراکز درمانی تهران بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به تهران نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "109",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "9",
|
||||
"name": "شهرکرد",
|
||||
"site_name": "شهرکرد نوبت",
|
||||
"slogan": "صفهای طولانی نوبت در شهرکرد را فراموش کنید",
|
||||
"domain": "shkord-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در شهرکرد | نوبتدهی آنلاین شهرکرد | شهرکرد نوبت",
|
||||
"description": "شهرکرد نوبت، سامانه جامع نوبتدهی پزشکی در چهارمحال و بختیاری. حذف صفهای طولانی با رزرو آنلاین. با شهرکرد نوبت، دسترسی به پزشکان در کوتاهترین زمان ممکن.",
|
||||
"keywords": "پزشکان شهرکرد, درمانگاههای چهارمحال و بختیاری, متخصصین شهرکرد, کلینیکهای شهرکرد, خدمات درمانی بام ایران",
|
||||
"contactPhone": "+98 038 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "shahrekord_nobat",
|
||||
"telegram": "shahrekord_nobat",
|
||||
"whatsapp": "989120000008"
|
||||
},
|
||||
"footerDescription": "شهرکرد نوبت، سامانه تخصصی نوبتدهی پزشکی در استان چهارمحال و بختیاری. رزرو نوبت از پزشکان و مراکز درمانی شهرکرد بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به شهرکرد نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "110",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "10",
|
||||
"name": "بیرجند",
|
||||
"site_name": "بیرجند نوبت",
|
||||
"slogan": "نوبتدهی پزشکی بیرجند، در کمترین زمان ممکن",
|
||||
"domain": "birjand-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در بیرجند | نوبتدهی آنلاین بیرجند | بیرجند نوبت",
|
||||
"description": "بیرجند نوبت، سامانه هوشمند نوبتدهی پزشکی در خراسان جنوبی. پوشش مراکز درمانی و پزشکان متخصص. با بیرجند نوبت، با چند کلیک ساده در هر ساعت نوبت خود را رزرو کنید.",
|
||||
"keywords": "پزشکان بیرجند, مراکز درمانی خراسان جنوبی, کلینیکهای بیرجند, متخصصین بیرجند, نوبتدهی آنلاین خراسان جنوبی",
|
||||
"contactPhone": "+98 056 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "birjand_nobat",
|
||||
"telegram": "birjand_nobat",
|
||||
"whatsapp": "989120000009"
|
||||
},
|
||||
"footerDescription": "بیرجند نوبت، سامانه جامع نوبتدهی پزشکی در استان خراسان جنوبی. رزرو نوبت از پزشکان و مراکز درمانی بیرجند بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به بیرجند نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "111",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "11",
|
||||
"name": "مشهد",
|
||||
"site_name": "مشهد نوبت",
|
||||
"slogan": "خداحافظی با صفهای نوبت پزشکی در مشهد",
|
||||
"domain": "mashhad-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در مشهد | نوبتدهی آنلاین مشهد | مشهد نوبت",
|
||||
"description": "مشهد نوبت، پیشرفتهترین سامانه رزرو نوبت پزشکی در مشهد مقدس. امکان مشاهده سوابق پزشکان و نظرات بیماران. مشهد نوبت تمامی مراکز درمانی شهر را پوشش میدهد.",
|
||||
"keywords": "پزشکان مشهد مقدس, بیمارستانهای مشهد, کلینیکهای خراسان رضوی, متخصصین مشهد, فوق تخصصهای مشهد",
|
||||
"contactPhone": "+98 051 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "mashhad_nobat",
|
||||
"telegram": "mashhad_nobat",
|
||||
"whatsapp": "989120000010"
|
||||
},
|
||||
"footerDescription": "مشهد نوبت، سامانه جامع نوبتدهی پزشکی در استان خراسان رضوی. رزرو نوبت از پزشکان و مراکز درمانی مشهد بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به مشهد نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "112",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "12",
|
||||
"name": "بجنورد",
|
||||
"site_name": "بجنورد نوبت",
|
||||
"slogan": "نوبت پزشک در بجنورد، تنها با چند کلیک",
|
||||
"domain": "bojnord-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در بجنورد | نوبتدهی آنلاین بجنورد | بجنورد نوبت",
|
||||
"description": "بجنورد نوبت، ارائهدهنده خدمات نوبتدهی آنلاین به پزشکان و مراکز درمانی خراسان شمالی. بجنورد نوبت به شما در صرفهجویی وقت و هزینه با سیستم رزرو هوشمند کمک میکند.",
|
||||
"keywords": "دکترهای بجنورد, مطبهای خراسان شمالی, کلینیکهای بجنورد, خدمات درمانی بجنورد, پزشکان متخصص خراسان شمالی",
|
||||
"contactPhone": "+98 058 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "bojnord_nobat",
|
||||
"telegram": "bojnord_nobat",
|
||||
"whatsapp": "989120000011"
|
||||
},
|
||||
"footerDescription": "بجنورد نوبت، سامانه جامع نوبتدهی پزشکی در استان خراسان شمالی. رزرو نوبت از پزشکان و مراکز درمانی بجنورد بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به بجنورد نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "113",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "13",
|
||||
"name": "اهواز",
|
||||
"site_name": "اهواز نوبت",
|
||||
"slogan": "سامانه هوشمند نوبتدهی پزشکان اهواز",
|
||||
"domain": "ahvaz-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در اهواز | نوبتدهی آنلاین اهواز | اهواز نوبت",
|
||||
"description": "اهواز نوبت، سامانه نوبتدهی آنلاین در اهواز و استان خوزستان. امکان جستجو و رزرو نوبت در مراکز درمانی. اهواز نوبت بهترین راه دسترسی به پزشکان متخصص است.",
|
||||
"keywords": "رزرو نوبت اهواز, پزشکان خوزستان, کلینیکهای اهواز, بیمارستانهای اهواز, متخصصین پزشکی اهواز",
|
||||
"contactPhone": "+98 061 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "ahvaz_nobat",
|
||||
"telegram": "ahvaz_nobat",
|
||||
"whatsapp": "989120000012"
|
||||
},
|
||||
"footerDescription": "اهواز نوبت، سامانه جامع نوبتدهی پزشکی در استان خوزستان. رزرو نوبت از پزشکان و مراکز درمانی اهواز بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به اهواز نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "114",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "14",
|
||||
"name": "زنجان",
|
||||
"site_name": "زنجان نوبت",
|
||||
"slogan": "نوبتگیری آنلاین از پزشکان زنجان، در هر ساعتی از روز",
|
||||
"domain": "zanjan-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در زنجان | نوبتدهی آنلاین زنجان | زنجان نوبت",
|
||||
"description": "زنجان نوبت، اولین سامانه تخصصی رزرو آنلاین نوبت پزشکی در استان زنجان. دسترسی سریع به پزشکان. با زنجان نوبت، انتخاب آگاهانه با مشاهده سوابق و نظرات بیماران.",
|
||||
"keywords": "نوبت پزشک زنجان, درمانگاههای زنجان, متخصصین استان زنجان, کلینیکهای زنجان, مراکز پزشکی زنجان",
|
||||
"contactPhone": "+98 024 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "zanjan_nobat",
|
||||
"telegram": "zanjan_nobat",
|
||||
"whatsapp": "989120000013"
|
||||
},
|
||||
"footerDescription": "زنجان نوبت، سامانه جامع نوبتدهی پزشکی در استان زنجان. رزرو نوبت از پزشکان و مراکز درمانی زنجان بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به زنجان نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "115",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "15",
|
||||
"name": "سمنان",
|
||||
"site_name": "سمنان نوبت",
|
||||
"slogan": "رزرو آنلاین پزشکان سمنان، بدون محدودیت زمانی",
|
||||
"domain": "semnan-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در سمنان | نوبتدهی آنلاین سمنان | سمنان نوبت",
|
||||
"description": "سمنان نوبت، جامعترین مرجع نوبتدهی آنلاین پزشکی در استان سمنان. با سمنان نوبت خدمات رزرو آنلاین برای مراکز درمانی و پزشکان متخصص را در کمترین زمان دریافت کنید.",
|
||||
"keywords": "پزشکان سمنان, مراکز درمانی سمنان, رزرو نوبت آنلاین سمنان, متخصصین استان سمنان, کلینیکهای سمنان",
|
||||
"contactPhone": "+98 023 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "semnan_nobat",
|
||||
"telegram": "semnan_nobat",
|
||||
"whatsapp": "989120000014"
|
||||
},
|
||||
"footerDescription": "سمنان نوبت، سامانه جامع نوبتدهی پزشکی در استان سمنان. رزرو نوبت از پزشکان و مراکز درمانی سمنان بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به سمنان نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "116",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "16",
|
||||
"name": "زاهدان",
|
||||
"site_name": "زاهدان نوبت",
|
||||
"slogan": "نوبتدهی پزشکی زاهدان، سریع و مطمئن",
|
||||
"domain": "zahedan-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در زاهدان | نوبتدهی آنلاین زاهدان | زاهدان نوبت",
|
||||
"description": "زاهدان نوبت، سامانه ویژه نوبتدهی پزشکی در سیستان و بلوچستان. پوشش پزشکان عمومی، متخصص و فوقتخصص. با زاهدان نوبت، رزرو آنلاین از مراکز معتبر درمانی استان.",
|
||||
"keywords": "نوبت پزشکان زاهدان, مراکز درمانی سیستان و بلوچستان, متخصصین زاهدان, کلینیکهای زاهدان, خدمات پزشکی زاهدان",
|
||||
"contactPhone": "+98 054 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "zahedan_nobat",
|
||||
"telegram": "zahedan_nobat",
|
||||
"whatsapp": "989120000015"
|
||||
},
|
||||
"footerDescription": "زاهدان نوبت، سامانه جامع نوبتدهی پزشکی در استان سیستان و بلوچستان. رزرو نوبت از پزشکان و مراکز درمانی زاهدان بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به زاهدان نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "117",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "17",
|
||||
"name": "شیراز",
|
||||
"site_name": "شیراز نوبت",
|
||||
"slogan": "نوبتدهی آنلاین پزشکان شیراز، در کمترین زمان",
|
||||
"domain": "shiraz-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در شیراز | نوبتدهی آنلاین شیراز | شیراز نوبت",
|
||||
"description": "شیراز نوبت، سامانه پیشرفته رزرو آنلاین نوبت پزشکی در شیراز. دسترسی به پزشکان برتر و مراکز درمانی فارس. شیراز نوبت امکان جستجو براساس تخصص و منطقه را فراهم میکند.",
|
||||
"keywords": "پزشکان شیراز, بیمارستانهای شیراز, مراکز درمانی فارس, مطبهای شیراز, متخصصین شهر شیراز",
|
||||
"contactPhone": "+98 071 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "shiraz_nobat",
|
||||
"telegram": "shiraz_nobat",
|
||||
"whatsapp": "989120000016"
|
||||
},
|
||||
"footerDescription": "شیراز نوبت، سامانه جامع نوبتدهی پزشکی در استان فارس. رزرو نوبت از پزشکان و مراکز درمانی شیراز بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به شیراز نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "118",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "18",
|
||||
"name": "قزوین",
|
||||
"site_name": "قزوین نوبت",
|
||||
"slogan": "نوبتگیری از پزشکان قزوین، بدون نیاز به حضور فیزیکی",
|
||||
"domain": "qazvin-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در قزوین | نوبتدهی آنلاین قزوین | قزوین نوبت",
|
||||
"description": "قزوین نوبت، اولین سامانه هوشمند نوبتدهی پزشکی در استان قزوین. رزرو آنلاین نوبت از پزشکان و مراکز پاراکلینیکی. با قزوین نوبت، مدیریت نوبتها از طریق پنل کاربری.",
|
||||
"keywords": "نوبت پزشک قزوین, مراکز درمانی استان قزوین, متخصصین قزوین, کلینیکهای قزوین, خدمات پزشکی قزوین",
|
||||
"contactPhone": "+98 028 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "qazvin_nobat",
|
||||
"telegram": "qazvin_nobat",
|
||||
"whatsapp": "989120000017"
|
||||
},
|
||||
"footerDescription": "قزوین نوبت، سامانه جامع نوبتدهی پزشکی در استان قزوین. رزرو نوبت از پزشکان و مراکز درمانی قزوین بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به قزوین نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "119",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "19",
|
||||
"name": "قم",
|
||||
"site_name": "قم نوبت",
|
||||
"slogan": "سامانه جامع نوبتدهی پزشکی قم، در خدمت سلامت شما",
|
||||
"domain": "qom-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در قم | نوبتدهی آنلاین قم | قم نوبت",
|
||||
"description": "قم نوبت، سامانه اختصاصی نوبتدهی پزشکی قم با پشتیبانی ۲۴ ساعته. دسترسی به پزشکان و مراکز درمانی شهر قم. قم نوبت امکان مشاهده تخصصها و هزینهها را فراهم میکند.",
|
||||
"keywords": "پزشکان قم, بیمارستانهای قم, مراکز تشخیصی قم, متخصصین شهر قم, کلینیکهای درمانی قم",
|
||||
"contactPhone": "+98 025 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "qom_nobat",
|
||||
"telegram": "qom_nobat",
|
||||
"whatsapp": "989120000018"
|
||||
},
|
||||
"footerDescription": "قم نوبت، سامانه جامع نوبتدهی پزشکی در استان قم. رزرو نوبت از پزشکان و مراکز درمانی قم بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به قم نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "120",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "20",
|
||||
"name": "سنندج",
|
||||
"site_name": "سنندج نوبت",
|
||||
"slogan": "نوبتدهی آنلاین پزشکان سنندج، ساده و کاربردی",
|
||||
"domain": "sanandaj-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در سنندج | نوبتدهی آنلاین سنندج | سنندج نوبت",
|
||||
"description": "سنندج نوبت، سامانه تخصصی نوبتدهی پزشکی استان کردستان. رزرو آنلاین نوبت از مراکز بهداشتی و پزشکان. سنندج نوبت به کاهش هزینههای درمان با مدیریت زمان کمک میکند.",
|
||||
"keywords": "نوبت پزشک سنندج, مراکز درمانی کردستان, متخصصان سنندج, کلینیکهای سنندج, پزشکان عمومی سنندج",
|
||||
"contactPhone": "+98 087 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "sanandaj_nobat",
|
||||
"telegram": "sanandaj_nobat",
|
||||
"whatsapp": "989120000019"
|
||||
},
|
||||
"footerDescription": "سنندج نوبت، سامانه جامع نوبتدهی پزشکی در استان کردستان. رزرو نوبت از پزشکان و مراکز درمانی سنندج بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به سنندج نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "121",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "21",
|
||||
"name": "کرمان",
|
||||
"site_name": "کرمان نوبت",
|
||||
"slogan": "نوبتدهی پزشکی کرمان، در خدمت سلامت شما",
|
||||
"domain": "kerman-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در کرمان | نوبتدهی آنلاین کرمان | کرمان نوبت",
|
||||
"description": "کرمان نوبت، سیستم جامع نوبتدهی آنلاین پزشکی در استان کرمان. پوشش گسترده پزشکان و مراکز تخصصی. کرمان نوبت امکان رزرو براساس نزدیکترین زمان و مکان را فراهم میکند.",
|
||||
"keywords": "رزرو نوبت کرمان, پزشکان استان کرمان, کلینیکهای کرمان, متخصصین کرمان, مراکز درمانی کرمان",
|
||||
"contactPhone": "+98 034 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "kerman_nobat",
|
||||
"telegram": "kerman_nobat",
|
||||
"whatsapp": "989120000020"
|
||||
},
|
||||
"footerDescription": "کرمان نوبت، سامانه جامع نوبتدهی پزشکی در استان کرمان. رزرو نوبت از پزشکان و مراکز درمانی کرمان بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به کرمان نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "122",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "22",
|
||||
"name": "کرمانشاه",
|
||||
"site_name": "کرمانشاه نوبت",
|
||||
"slogan": "رزرو آنلاین نوبت پزشکان کرمانشاه، ۲۴ ساعته",
|
||||
"domain": "kermanshah-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در کرمانشاه | نوبتدهی آنلاین کرمانشاه | کرمانشاه نوبت",
|
||||
"description": "کرمانشاه نوبت، سامانه هوشمند نوبتدهی پزشکی با پوشش مراکز درمانی کرمانشاه. کرمانشاه نوبت امکان رزرو آنلاین از پزشکان متخصص و بیمارستانها در هر ساعت را فراهم میکند.",
|
||||
"keywords": "پزشکان کرمانشاه, نوبتدهی درمانی کرمانشاه, مطبهای کرمانشاه, کلینیکهای غرب کشور, بیمارستانهای کرمانشاه",
|
||||
"contactPhone": "+98 083 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "kermanshah_nobat",
|
||||
"telegram": "kermanshah_nobat",
|
||||
"whatsapp": "989120000021"
|
||||
},
|
||||
"footerDescription": "کرمانشاه نوبت، سامانه جامع نوبتدهی پزشکی در استان کرمانشاه. رزرو نوبت از پزشکان و مراکز درمانی کرمانشاه بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به کرمانشاه نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "123",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "23",
|
||||
"name": "یاسوج",
|
||||
"site_name": "یاسوج نوبت",
|
||||
"slogan": "نوبتدهی پزشکان یاسوج، بدون اتلاف وقت و هزینه",
|
||||
"domain": "yasuj-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در یاسوج | نوبتدهی آنلاین یاسوج | یاسوج نوبت",
|
||||
"description": "یاسوج نوبت، سامانه نوبتدهی آنلاین پزشکی در کهگیلویه و بویراحمد. دسترسی به پزشکان متخصص و مراکز درمانی. یاسوج نوبت باعث کاهش اتلاف وقت و هزینه میشود.",
|
||||
"keywords": "نوبت پزشک یاسوج, مراکز درمانی کهگیلویه و بویراحمد, متخصصین یاسوج, کلینیکهای یاسوج, درمانگاههای یاسوج",
|
||||
"contactPhone": "+98 074 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "yasuj_nobat",
|
||||
"telegram": "yasuj_nobat",
|
||||
"whatsapp": "989120000022"
|
||||
},
|
||||
"footerDescription": "یاسوج نوبت، سامانه جامع نوبتدهی پزشکی در استان کهگیلویه و بویراحمد. رزرو نوبت از پزشکان و مراکز درمانی یاسوج بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به یاسوج نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "124",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "23",
|
||||
"name": "گچساران",
|
||||
"site_name": "یاسوج نوبت",
|
||||
"slogan": "نوبتدهی پزشکان یاسوج، بدون اتلاف وقت و هزینه",
|
||||
"domain": "yasuj-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در یاسوج | نوبتدهی آنلاین یاسوج | یاسوج نوبت",
|
||||
"description": "یاسوج نوبت، سامانه نوبتدهی آنلاین پزشکی در کهگیلویه و بویراحمد. دسترسی به پزشکان متخصص و مراکز درمانی. یاسوج نوبت باعث کاهش اتلاف وقت و هزینه میشود.",
|
||||
"keywords": "نوبت پزشک یاسوج, مراکز درمانی کهگیلویه و بویراحمد, متخصصین یاسوج, کلینیکهای یاسوج, درمانگاههای یاسوج",
|
||||
"contactPhone": "+98 074 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "yasuj_nobat",
|
||||
"telegram": "yasuj_nobat",
|
||||
"whatsapp": "989120000022"
|
||||
},
|
||||
"footerDescription": "یاسوج نوبت، سامانه جامع نوبتدهی پزشکی در استان کهگیلویه و بویراحمد. رزرو نوبت از پزشکان و مراکز درمانی یاسوج بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به یاسوج نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "125",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "24",
|
||||
"name": "گرگان",
|
||||
"site_name": "گرگان نوبت",
|
||||
"slogan": "نوبتدهی آنلاین پزشکی گرگان، ساده و سریع",
|
||||
"domain": "golestan-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در گرگان | نوبتدهی آنلاین گرگان | گرگان نوبت",
|
||||
"description": "گرگان نوبت، پیشرفتهترین سامانه رزرو آنلاین نوبت پزشکی گلستان. خدمات نوبتدهی به تمامی مراکز درمانی و پزشکان. با گرگان نوبت، رزرو سریع با چند کلیک ساده.",
|
||||
"keywords": "پزشکان گرگان, خدمات درمانی گلستان, مطبهای گرگان, کلینیکهای گرگان, متخصصین استان گلستان",
|
||||
"contactPhone": "+98 017 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "gorgan_nobat",
|
||||
"telegram": "gorgan_nobat",
|
||||
"whatsapp": "989120000023"
|
||||
},
|
||||
"footerDescription": "گرگان نوبت، سامانه جامع نوبتدهی پزشکی در استان گلستان. رزرو نوبت از پزشکان و مراکز درمانی گرگان بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به گرگان نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "126",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "25",
|
||||
"name": "رشت",
|
||||
"site_name": "رشت نوبت",
|
||||
"slogan": "سامانه هوشمند نوبت پزشکی در رشت",
|
||||
"domain": "rasht-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در رشت | نوبتدهی آنلاین رشت | رشت نوبت",
|
||||
"description": "رشت نوبت، سامانه تخصصی نوبتدهی پزشکی استان گیلان. دسترسی به پزشکان و مراکز تشخیصی استان. رشت نوبت امکان رزرو از پزشکان معتبر با مرور سوابق را فراهم میکند.",
|
||||
"keywords": "نوبت پزشک رشت, مراکز درمانی گیلان, متخصصین رشت, کلینیکهای رشت, بیمارستانهای گیلان",
|
||||
"contactPhone": "+98 013 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "rasht_nobat",
|
||||
"telegram": "rasht_nobat",
|
||||
"whatsapp": "989120000024"
|
||||
},
|
||||
"footerDescription": "رشت نوبت، سامانه جامع نوبتدهی پزشکی در استان گیلان. رزرو نوبت از پزشکان و مراکز درمانی رشت بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به رشت نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "127",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "26",
|
||||
"name": "خرمآباد",
|
||||
"site_name": "خرمآباد نوبت",
|
||||
"slogan": "نوبتدهی آنلاین پزشکان خرمآباد، با چند کلیک ساده",
|
||||
"domain": "lorestan-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در خرمآباد | نوبتدهی آنلاین خرمآباد | خرمآباد نوبت",
|
||||
"description": "خرمآباد نوبت، سامانه نوبتدهی آنلاین پزشکی در لرستان. ارائه خدمات به مراکز درمانی و پزشکان استان. خرمآباد نوبت امکان جستجو براساس تخصص و بیمه را فراهم میکند.",
|
||||
"keywords": "پزشکان خرمآباد, مراکز درمانی لرستان, کلینیکهای خرمآباد, متخصصین لرستان, خدمات پزشکی خرمآباد",
|
||||
"contactPhone": "+98 066 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "khorramabad_nobat",
|
||||
"telegram": "khorramabad_nobat",
|
||||
"whatsapp": "989120000025"
|
||||
},
|
||||
"footerDescription": "خرمآباد نوبت، سامانه جامع نوبتدهی پزشکی در استان لرستان. رزرو نوبت از پزشکان و مراکز درمانی خرمآباد بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به خرمآباد نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "128",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "27",
|
||||
"name": "ساری",
|
||||
"site_name": "ساری نوبت",
|
||||
"slogan": "نوبت پزشکی در ساری، بدون اتلاف وقت",
|
||||
"domain": "sari-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در ساری | نوبتدهی آنلاین ساری | ساری نوبت",
|
||||
"description": "ساری نوبت، سامانه جامع نوبتدهی پزشکی استان مازندران. پوشش مراکز درمانی و پزشکان متخصص. ساری نوبت امکان رزرو در هر ساعت بدون نیاز به تماس تلفنی را فراهم میکند.",
|
||||
"keywords": "نوبت پزشک ساری, مراکز درمانی مازندران, متخصصین ساری, کلینیکهای شمال ایران, پزشکان استان مازندران",
|
||||
"contactPhone": "+98 011 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "sari_nobat",
|
||||
"telegram": "sari_nobat",
|
||||
"whatsapp": "989120000026"
|
||||
},
|
||||
"footerDescription": "ساری نوبت، سامانه جامع نوبتدهی پزشکی در استان مازندران. رزرو نوبت از پزشکان و مراکز درمانی ساری بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به ساری نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "129",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "28",
|
||||
"name": "اراک",
|
||||
"site_name": "اراک نوبت",
|
||||
"slogan": "رزرو آنلاین نوبت پزشکان اراک، ۲۴ ساعته",
|
||||
"domain": "arak-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در اراک | نوبتدهی آنلاین اراک | اراک نوبت",
|
||||
"description": "اراک نوبت، سامانه هوشمند نوبتدهی پزشکی استان مرکزی. دسترسی به پزشکان و بیمارستانها. اراک نوبت امکان فیلتر براساس تخصص، منطقه و بیمه پذیرفته شده را فراهم میکند.",
|
||||
"keywords": "پزشکان اراک, مراکز درمانی مرکزی, متخصصین اراک, کلینیکهای اراک, بیمارستانهای استان مرکزی",
|
||||
"contactPhone": "+98 086 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "arak_nobat",
|
||||
"telegram": "arak_nobat",
|
||||
"whatsapp": "989120000027"
|
||||
},
|
||||
"footerDescription": "اراک نوبت، سامانه جامع نوبتدهی پزشکی در استان مرکزی. رزرو نوبت از پزشکان و مراکز درمانی اراک بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به اراک نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "130",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "29",
|
||||
"name": "بندرعباس",
|
||||
"site_name": "بندرعباس نوبت",
|
||||
"slogan": "سیستم جامع نوبتگیری پزشکی بندرعباس",
|
||||
"domain": "bandar-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در بندرعباس | نوبتدهی آنلاین بندرعباس | بندرعباس نوبت",
|
||||
"description": "بندرعباس نوبت، اولین سامانه نوبتدهی آنلاین پزشکی هرمزگان. دسترسی به پزشکان و مراکز تشخیصی. با بندرعباس نوبت رزرو نوبت با کمترین زمان انتظار امکانپذیر است.",
|
||||
"keywords": "نوبت پزشک بندرعباس, مراکز درمانی هرمزگان, متخصصین بندرعباس, کلینیکهای جنوب ایران, پزشکان هرمزگان",
|
||||
"contactPhone": "+98 076 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "bandarabbas_nobat",
|
||||
"telegram": "bandarabbas_nobat",
|
||||
"whatsapp": "989120000028"
|
||||
},
|
||||
"footerDescription": "بندرعباس نوبت، سامانه جامع نوبتدهی پزشکی در استان هرمزگان. رزرو نوبت از پزشکان و مراکز درمانی بندرعباس بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به بندرعباس نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "131",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "30",
|
||||
"name": "همدان",
|
||||
"site_name": "همدان نوبت",
|
||||
"slogan": "نوبتدهی پزشکی همدان، آسان و سریع",
|
||||
"domain": "hamadan-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در همدان | نوبتدهی آنلاین همدان | همدان نوبت",
|
||||
"description": "همدان نوبت، سامانه پیشرفته نوبتدهی پزشکی در استان همدان. پوشش پزشکان و مراکز درمانی استان. همدان نوبت امکان جستجو براساس تخصص و محله را فراهم میکند.",
|
||||
"keywords": "پزشکان همدان, نوبتدهی متخصصین همدان, کلینیکهای استان همدان, مراکز درمانی همدان, بیمارستانهای همدان",
|
||||
"contactPhone": "+98 081 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "hamedan_nobat",
|
||||
"telegram": "hamedan_nobat",
|
||||
"whatsapp": "989120000029"
|
||||
},
|
||||
"footerDescription": "همدان نوبت، سامانه جامع نوبتدهی پزشکی در استان همدان. رزرو نوبت از پزشکان و مراکز درمانی همدان بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به همدان نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "132",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"province_id": "100",
|
||||
"name": "یزد",
|
||||
"site_name": "یزد نوبت",
|
||||
"slogan": "نوبتگیری آنلاین پزشکان یزد، در هر ساعت از روز",
|
||||
"domain": "yazd-nobat.ir",
|
||||
"title": "رزرو نوبت پزشکی در یزد | نوبتدهی آنلاین یزد | یزد نوبت",
|
||||
"description": "یزد نوبت، کاملترین سامانه نوبتدهی آنلاین پزشکی در استان یزد. دسترسی به پزشکان و مراکز پاراکلینیکی. یزد نوبت امکان رزرو با کمترین زمان انتظار را فراهم میکند.",
|
||||
"keywords": "نوبت پزشک یزد, مراکز درمانی استان یزد, متخصصین یزد, کلینیکهای یزد, خدمات پزشکی شهر جهانی یزد",
|
||||
"contactPhone": "+98 035 33333333",
|
||||
"socialMedia": {
|
||||
"instagram": "yazd_nobat",
|
||||
"telegram": "yazd_nobat",
|
||||
"whatsapp": "989120000030"
|
||||
},
|
||||
"footerDescription": "یزد نوبت، سامانه جامع نوبتدهی پزشکی در استان یزد. رزرو نوبت از پزشکان و مراکز درمانی یزد بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به یزد نوبت میباشد."
|
||||
},
|
||||
{
|
||||
"id": "600",
|
||||
"email": "nobat724@gmail.com",
|
||||
"type": "2",
|
||||
"name": "نوبت 724",
|
||||
"site_name": "نوبت 724",
|
||||
"slogan": "دیگه نوبت گرفتن کار سختی نیست !",
|
||||
"domain": "nobat724.com",
|
||||
"title": "رزرو نوبت پزشکی | نوبتدهی آنلاین | نوبت 724",
|
||||
"description": "نوبت 724 - سیستم آنلاین نوبتدهی برای پزشکان و کلینیکها. با استفاده از نوبت 724، به راحتی نوبت پزشکی خود را به صورت آنلاین رزرو کنید و از خدمات سریع و کارآمد ما بهرهمند شوید",
|
||||
"keywords": "نوبت 724, نوبت دهی, رزرو نوبت, پزشک, پزشکی, کلینیک, بیمارستان, نوبت آنلاین, سیستم نوبت دهی, سیستم نوبت دهی آنلاین, سیستم نوبت دهی پزشکی, سیستم نوبت دهی کلینیک, سیستم نوبت دهی بیمارستان, سیستم نوبت دهی آنلاین پزشکی, سیستم نوبت دهی آنلاین کلینیک, سیستم نوبت دهی آنلاین بیمارستان",
|
||||
"contactPhone": "+98 021 724724724",
|
||||
"socialMedia": {
|
||||
"instagram": "nobat724",
|
||||
"telegram": "nobat724",
|
||||
"whatsapp": "989120000031"
|
||||
},
|
||||
"footerDescription": "نوبت 724، سامانه جامع نوبتدهی پزشکی برای تمامی شهرها. رزرو نوبت از پزشکان و مراکز درمانی معتبر بدون نیاز به مراجعه حضوری.",
|
||||
"footerDisclaimer": "تمامی حقوق این سایت متعلق به نوبت 724 میباشد."
|
||||
}
|
||||
]
|
||||
File diff suppressed because it is too large
Load Diff
-114
@@ -1,114 +0,0 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
try {
|
||||
$pdo = new PDO('mysql:host=db;dbname=db;charset=utf8mb4', 'db', 'db');
|
||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
|
||||
$base = '/var/www/html/data';
|
||||
|
||||
$pdo->exec('SET FOREIGN_KEY_CHECKS = 0');
|
||||
$pdo->exec('SET NAMES utf8mb4');
|
||||
|
||||
// ── Clear dependent pivot tables ──────────────────────────────────────────
|
||||
foreach (['doctor_provinces', 'doctor_cities', 'doctor_specialties', 'doctor_expertise', 'clinic_specialties', 'clinic_services', 'clinic_insurances'] as $t) {
|
||||
$pdo->exec("TRUNCATE TABLE `$t`");
|
||||
echo "Truncated $t\n";
|
||||
}
|
||||
|
||||
// Clear location FKs on clinics
|
||||
$pdo->exec('UPDATE clinics SET province_id = NULL, city_id = NULL');
|
||||
|
||||
// ── Clear main tables ─────────────────────────────────────────────────────
|
||||
foreach (['doctor_services', 'specialties', 'cities', 'provinces'] as $t) {
|
||||
$pdo->exec("DELETE FROM `$t`");
|
||||
echo "Cleared $t\n";
|
||||
}
|
||||
|
||||
// ── 1. Provinces ──────────────────────────────────────────────────────────
|
||||
$states = json_decode(file_get_contents("$base/state.json"), true);
|
||||
$stmt = $pdo->prepare(
|
||||
'INSERT INTO provinces (id, uuid, name, status, weight) VALUES (?, UUID(), ?, 1, ?)'
|
||||
);
|
||||
foreach ($states as $i => $s) {
|
||||
$stmt->execute([(int)$s['id'], $s['name'], ($i + 1) * 10]);
|
||||
}
|
||||
echo 'Inserted ' . count($states) . " provinces\n";
|
||||
|
||||
// ── 2. Cities ─────────────────────────────────────────────────────────────
|
||||
$cities = json_decode(file_get_contents("$base/city.json"), true);
|
||||
$stmt = $pdo->prepare(
|
||||
'INSERT INTO cities (id, uuid, name, status, weight, province_id, email, slogan, domain,
|
||||
description, keywords, contact_phone, social_media, footer_description)
|
||||
VALUES (?, UUID(), ?, 1, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
|
||||
);
|
||||
foreach ($cities as $c) {
|
||||
$social = isset($c['socialMedia']) ? json_encode($c['socialMedia'], JSON_UNESCAPED_UNICODE) : null;
|
||||
$stmt->execute([
|
||||
(int)$c['id'],
|
||||
$c['name'],
|
||||
isset($c['province_id']) ? (int)$c['province_id'] : null,
|
||||
$c['email'] ?? null,
|
||||
$c['slogan'] ?? null,
|
||||
$c['domain'] ?? null,
|
||||
$c['description'] ?? null,
|
||||
$c['keywords'] ?? null,
|
||||
$c['contactPhone'] ?? null,
|
||||
$social,
|
||||
$c['footerDescription'] ?? null,
|
||||
]);
|
||||
}
|
||||
echo 'Inserted ' . count($cities) . " cities\n";
|
||||
|
||||
// ── 3. Specialties (parents first, then children) ─────────────────────────
|
||||
$specialties = json_decode(file_get_contents("$base/specialties.json"), true);
|
||||
$parents = array_values(array_filter($specialties, fn($s) => $s['parent'] === null));
|
||||
$children = array_values(array_filter($specialties, fn($s) => $s['parent'] !== null));
|
||||
|
||||
$stmt = $pdo->prepare(
|
||||
'INSERT INTO specialties (id, uuid, name, slug, status, weight, parent_id)
|
||||
VALUES (?, UUID(), ?, ?, 1, ?, ?)'
|
||||
);
|
||||
foreach ($parents as $i => $s) {
|
||||
$stmt->execute([(int)$s['id'], $s['name'], $s['slug'], ($i + 1) * 10, null]);
|
||||
}
|
||||
foreach ($children as $i => $s) {
|
||||
$stmt->execute([(int)$s['id'], $s['name'], $s['slug'], ($i + 1) * 10, (int)$s['parent']]);
|
||||
}
|
||||
echo 'Inserted ' . count($specialties) . " specialties (" . count($parents) . " root + " . count($children) . " children)\n";
|
||||
|
||||
// ── 4. Doctor services ────────────────────────────────────────────────────
|
||||
$services = json_decode(file_get_contents("$base/doctor_services.json"), true);
|
||||
$stmt = $pdo->prepare(
|
||||
'INSERT INTO doctor_services (id, uuid, name, slug, status, weight, specialty_id)
|
||||
VALUES (?, UUID(), ?, ?, 1, ?, ?)'
|
||||
);
|
||||
foreach ($services as $i => $s) {
|
||||
$stmt->execute([
|
||||
(int)$s['id'],
|
||||
$s['name'],
|
||||
$s['slug'],
|
||||
($i + 1) * 10,
|
||||
isset($s['specialty_id']) ? (int)$s['specialty_id'] : null,
|
||||
]);
|
||||
}
|
||||
echo 'Inserted ' . count($services) . " doctor_services\n";
|
||||
|
||||
// ── Fix AUTO_INCREMENT ────────────────────────────────────────────────────
|
||||
$pdo->exec('ALTER TABLE provinces AUTO_INCREMENT = 200');
|
||||
$pdo->exec('ALTER TABLE cities AUTO_INCREMENT = 2000');
|
||||
$pdo->exec('ALTER TABLE specialties AUTO_INCREMENT = 500');
|
||||
$pdo->exec('ALTER TABLE doctor_services AUTO_INCREMENT = 30000');
|
||||
|
||||
$pdo->exec('SET FOREIGN_KEY_CHECKS = 1');
|
||||
|
||||
echo "\nDone! Summary:\n";
|
||||
foreach (['provinces', 'cities', 'specialties', 'doctor_services'] as $t) {
|
||||
$cnt = $pdo->query("SELECT COUNT(*) FROM `$t`")->fetchColumn();
|
||||
echo " $t: $cnt rows\n";
|
||||
}
|
||||
|
||||
} catch (Throwable $e) {
|
||||
echo 'ERROR: ' . $e->getMessage() . "\n";
|
||||
exit(1);
|
||||
}
|
||||
-482
@@ -1,482 +0,0 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
$pdo = new PDO('mysql:host=db;dbname=db;charset=utf8mb4', 'db', 'db');
|
||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
$pdo->exec('SET NAMES utf8mb4');
|
||||
$pdo->exec('SET FOREIGN_KEY_CHECKS = 0');
|
||||
|
||||
$now = time();
|
||||
|
||||
// ── Helpers ───────────────────────────────────────────────────────────────────
|
||||
function uuid(): string {
|
||||
return 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));
|
||||
}
|
||||
function rand_item(array $arr) { return $arr[array_rand($arr)]; }
|
||||
function rand_items(array $arr, int $min, int $max): array {
|
||||
$count = rand($min, $max);
|
||||
$keys = (array) array_rand($arr, min($count, count($arr)));
|
||||
return array_map(fn($k) => $arr[$k], $keys);
|
||||
}
|
||||
function mobile(): string {
|
||||
$prefix = rand_item(['0910','0911','0912','0913','0914','0915','0916','0917','0918','0919',
|
||||
'0930','0933','0935','0936','0937','0938','0939','0901','0902','0903',
|
||||
'0920','0921','0922','0991','0992','0993','0994']);
|
||||
return $prefix . str_pad((string)rand(1000000, 9999999), 7, '0', STR_PAD_LEFT);
|
||||
}
|
||||
function nationalCode(): string {
|
||||
return str_pad((string)rand(1000000000, 9999999999), 10, '0', STR_PAD_LEFT);
|
||||
}
|
||||
function medicalCode(): string {
|
||||
return (string)rand(10000000, 99999999);
|
||||
}
|
||||
function passwordHash(): string {
|
||||
return '$2y$13$' . substr(base64_encode(random_bytes(32)), 0, 53);
|
||||
}
|
||||
|
||||
// ── Static data ───────────────────────────────────────────────────────────────
|
||||
$maleNames = ['علی','محمد','حسین','احمد','رضا','مهدی','حسن','اکبر','ابراهیم','کریم',
|
||||
'جواد','امیر','سعید','مجید','فرید','کامران','سیاوش','داریوش','پرویز','شهرام',
|
||||
'بهرام','فرهاد','نادر','مسعود','وحید','یاسر','حامد','سجاد','ایمان','میثم',
|
||||
'آرش','آرمان','آرمین','پدرام','پویا','کیان','سیروس','بابک','فریبرز','هوشنگ'];
|
||||
$femaleNames = ['فاطمه','زهرا','مریم','سارا','نرگس','لیلا','نازنین','مهناز','شیرین','پروین',
|
||||
'ملیحه','الناز','آتنا','باران','ترانه','دلارام','رویا','شادی','گلناز','ماهرخ',
|
||||
'ندا','نیلوفر','هانیه','یاسمن','زینب','حدیثه','سمیه','طاهره','عاطفه','منیژه'];
|
||||
$lastNames = ['احمدی','محمدی','رضایی','حسینی','موسوی','جعفری','کریمی','نوری','صادقی','قاسمی',
|
||||
'عباسی','میرزایی','رحیمی','اکبری','یوسفی','حیدری','طاهری','نصیری','سلیمانی','زارعی',
|
||||
'مرادی','شریفی','منصوری','ذبیحی','تهرانی','اصفهانی','مشهدی','شیرازی','تبریزی','همدانی',
|
||||
'ملکی','درویشی','امیری','نجفی','شاهی','بهرامی','خسروی','گلمحمدی','فدایی','ولیپور',
|
||||
'نظری','فروزان','پورعلی','دهقانی','صالحی','ربیعی','مجیدی','سبحانی','زمانی','بهشتی'];
|
||||
$degrees = ['متخصص','فوق تخصص','دکترای عمومی','فلوشیپ','استادیار','دانشیار','پروفسور'];
|
||||
$genders = ['male','female'];
|
||||
$bios = [
|
||||
'دارای بیش از ۱۵ سال سابقه در حوزه تخصصی خود، عضو انجمن پزشکی ایران.',
|
||||
'فارغالتحصیل دانشگاه علوم پزشکی تهران، دارای تجربه کار در بیمارستانهای معتبر.',
|
||||
'متخصص با سابقه درخشان در درمان بیماران، ارائه خدمات با بالاترین کیفیت.',
|
||||
'عضو هیئت علمی دانشگاه و مشاور پزشکی با بیش از ۱۰ سال تجربه بالینی.',
|
||||
'دارای گواهینامههای تخصصی از مراکز بینالمللی، آشنا با جدیدترین روشهای درمانی.',
|
||||
'پزشک باتجربه با رویکرد جامع در درمان، اعتقاد به طب پیشگیری و توانبخشی.',
|
||||
'متعهد به ارائه بهترین مراقبتهای پزشکی با رعایت اصول اخلاق پزشکی.',
|
||||
'دارای مدرک تخصصی از اروپا، تجربه کار در مراکز درمانی پیشرفته.',
|
||||
];
|
||||
$clinicNames = ['کلینیک تخصصی','مرکز درمانی','بیمارستان','کلینیک جامع','مرکز مشاوره پزشکی',
|
||||
'مطب دکتر','کلینیک ویژه','مرکز پزشکی','درمانگاه','کلینیک سلامت'];
|
||||
$clinicSuffixes = ['امید','نوین','رازی','ابن سینا','سینا','شفا','سلامت','آریا','پارس','ایران','مهر','صبا'];
|
||||
$appointmentStatuses = ['reserved','visited','completed','cancelled_by_user','cancelled_by_doctor','no_show'];
|
||||
$appointmentStatusWeights = [30,25,25,10,5,5]; // percent chance
|
||||
$paymentStatuses = ['paid','pending','failed'];
|
||||
$commentTexts = [
|
||||
'دکتر بسیار خوب و دلسوزی هستند. توضیحات کاملی دادند.',
|
||||
'معاینه دقیق بود و تشخیص درست. ممنونم.',
|
||||
'وقت انتظار کمی داشتم، دکتر سر وقت حاضر بود.',
|
||||
'بسیار متبحر و با حوصله. مشکلم کاملاً حل شد.',
|
||||
'توصیه میکنم. رفتار بسیار حرفهای دارند.',
|
||||
'دکتر خوبی هستند ولی وقت ویزیت کمی کوتاه بود.',
|
||||
'راضی بودم از ویزیت. درمان موثر بود.',
|
||||
'یکی از بهترین دکترهایی که به آنها مراجعه کردهام.',
|
||||
'کمی منتظر ماندم ولی ارزشش را داشت.',
|
||||
'متخصص واقعی در حوزه کارشان. توصیه میکنم.',
|
||||
];
|
||||
$blogTitles = [
|
||||
'راهنمای جامع برای پیشگیری از بیماریهای قلبی',
|
||||
'تغذیه سالم برای کودکان در سنین رشد',
|
||||
'اهمیت چکاپ منظم سالانه',
|
||||
'راهکارهای مقابله با استرس و اضطراب',
|
||||
'علائم هشداردهنده دیابت نوع ۲',
|
||||
'ورزش و تأثیر آن بر سلامت قلب و عروق',
|
||||
'خواب کافی و نقش آن در سلامت جسم و روان',
|
||||
'راهنمای مراقبت از پوست در فصول مختلف',
|
||||
'پیشگیری از پوکی استخوان با تغذیه مناسب',
|
||||
'نکات مهم برای مراقبت از بینایی',
|
||||
'سرطان پستان؛ تشخیص زودهنگام نجاتبخش است',
|
||||
'بهداشت دهان و دندان در کودکان',
|
||||
'فشار خون بالا و روشهای کنترل آن',
|
||||
'نقش واکسیناسیون در پیشگیری از بیماریها',
|
||||
'آرتروز زانو؛ علائم، پیشگیری و درمان',
|
||||
];
|
||||
$blogBodies = [
|
||||
'بیماریهای قلبی از مهمترین علل مرگ در ایران و جهان هستند. با رعایت سبک زندگی سالم، ترک دخانیات و فعالیت بدنی منظم میتوان خطر آن را کاهش داد.',
|
||||
'تغذیه متعادل و سرشار از ویتامینها برای رشد کودکان ضروری است. مصرف میوه، سبزیجات، پروتئین و لبنیات را در برنامه غذایی کودک خود بگنجانید.',
|
||||
'انجام آزمایشهای منظم، بررسی فشار خون، قند خون و چکاپ کلی هر سال توصیه میشود. تشخیص زودهنگام بیماریها درمان را آسانتر میکند.',
|
||||
'مدیریت استرس با تکنیکهای تنفس عمیق، مدیتیشن و فعالیت بدنی امکانپذیر است. در صورت نیاز از مشاور یا روانپزشک کمک بگیرید.',
|
||||
'دیابت نوع ۲ با علائمی مانند تشنگی زیاد، ادرار مکرر و خستگی مزمن همراه است. کنترل وزن و رژیم غذایی مناسب در پیشگیری از آن نقش دارد.',
|
||||
];
|
||||
|
||||
// ── Load existing data ────────────────────────────────────────────────────────
|
||||
$provinces = $pdo->query('SELECT id FROM provinces')->fetchAll(PDO::FETCH_COLUMN);
|
||||
$cities = $pdo->query('SELECT id, province_id FROM cities WHERE id != 600')->fetchAll(PDO::FETCH_ASSOC);
|
||||
$cityIds = array_column($cities, 'id');
|
||||
$specialtyParents = $pdo->query('SELECT id FROM specialties WHERE parent_id IS NULL')->fetchAll(PDO::FETCH_COLUMN);
|
||||
$allSpecialties = $pdo->query('SELECT id FROM specialties')->fetchAll(PDO::FETCH_COLUMN);
|
||||
$allServices = $pdo->query('SELECT id, specialty_id FROM doctor_services')->fetchAll(PDO::FETCH_ASSOC);
|
||||
$serviceIds = array_column($allServices, 'id');
|
||||
|
||||
// Build specialty->services map
|
||||
$specialtyServicesMap = [];
|
||||
foreach ($allServices as $svc) {
|
||||
if ($svc['specialty_id']) {
|
||||
$specialtyServicesMap[$svc['specialty_id']][] = $svc['id'];
|
||||
}
|
||||
}
|
||||
|
||||
$count = 0;
|
||||
|
||||
// ── 1. Insurances ─────────────────────────────────────────────────────────────
|
||||
echo "Inserting insurances...\n";
|
||||
$basicInsurances = [
|
||||
['تأمین اجتماعی','basic'],['خدمات درمانی','basic'],['نیروهای مسلح','basic'],
|
||||
['کمیته امداد','basic'],['بهزیستی','basic'],['روستایی','basic'],
|
||||
];
|
||||
$suppInsurances = [
|
||||
['ایران','supplementary'],['آسیا','supplementary'],['البرز','supplementary'],
|
||||
['پارسیان','supplementary'],['سامان','supplementary'],['میهن','supplementary'],
|
||||
['دانا','supplementary'],['رازی','supplementary'],['کوثر','supplementary'],['معلم','supplementary'],
|
||||
];
|
||||
$insStmt = $pdo->prepare('INSERT IGNORE INTO insurances (uuid,name,type,status) VALUES (?,?,?,1)');
|
||||
$insIds = [];
|
||||
foreach (array_merge($basicInsurances, $suppInsurances) as $ins) {
|
||||
$insStmt->execute([uuid(), $ins[0], $ins[1]]);
|
||||
$insIds[] = $pdo->lastInsertId();
|
||||
$count++;
|
||||
}
|
||||
$insIds = array_filter($insIds); // remove zeros from IGNORE
|
||||
if (empty($insIds)) {
|
||||
$insIds = $pdo->query('SELECT id FROM insurances')->fetchAll(PDO::FETCH_COLUMN);
|
||||
}
|
||||
echo " Insurances: " . count($insIds) . "\n";
|
||||
|
||||
// ── 2. Users (patients) ───────────────────────────────────────────────────────
|
||||
echo "Inserting users (patients)...\n";
|
||||
$usedMobiles = [];
|
||||
$patientIds = [];
|
||||
$uStmt = $pdo->prepare(
|
||||
'INSERT INTO users (uuid,mobile_number,password_hash,email,real_name,roles,status,created_at,updated_at)
|
||||
VALUES (?,?,?,?,?,?,1,?,?)'
|
||||
);
|
||||
for ($i = 0; $i < 200; $i++) {
|
||||
$gender = rand_item($genders);
|
||||
$firstName = $gender === 'male' ? rand_item($maleNames) : rand_item($femaleNames);
|
||||
$lastName = rand_item($lastNames);
|
||||
$name = $firstName . ' ' . $lastName;
|
||||
do { $mobile = mobile(); } while (isset($usedMobiles[$mobile]));
|
||||
$usedMobiles[$mobile] = true;
|
||||
$email = strtolower(rand_item(['user','p','pt','patient'])) . $i . '@example.ir';
|
||||
$ts = $now - rand(86400, 86400 * 365);
|
||||
$uStmt->execute([uuid(), $mobile, passwordHash(), $email, $name, '["ROLE_USER"]', $ts, $ts]);
|
||||
$patientIds[] = (int)$pdo->lastInsertId();
|
||||
$count++;
|
||||
}
|
||||
echo " Patients: " . count($patientIds) . "\n";
|
||||
|
||||
// ── 3. Doctor users ───────────────────────────────────────────────────────────
|
||||
echo "Inserting doctors...\n";
|
||||
$doctorUserIds = [];
|
||||
$doctorIds = [];
|
||||
$duStmt = $pdo->prepare(
|
||||
'INSERT INTO users (uuid,mobile_number,password_hash,email,real_name,roles,status,created_at,updated_at)
|
||||
VALUES (?,?,?,?,?,?,1,?,?)'
|
||||
);
|
||||
$dStmt = $pdo->prepare(
|
||||
'INSERT INTO doctors (uuid,name,gender,medical_system_code,mobile_number,activity_time,degree,info,
|
||||
images,doctor_rate,doctor_rate_percentage,active_doctor_appointment,created_at,updated_at,user_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,1,?,?,?)'
|
||||
);
|
||||
for ($i = 0; $i < 60; $i++) {
|
||||
$gender = $i % 4 === 0 ? 'female' : 'male';
|
||||
$firstName = $gender === 'male' ? rand_item($maleNames) : rand_item($femaleNames);
|
||||
$lastName = rand_item($lastNames);
|
||||
$name = 'دکتر ' . $firstName . ' ' . $lastName;
|
||||
do { $mobile = mobile(); } while (isset($usedMobiles[$mobile]));
|
||||
$usedMobiles[$mobile] = true;
|
||||
$email = 'dr' . $i . '@clinic-pro.ir';
|
||||
$ts = $now - rand(86400 * 30, 86400 * 730);
|
||||
$duStmt->execute([uuid(), $mobile, passwordHash(), $email, $name, '["ROLE_USER","ROLE_DOCTOR"]', $ts, $ts]);
|
||||
$userId = (int)$pdo->lastInsertId();
|
||||
$doctorUserIds[] = $userId;
|
||||
$rate = round(rand(35, 50) / 10, 1);
|
||||
$ratePct = rand(72, 98);
|
||||
$dStmt->execute([
|
||||
uuid(), $name, $gender, medicalCode(), $mobile,
|
||||
rand(5, 25), rand_item($degrees), rand_item($bios),
|
||||
json_encode([]), $rate, $ratePct, $ts, $ts, $userId
|
||||
]);
|
||||
$doctorIds[] = (int)$pdo->lastInsertId();
|
||||
$count += 2;
|
||||
}
|
||||
echo " Doctors: " . count($doctorIds) . "\n";
|
||||
|
||||
// ── 4. Doctor specialties & services ─────────────────────────────────────────
|
||||
echo "Linking doctor specialties/services...\n";
|
||||
$dsStmt = $pdo->prepare('INSERT IGNORE INTO doctor_specialties (doctor_id,specialty_id) VALUES (?,?)');
|
||||
$deStmt = $pdo->prepare('INSERT IGNORE INTO doctor_expertise (doctor_id,service_id) VALUES (?,?)');
|
||||
$dpStmt = $pdo->prepare('INSERT IGNORE INTO doctor_provinces (doctor_id,province_id) VALUES (?,?)');
|
||||
$dcStmt = $pdo->prepare('INSERT IGNORE INTO doctor_cities (doctor_id,city_id) VALUES (?,?)');
|
||||
$daStmt = $pdo->prepare(
|
||||
'INSERT INTO doctor_addresses (uuid,name,address,telephone,latitude,longitude,created_at,updated_at,doctor_id,city_id,province_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?)'
|
||||
);
|
||||
|
||||
$cityProvinceMap = array_column($cities, 'province_id', 'id');
|
||||
$streetNames = ['خیابان ولیعصر','خیابان انقلاب','خیابان آزادی','بلوار کشاورز','خیابان شریعتی',
|
||||
'خیابان مطهری','خیابان فردوسی','خیابان پاسداران','خیابان جمهوری','خیابان امام خمینی'];
|
||||
$buildingDescs = ['ساختمان پزشکان','برج طبی','مجتمع پزشکی','کلینیک ویژه','مطب','مرکز درمانی'];
|
||||
|
||||
foreach ($doctorIds as $idx => $doctorId) {
|
||||
// 1-2 specialties per doctor
|
||||
$numSpec = rand(1, 2);
|
||||
$chosenParents = (array)array_rand(array_flip($specialtyParents), min($numSpec, count($specialtyParents)));
|
||||
foreach ($chosenParents as $specId) {
|
||||
$dsStmt->execute([$doctorId, $specId]);
|
||||
$count++;
|
||||
// Add 2-5 child specialties under same parent if exist
|
||||
$children = array_values(array_filter($allSpecialties, fn($s) => !in_array($s, $specialtyParents)));
|
||||
foreach (array_slice($children, 0, rand(2, 5)) as $cs) {
|
||||
$dsStmt->execute([$doctorId, $cs]);
|
||||
$count++;
|
||||
}
|
||||
// Services for this specialty
|
||||
$svcPool = $specialtyServicesMap[$specId] ?? array_slice($serviceIds, 0, 10);
|
||||
foreach (rand_items($svcPool, 3, 8) as $svcId) {
|
||||
$deStmt->execute([$doctorId, $svcId]);
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
|
||||
// 1-3 cities per doctor
|
||||
$chosenCities = rand_items($cityIds, 1, 3);
|
||||
foreach ($chosenCities as $cityId) {
|
||||
$provId = $cityProvinceMap[$cityId] ?? null;
|
||||
$dcStmt->execute([$doctorId, $cityId]);
|
||||
if ($provId) $dpStmt->execute([$doctorId, $provId]);
|
||||
$count += $provId ? 2 : 1;
|
||||
|
||||
// Doctor address for each city
|
||||
$street = rand_item($streetNames);
|
||||
$building = rand_item($buildingDescs);
|
||||
$no = rand(1, 200);
|
||||
$address = 'تهران، ' . $street . '، پلاک ' . $no . '، ' . $building;
|
||||
$lat = 33.0 + (rand(0, 700) / 100);
|
||||
$lon = 48.0 + (rand(0, 1500) / 100);
|
||||
$tel = '0' . rand_item(['21','511','411','31','71','81','351','44']) . rand(10000000, 99999999);
|
||||
$ts = $now - rand(86400, 86400 * 180);
|
||||
$daStmt->execute([uuid(), 'مطب شماره ' . ($idx+1), $address, $tel, $lat, $lon, $ts, $ts, $doctorId, $cityId, $provId]);
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
|
||||
// ── 5. Clinics ────────────────────────────────────────────────────────────────
|
||||
echo "Inserting clinics...\n";
|
||||
$clinicIds = [];
|
||||
$clStmt = $pdo->prepare(
|
||||
'INSERT INTO clinics (uuid,name,info,address,telephone,is_24_7,working_days,latitude,longitude,
|
||||
city_id,province_id,images_clinic,clinic_logo,created_at,updated_at,user_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'
|
||||
);
|
||||
$clDStmt = $pdo->prepare('INSERT IGNORE INTO clinic_doctors (clinic_id,doctor_id) VALUES (?,?)');
|
||||
$clSpStmt = $pdo->prepare('INSERT IGNORE INTO clinic_specialties (clinic_id,specialty_id) VALUES (?,?)');
|
||||
$clSvStmt = $pdo->prepare('INSERT IGNORE INTO clinic_services (clinic_id,service_id) VALUES (?,?)');
|
||||
$clInStmt = $pdo->prepare('INSERT IGNORE INTO clinic_insurances (clinic_id,insurance_id) VALUES (?,?)');
|
||||
|
||||
$workingDays = ['شنبه تا چهارشنبه ۸ تا ۲۰','شنبه تا پنجشنبه ۸ تا ۱۸','یکشنبه تا پنجشنبه ۹ تا ۱۷',
|
||||
'شنبه تا سهشنبه ۷ تا ۱۹','همه روزه ۸ تا ۲۲','شنبه تا چهارشنبه ۹ تا ۲۰'];
|
||||
|
||||
$shuffledDoctors = $doctorIds;
|
||||
shuffle($shuffledDoctors);
|
||||
|
||||
for ($i = 0; $i < 30; $i++) {
|
||||
$cityRow = rand_item($cities);
|
||||
$cityId = (int)$cityRow['id'];
|
||||
$provId = (int)$cityRow['province_id'];
|
||||
$lat = 33.0 + (rand(0, 700) / 100);
|
||||
$lon = 48.0 + (rand(0, 1500) / 100);
|
||||
$is247 = rand(0, 5) === 0 ? 1 : 0;
|
||||
$name = rand_item($clinicNames) . ' ' . rand_item($clinicSuffixes);
|
||||
$ts = $now - rand(86400 * 30, 86400 * 365);
|
||||
$tel = '0' . rand_item(['21','511','411','31','71','81','351','44']) . rand(10000000, 99999999);
|
||||
$address = rand_item($streetNames) . '، پلاک ' . rand(1,300);
|
||||
$ownerId = $doctorUserIds[array_rand($doctorUserIds)];
|
||||
$clStmt->execute([
|
||||
uuid(), $name, 'ارائه خدمات تخصصی پزشکی با استفاده از جدیدترین تجهیزات.',
|
||||
$address, $tel, $is247, rand_item($workingDays), $lat, $lon,
|
||||
$cityId, $provId, json_encode([]), json_encode([]), $ts, $ts, $ownerId
|
||||
]);
|
||||
$clinicId = (int)$pdo->lastInsertId();
|
||||
$clinicIds[] = $clinicId;
|
||||
$count++;
|
||||
|
||||
// 2-4 doctors per clinic
|
||||
$cDocs = array_splice($shuffledDoctors, 0, rand(2, 4));
|
||||
if (empty($cDocs)) $cDocs = rand_items($doctorIds, 2, 3);
|
||||
foreach ($cDocs as $dId) {
|
||||
$clDStmt->execute([$clinicId, $dId]); $count++;
|
||||
}
|
||||
// 2-4 specialties
|
||||
foreach (rand_items($specialtyParents, 2, 4) as $spId) {
|
||||
$clSpStmt->execute([$clinicId, $spId]); $count++;
|
||||
}
|
||||
// 3-6 services
|
||||
foreach (rand_items($serviceIds, 3, 6) as $svId) {
|
||||
$clSvStmt->execute([$clinicId, $svId]); $count++;
|
||||
}
|
||||
// 3-6 insurances
|
||||
foreach (rand_items($insIds, 3, 6) as $inId) {
|
||||
$clInStmt->execute([$clinicId, $inId]); $count++;
|
||||
}
|
||||
}
|
||||
echo " Clinics: " . count($clinicIds) . "\n";
|
||||
|
||||
// ── 6. Appointments ───────────────────────────────────────────────────────────
|
||||
echo "Inserting appointments...\n";
|
||||
$apptStmt = $pdo->prepare(
|
||||
'INSERT INTO appointments (uuid,slot_start,slot_end,status,note,created_at,updated_at,doctor_id,user_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?)'
|
||||
);
|
||||
$apptIds = [];
|
||||
$apptStatusFinal = [];
|
||||
|
||||
// weighted random status
|
||||
function weightedStatus(array $statuses, array $weights): string {
|
||||
$total = array_sum($weights);
|
||||
$r = rand(1, $total);
|
||||
$cum = 0;
|
||||
foreach ($statuses as $i => $status) {
|
||||
$cum += $weights[$i];
|
||||
if ($r <= $cum) return $status;
|
||||
}
|
||||
return $statuses[0];
|
||||
}
|
||||
|
||||
$appointmentStatuses = ['reserved','visited','completed','cancelled_by_user','cancelled_by_doctor','no_show'];
|
||||
$apptWeights = [20, 25, 30, 10, 8, 7];
|
||||
|
||||
for ($i = 0; $i < 500; $i++) {
|
||||
$doctorId = rand_item($doctorIds);
|
||||
$userId = rand_item($patientIds);
|
||||
$status = weightedStatus($appointmentStatuses, $apptWeights);
|
||||
|
||||
// Past appointments: visited/completed/cancelled, Future: reserved
|
||||
if (in_array($status, ['visited','completed','no_show','cancelled_by_user','cancelled_by_doctor'])) {
|
||||
$slotStart = $now - rand(3600, 86400 * 180);
|
||||
} else {
|
||||
$slotStart = $now + rand(3600, 86400 * 30);
|
||||
}
|
||||
$slotEnd = $slotStart + 1800; // 30 min
|
||||
$ts = $slotStart - rand(3600, 86400 * 7);
|
||||
$notes = ['','مراجعه اول','پیگیری','نوبت اضطراری','مشاوره','کنترل دورهای'];
|
||||
$apptStmt->execute([uuid(), $slotStart, $slotEnd, $status, rand_item($notes), $ts, $ts, $doctorId, $userId]);
|
||||
$apptId = (int)$pdo->lastInsertId();
|
||||
$apptIds[] = $apptId;
|
||||
$apptStatusFinal[] = $status;
|
||||
$count++;
|
||||
}
|
||||
echo " Appointments: " . count($apptIds) . "\n";
|
||||
|
||||
// ── 7. Payments ───────────────────────────────────────────────────────────────
|
||||
echo "Inserting payments...\n";
|
||||
$payStmt = $pdo->prepare(
|
||||
'INSERT INTO payments (uuid,order_id,amount_rials,status,gateway,type,reference_id,created_at,updated_at,user_id,appointment_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?)'
|
||||
);
|
||||
$gateways = ['mellat','sep','zarinpal','parsian'];
|
||||
// Only completed/visited appointments get paid
|
||||
$paidApptIds = [];
|
||||
foreach ($apptIds as $k => $apptId) {
|
||||
if (in_array($apptStatusFinal[$k], ['visited','completed','reserved'])) {
|
||||
$paidApptIds[] = [$apptId, $k];
|
||||
}
|
||||
}
|
||||
shuffle($paidApptIds);
|
||||
$paidApptIds = array_slice($paidApptIds, 0, 380);
|
||||
|
||||
foreach ($paidApptIds as [$apptId, $k]) {
|
||||
$status = in_array($apptStatusFinal[$k], ['visited','completed']) ? 'paid' : rand_item(['paid','pending']);
|
||||
$amount = rand_item([1500000,2000000,2500000,3000000,3500000,4000000,4500000,5000000]);
|
||||
$userId = rand_item($patientIds);
|
||||
$ts = $now - rand(3600, 86400 * 180);
|
||||
$refId = $status === 'paid' ? (string)rand(100000000, 999999999) : null;
|
||||
$payStmt->execute([
|
||||
uuid(), 'ORD-' . strtoupper(substr(uuid(), 0, 8)), $amount, $status,
|
||||
rand_item($gateways), 'appointment', $refId, $ts, $ts, $userId, $apptId
|
||||
]);
|
||||
$count++;
|
||||
}
|
||||
echo " Payments: " . count($paidApptIds) . "\n";
|
||||
|
||||
// ── 8. Rates ──────────────────────────────────────────────────────────────────
|
||||
echo "Inserting rates...\n";
|
||||
$rateStmt = $pdo->prepare('INSERT INTO rates (uuid,score,created_at,updated_at,user_id,doctor_id) VALUES (?,?,?,?,?,?)');
|
||||
$usedRatePairs = [];
|
||||
$rateCount = 0;
|
||||
$i = 0;
|
||||
while ($rateCount < 200 && $i < 1000) {
|
||||
$i++;
|
||||
$doctorId = rand_item($doctorIds);
|
||||
$userId = rand_item($patientIds);
|
||||
$key = "$userId-$doctorId";
|
||||
if (isset($usedRatePairs[$key])) continue;
|
||||
$usedRatePairs[$key] = true;
|
||||
$score = rand_item([1,2,3,3,4,4,4,5,5,5]);
|
||||
$ts = $now - rand(3600, 86400 * 300);
|
||||
$rateStmt->execute([uuid(), $score, $ts, $ts, $userId, $doctorId]);
|
||||
$rateCount++;
|
||||
$count++;
|
||||
}
|
||||
echo " Rates: $rateCount\n";
|
||||
|
||||
// ── 9. Comments ───────────────────────────────────────────────────────────────
|
||||
echo "Inserting comments...\n";
|
||||
$comStmt = $pdo->prepare('INSERT INTO comments (uuid,body,status,created_at,updated_at,user_id,doctor_id) VALUES (?,?,?,?,?,?,?)');
|
||||
$comStatuses = ['approved','approved','approved','pending','rejected'];
|
||||
for ($i = 0; $i < 150; $i++) {
|
||||
$doctorId = rand_item($doctorIds);
|
||||
$userId = rand_item($patientIds);
|
||||
$ts = $now - rand(3600, 86400 * 300);
|
||||
$comStmt->execute([uuid(), rand_item($commentTexts), rand_item($comStatuses), $ts, $ts, $userId, $doctorId]);
|
||||
$count++;
|
||||
}
|
||||
echo " Comments: 150\n";
|
||||
|
||||
// ── 10. Blogs ─────────────────────────────────────────────────────────────────
|
||||
echo "Inserting blogs...\n";
|
||||
$blogStmt = $pdo->prepare(
|
||||
'INSERT INTO blogs (uuid,title,slug,body,summary,tags,status,created_at,updated_at,author_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?)'
|
||||
);
|
||||
$adminUserId = null;
|
||||
$adminRow = $pdo->query("SELECT id FROM users WHERE roles LIKE '%ROLE_ADMIN%' LIMIT 1")->fetch(PDO::FETCH_ASSOC);
|
||||
if ($adminRow) $adminUserId = $adminRow['id'];
|
||||
|
||||
$blogTags = [['سلامت','قلب'],['کودکان','تغذیه'],['پیشگیری','چکاپ'],['روانشناسی','استرس'],
|
||||
['دیابت','تغذیه'],['ورزش','قلب'],['خواب','سلامت'],['پوست','مراقبت'],
|
||||
['استخوان','تغذیه'],['چشم','بینایی'],['سرطان','پیشگیری'],['دندان','بهداشت'],
|
||||
['فشار خون','قلب'],['واکسن','پیشگیری'],['مفصل','ارتوپدی']];
|
||||
$usedSlugs = [];
|
||||
for ($i = 0; $i < min(count($blogTitles), 15); $i++) {
|
||||
$title = $blogTitles[$i];
|
||||
$slug = 'blog-post-' . ($i + 1) . '-' . rand(1000, 9999);
|
||||
$body = rand_item($blogBodies) . ' ' . rand_item($blogBodies);
|
||||
$tags = json_encode($blogTags[$i] ?? ['سلامت'], JSON_UNESCAPED_UNICODE);
|
||||
$status = $i < 12 ? 'published' : 'draft';
|
||||
$ts = $now - rand(86400, 86400 * 200);
|
||||
$authorId = $adminUserId ?? rand_item($doctorUserIds);
|
||||
$blogStmt->execute([uuid(), $title, $slug, $body, mb_substr($body, 0, 150), $tags, $status, $ts, $ts, $authorId]);
|
||||
$count++;
|
||||
}
|
||||
echo " Blogs: 15\n";
|
||||
|
||||
$pdo->exec('SET FOREIGN_KEY_CHECKS = 1');
|
||||
|
||||
echo "\n=== Seed Complete ===\n";
|
||||
$tables = ['users','doctors','clinics','clinic_doctors','doctor_specialties','doctor_expertise',
|
||||
'doctor_provinces','doctor_cities','doctor_addresses','appointments','payments',
|
||||
'rates','comments','blogs','insurances'];
|
||||
$total = 0;
|
||||
foreach ($tables as $t) {
|
||||
$c = (int)$pdo->query("SELECT COUNT(*) FROM `$t`")->fetchColumn();
|
||||
echo " $t: $c\n";
|
||||
$total += $c;
|
||||
}
|
||||
echo "\nTotal records across tables: $total\n";
|
||||
@@ -1,126 +0,0 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
set_time_limit(0);
|
||||
|
||||
$pdo = new PDO('mysql:host=db;dbname=db;charset=utf8mb4', 'db', 'db');
|
||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
$pdo->exec('SET NAMES utf8mb4');
|
||||
|
||||
$now = time();
|
||||
function uuid(): string {
|
||||
return 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));
|
||||
}
|
||||
function ri(array $a) { return $a[array_rand($a)]; }
|
||||
function wRand(array $items, array $weights): mixed {
|
||||
$total = array_sum($weights); $r = rand(1, $total); $c = 0;
|
||||
foreach ($items as $k => $v) { $c += $weights[$k]; if ($r <= $c) return $v; }
|
||||
return $items[0];
|
||||
}
|
||||
|
||||
// Load existing IDs
|
||||
$doctorIds = $pdo->query('SELECT id FROM doctors')->fetchAll(PDO::FETCH_COLUMN);
|
||||
$patientIds = $pdo->query("SELECT id FROM users WHERE roles NOT LIKE '%ROLE_DOCTOR%' AND roles NOT LIKE '%ROLE_ADMIN%'")->fetchAll(PDO::FETCH_COLUMN);
|
||||
echo 'Doctors: ' . count($doctorIds) . ', Patients: ' . count($patientIds) . "\n";
|
||||
|
||||
// ── Ratings ───────────────────────────────────────────────────────────────────
|
||||
echo "Inserting ratings...\n";
|
||||
$rateStmt = $pdo->prepare('INSERT INTO rates (uuid,score,created_at,updated_at,user_id,doctor_id) VALUES (?,?,?,?,?,?)');
|
||||
$usedPairs = [];
|
||||
$rateCount = 0;
|
||||
$pdo->beginTransaction();
|
||||
$tries = 0;
|
||||
while ($rateCount < 3000 && $tries < 30000) {
|
||||
$tries++;
|
||||
$doctorId = ri($doctorIds);
|
||||
$userId = ri($patientIds);
|
||||
$key = $userId . '-' . $doctorId;
|
||||
if (isset($usedPairs[$key])) continue;
|
||||
$usedPairs[$key] = true;
|
||||
$score = wRand([1,2,3,4,5], [3,5,15,35,42]);
|
||||
$ts = $now - rand(3600, 86400 * 400);
|
||||
$rateStmt->execute([uuid(), $score, $ts, $ts, $userId, $doctorId]);
|
||||
$rateCount++;
|
||||
if ($rateCount % 1000 === 0) { $pdo->commit(); $pdo->beginTransaction(); echo " $rateCount\n"; }
|
||||
}
|
||||
$pdo->commit();
|
||||
echo "Ratings: $rateCount\n";
|
||||
|
||||
// ── Comments ──────────────────────────────────────────────────────────────────
|
||||
echo "Inserting comments...\n";
|
||||
$comTexts = [
|
||||
'دکتر بسیار دلسوز و با حوصله هستند. توضیحات کامل دادند.',
|
||||
'معاینه دقیق بود. تشخیص درست و درمان موثر. ممنونم.',
|
||||
'وقت انتظار کم بود و کیفیت ویزیت عالی.',
|
||||
'بسیار متبحر و باتجربه. مشکلم حل شد.',
|
||||
'رفتار حرفهای و انسانی. مطب تمیز و منظم. توصیه میکنم.',
|
||||
'ویزیت خوبی داشتم. داروها موثر بود.',
|
||||
'یکی از بهترین پزشکانی که دیدهام. صبور و دقیق.',
|
||||
'کمی صبر کردم ولی ارزشش داشت. وقت کافی گذاشت.',
|
||||
'متخصص واقعی. همه سوالات را صادقانه جواب داد.',
|
||||
'رزرو آسان و ویزیت به موقع. کاملاً راضی هستم.',
|
||||
'برخورد محترمانه و تخصص بالا. حتماً دوباره مراجعه میکنم.',
|
||||
'اطلاعات دقیق و مشاوره عالی. بهترین انتخاب بود.',
|
||||
];
|
||||
$comStmt = $pdo->prepare('INSERT INTO comments (uuid,body,status,created_at,updated_at,user_id,doctor_id) VALUES (?,?,?,?,?,?,?)');
|
||||
$comStatuses = ['approved','approved','approved','approved','pending','rejected'];
|
||||
$pdo->beginTransaction();
|
||||
for ($i = 0; $i < 2000; $i++) {
|
||||
$ts = $now - rand(3600, 86400 * 400);
|
||||
$comStmt->execute([uuid(), ri($comTexts), ri($comStatuses), $ts, $ts, ri($patientIds), ri($doctorIds)]);
|
||||
if (($i+1) % 500 === 0) { $pdo->commit(); $pdo->beginTransaction(); echo " Comments: " . ($i+1) . "\n"; }
|
||||
}
|
||||
$pdo->commit();
|
||||
echo "Comments: 2000\n";
|
||||
|
||||
// ── Blogs ─────────────────────────────────────────────────────────────────────
|
||||
echo "Inserting blogs...\n";
|
||||
$blogStmt = $pdo->prepare('INSERT INTO blogs (uuid,title,slug,body,summary,tags,status,created_at,updated_at,author_id) VALUES (?,?,?,?,?,?,?,?,?,?)');
|
||||
$blogData = [
|
||||
['راهنمای جامع پیشگیری از بیماریهای قلبی','heart-disease-prevention','بیماریهای قلبی از علل اصلی مرگ هستند. با تغذیه سالم، ورزش منظم، ترک سیگار و کنترل فشار خون میتوان خطر ابتلا را کاهش داد.',['قلب','پیشگیری','سلامت'],'published'],
|
||||
['تغذیه سالم برای کودکان در سنین رشد','healthy-nutrition-children','مصرف متعادل پروتئین، لبنیات، میوه و سبزیجات برای رشد کودکان ضروری است.',['کودکان','تغذیه','رشد'],'published'],
|
||||
['اهمیت چکاپ منظم سالانه','annual-checkup','آزمایش خون، فشار خون و غربالگری سرطان باید سالانه انجام شوند. تشخیص زودهنگام درمان را سادهتر میکند.',['چکاپ','پیشگیری'],'published'],
|
||||
['مدیریت استرس در زندگی مدرن','stress-management','تنفس عمیق، مدیتیشن، ورزش و ارتباط اجتماعی سالم از راهکارهای موثر مدیریت استرس هستند.',['استرس','سلامت روان'],'published'],
|
||||
['دیابت نوع ۲: علائم و کنترل','diabetes-type2','تشنگی زیاد، ادرار مکرر و خستگی از علائم دیابت هستند. رژیم مناسب و ورزش در مدیریت آن حیاتی است.',['دیابت','قند خون'],'published'],
|
||||
['نقش ورزش در سلامت قلب','exercise-cardiovascular','۱۵۰ دقیقه فعالیت هوازی در هفته برای سلامت قلب ضروری است.',['ورزش','قلب'],'published'],
|
||||
['خواب کافی و سلامت روان','sleep-health','بزرگسالان به ۷-۹ ساعت خواب نیاز دارند. کمبود خواب با بیماریهای مزمن ارتباط دارد.',['خواب','سلامت'],'published'],
|
||||
['مراقبت از پوست در برابر آفتاب','skin-care-sun','استفاده از کرم ضدآفتاب SPF 30+ و پوشش مناسب از پوست محافظت میکند.',['پوست','ضدآفتاب'],'published'],
|
||||
['پیشگیری از پوکی استخوان','osteoporosis','مصرف کلسیم، ویتامین D و ورزش منظم از پوکی استخوان جلوگیری میکنند.',['استخوان','کلسیم'],'published'],
|
||||
['مراقبت از بینایی','eye-care','معاینه سالانه چشم و رعایت قانون ۲۰-۲۰-۲۰ برای سلامت چشم ضروری است.',['چشم','بینایی'],'published'],
|
||||
['سرطان پستان؛ تشخیص زودهنگام','breast-cancer','معاینه خودآزمایی ماهانه و ماموگرافی سالانه از ابزارهای تشخیص زودهنگام هستند.',['سرطان','پستان'],'published'],
|
||||
['بهداشت دهان و دندان','dental-hygiene','مسواک زدن دو بار در روز و مراجعه به دندانپزشک هر ۶ ماه توصیه میشود.',['دندان','بهداشت'],'published'],
|
||||
['کنترل فشار خون بالا','blood-pressure','کاهش نمک، ورزش منظم و مصرف داروها در کنترل فشار خون موثر هستند.',['فشار خون','قلب'],'published'],
|
||||
['واکسیناسیون بزرگسالان','adult-vaccination','آنفلوانزا، هپاتیت B و واکسن HPV از واکسنهای مهم بزرگسالی هستند.',['واکسن','پیشگیری'],'published'],
|
||||
['آرتروز زانو: درمان و بازتوانی','knee-arthritis','فیزیوتراپی، ورزشهای تقویتی و کاهش وزن در درمان آرتروز زانو موثر هستند.',['آرتروز','ارتوپدی'],'published'],
|
||||
['تغذیه در بیماریهای کلیوی','renal-diet','رژیم کمپتاسیم و کمفسفر برای بیماران کلیوی ضروری است.',['کلیه','تغذیه'],'draft'],
|
||||
['سلامت روان در محیط کار','workplace-mental-health','تعادل کار و زندگی و ارتباط موثر با همکاران از عوامل سلامت روان در کار هستند.',['سلامت روان','کار'],'published'],
|
||||
['آلرژی فصلی','seasonal-allergy','اجتناب از محرکها و استفاده از آنتیهیستامین از روشهای اصلی مقابله با آلرژی هستند.',['آلرژی','تنفس'],'published'],
|
||||
['ورزش در دوران بارداری','pregnancy-exercise','پیادهروی و یوگای بارداری با نظر پزشک برای مادر و جنین مفید است.',['بارداری','ورزش'],'published'],
|
||||
['پیشگیری از سرطان روده','colorectal-cancer','کولونوسکوپی از سن ۴۵ سالگی و رژیم پرفیبر خطر را کاهش میدهند.',['سرطان','روده'],'published'],
|
||||
];
|
||||
$adminRow = $pdo->query("SELECT id FROM users WHERE roles LIKE '%ROLE_ADMIN%' LIMIT 1")->fetch(PDO::FETCH_ASSOC);
|
||||
$adminId = $adminRow ? $adminRow['id'] : ri($doctorIds);
|
||||
foreach ($blogData as $b) {
|
||||
$ts = $now - rand(86400, 86400 * 300);
|
||||
$blogStmt->execute([
|
||||
uuid(), $b[0], $b[1] . '-' . rand(100,999), $b[2],
|
||||
mb_substr($b[2], 0, 200), json_encode($b[3], JSON_UNESCAPED_UNICODE),
|
||||
$b[4], $ts, $ts, $adminId
|
||||
]);
|
||||
}
|
||||
echo 'Blogs: ' . count($blogData) . "\n";
|
||||
|
||||
// ── Summary ───────────────────────────────────────────────────────────────────
|
||||
echo "\n=== Final counts ===\n";
|
||||
$tables = ['users','doctors','clinics','clinic_doctors','clinic_specialties','clinic_services','clinic_insurances',
|
||||
'doctor_specialties','doctor_expertise','doctor_provinces','doctor_cities','doctor_addresses',
|
||||
'appointments','payments','rates','comments','blogs','insurances','profiles'];
|
||||
$total = 0;
|
||||
foreach ($tables as $t) {
|
||||
$c = (int)$pdo->query("SELECT COUNT(*) FROM `$t`")->fetchColumn();
|
||||
printf(" %-30s %d\n", $t . ':', $c);
|
||||
$total += $c;
|
||||
}
|
||||
echo "\nTotal records: $total\n";
|
||||
@@ -1,708 +0,0 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
set_time_limit(0);
|
||||
ini_set('memory_limit', '512M');
|
||||
|
||||
$pdo = new PDO('mysql:host=db;dbname=db;charset=utf8mb4', 'db', 'db');
|
||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
$pdo->exec('SET NAMES utf8mb4');
|
||||
$pdo->exec('SET FOREIGN_KEY_CHECKS = 0');
|
||||
$pdo->exec("SET SESSION sql_mode = ''");
|
||||
|
||||
$now = time();
|
||||
$BASE_DIR = '/var/www/html/public';
|
||||
$BASE_URL = '';
|
||||
|
||||
// ── Helpers ───────────────────────────────────────────────────────────────────
|
||||
function uuid(): string {
|
||||
return 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));
|
||||
}
|
||||
function ri(array $a) { return $a[array_rand($a)]; }
|
||||
function ris(array $a, int $min, int $max): array {
|
||||
$n = rand($min, min($max, count($a)));
|
||||
shuffle($a);
|
||||
return array_slice($a, 0, $n);
|
||||
}
|
||||
function mobile(array &$used): string {
|
||||
$prefixes = ['0910','0911','0912','0913','0914','0915','0916','0917','0918','0919',
|
||||
'0930','0933','0935','0936','0937','0938','0901','0902','0920','0921',
|
||||
'0991','0992','0993','0994'];
|
||||
do {
|
||||
$m = ri($prefixes) . str_pad((string)rand(1000000,9999999),7,'0',STR_PAD_LEFT);
|
||||
} while (isset($used[$m]));
|
||||
$used[$m] = true;
|
||||
return $m;
|
||||
}
|
||||
function pw(): string { return '$2y$13$fakehash' . substr(str_replace(['+','/','='],'',base64_encode(random_bytes(24))),0,44); }
|
||||
|
||||
// ── Download images with parallel curl ───────────────────────────────────────
|
||||
function downloadParallel(array $urls, array $paths, int $batchSize = 20): void {
|
||||
$total = count($urls);
|
||||
for ($offset = 0; $offset < $total; $offset += $batchSize) {
|
||||
$batch = array_slice($urls, $offset, $batchSize, true);
|
||||
$batchPath = array_slice($paths, $offset, $batchSize, true);
|
||||
$mh = curl_multi_init();
|
||||
$handles = [];
|
||||
foreach ($batch as $i => $url) {
|
||||
if (file_exists($batchPath[$i])) continue;
|
||||
$ch = curl_init($url);
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_FOLLOWLOCATION => true,
|
||||
CURLOPT_TIMEOUT => 15,
|
||||
CURLOPT_SSL_VERIFYPEER => false,
|
||||
CURLOPT_USERAGENT => 'Mozilla/5.0',
|
||||
]);
|
||||
curl_multi_add_handle($mh, $ch);
|
||||
$handles[$i] = $ch;
|
||||
}
|
||||
$running = null;
|
||||
do { curl_multi_exec($mh, $running); curl_multi_select($mh); } while ($running > 0);
|
||||
foreach ($handles as $i => $ch) {
|
||||
$data = curl_multi_getcontent($ch);
|
||||
if ($data && strlen($data) > 1000) {
|
||||
@mkdir(dirname($batchPath[$i]), 0755, true);
|
||||
file_put_contents($batchPath[$i], $data);
|
||||
}
|
||||
curl_multi_remove_handle($mh, $ch);
|
||||
curl_close($ch);
|
||||
}
|
||||
curl_multi_close($mh);
|
||||
echo '.';
|
||||
}
|
||||
echo "\n";
|
||||
}
|
||||
|
||||
function imgJson(string $url, string $filename, int $filesize = 0): string {
|
||||
return json_encode([[
|
||||
'fid' => rand(10000, 999999),
|
||||
'uuid' => uuid(),
|
||||
'url' => $url,
|
||||
'filename' => $filename,
|
||||
'filemime' => 'image/jpeg',
|
||||
'filesize' => $filesize > 0 ? $filesize : rand(25000, 90000),
|
||||
]], JSON_UNESCAPED_UNICODE);
|
||||
}
|
||||
|
||||
// ── STEP 1 — Download doctor photos ──────────────────────────────────────────
|
||||
echo "=== Downloading doctor photos ===\n";
|
||||
$doctorPhotoDir = $BASE_DIR . '/uploads/doctors/2026-06';
|
||||
@mkdir($doctorPhotoDir, 0755, true);
|
||||
|
||||
$photoUrls = [];
|
||||
$photoPaths = [];
|
||||
$doctorPhotos = ['male' => [], 'female' => []];
|
||||
|
||||
// 99 male portraits
|
||||
for ($n = 1; $n <= 99; $n++) {
|
||||
$url = "https://randomuser.me/api/portraits/men/$n.jpg";
|
||||
$path = "$doctorPhotoDir/m-$n.jpg";
|
||||
$photoUrls[] = $url;
|
||||
$photoPaths[] = $path;
|
||||
$doctorPhotos['male'][] = [
|
||||
'url' => "/uploads/doctors/2026-06/m-$n.jpg",
|
||||
'file' => "m-$n.jpg",
|
||||
'path' => $path,
|
||||
];
|
||||
}
|
||||
// 99 female portraits
|
||||
for ($n = 1; $n <= 99; $n++) {
|
||||
$url = "https://randomuser.me/api/portraits/women/$n.jpg";
|
||||
$path = "$doctorPhotoDir/f-$n.jpg";
|
||||
$photoUrls[] = $url;
|
||||
$photoPaths[] = $path;
|
||||
$doctorPhotos['female'][] = [
|
||||
'url' => "/uploads/doctors/2026-06/f-$n.jpg",
|
||||
'file' => "f-$n.jpg",
|
||||
'path' => $path,
|
||||
];
|
||||
}
|
||||
echo "Downloading 198 doctor portraits ";
|
||||
downloadParallel($photoUrls, $photoPaths, 25);
|
||||
|
||||
// ── STEP 2 — Download clinic gallery & logos ──────────────────────────────────
|
||||
echo "=== Downloading clinic images ===\n";
|
||||
$galleryDir = $BASE_DIR . '/uploads/clinics/gallery/2026-06';
|
||||
$logoDir = $BASE_DIR . '/uploads/clinics/logo/2026-06';
|
||||
@mkdir($galleryDir, 0755, true);
|
||||
@mkdir($logoDir, 0755, true);
|
||||
|
||||
$clinicPhotoUrls = [];
|
||||
$clinicPhotoPaths = [];
|
||||
$clinicGalleryPhotos = [];
|
||||
$clinicLogoPhotos = [];
|
||||
|
||||
// 60 clinic gallery photos (medical/building themed via picsum seeds)
|
||||
$clinicSeeds = [100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,
|
||||
1600,1700,1800,1900,2000,2100,2200,2300,2400,2500,2600,2700,2800,
|
||||
2900,3000,3100,3200,3300,3400,3500,3600,3700,3800,3900,4000,
|
||||
4100,4200,4300,4400,4500,4600,4700,4800,4900,5000,5100,5200,5300,5400,5500,5600,5700,5800,5900,6000];
|
||||
foreach ($clinicSeeds as $seed) {
|
||||
$url = "https://picsum.photos/seed/$seed/640/480";
|
||||
$path = "$galleryDir/c-$seed.jpg";
|
||||
$clinicPhotoUrls[] = $url;
|
||||
$clinicPhotoPaths[] = $path;
|
||||
$clinicGalleryPhotos[] = ['url' => "/uploads/clinics/gallery/2026-06/c-$seed.jpg", 'file' => "c-$seed.jpg"];
|
||||
}
|
||||
// 40 clinic logos (smaller)
|
||||
$logoSeeds = [10,20,30,40,50,60,70,80,90,110,120,130,140,150,160,170,180,190,210,220,
|
||||
230,240,250,260,270,280,290,310,320,330,340,350,360,370,380,390,410,420,430,440];
|
||||
foreach ($logoSeeds as $seed) {
|
||||
$url = "https://picsum.photos/seed/logo$seed/200/200";
|
||||
$path = "$logoDir/logo-$seed.jpg";
|
||||
$clinicPhotoUrls[] = $url;
|
||||
$clinicPhotoPaths[] = $path;
|
||||
$clinicLogoPhotos[] = ['url' => "/uploads/clinics/logo/2026-06/logo-$seed.jpg", 'file' => "logo-$seed.jpg"];
|
||||
}
|
||||
echo "Downloading 100 clinic images ";
|
||||
downloadParallel($clinicPhotoUrls, $clinicPhotoPaths, 25);
|
||||
|
||||
// ── STEP 3 — Download insurance logos ─────────────────────────────────────────
|
||||
echo "=== Downloading insurance logos ===\n";
|
||||
$insLogoDir = $BASE_DIR . '/uploads/insurances/logo/2026-06';
|
||||
@mkdir($insLogoDir, 0755, true);
|
||||
$insLogoUrls = [];
|
||||
$insLogoPaths = [];
|
||||
$insLogoFiles = [];
|
||||
for ($n = 1; $n <= 20; $n++) {
|
||||
$seed = $n * 50;
|
||||
$url = "https://picsum.photos/seed/ins$seed/200/200";
|
||||
$path = "$insLogoDir/ins-$n.jpg";
|
||||
$insLogoUrls[] = $url;
|
||||
$insLogoPaths[] = $path;
|
||||
$insLogoFiles[] = "/uploads/insurances/logo/2026-06/ins-$n.jpg";
|
||||
}
|
||||
echo "Downloading 20 insurance logos ";
|
||||
downloadParallel($insLogoUrls, $insLogoPaths, 20);
|
||||
|
||||
// ── Load DB data ──────────────────────────────────────────────────────────────
|
||||
$provinces = $pdo->query('SELECT id FROM provinces')->fetchAll(PDO::FETCH_COLUMN);
|
||||
$cities = $pdo->query('SELECT id, province_id FROM cities WHERE id != 600')->fetchAll(PDO::FETCH_ASSOC);
|
||||
$cityIds = array_column($cities, 'id');
|
||||
$cityProvMap = array_column($cities, 'province_id', 'id');
|
||||
$specParents = $pdo->query('SELECT id FROM specialties WHERE parent_id IS NULL')->fetchAll(PDO::FETCH_COLUMN);
|
||||
$specChildren = $pdo->query('SELECT id, parent_id FROM specialties WHERE parent_id IS NOT NULL')->fetchAll(PDO::FETCH_ASSOC);
|
||||
$allServiceRows = $pdo->query('SELECT id, specialty_id FROM doctor_services')->fetchAll(PDO::FETCH_ASSOC);
|
||||
$serviceIds = array_column($allServiceRows, 'id');
|
||||
$specSvcMap = [];
|
||||
foreach ($allServiceRows as $r) {
|
||||
if ($r['specialty_id']) $specSvcMap[$r['specialty_id']][] = $r['id'];
|
||||
}
|
||||
$specChildMap = [];
|
||||
foreach ($specChildren as $r) {
|
||||
$specChildMap[$r['parent_id']][] = $r['id'];
|
||||
}
|
||||
|
||||
// ── Static data ───────────────────────────────────────────────────────────────
|
||||
$maleNames = ['علی','محمد','حسین','احمد','رضا','مهدی','حسن','اکبر','ابراهیم','کریم','جواد','امیر',
|
||||
'سعید','مجید','فرید','کامران','سیاوش','داریوش','پرویز','شهرام','بهرام','فرهاد','نادر',
|
||||
'مسعود','وحید','یاسر','حامد','سجاد','ایمان','میثم','آرش','آرمان','پدرام','پویا','کیان',
|
||||
'سیروس','بابک','فریبرز','هوشنگ','نیما','شاهین','کاوه','آریا','پارسا','دانیال','سینا',
|
||||
'رامین','کورش','منوچهر','فرامرز','بهزاد','پیمان','امین','اشکان','شایان','آیدین','ارسلان'];
|
||||
$femaleNames = ['فاطمه','زهرا','مریم','سارا','نرگس','لیلا','نازنین','مهناز','شیرین','پروین','ملیحه',
|
||||
'الناز','آتنا','باران','ترانه','دلارام','رویا','شادی','گلناز','ماهرخ','ندا','نیلوفر',
|
||||
'هانیه','یاسمن','زینب','حدیثه','سمیه','طاهره','عاطفه','منیژه','سوده','ریحانه','فرزانه',
|
||||
'نسرین','ناهید','مینا','گیتی','آذر','پرستو','ژیلا','شکوفه','آفرین','بهناز','مهسا','رها'];
|
||||
$lastNames = ['احمدی','محمدی','رضایی','حسینی','موسوی','جعفری','کریمی','نوری','صادقی','قاسمی',
|
||||
'عباسی','میرزایی','رحیمی','اکبری','یوسفی','حیدری','طاهری','نصیری','سلیمانی','زارعی',
|
||||
'مرادی','شریفی','منصوری','ذبیحی','تهرانی','اصفهانی','مشهدی','شیرازی','تبریزی','همدانی',
|
||||
'ملکی','درویشی','امیری','نجفی','شاهی','بهرامی','خسروی','گلمحمدی','فدایی','ولیپور',
|
||||
'نظری','فروزان','پورعلی','دهقانی','صالحی','ربیعی','مجیدی','سبحانی','زمانی','بهشتی',
|
||||
'عزیزی','خلیلی','رستمی','پورحسین','نظامالدینی','میرمحمدی','سیدی','سلطانی','نادری','ابراهیمی'];
|
||||
$degrees = ['متخصص','فوق تخصص','دکترای عمومی','فلوشیپ','استادیار','دانشیار','پروفسور','رزیدنت'];
|
||||
$bios = [
|
||||
'دارای بیش از ۱۵ سال سابقه در حوزه تخصصی، عضو انجمن پزشکی ایران و سازمان نظام پزشکی.',
|
||||
'فارغالتحصیل دانشگاه علوم پزشکی تهران با تجربه کار در بیمارستانهای معتبر کشور.',
|
||||
'متخصص با سابقه درخشان، ارائه خدمات با بالاترین کیفیت با استفاده از جدیدترین تجهیزات.',
|
||||
'عضو هیئت علمی دانشگاه با بیش از ۱۰ سال تجربه بالینی و پژوهشی.',
|
||||
'دارای گواهینامههای تخصصی از مراکز بینالمللی، آشنا با جدیدترین روشهای درمانی.',
|
||||
'پزشک باتجربه با رویکرد جامع در درمان و اعتقاد راسخ به طب پیشگیری.',
|
||||
'متعهد به ارائه بهترین مراقبتهای پزشکی با رعایت کامل اصول اخلاق پزشکی.',
|
||||
'دارای مدرک تخصصی از اروپا و تجربه کار در مراکز درمانی پیشرفته اروپا و آمریکا.',
|
||||
'فارغالتحصیل ممتاز دانشگاه علوم پزشکی مشهد، برنده جایزه پزشک نمونه سال.',
|
||||
'متخصص با سابقه بیش از ۲۰ سال در درمان بیماریهای مزمن و پیچیده.',
|
||||
'عضو چندین انجمن علمی تخصصی، دارای مقالات متعدد در مجلات معتبر.',
|
||||
'پزشک متخصص با رویکرد بیمارمحور و استفاده از روشهای نوین تشخیص و درمان.',
|
||||
];
|
||||
$clinicNames = ['کلینیک تخصصی','مرکز درمانی','بیمارستان','کلینیک جامع','مرکز مشاوره پزشکی',
|
||||
'مطب','کلینیک ویژه','مرکز پزشکی','درمانگاه','کلینیک سلامت','مجتمع پزشکی'];
|
||||
$clinicSuffixes = ['امید','نوین','رازی','ابن سینا','سینا','شفا','سلامت','آریا','پارس','ایران',
|
||||
'مهر','صبا','فجر','بهار','شهید بهشتی','حضرت علی','امام رضا','گلستان','نور','طلوع'];
|
||||
$streets = ['خیابان ولیعصر','خیابان انقلاب','خیابان آزادی','بلوار کشاورز','خیابان شریعتی',
|
||||
'خیابان مطهری','خیابان فردوسی','خیابان پاسداران','خیابان جمهوری','خیابان طالقانی',
|
||||
'بلوار سعادتآباد','خیابان وزرا','خیابان بهشتی','خیابان میرداماد','خیابان حقانی',
|
||||
'خیابان دکتر چمران','بزرگراه شهید همت','خیابان ملاصدرا','خیابان زرتشت','بلوار اشرفی'];
|
||||
$buildings = ['ساختمان پزشکان','برج طبی','مجتمع پزشکی','پلاک','مطب طبقه','واحد'];
|
||||
$workingDaysList = [
|
||||
'شنبه تا چهارشنبه ۸ تا ۲۰', 'شنبه تا پنجشنبه ۸ تا ۱۸',
|
||||
'یکشنبه تا پنجشنبه ۹ تا ۱۷', 'شنبه تا سهشنبه ۷ تا ۱۹',
|
||||
'همه روزه ۸ تا ۲۲', 'شنبه تا چهارشنبه ۹ تا ۲۰',
|
||||
'دوشنبه تا جمعه ۱۰ تا ۱۸', 'شنبه تا پنجشنبه ۷ تا ۱۳ و ۱۶ تا ۲۰',
|
||||
];
|
||||
$apptStatuses = ['reserved','visited','completed','cancelled_by_user','cancelled_by_doctor','no_show','waiting','checked_in'];
|
||||
$apptWeights = [15, 25, 30, 10, 5, 5, 5, 5];
|
||||
$commentTexts = [
|
||||
'دکتر بسیار دلسوز و با حوصله هستند. توضیحات کاملی دادند و از معاینه راضی بودم.',
|
||||
'معاینه بسیار دقیق بود. تشخیص درست و درمان موثر. ممنونم از دکتر عزیز.',
|
||||
'وقت انتظار کمی داشتم و دکتر سر وقت حاضر بودند. کیفیت ویزیت بالا بود.',
|
||||
'بسیار متبحر و با تجربه. مشکلم کاملاً حل شد و از نتیجه درمان راضی هستم.',
|
||||
'توصیه میکنم به همه. رفتار حرفهای و انسانی. مطب تمیز و منظم.',
|
||||
'دکتر خوبی هستند ولی وقت ویزیت کمی کوتاه بود. در کل تجربه خوبی داشتم.',
|
||||
'از ویزیت کاملاً راضی بودم. درمان موثر و پیگیری خوب.',
|
||||
'یکی از بهترین پزشکانی که تاکنون به آنها مراجعه کردهام. بسیار ماهر و دلسوز.',
|
||||
'کمی منتظر ماندم اما ارزشش را داشت. دکتر وقت کافی برای بیمار میگذارند.',
|
||||
'متخصص واقعی در حوزه کار خود. با صبر و حوصله همه سوالات را جواب دادند.',
|
||||
'رزرو آنلاین خیلی راحت بود. دکتر به موقع ویزیت کردند و مشکلم برطرف شد.',
|
||||
'برخورد محترمانه و صادقانه. داروها اثر کردند. حتماً دوباره مراجعه خواهم کرد.',
|
||||
];
|
||||
|
||||
// ── STEP 4 — Insurances ───────────────────────────────────────────────────────
|
||||
echo "\n=== Inserting insurances ===\n";
|
||||
$insData = [
|
||||
['تأمین اجتماعی','basic'],['خدمات درمانی','basic'],['نیروهای مسلح','basic'],
|
||||
['کمیته امداد امام خمینی','basic'],['سازمان بهزیستی','basic'],['بیمه روستایی','basic'],
|
||||
['ایران','supplementary'],['آسیا','supplementary'],['البرز','supplementary'],
|
||||
['پارسیان','supplementary'],['سامان','supplementary'],['میهن','supplementary'],
|
||||
['دانا','supplementary'],['رازی','supplementary'],['کوثر','supplementary'],
|
||||
['معلم','supplementary'],['ملت','supplementary'],['حافظ','supplementary'],
|
||||
['اتکا','supplementary'],['توسعه','supplementary'],
|
||||
];
|
||||
$insStmt = $pdo->prepare('INSERT INTO insurances (uuid,name,type,logo_url,status) VALUES (?,?,?,?,1)');
|
||||
$insIds = [];
|
||||
foreach ($insData as $i => $ins) {
|
||||
$logo = isset($insLogoFiles[$i]) ? $insLogoFiles[$i] : null;
|
||||
$insStmt->execute([uuid(), $ins[0], $ins[1], $logo]);
|
||||
$insIds[] = (int)$pdo->lastInsertId();
|
||||
}
|
||||
echo 'Insurances: ' . count($insIds) . "\n";
|
||||
|
||||
// ── STEP 5 — Patients ─────────────────────────────────────────────────────────
|
||||
echo "=== Inserting patients (3000) ===\n";
|
||||
$usedMobiles = [];
|
||||
// Reserve admin mobile
|
||||
$usedMobiles['09120671713'] = true;
|
||||
$patientIds = [];
|
||||
|
||||
$uStmt = $pdo->prepare(
|
||||
'INSERT INTO users (uuid,mobile_number,password_hash,email,real_name,roles,status,created_at,updated_at)
|
||||
VALUES (?,?,?,?,?,?,1,?,?)'
|
||||
);
|
||||
$pStmt = $pdo->prepare(
|
||||
'INSERT INTO profiles (uuid,label,family,gender,blood_type,marital_status,sharing_with_user,
|
||||
basic_insurance_id,supplementary_insurance_id,created_at,updated_at,user_id)
|
||||
VALUES (?,?,?,?,?,?,1,?,?,?,?,?)'
|
||||
);
|
||||
$bloodTypes = ['A+','A-','B+','B-','O+','O-','AB+','AB-'];
|
||||
$marital = ['single','married','divorced','widowed'];
|
||||
|
||||
$pdo->beginTransaction();
|
||||
$batchCount = 0;
|
||||
for ($i = 0; $i < 3000; $i++) {
|
||||
$gender = rand(0,2) === 0 ? 'female' : 'male';
|
||||
$firstName = $gender === 'female' ? ri($femaleNames) : ri($maleNames);
|
||||
$lastName = ri($lastNames);
|
||||
$name = $firstName . ' ' . $lastName;
|
||||
$mob = mobile($usedMobiles);
|
||||
$email = 'patient' . $i . '@mail.ir';
|
||||
$ts = $now - rand(86400, 86400 * 730);
|
||||
|
||||
$uStmt->execute([uuid(), $mob, pw(), $email, $name, '["ROLE_USER"]', $ts, $ts]);
|
||||
$userId = (int)$pdo->lastInsertId();
|
||||
$patientIds[] = $userId;
|
||||
|
||||
// Profile for some patients
|
||||
if ($i % 3 === 0) {
|
||||
$basicIns = ri(array_slice($insIds, 0, 6));
|
||||
$suppIns = rand(0,1) ? ri(array_slice($insIds, 6)) : null;
|
||||
$pStmt->execute([
|
||||
uuid(), $firstName, $lastName, $gender, ri($bloodTypes), ri($marital),
|
||||
$basicIns, $suppIns, $ts, $ts, $userId
|
||||
]);
|
||||
}
|
||||
|
||||
$batchCount++;
|
||||
if ($batchCount % 500 === 0) {
|
||||
$pdo->commit();
|
||||
$pdo->beginTransaction();
|
||||
echo " Patients: $batchCount\n";
|
||||
}
|
||||
}
|
||||
$pdo->commit();
|
||||
echo 'Total patients: ' . count($patientIds) . "\n";
|
||||
|
||||
// ── STEP 6 — Doctors (1000) ───────────────────────────────────────────────────
|
||||
echo "=== Inserting doctors (1000) ===\n";
|
||||
$doctorIds = [];
|
||||
$doctorUserIds = [];
|
||||
$doctorGenderMap = [];
|
||||
|
||||
$duStmt = $pdo->prepare(
|
||||
'INSERT INTO users (uuid,mobile_number,password_hash,email,real_name,roles,status,created_at,updated_at)
|
||||
VALUES (?,?,?,?,?,?,1,?,?)'
|
||||
);
|
||||
$dStmt = $pdo->prepare(
|
||||
'INSERT INTO doctors (uuid,name,gender,medical_system_code,mobile_number,activity_time,degree,info,
|
||||
images,doctor_rate,doctor_rate_percentage,active_doctor_appointment,created_at,updated_at,user_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,1,?,?,?)'
|
||||
);
|
||||
$dsStmt = $pdo->prepare('INSERT IGNORE INTO doctor_specialties (doctor_id,specialty_id) VALUES (?,?)');
|
||||
$deStmt = $pdo->prepare('INSERT IGNORE INTO doctor_expertise (doctor_id,service_id) VALUES (?,?)');
|
||||
$dpStmt = $pdo->prepare('INSERT IGNORE INTO doctor_provinces (doctor_id,province_id) VALUES (?,?)');
|
||||
$dcStmt = $pdo->prepare('INSERT IGNORE INTO doctor_cities (doctor_id,city_id) VALUES (?,?)');
|
||||
$daStmt = $pdo->prepare(
|
||||
'INSERT INTO doctor_addresses (uuid,name,address,telephone,latitude,longitude,created_at,updated_at,doctor_id,city_id,province_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?)'
|
||||
);
|
||||
|
||||
$malePhotos = $doctorPhotos['male'];
|
||||
$femalePhotos = $doctorPhotos['female'];
|
||||
|
||||
$pdo->beginTransaction();
|
||||
for ($i = 0; $i < 1000; $i++) {
|
||||
$gender = $i % 4 === 0 ? 'female' : 'male';
|
||||
$firstName = $gender === 'female' ? ri($femaleNames) : ri($maleNames);
|
||||
$lastName = ri($lastNames);
|
||||
$name = 'دکتر ' . $firstName . ' ' . $lastName;
|
||||
$mob = mobile($usedMobiles);
|
||||
$email = 'doctor' . $i . '@clinic-pro.ir';
|
||||
$ts = $now - rand(86400 * 60, 86400 * 1000);
|
||||
|
||||
// User
|
||||
$duStmt->execute([uuid(), $mob, pw(), $email, $name, '["ROLE_USER","ROLE_DOCTOR"]', $ts, $ts]);
|
||||
$userId = (int)$pdo->lastInsertId();
|
||||
$doctorUserIds[] = $userId;
|
||||
|
||||
// Pick photo
|
||||
$photoPool = $gender === 'female' ? $femalePhotos : $malePhotos;
|
||||
$photo = $photoPool[$i % count($photoPool)];
|
||||
$imgJson = json_encode([[
|
||||
'fid' => rand(10000,999999),
|
||||
'uuid' => uuid(),
|
||||
'url' => $photo['url'],
|
||||
'filename' => $photo['file'],
|
||||
'filemime' => 'image/jpeg',
|
||||
'filesize' => rand(30000, 80000),
|
||||
]], JSON_UNESCAPED_UNICODE);
|
||||
|
||||
$rate = round(rand(32, 50) / 10, 1);
|
||||
$ratePct = rand(68, 98);
|
||||
|
||||
$dStmt->execute([
|
||||
uuid(), $name, $gender,
|
||||
(string)rand(10000000, 99999999), $mob,
|
||||
rand(3, 30), ri($degrees), ri($bios),
|
||||
$imgJson, $rate, $ratePct, $ts, $ts, $userId
|
||||
]);
|
||||
$doctorId = (int)$pdo->lastInsertId();
|
||||
$doctorIds[] = $doctorId;
|
||||
$doctorGenderMap[$doctorId] = $gender;
|
||||
|
||||
// 1-3 parent specialties
|
||||
$chosenParents = ris($specParents, 1, 2);
|
||||
foreach ($chosenParents as $spId) {
|
||||
$dsStmt->execute([$doctorId, $spId]);
|
||||
// 1-3 child specialties under same parent
|
||||
$kids = $specChildMap[$spId] ?? [];
|
||||
foreach (ris($kids, 1, 3) as $kid) {
|
||||
$dsStmt->execute([$doctorId, $kid]);
|
||||
}
|
||||
// 3-8 services
|
||||
$svcPool = $specSvcMap[$spId] ?? array_slice($serviceIds, 0, 15);
|
||||
foreach (ris($svcPool, 3, 8) as $svcId) {
|
||||
$deStmt->execute([$doctorId, $svcId]);
|
||||
}
|
||||
}
|
||||
|
||||
// 1-3 cities
|
||||
$chosenCities = ris($cityIds, 1, 3);
|
||||
foreach ($chosenCities as $cid) {
|
||||
$provId = $cityProvMap[$cid] ?? null;
|
||||
$dcStmt->execute([$doctorId, $cid]);
|
||||
if ($provId) $dpStmt->execute([$doctorId, $provId]);
|
||||
|
||||
// Address
|
||||
$street = ri($streets);
|
||||
$bld = ri($buildings);
|
||||
$no = rand(1, 300);
|
||||
$addr = $street . '، ' . $bld . ' ' . $no;
|
||||
$lat = 33.0 + rand(0, 700) / 100;
|
||||
$lon = 48.0 + rand(0, 1500) / 100;
|
||||
$tel = '0' . ri(['21','511','411','31','71','81','351','441','131','3411']) . rand(10000000, 99999999);
|
||||
$ts2 = $now - rand(86400, 86400 * 200);
|
||||
$daStmt->execute([uuid(), 'مطب ' . $firstName . ' ' . $lastName, $addr, $tel, $lat, $lon, $ts2, $ts2, $doctorId, $cid, $provId]);
|
||||
}
|
||||
|
||||
if (($i + 1) % 100 === 0) {
|
||||
$pdo->commit();
|
||||
$pdo->beginTransaction();
|
||||
echo " Doctors: " . ($i + 1) . "\n";
|
||||
}
|
||||
}
|
||||
$pdo->commit();
|
||||
echo 'Total doctors: ' . count($doctorIds) . "\n";
|
||||
|
||||
// ── STEP 7 — Clinics (200) ────────────────────────────────────────────────────
|
||||
echo "=== Inserting clinics (200) ===\n";
|
||||
$clinicIds = [];
|
||||
|
||||
$clStmt = $pdo->prepare(
|
||||
'INSERT INTO clinics (uuid,name,info,address,telephone,is_24_7,working_days,latitude,longitude,
|
||||
city_id,province_id,images_clinic,clinic_logo,created_at,updated_at,user_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'
|
||||
);
|
||||
$clDStmt = $pdo->prepare('INSERT IGNORE INTO clinic_doctors (clinic_id,doctor_id) VALUES (?,?)');
|
||||
$clSpStmt = $pdo->prepare('INSERT IGNORE INTO clinic_specialties (clinic_id,specialty_id) VALUES (?,?)');
|
||||
$clSvStmt = $pdo->prepare('INSERT IGNORE INTO clinic_services (clinic_id,service_id) VALUES (?,?)');
|
||||
$clInStmt = $pdo->prepare('INSERT IGNORE INTO clinic_insurances (clinic_id,insurance_id) VALUES (?,?)');
|
||||
|
||||
// 60% of doctors go into clinics
|
||||
$clinicDoctorPool = array_slice($doctorIds, 0, 600);
|
||||
shuffle($clinicDoctorPool);
|
||||
$poolIdx = 0;
|
||||
|
||||
$pdo->beginTransaction();
|
||||
for ($i = 0; $i < 200; $i++) {
|
||||
$cityRow = ri($cities);
|
||||
$cityId = (int)$cityRow['id'];
|
||||
$provId = (int)($cityRow['province_id'] ?? 0);
|
||||
$name = ri($clinicNames) . ' ' . ri($clinicSuffixes);
|
||||
$is247 = rand(0, 7) === 0 ? 1 : 0;
|
||||
$ts = $now - rand(86400 * 60, 86400 * 730);
|
||||
$street = ri($streets);
|
||||
$no = rand(1, 300);
|
||||
$addr = $street . '، پلاک ' . $no;
|
||||
$tel = '0' . ri(['21','511','411','31','71','81','351','441']) . rand(10000000, 99999999);
|
||||
$lat = 33.0 + rand(0, 700) / 100;
|
||||
$lon = 48.0 + rand(0, 1500) / 100;
|
||||
$ownerId = $doctorUserIds[array_rand($doctorUserIds)];
|
||||
|
||||
// Clinic photos (1-3 gallery + 1 logo)
|
||||
$galleryCount = rand(1, 3);
|
||||
$galleryArr = [];
|
||||
for ($g = 0; $g < $galleryCount; $g++) {
|
||||
$photo = $clinicGalleryPhotos[($i * 3 + $g) % count($clinicGalleryPhotos)];
|
||||
$galleryArr[] = ['fid'=>rand(10000,999999),'uuid'=>uuid(),'url'=>$photo['url'],
|
||||
'filename'=>$photo['file'],'filemime'=>'image/jpeg','filesize'=>rand(60000,200000)];
|
||||
}
|
||||
$logoPhoto = $clinicLogoPhotos[$i % count($clinicLogoPhotos)];
|
||||
$logoArr = [['fid'=>rand(10000,999999),'uuid'=>uuid(),'url'=>$logoPhoto['url'],
|
||||
'filename'=>$logoPhoto['file'],'filemime'=>'image/jpeg','filesize'=>rand(20000,50000)]];
|
||||
|
||||
$clStmt->execute([
|
||||
uuid(), $name,
|
||||
'ارائه خدمات تخصصی پزشکی با استفاده از جدیدترین تجهیزات و کادر درمانی مجرب.',
|
||||
$addr, $tel, $is247, ri($workingDaysList), $lat, $lon,
|
||||
$cityId, $provId > 0 ? $provId : null,
|
||||
json_encode($galleryArr, JSON_UNESCAPED_UNICODE),
|
||||
json_encode($logoArr, JSON_UNESCAPED_UNICODE),
|
||||
$ts, $ts, $ownerId
|
||||
]);
|
||||
$clinicId = (int)$pdo->lastInsertId();
|
||||
$clinicIds[] = $clinicId;
|
||||
|
||||
// 3-6 doctors per clinic
|
||||
$numDocs = rand(3, 6);
|
||||
$addedDocs = 0;
|
||||
while ($addedDocs < $numDocs && $poolIdx < count($clinicDoctorPool)) {
|
||||
$clDStmt->execute([$clinicId, $clinicDoctorPool[$poolIdx++]]);
|
||||
$addedDocs++;
|
||||
}
|
||||
|
||||
// 2-4 specialties
|
||||
foreach (ris($specParents, 2, 4) as $spId) {
|
||||
$clSpStmt->execute([$clinicId, $spId]);
|
||||
}
|
||||
// 3-6 services
|
||||
foreach (ris($serviceIds, 3, 6) as $svId) {
|
||||
$clSvStmt->execute([$clinicId, $svId]);
|
||||
}
|
||||
// 3-6 insurances
|
||||
foreach (ris($insIds, 3, 6) as $inId) {
|
||||
$clInStmt->execute([$clinicId, $inId]);
|
||||
}
|
||||
|
||||
if (($i + 1) % 50 === 0) {
|
||||
$pdo->commit();
|
||||
$pdo->beginTransaction();
|
||||
echo " Clinics: " . ($i + 1) . "\n";
|
||||
}
|
||||
}
|
||||
$pdo->commit();
|
||||
echo 'Total clinics: ' . count($clinicIds) . "\n";
|
||||
|
||||
// ── STEP 8 — Appointments (8000) ──────────────────────────────────────────────
|
||||
echo "=== Inserting appointments (8000) ===\n";
|
||||
$apptStmt = $pdo->prepare(
|
||||
'INSERT INTO appointments (uuid,slot_start,slot_end,status,note,created_at,updated_at,doctor_id,user_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?)'
|
||||
);
|
||||
$apptIds = [];
|
||||
$apptStatusArr = [];
|
||||
$notes = ['','مراجعه اول','پیگیری','نوبت اضطراری','مشاوره','کنترل دورهای','آزمایش تکمیلی','چکاپ سالانه'];
|
||||
|
||||
function wRand(array $items, array $weights): mixed {
|
||||
$total = array_sum($weights); $r = rand(1, $total); $c = 0;
|
||||
foreach ($items as $k => $item) { $c += $weights[$k]; if ($r <= $c) return $item; }
|
||||
return $items[0];
|
||||
}
|
||||
|
||||
$pdo->beginTransaction();
|
||||
for ($i = 0; $i < 8000; $i++) {
|
||||
$doctorId = ri($doctorIds);
|
||||
$userId = ri($patientIds);
|
||||
$status = wRand($apptStatuses, $apptWeights);
|
||||
|
||||
if (in_array($status, ['visited','completed','no_show','cancelled_by_user','cancelled_by_doctor','checked_in'])) {
|
||||
$slotStart = $now - rand(3600, 86400 * 365);
|
||||
} else {
|
||||
$slotStart = $now + rand(3600, 86400 * 45);
|
||||
}
|
||||
$slotEnd = $slotStart + 1800;
|
||||
$ts = $slotStart - rand(3600, 86400 * 14);
|
||||
|
||||
$apptStmt->execute([uuid(), $slotStart, $slotEnd, $status, ri($notes), $ts, $ts, $doctorId, $userId]);
|
||||
$apptId = (int)$pdo->lastInsertId();
|
||||
$apptIds[] = $apptId;
|
||||
$apptStatusArr[] = $status;
|
||||
|
||||
if (($i + 1) % 1000 === 0) {
|
||||
$pdo->commit();
|
||||
$pdo->beginTransaction();
|
||||
echo " Appointments: " . ($i + 1) . "\n";
|
||||
}
|
||||
}
|
||||
$pdo->commit();
|
||||
|
||||
// ── STEP 9 — Payments ─────────────────────────────────────────────────────────
|
||||
echo "=== Inserting payments ===\n";
|
||||
$payStmt = $pdo->prepare(
|
||||
'INSERT INTO payments (uuid,order_id,amount_rials,status,gateway,type,reference_id,created_at,updated_at,user_id,appointment_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?)'
|
||||
);
|
||||
$gateways = ['mellat','sep','zarinpal','parsian','sadad'];
|
||||
$amounts = [1500000,2000000,2500000,3000000,3500000,4000000,4500000,5000000,5500000,6000000,7000000,8000000];
|
||||
|
||||
$pdo->beginTransaction();
|
||||
$payCount = 0;
|
||||
foreach ($apptIds as $k => $apptId) {
|
||||
$st = $apptStatusArr[$k];
|
||||
if (!in_array($st, ['visited','completed','reserved','waiting','checked_in'])) continue;
|
||||
$payStatus = in_array($st, ['visited','completed','checked_in']) ? 'paid' : ri(['paid','pending']);
|
||||
$userId = ri($patientIds);
|
||||
$ts = $now - rand(3600, 86400 * 365);
|
||||
$refId = $payStatus === 'paid' ? (string)rand(100000000, 999999999) : null;
|
||||
$payStmt->execute([
|
||||
uuid(), 'ORD-' . strtoupper(substr(uuid(), 0, 8)), ri($amounts),
|
||||
$payStatus, ri($gateways), 'appointment', $refId, $ts, $ts, $userId, $apptId
|
||||
]);
|
||||
$payCount++;
|
||||
if ($payCount % 1000 === 0) {
|
||||
$pdo->commit();
|
||||
$pdo->beginTransaction();
|
||||
echo " Payments: $payCount\n";
|
||||
}
|
||||
}
|
||||
$pdo->commit();
|
||||
echo "Total payments: $payCount\n";
|
||||
|
||||
// ── STEP 10 — Ratings ─────────────────────────────────────────────────────────
|
||||
echo "=== Inserting ratings (3000) ===\n";
|
||||
$rateStmt = $pdo->prepare('INSERT INTO rates (uuid,score,created_at,updated_at,user_id,doctor_id) VALUES (?,?,?,?,?,?)');
|
||||
$usedPairs = [];
|
||||
$rateCount = 0;
|
||||
$pdo->beginTransaction();
|
||||
$tries = 0;
|
||||
while ($rateCount < 3000 && $tries < 20000) {
|
||||
$tries++;
|
||||
$doctorId = ri($doctorIds);
|
||||
$userId = ri($patientIds);
|
||||
$key = $userId . '-' . $doctorId;
|
||||
if (isset($usedPairs[$key])) continue;
|
||||
$usedPairs[$key] = true;
|
||||
$score = wRand([1,2,3,4,5], [3,5,15,35,42]);
|
||||
$ts = $now - rand(3600, 86400 * 400);
|
||||
$rateStmt->execute([uuid(), $score, $ts, $ts, $userId, $doctorId]);
|
||||
$rateCount++;
|
||||
if ($rateCount % 1000 === 0) {
|
||||
$pdo->commit();
|
||||
$pdo->beginTransaction();
|
||||
echo " Ratings: $rateCount\n";
|
||||
}
|
||||
}
|
||||
$pdo->commit();
|
||||
echo "Total ratings: $rateCount\n";
|
||||
|
||||
// ── STEP 11 — Comments ────────────────────────────────────────────────────────
|
||||
echo "=== Inserting comments (2000) ===\n";
|
||||
$comStmt = $pdo->prepare('INSERT INTO comments (uuid,body,status,created_at,updated_at,user_id,doctor_id) VALUES (?,?,?,?,?,?,?)');
|
||||
$comStatuses = ['approved','approved','approved','approved','pending','rejected'];
|
||||
$pdo->beginTransaction();
|
||||
for ($i = 0; $i < 2000; $i++) {
|
||||
$ts = $now - rand(3600, 86400 * 400);
|
||||
$comStmt->execute([uuid(), ri($commentTexts), ri($comStatuses), $ts, $ts, ri($patientIds), ri($doctorIds)]);
|
||||
if (($i + 1) % 500 === 0) {
|
||||
$pdo->commit();
|
||||
$pdo->beginTransaction();
|
||||
echo " Comments: " . ($i + 1) . "\n";
|
||||
}
|
||||
}
|
||||
$pdo->commit();
|
||||
|
||||
// ── STEP 12 — Blogs ───────────────────────────────────────────────────────────
|
||||
echo "=== Inserting blogs ===\n";
|
||||
$blogStmt = $pdo->prepare(
|
||||
'INSERT INTO blogs (uuid,title,slug,body,summary,tags,status,created_at,updated_at,author_id)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?)'
|
||||
);
|
||||
$blogData = [
|
||||
['راهنمای جامع پیشگیری از بیماریهای قلبی','heart-disease-prevention','بیماریهای قلبی از مهمترین علل مرگ هستند. با تغذیه سالم، ورزش منظم، ترک سیگار و کنترل فشار خون میتوان خطر ابتلا را به شدت کاهش داد. چکاپ سالیانه و مشاوره با متخصص قلب توصیه میشود.',['قلب','پیشگیری','سلامت']],
|
||||
['تغذیه سالم برای کودکان در سنین رشد','healthy-nutrition-children','مصرف متعادل پروتئین، لبنیات، میوه و سبزیجات برای رشد کودکان ضروری است. از مصرف قند و چربی اشباع بپرهیزید و آب کافی بنوشید.',['کودکان','تغذیه','رشد']],
|
||||
['اهمیت چکاپ منظم سالانه برای همه سنین','annual-checkup-importance','آزمایش خون، فشار خون، قند خون و تستهای غربالگری سرطان باید سالانه انجام شوند. تشخیص زودهنگام درمان را سادهتر میکند.',['چکاپ','پیشگیری','غربالگری']],
|
||||
['مدیریت استرس و اضطراب در زندگی مدرن','stress-management','تکنیکهای تنفس عمیق، مدیتیشن، ورزش منظم و ارتباط اجتماعی سالم از راهکارهای موثر مدیریت استرس هستند.',['استرس','سلامت روان','مدیتیشن']],
|
||||
['دیابت نوع ۲: علائم، پیشگیری و کنترل','diabetes-type2','تشنگی زیاد، ادرار مکرر، خستگی و تاری دید از علائم دیابت هستند. رژیم غذایی مناسب، ورزش و کنترل وزن در پیشگیری و مدیریت آن حیاتی است.',['دیابت','قند خون','پیشگیری']],
|
||||
['نقش ورزش در سلامت قلب و عروق','exercise-cardiovascular-health','۱۵۰ دقیقه فعالیت هوازی متوسط در هفته برای سلامت قلب توصیه میشود. پیادهروی، شنا و دوچرخهسواری گزینههای عالی هستند.',['ورزش','قلب','سلامت']],
|
||||
['خواب کافی و تاثیر آن بر سلامت جسم و روان','sleep-health','بزرگسالان به ۷-۹ ساعت خواب شبانه نیاز دارند. کمبود خواب با دیابت، چاقی، افسردگی و بیماری قلبی ارتباط دارد.',['خواب','سلامت','استراحت']],
|
||||
['مراقبت از پوست در برابر آفتاب و آلودگی','skin-care-sun-pollution','استفاده از کرم ضدآفتاب با SPF 30+، پوشش مناسب و آنتیاکسیدانها به محافظت از پوست کمک میکنند.',['پوست','ضدآفتاب','آلودگی']],
|
||||
['پیشگیری از پوکی استخوان با تغذیه مناسب','osteoporosis-prevention','مصرف کافی کلسیم، ویتامین D، ورزش با وزن بدن و پرهیز از سیگار و الکل از مهمترین راهکارهای پیشگیری از پوکی استخوان هستند.',['استخوان','کلسیم','پیشگیری']],
|
||||
['راهنمای کامل مراقبت از بینایی','eye-care-guide','معاینه سالانه چشم، استفاده از عینک آفتابی مناسب، رعایت قانون ۲۰-۲۰-۲۰ هنگام کار با صفحه نمایش و تغذیه سرشار از لوتئین برای سلامت چشم ضروری است.',['چشم','بینایی','سلامت']],
|
||||
['سرطان پستان: تشخیص زودهنگام نجاتبخش است','breast-cancer-early-detection','معاینه خودآزمایی ماهانه، ماموگرافی سالانه برای زنان بالای ۴۰ سال و مراجعه به پزشک در صورت تغییرات مشکوک توصیه میشود.',['سرطان','پستان','غربالگری']],
|
||||
['بهداشت دهان و دندان در همه سنین','dental-hygiene','مسواک زدن دو بار در روز، استفاده از نخ دندان و مراجعه به دندانپزشک هر ۶ ماه یکبار از اساسیترین اصول بهداشت دهان است.',['دندان','بهداشت','پیشگیری']],
|
||||
['کنترل فشار خون بالا با تغییر سبک زندگی','high-blood-pressure-control','کاهش مصرف نمک، کنترل وزن، ورزش منظم، پرهیز از استرس و مصرف منظم داروها در کنترل فشار خون ضروری هستند.',['فشار خون','قلب','سبک زندگی']],
|
||||
['واکسیناسیون بزرگسالان؛ آنچه باید بدانید','adult-vaccination-guide','آنفلوانزا، کزاز، هپاتیت B، آبله مرغان و واکسن HPV از واکسنهای مهم بزرگسالی هستند. برنامه واکسیناسیون را با پزشک خود مشورت کنید.',['واکسن','پیشگیری','بیماری']],
|
||||
['آرتروز زانو: درمان و بازتوانی','knee-osteoarthritis-treatment','فیزیوتراپی، ورزشهای تقویتی، کاهش وزن و در موارد پیشرفته جراحی از روشهای درمان آرتروز زانو هستند.',['آرتروز','زانو','ارتوپدی']],
|
||||
['تغذیه درمانی در بیماریهای کلیوی','renal-diet','رژیم کمپتاسیم، کمفسفر و کمسدیم برای بیماران کلیوی ضروری است. مقدار پروتئین مصرفی باید با پزشک هماهنگ شود.',['کلیه','تغذیه','رژیم']],
|
||||
['سلامت روان در محیط کار','workplace-mental-health','تعادل کار و زندگی، ارتباط موثر با همکاران، مدیریت زمان و استراحت کافی از عوامل مهم سلامت روان در محیط کار هستند.',['سلامت روان','کار','استرس']],
|
||||
['آلرژی فصلی و راهکارهای مقابله','seasonal-allergy-management','اجتناب از محرکها، استفاده از داروهای آنتیهیستامین، شستن منظم دست و چشم و مشاوره با متخصص آلرژی از راهکارهای اصلی هستند.',['آلرژی','تنفس','بهار']],
|
||||
['اهمیت ورزش در دوران بارداری','pregnancy-exercise','پیادهروی، شنا و یوگای بارداری با نظر پزشک برای سلامت مادر و جنین مفید هستند. از ورزشهای پرضربه پرهیز کنید.',['بارداری','ورزش','سلامت']],
|
||||
['پیشگیری از سرطان روده بزرگ','colorectal-cancer-prevention','غربالگری با کولونوسکوپی از سن ۴۵ سالگی، رژیم پرفیبر، کاهش مصرف گوشت قرمز و ورزش منظم خطر را کاهش میدهند.',['سرطان','روده','غربالگری']],
|
||||
];
|
||||
$adminRow = $pdo->query("SELECT id FROM users WHERE roles LIKE '%ROLE_ADMIN%' LIMIT 1")->fetch(PDO::FETCH_ASSOC);
|
||||
$adminId = $adminRow ? $adminRow['id'] : $doctorUserIds[0];
|
||||
$statuses = ['published','published','published','published','published','draft'];
|
||||
foreach ($blogData as $idx => $b) {
|
||||
$ts = $now - rand(86400, 86400 * 300);
|
||||
$blogStmt->execute([
|
||||
uuid(), $b[0], $b[1] . '-' . rand(100,999), $b[2],
|
||||
mb_substr($b[2], 0, 200), json_encode($b[3], JSON_UNESCAPED_UNICODE),
|
||||
ri($statuses), $ts, $ts, $adminId
|
||||
]);
|
||||
}
|
||||
echo 'Blogs: ' . count($blogData) . "\n";
|
||||
|
||||
$pdo->exec('SET FOREIGN_KEY_CHECKS = 1');
|
||||
|
||||
// ── Summary ───────────────────────────────────────────────────────────────────
|
||||
echo "\n=== COMPLETE — Record counts ===\n";
|
||||
$tables = ['users','doctors','clinics','clinic_doctors','clinic_specialties','clinic_services','clinic_insurances',
|
||||
'doctor_specialties','doctor_expertise','doctor_provinces','doctor_cities','doctor_addresses',
|
||||
'appointments','payments','rates','comments','blogs','insurances','profiles'];
|
||||
$total = 0;
|
||||
foreach ($tables as $t) {
|
||||
$c = (int)$pdo->query("SELECT COUNT(*) FROM `$t`")->fetchColumn();
|
||||
printf(" %-30s %d\n", $t . ':', $c);
|
||||
$total += $c;
|
||||
}
|
||||
echo "\nTotal records: $total\n";
|
||||
@@ -1,770 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "1",
|
||||
"name": "پزشکی داخلی",
|
||||
"parent": null,
|
||||
"slug": "internal-medicine"
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"name": "داخلی عمومی",
|
||||
"parent": "1",
|
||||
"slug": "general-internal-medicine"
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
"name": "قلب و عروق (کاردیولوژی)",
|
||||
"parent": "1",
|
||||
"slug": "cardiology"
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"name": "گوارش و کبد (گاستروانترولوژی)",
|
||||
"parent": "1",
|
||||
"slug": "gastroenterology"
|
||||
},
|
||||
{
|
||||
"id": "5",
|
||||
"name": "ریه (پولمونولوژی)",
|
||||
"parent": "1",
|
||||
"slug": "pulmonology"
|
||||
},
|
||||
{
|
||||
"id": "6",
|
||||
"name": "کلیه (نفرولوژی)",
|
||||
"parent": "1",
|
||||
"slug": "nephrology"
|
||||
},
|
||||
{
|
||||
"id": "7",
|
||||
"name": "غدد درونریز (اندوکرینولوژی)",
|
||||
"parent": "1",
|
||||
"slug": "endocrinology"
|
||||
},
|
||||
{
|
||||
"id": "8",
|
||||
"name": "روماتولوژی (مفاصل و بافت همبند)",
|
||||
"parent": "1",
|
||||
"slug": "rheumatology"
|
||||
},
|
||||
{
|
||||
"id": "9",
|
||||
"name": "خونشناسی (هماتولوژی)",
|
||||
"parent": "1",
|
||||
"slug": "hematology"
|
||||
},
|
||||
{
|
||||
"id": "10",
|
||||
"name": "نورولوژی (مغز و اعصاب)",
|
||||
"parent": "1",
|
||||
"slug": "neurology"
|
||||
},
|
||||
{
|
||||
"id": "11",
|
||||
"name": "آلرژی و ایمونولوژی بالینی",
|
||||
"parent": "1",
|
||||
"slug": "allergy-immunology"
|
||||
},
|
||||
{
|
||||
"id": "12",
|
||||
"name": "بیماریهای عفونی",
|
||||
"parent": "1",
|
||||
"slug": "infectious-diseases"
|
||||
},
|
||||
{
|
||||
"id": "20",
|
||||
"name": "جراحی",
|
||||
"parent": null,
|
||||
"slug": "surgery"
|
||||
},
|
||||
{
|
||||
"id": "21",
|
||||
"name": "جراحی عمومی",
|
||||
"parent": "20",
|
||||
"slug": "general-surgery"
|
||||
},
|
||||
{
|
||||
"id": "22",
|
||||
"name": "جراحی مغز و اعصاب (نوروسرجری)",
|
||||
"parent": "20",
|
||||
"slug": "neurosurgery"
|
||||
},
|
||||
{
|
||||
"id": "23",
|
||||
"name": "جراحی قلب و عروق",
|
||||
"parent": "20",
|
||||
"slug": "cardiac-surgery"
|
||||
},
|
||||
{
|
||||
"id": "24",
|
||||
"name": "جراحی عروق محیطی",
|
||||
"parent": "20",
|
||||
"slug": "vascular-surgery"
|
||||
},
|
||||
{
|
||||
"id": "25",
|
||||
"name": "جراحی پلاستیک و ترمیمی",
|
||||
"parent": "20",
|
||||
"slug": "plastic-reconstructive-surgery"
|
||||
},
|
||||
{
|
||||
"id": "26",
|
||||
"name": "جراحی کودکان",
|
||||
"parent": "20",
|
||||
"slug": "pediatric-surgery"
|
||||
},
|
||||
{
|
||||
"id": "27",
|
||||
"name": "جراحی دستگاه گوارش (کولورکتال)",
|
||||
"parent": "20",
|
||||
"slug": "colorectal-surgery"
|
||||
},
|
||||
{
|
||||
"id": "28",
|
||||
"name": "جراحی توراکس (قفسه سینه)",
|
||||
"parent": "20",
|
||||
"slug": "thoracic-surgery"
|
||||
},
|
||||
{
|
||||
"id": "29",
|
||||
"name": "جراحی دست",
|
||||
"parent": "20",
|
||||
"slug": "hand-surgery"
|
||||
},
|
||||
{
|
||||
"id": "30",
|
||||
"name": "جراحی پیوند اعضا",
|
||||
"parent": "20",
|
||||
"slug": "transplant-surgery"
|
||||
},
|
||||
{
|
||||
"id": "40",
|
||||
"name": "اطفال (کودکان)",
|
||||
"parent": null,
|
||||
"slug": "pediatrics"
|
||||
},
|
||||
{
|
||||
"id": "41",
|
||||
"name": "اطفال عمومی",
|
||||
"parent": "40",
|
||||
"slug": "general-pediatrics"
|
||||
},
|
||||
{
|
||||
"id": "42",
|
||||
"name": "نوزادان (نئوناتولوژی)",
|
||||
"parent": "40",
|
||||
"slug": "neonatology"
|
||||
},
|
||||
{
|
||||
"id": "43",
|
||||
"name": "قلب اطفال",
|
||||
"parent": "40",
|
||||
"slug": "pediatric-cardiology"
|
||||
},
|
||||
{
|
||||
"id": "44",
|
||||
"name": "مغز و اعصاب اطفال",
|
||||
"parent": "40",
|
||||
"slug": "pediatric-neurology"
|
||||
},
|
||||
{
|
||||
"id": "45",
|
||||
"name": "گوارش اطفال",
|
||||
"parent": "40",
|
||||
"slug": "pediatric-gastroenterology"
|
||||
},
|
||||
{
|
||||
"id": "46",
|
||||
"name": "کلیه اطفال",
|
||||
"parent": "40",
|
||||
"slug": "pediatric-nephrology"
|
||||
},
|
||||
{
|
||||
"id": "47",
|
||||
"name": "خون و انکولوژی اطفال",
|
||||
"parent": "40",
|
||||
"slug": "pediatric-hematology-oncology"
|
||||
},
|
||||
{
|
||||
"id": "48",
|
||||
"name": "ریه اطفال",
|
||||
"parent": "40",
|
||||
"slug": "pediatric-pulmonology"
|
||||
},
|
||||
{
|
||||
"id": "49",
|
||||
"name": "روماتولوژی اطفال",
|
||||
"parent": "40",
|
||||
"slug": "pediatric-rheumatology"
|
||||
},
|
||||
{
|
||||
"id": "50",
|
||||
"name": "غدد اطفال (اندوکرینولوژی اطفال)",
|
||||
"parent": "40",
|
||||
"slug": "pediatric-endocrinology"
|
||||
},
|
||||
{
|
||||
"id": "51",
|
||||
"name": "بیماریهای عفونی اطفال",
|
||||
"parent": "40",
|
||||
"slug": "pediatric-infectious-diseases"
|
||||
},
|
||||
{
|
||||
"id": "52",
|
||||
"name": "آلرژی اطفال",
|
||||
"parent": "40",
|
||||
"slug": "pediatric-allergy"
|
||||
},
|
||||
{
|
||||
"id": "60",
|
||||
"name": "زنان و زایمان",
|
||||
"parent": null,
|
||||
"slug": "obstetrics-gynecology"
|
||||
},
|
||||
{
|
||||
"id": "61",
|
||||
"name": "زنان و زایمان عمومی",
|
||||
"parent": "60",
|
||||
"slug": "general-obstetrics-gynecology"
|
||||
},
|
||||
{
|
||||
"id": "62",
|
||||
"name": "ناباروری و IVF",
|
||||
"parent": "60",
|
||||
"slug": "infertility-ivf"
|
||||
},
|
||||
{
|
||||
"id": "63",
|
||||
"name": "پریناتولوژی (مراقبت مادر و جنین)",
|
||||
"parent": "60",
|
||||
"slug": "perinatology"
|
||||
},
|
||||
{
|
||||
"id": "64",
|
||||
"name": "انکولوژی زنان",
|
||||
"parent": "60",
|
||||
"slug": "gynecologic-oncology"
|
||||
},
|
||||
{
|
||||
"id": "65",
|
||||
"name": "اورولوژی زنان",
|
||||
"parent": "60",
|
||||
"slug": "urogynecology"
|
||||
},
|
||||
{
|
||||
"id": "70",
|
||||
"name": "روانپزشکی",
|
||||
"parent": null,
|
||||
"slug": "psychiatry"
|
||||
},
|
||||
{
|
||||
"id": "71",
|
||||
"name": "روانپزشکی عمومی",
|
||||
"parent": "70",
|
||||
"slug": "general-psychiatry"
|
||||
},
|
||||
{
|
||||
"id": "72",
|
||||
"name": "روانپزشکی کودکان و نوجوانان",
|
||||
"parent": "70",
|
||||
"slug": "child-adolescent-psychiatry"
|
||||
},
|
||||
{
|
||||
"id": "73",
|
||||
"name": "روانپزشکی سالمندان",
|
||||
"parent": "70",
|
||||
"slug": "geriatric-psychiatry"
|
||||
},
|
||||
{
|
||||
"id": "74",
|
||||
"name": "اعتیاد و سوءمصرف مواد",
|
||||
"parent": "70",
|
||||
"slug": "addiction-psychiatry"
|
||||
},
|
||||
{
|
||||
"id": "80",
|
||||
"name": "پوست و مو (درماتولوژی)",
|
||||
"parent": null,
|
||||
"slug": "dermatology"
|
||||
},
|
||||
{
|
||||
"id": "81",
|
||||
"name": "درماتولوژی بالینی",
|
||||
"parent": "80",
|
||||
"slug": "clinical-dermatology"
|
||||
},
|
||||
{
|
||||
"id": "82",
|
||||
"name": "زیبایی پوست و لیزر",
|
||||
"parent": "80",
|
||||
"slug": "cosmetic-dermatology-laser"
|
||||
},
|
||||
{
|
||||
"id": "83",
|
||||
"name": "جراحی پوست",
|
||||
"parent": "80",
|
||||
"slug": "dermatologic-surgery"
|
||||
},
|
||||
{
|
||||
"id": "84",
|
||||
"name": "تریکولوژی (بیماریهای مو)",
|
||||
"parent": "80",
|
||||
"slug": "trichology"
|
||||
},
|
||||
{
|
||||
"id": "90",
|
||||
"name": "چشمپزشکی (افتالمولوژی)",
|
||||
"parent": null,
|
||||
"slug": "ophthalmology"
|
||||
},
|
||||
{
|
||||
"id": "91",
|
||||
"name": "چشمپزشکی عمومی",
|
||||
"parent": "90",
|
||||
"slug": "general-ophthalmology"
|
||||
},
|
||||
{
|
||||
"id": "92",
|
||||
"name": "شبکیه و زجاجیه",
|
||||
"parent": "90",
|
||||
"slug": "retina-vitreous"
|
||||
},
|
||||
{
|
||||
"id": "93",
|
||||
"name": "گلوکوم (آب سیاه)",
|
||||
"parent": "90",
|
||||
"slug": "glaucoma"
|
||||
},
|
||||
{
|
||||
"id": "94",
|
||||
"name": "قرنیه و سطح چشم",
|
||||
"parent": "90",
|
||||
"slug": "cornea-ocular-surface"
|
||||
},
|
||||
{
|
||||
"id": "95",
|
||||
"name": "استرابیسم (انحراف چشم)",
|
||||
"parent": "90",
|
||||
"slug": "strabismus"
|
||||
},
|
||||
{
|
||||
"id": "96",
|
||||
"name": "جراحی ریفرکتیو (لیزیک)",
|
||||
"parent": "90",
|
||||
"slug": "refractive-surgery-lasik"
|
||||
},
|
||||
{
|
||||
"id": "97",
|
||||
"name": "چشمپزشکی کودکان",
|
||||
"parent": "90",
|
||||
"slug": "pediatric-ophthalmology"
|
||||
},
|
||||
{
|
||||
"id": "98",
|
||||
"name": "نئوروافتالمولوژی",
|
||||
"parent": "90",
|
||||
"slug": "neuro-ophthalmology"
|
||||
},
|
||||
{
|
||||
"id": "100",
|
||||
"name": "گوش، حلق و بینی (ENT)",
|
||||
"parent": null,
|
||||
"slug": "ent"
|
||||
},
|
||||
{
|
||||
"id": "101",
|
||||
"name": "گوش، حلق و بینی عمومی",
|
||||
"parent": "100",
|
||||
"slug": "general-ent"
|
||||
},
|
||||
{
|
||||
"id": "102",
|
||||
"name": "اتولوژی (بیماریهای گوش)",
|
||||
"parent": "100",
|
||||
"slug": "otology"
|
||||
},
|
||||
{
|
||||
"id": "103",
|
||||
"name": "رینولوژی (بیماریهای بینی)",
|
||||
"parent": "100",
|
||||
"slug": "rhinology"
|
||||
},
|
||||
{
|
||||
"id": "104",
|
||||
"name": "لارنگولوژی (بیماریهای حنجره)",
|
||||
"parent": "100",
|
||||
"slug": "laryngology"
|
||||
},
|
||||
{
|
||||
"id": "105",
|
||||
"name": "انکولوژی سر و گردن",
|
||||
"parent": "100",
|
||||
"slug": "head-neck-oncology"
|
||||
},
|
||||
{
|
||||
"id": "106",
|
||||
"name": "شنواییشناسی (ادیولوژی)",
|
||||
"parent": "100",
|
||||
"slug": "audiology"
|
||||
},
|
||||
{
|
||||
"id": "110",
|
||||
"name": "ارتوپدی",
|
||||
"parent": null,
|
||||
"slug": "orthopedics"
|
||||
},
|
||||
{
|
||||
"id": "111",
|
||||
"name": "ارتوپدی عمومی",
|
||||
"parent": "110",
|
||||
"slug": "general-orthopedics"
|
||||
},
|
||||
{
|
||||
"id": "112",
|
||||
"name": "آرتروسکوپی و آسیبهای ورزشی",
|
||||
"parent": "110",
|
||||
"slug": "arthroscopy-sports-medicine"
|
||||
},
|
||||
{
|
||||
"id": "113",
|
||||
"name": "جراحی ستون فقرات",
|
||||
"parent": "110",
|
||||
"slug": "spine-surgery"
|
||||
},
|
||||
{
|
||||
"id": "114",
|
||||
"name": "آرتروپلاستی (تعویض مفصل)",
|
||||
"parent": "110",
|
||||
"slug": "arthroplasty"
|
||||
},
|
||||
{
|
||||
"id": "115",
|
||||
"name": "ارتوپدی اطفال",
|
||||
"parent": "110",
|
||||
"slug": "pediatric-orthopedics"
|
||||
},
|
||||
{
|
||||
"id": "116",
|
||||
"name": "تروما و شکستگی",
|
||||
"parent": "110",
|
||||
"slug": "trauma-fracture"
|
||||
},
|
||||
{
|
||||
"id": "117",
|
||||
"name": "جراحی دست و مچ",
|
||||
"parent": "110",
|
||||
"slug": "hand-wrist-surgery"
|
||||
},
|
||||
{
|
||||
"id": "118",
|
||||
"name": "جراحی پا و مچ پا",
|
||||
"parent": "110",
|
||||
"slug": "foot-ankle-surgery"
|
||||
},
|
||||
{
|
||||
"id": "120",
|
||||
"name": "اورولوژی (مجاری ادراری و تناسلی)",
|
||||
"parent": null,
|
||||
"slug": "urology"
|
||||
},
|
||||
{
|
||||
"id": "121",
|
||||
"name": "اورولوژی عمومی",
|
||||
"parent": "120",
|
||||
"slug": "general-urology"
|
||||
},
|
||||
{
|
||||
"id": "122",
|
||||
"name": "انکولوژی اورولوژی",
|
||||
"parent": "120",
|
||||
"slug": "urologic-oncology"
|
||||
},
|
||||
{
|
||||
"id": "123",
|
||||
"name": "اندواورولوژی (سنگ کلیه)",
|
||||
"parent": "120",
|
||||
"slug": "endourology"
|
||||
},
|
||||
{
|
||||
"id": "124",
|
||||
"name": "آندرولوژی (ناباروری مردان)",
|
||||
"parent": "120",
|
||||
"slug": "andrology"
|
||||
},
|
||||
{
|
||||
"id": "125",
|
||||
"name": "اورودینامیک",
|
||||
"parent": "120",
|
||||
"slug": "urodynamics"
|
||||
},
|
||||
{
|
||||
"id": "130",
|
||||
"name": "رادیولوژی و تصویربرداری پزشکی",
|
||||
"parent": null,
|
||||
"slug": "radiology-imaging"
|
||||
},
|
||||
{
|
||||
"id": "131",
|
||||
"name": "رادیولوژی تشخیصی",
|
||||
"parent": "130",
|
||||
"slug": "diagnostic-radiology"
|
||||
},
|
||||
{
|
||||
"id": "132",
|
||||
"name": "رادیولوژی مداخلهای",
|
||||
"parent": "130",
|
||||
"slug": "interventional-radiology"
|
||||
},
|
||||
{
|
||||
"id": "133",
|
||||
"name": "سونوگرافی",
|
||||
"parent": "130",
|
||||
"slug": "ultrasonography"
|
||||
},
|
||||
{
|
||||
"id": "134",
|
||||
"name": "نورورادیولوژی",
|
||||
"parent": "130",
|
||||
"slug": "neuroradiology"
|
||||
},
|
||||
{
|
||||
"id": "135",
|
||||
"name": "رادیولوژی اطفال",
|
||||
"parent": "130",
|
||||
"slug": "pediatric-radiology"
|
||||
},
|
||||
{
|
||||
"id": "140",
|
||||
"name": "پاتولوژی (آسیبشناسی)",
|
||||
"parent": null,
|
||||
"slug": "pathology"
|
||||
},
|
||||
{
|
||||
"id": "141",
|
||||
"name": "پاتولوژی آناتومیک",
|
||||
"parent": "140",
|
||||
"slug": "anatomic-pathology"
|
||||
},
|
||||
{
|
||||
"id": "142",
|
||||
"name": "پاتولوژی بالینی",
|
||||
"parent": "140",
|
||||
"slug": "clinical-pathology"
|
||||
},
|
||||
{
|
||||
"id": "143",
|
||||
"name": "سیتولوژی",
|
||||
"parent": "140",
|
||||
"slug": "cytology"
|
||||
},
|
||||
{
|
||||
"id": "144",
|
||||
"name": "پاتولوژی مولکولی",
|
||||
"parent": "140",
|
||||
"slug": "molecular-pathology"
|
||||
},
|
||||
{
|
||||
"id": "150",
|
||||
"name": "انکولوژی (سرطانشناسی)",
|
||||
"parent": null,
|
||||
"slug": "oncology"
|
||||
},
|
||||
{
|
||||
"id": "151",
|
||||
"name": "انکولوژی پزشکی",
|
||||
"parent": "150",
|
||||
"slug": "medical-oncology"
|
||||
},
|
||||
{
|
||||
"id": "152",
|
||||
"name": "رادیوتراپی انکولوژی",
|
||||
"parent": "150",
|
||||
"slug": "radiation-oncology"
|
||||
},
|
||||
{
|
||||
"id": "160",
|
||||
"name": "بیهوشی و مراقبتهای ویژه",
|
||||
"parent": null,
|
||||
"slug": "anesthesiology-critical-care"
|
||||
},
|
||||
{
|
||||
"id": "161",
|
||||
"name": "بیهوشی عمومی",
|
||||
"parent": "160",
|
||||
"slug": "general-anesthesiology"
|
||||
},
|
||||
{
|
||||
"id": "162",
|
||||
"name": "مراقبتهای ویژه (ICU/CCU)",
|
||||
"parent": "160",
|
||||
"slug": "critical-care-icu-ccu"
|
||||
},
|
||||
{
|
||||
"id": "163",
|
||||
"name": "بیهوشی اطفال",
|
||||
"parent": "160",
|
||||
"slug": "pediatric-anesthesiology"
|
||||
},
|
||||
{
|
||||
"id": "164",
|
||||
"name": "بیهوشی قلب",
|
||||
"parent": "160",
|
||||
"slug": "cardiac-anesthesiology"
|
||||
},
|
||||
{
|
||||
"id": "165",
|
||||
"name": "طب درد (پین مدیسین)",
|
||||
"parent": "160",
|
||||
"slug": "pain-medicine"
|
||||
},
|
||||
{
|
||||
"id": "170",
|
||||
"name": "طب فیزیکی و توانبخشی",
|
||||
"parent": null,
|
||||
"slug": "physical-medicine-rehabilitation"
|
||||
},
|
||||
{
|
||||
"id": "171",
|
||||
"name": "طب فیزیکی عمومی",
|
||||
"parent": "170",
|
||||
"slug": "general-physical-medicine"
|
||||
},
|
||||
{
|
||||
"id": "172",
|
||||
"name": "نوروتوانبخشی",
|
||||
"parent": "170",
|
||||
"slug": "neurorehabilitation"
|
||||
},
|
||||
{
|
||||
"id": "173",
|
||||
"name": "توانبخشی ارتوپدی",
|
||||
"parent": "170",
|
||||
"slug": "orthopedic-rehabilitation"
|
||||
},
|
||||
{
|
||||
"id": "180",
|
||||
"name": "دندانپزشکی",
|
||||
"parent": null,
|
||||
"slug": "dentistry"
|
||||
},
|
||||
{
|
||||
"id": "181",
|
||||
"name": "دندانپزشکی عمومی",
|
||||
"parent": "180",
|
||||
"slug": "general-dentistry"
|
||||
},
|
||||
{
|
||||
"id": "182",
|
||||
"name": "ارتودنسی",
|
||||
"parent": "180",
|
||||
"slug": "orthodontics"
|
||||
},
|
||||
{
|
||||
"id": "183",
|
||||
"name": "جراحی فک و صورت",
|
||||
"parent": "180",
|
||||
"slug": "oral-maxillofacial-surgery"
|
||||
},
|
||||
{
|
||||
"id": "184",
|
||||
"name": "پریودنتولوژی (بیماریهای لثه)",
|
||||
"parent": "180",
|
||||
"slug": "periodontology"
|
||||
},
|
||||
{
|
||||
"id": "185",
|
||||
"name": "اندودنتولوژی (درمان ریشه)",
|
||||
"parent": "180",
|
||||
"slug": "endodontics"
|
||||
},
|
||||
{
|
||||
"id": "186",
|
||||
"name": "پروتز دندان",
|
||||
"parent": "180",
|
||||
"slug": "prosthodontics"
|
||||
},
|
||||
{
|
||||
"id": "187",
|
||||
"name": "دندانپزشکی کودکان",
|
||||
"parent": "180",
|
||||
"slug": "pediatric-dentistry"
|
||||
},
|
||||
{
|
||||
"id": "188",
|
||||
"name": "ایمپلنت دندان",
|
||||
"parent": "180",
|
||||
"slug": "dental-implant"
|
||||
},
|
||||
{
|
||||
"id": "189",
|
||||
"name": "دندانپزشکی زیبایی",
|
||||
"parent": "180",
|
||||
"slug": "cosmetic-dentistry"
|
||||
},
|
||||
{
|
||||
"id": "190",
|
||||
"name": "طب اورژانس",
|
||||
"parent": null,
|
||||
"slug": "emergency-medicine"
|
||||
},
|
||||
{
|
||||
"id": "200",
|
||||
"name": "پزشکی خانواده و عمومی",
|
||||
"parent": null,
|
||||
"slug": "family-medicine"
|
||||
},
|
||||
{
|
||||
"id": "210",
|
||||
"name": "طب ورزشی",
|
||||
"parent": null,
|
||||
"slug": "sports-medicine"
|
||||
},
|
||||
{
|
||||
"id": "220",
|
||||
"name": "پزشکی هستهای",
|
||||
"parent": null,
|
||||
"slug": "nuclear-medicine"
|
||||
},
|
||||
{
|
||||
"id": "230",
|
||||
"name": "پزشکی قانونی",
|
||||
"parent": null,
|
||||
"slug": "forensic-medicine"
|
||||
},
|
||||
{
|
||||
"id": "240",
|
||||
"name": "پزشکی اجتماعی و پیشگیری",
|
||||
"parent": null,
|
||||
"slug": "community-preventive-medicine"
|
||||
},
|
||||
{
|
||||
"id": "250",
|
||||
"name": "طب سالمندان (جریاتریک)",
|
||||
"parent": null,
|
||||
"slug": "geriatrics"
|
||||
},
|
||||
{
|
||||
"id": "260",
|
||||
"name": "پزشکی شغلی",
|
||||
"parent": null,
|
||||
"slug": "occupational-medicine"
|
||||
},
|
||||
{
|
||||
"id": "270",
|
||||
"name": "ژنتیک پزشکی",
|
||||
"parent": null,
|
||||
"slug": "medical-genetics"
|
||||
},
|
||||
{
|
||||
"id": "280",
|
||||
"name": "میکروبیولوژی و ویروسشناسی پزشکی",
|
||||
"parent": null,
|
||||
"slug": "medical-microbiology-virology"
|
||||
},
|
||||
{
|
||||
"id": "290",
|
||||
"name": "پزشکی خواب",
|
||||
"parent": null,
|
||||
"slug": "sleep-medicine"
|
||||
}
|
||||
]
|
||||
-126
@@ -1,126 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "1",
|
||||
"name": "آذربایجان شرقی"
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"name": "آذربایجان غربی"
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
"name": "اردبیل"
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"name": "اصفهان"
|
||||
},
|
||||
{
|
||||
"id": "5",
|
||||
"name": "البرز"
|
||||
},
|
||||
{
|
||||
"id": "6",
|
||||
"name": "ایلام"
|
||||
},
|
||||
{
|
||||
"id": "7",
|
||||
"name": "بوشهر"
|
||||
},
|
||||
{
|
||||
"id": "8",
|
||||
"name": "تهران"
|
||||
},
|
||||
{
|
||||
"id": "9",
|
||||
"name": "چهارمحال و بختیاری"
|
||||
},
|
||||
{
|
||||
"id": "10",
|
||||
"name": "خراسان جنوبی"
|
||||
},
|
||||
{
|
||||
"id": "11",
|
||||
"name": "خراسان رضوی"
|
||||
},
|
||||
{
|
||||
"id": "12",
|
||||
"name": "خراسان شمالی"
|
||||
},
|
||||
{
|
||||
"id": "13",
|
||||
"name": "خوزستان"
|
||||
},
|
||||
{
|
||||
"id": "14",
|
||||
"name": "زنجان"
|
||||
},
|
||||
{
|
||||
"id": "15",
|
||||
"name": "سمنان"
|
||||
},
|
||||
{
|
||||
"id": "16",
|
||||
"name": "سیستان و بلوچستان"
|
||||
},
|
||||
{
|
||||
"id": "17",
|
||||
"name": "فارس"
|
||||
},
|
||||
{
|
||||
"id": "18",
|
||||
"name": "قزوین"
|
||||
},
|
||||
{
|
||||
"id": "19",
|
||||
"name": "قم"
|
||||
},
|
||||
{
|
||||
"id": "20",
|
||||
"name": "کردستان"
|
||||
},
|
||||
{
|
||||
"id": "21",
|
||||
"name": "کرمان"
|
||||
},
|
||||
{
|
||||
"id": "22",
|
||||
"name": "کرمانشاه"
|
||||
},
|
||||
{
|
||||
"id": "23",
|
||||
"name": "کهگیلویه و بویراحمد"
|
||||
},
|
||||
{
|
||||
"id": "24",
|
||||
"name": "گلستان"
|
||||
},
|
||||
{
|
||||
"id": "25",
|
||||
"name": "گیلان"
|
||||
},
|
||||
{
|
||||
"id": "26",
|
||||
"name": "لرستان"
|
||||
},
|
||||
{
|
||||
"id": "27",
|
||||
"name": "مازندران"
|
||||
},
|
||||
{
|
||||
"id": "28",
|
||||
"name": "مرکزی"
|
||||
},
|
||||
{
|
||||
"id": "29",
|
||||
"name": "هرمزگان"
|
||||
},
|
||||
{
|
||||
"id": "30",
|
||||
"name": "همدان"
|
||||
},
|
||||
{
|
||||
"id": "100",
|
||||
"name": "یزد"
|
||||
}
|
||||
]
|
||||
@@ -1,439 +0,0 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
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();
|
||||
$conn = $kernel->getContainer()->get('doctrine')->getManager()->getConnection();
|
||||
|
||||
$now = time();
|
||||
$passwordHash = password_hash('Test@1234', PASSWORD_BCRYPT);
|
||||
$mobileCounter = 9100100000; // شروع از 09100100000
|
||||
|
||||
// ── Helpers ──────────────────────────────────────────────────────────────────
|
||||
|
||||
function newUuid(): string
|
||||
{
|
||||
return 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)
|
||||
);
|
||||
}
|
||||
|
||||
function nextMobile(): string
|
||||
{
|
||||
global $mobileCounter;
|
||||
return '0' . $mobileCounter++;
|
||||
}
|
||||
|
||||
function makeSchedule(int $addressId, bool $fullWeek = true): string
|
||||
{
|
||||
$days = [];
|
||||
for ($i = 0; $i < 7; $i++) {
|
||||
if ($i === 6) {
|
||||
$days[] = ['sessions' => []];
|
||||
} elseif ($i === 5) {
|
||||
$days[] = ['sessions' => [
|
||||
['active' => true, 'location_id' => $addressId, 'start_time' => '09:00',
|
||||
'end_time' => '13:00', 'duration_per_patient' => 20,
|
||||
'has_rest' => false, 'rest_interval' => 60, 'time_to_rest' => 10, 'patient_limit' => null],
|
||||
]];
|
||||
} elseif ($fullWeek) {
|
||||
$days[] = ['sessions' => [
|
||||
['active' => true, 'location_id' => $addressId, 'start_time' => '09:00',
|
||||
'end_time' => '13:00', 'duration_per_patient' => 20,
|
||||
'has_rest' => true, 'rest_interval' => 60, 'time_to_rest' => 10, 'patient_limit' => null],
|
||||
['active' => true, 'location_id' => $addressId, 'start_time' => '14:00',
|
||||
'end_time' => '18:00', 'duration_per_patient' => 20,
|
||||
'has_rest' => false, 'rest_interval' => 60, 'time_to_rest' => 10, 'patient_limit' => null],
|
||||
]];
|
||||
} else {
|
||||
$days[] = ['sessions' => [
|
||||
['active' => true, 'location_id' => $addressId, 'start_time' => '09:00',
|
||||
'end_time' => '13:00', 'duration_per_patient' => 20,
|
||||
'has_rest' => false, 'rest_interval' => 60, 'time_to_rest' => 10, 'patient_limit' => null],
|
||||
]];
|
||||
}
|
||||
}
|
||||
return json_encode($days, JSON_UNESCAPED_UNICODE);
|
||||
}
|
||||
|
||||
// نگاشت شهر → استان
|
||||
$cityProvince = [
|
||||
101 => 1, 102 => 2, 103 => 3, 104 => 4, 105 => 5,
|
||||
106 => 6, 107 => 7, 108 => 8, 109 => 9, 110 => 10,
|
||||
111 => 11, 112 => 12, 113 => 13, 114 => 14, 115 => 15,
|
||||
116 => 16, 117 => 17, 118 => 18, 119 => 19, 120 => 20,
|
||||
121 => 21, 122 => 22, 123 => 23, 125 => 24, 126 => 25,
|
||||
127 => 26, 128 => 27, 129 => 28, 130 => 29, 131 => 30, 132 => 100,
|
||||
];
|
||||
|
||||
$cityNames = [
|
||||
101 => 'تبریز', 102 => 'ارومیه', 103 => 'اردبیل', 104 => 'اصفهان',
|
||||
105 => 'کرج', 108 => 'تهران', 111 => 'مشهد', 113 => 'اهواز',
|
||||
117 => 'شیراز', 121 => 'کرمان', 122 => 'کرمانشاه', 126 => 'رشت',
|
||||
128 => 'ساری', 131 => 'همدان', 132 => 'یزد',
|
||||
];
|
||||
|
||||
// توزیع تخصصها برای ۱۰۰ دکتر
|
||||
$specialtyGroups = [
|
||||
['specs' => [200], 'services' => [], 'degree' => 'general', 'gender_mix' => 'both', 'count' => 15],
|
||||
['specs' => [2, 3], 'services' => [101,102,103,110], 'degree' => 'specialist', 'gender_mix' => 'male', 'count' => 10],
|
||||
['specs' => [4], 'services' => [201,202,203,210], 'degree' => 'specialist', 'gender_mix' => 'both', 'count' => 6],
|
||||
['specs' => [10], 'services' => [801,802,803,805], 'degree' => 'specialist', 'gender_mix' => 'both', 'count' => 6],
|
||||
['specs' => [21], 'services' => [2101,2102,2103,2113],'degree' => 'specialist','gender_mix' => 'male', 'count' => 8],
|
||||
['specs' => [61], 'services' => [], 'degree' => 'specialist', 'gender_mix' => 'female', 'count' => 8],
|
||||
['specs' => [41], 'services' => [], 'degree' => 'specialist', 'gender_mix' => 'both', 'count' => 8],
|
||||
['specs' => [111], 'services' => [], 'degree' => 'specialist', 'gender_mix' => 'male', 'count' => 7],
|
||||
['specs' => [81, 82], 'services' => [], 'degree' => 'specialist', 'gender_mix' => 'both', 'count' => 6],
|
||||
['specs' => [91], 'services' => [], 'degree' => 'specialist', 'gender_mix' => 'both', 'count' => 6],
|
||||
['specs' => [101], 'services' => [], 'degree' => 'specialist', 'gender_mix' => 'both', 'count' => 5],
|
||||
['specs' => [71], 'services' => [], 'degree' => 'specialist', 'gender_mix' => 'both', 'count' => 5],
|
||||
['specs' => [121], 'services' => [], 'degree' => 'specialist', 'gender_mix' => 'male', 'count' => 4],
|
||||
['specs' => [181], 'services' => [], 'degree' => 'dentist', 'gender_mix' => 'both', 'count' => 6],
|
||||
];
|
||||
|
||||
$maleFirstNames = ['علی', 'محمد', 'حسین', 'رضا', 'امیر', 'مهدی', 'سعید', 'احمد', 'حسن', 'جواد',
|
||||
'کریم', 'ابراهیم', 'اکبر', 'ناصر', 'پیمان', 'بهروز', 'شاهین', 'کاوه', 'آرش', 'سهراب',
|
||||
'فرزاد', 'بهنام', 'وحید', 'مجید', 'عباس', 'صادق', 'داود', 'یوسف', 'منصور', 'اسماعیل'];
|
||||
$femaleFirstNames = ['فاطمه', 'زهرا', 'مریم', 'سارا', 'نگین', 'الهه', 'نیلوفر', 'شیما', 'لیلا', 'نازنین',
|
||||
'مینا', 'آزاده', 'ندا', 'رویا', 'پریسا', 'گلناز', 'سپیده', 'بهاره', 'شادی', 'فریده',
|
||||
'سمانه', 'مهتاب', 'شهرزاد', 'گیتا', 'آناهیتا', 'سیمین', 'منیژه', 'ناهید', 'پگاه', 'روشنک'];
|
||||
$lastNames = ['رضایی', 'محمدی', 'حسینی', 'علوی', 'موسوی', 'احمدی', 'کریمی', 'صادقی', 'جعفری', 'مرادی',
|
||||
'نجفی', 'تبریزی', 'اصفهانی', 'مشهدی', 'شیرازی', 'کرمانی', 'رشیدی', 'نظری', 'ابراهیمی',
|
||||
'قاسمی', 'یوسفی', 'منصوری', 'زارعی', 'ملکی', 'بهرامی', 'سلیمانی', 'نوری', 'پارسا', 'امینی', 'زاهدی'];
|
||||
|
||||
$degreeLabels = ['general' => 'پزشک عمومی', 'specialist' => 'متخصص', 'dentist' => 'دندانپزشک', 'subspecialist' => 'فوقتخصص'];
|
||||
$specNames = [
|
||||
2 => 'داخلی', 3 => 'قلب و عروق', 4 => 'گوارش', 10 => 'نورولوژی',
|
||||
21 => 'جراحی عمومی', 41 => 'اطفال', 61 => 'زنان و زایمان', 71 => 'روانپزشکی',
|
||||
81 => 'پوست', 82 => 'زیبایی پوست', 91 => 'چشمپزشکی', 101 => 'گوش، حلق و بینی',
|
||||
111 => 'ارتوپدی', 121 => 'اورولوژی', 181 => 'دندانپزشکی', 200 => 'پزشکی عمومی',
|
||||
];
|
||||
|
||||
$supplementaryInsurances = [7, 8, 9, 10, 11, 12, 13, 14, 15];
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// بخش A — پاکسازی
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
echo "🧹 پاکسازی دیتابیس...\n";
|
||||
|
||||
$conn->executeStatement('SET FOREIGN_KEY_CHECKS=0');
|
||||
$conn->executeStatement('DELETE FROM weekly_schedules');
|
||||
$conn->executeStatement('DELETE FROM doctor_addresses');
|
||||
$conn->executeStatement('DELETE FROM doctor_specialties');
|
||||
$conn->executeStatement('DELETE FROM doctor_expertise');
|
||||
$conn->executeStatement('DELETE FROM doctor_insurances');
|
||||
$conn->executeStatement('DELETE FROM doctor_cities');
|
||||
$conn->executeStatement('DELETE FROM doctor_provinces');
|
||||
$conn->executeStatement('DELETE FROM doctor_secretaries');
|
||||
$conn->executeStatement('DELETE FROM clinic_doctors');
|
||||
$conn->executeStatement('DELETE FROM clinic_specialties');
|
||||
$conn->executeStatement('DELETE FROM clinic_services');
|
||||
$conn->executeStatement('DELETE FROM clinic_insurances');
|
||||
$conn->executeStatement('DELETE FROM patient_records');
|
||||
$conn->executeStatement('DELETE FROM appointments');
|
||||
$conn->executeStatement('DELETE FROM payments');
|
||||
$conn->executeStatement('DELETE FROM sms_logs');
|
||||
$conn->executeStatement('DELETE FROM rates');
|
||||
$conn->executeStatement('DELETE FROM doctors');
|
||||
$conn->executeStatement('DELETE FROM clinics');
|
||||
$conn->executeStatement("DELETE FROM users WHERE JSON_CONTAINS(roles, '\"ROLE_DOCTOR\"') OR JSON_CONTAINS(roles, '\"ROLE_CLINIC\"') OR JSON_CONTAINS(roles, '\"ROLE_PATIENT\"') OR JSON_CONTAINS(roles, '\"ROLE_SECRETARY\"')");
|
||||
$conn->executeStatement('SET FOREIGN_KEY_CHECKS=1');
|
||||
|
||||
echo "✅ پاکسازی کامل شد\n\n";
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// بخش B — کلینیک نمونه کامل (تبریز)
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
echo "🏥 ایجاد کلینیک نمونه...\n";
|
||||
|
||||
$clinicMobile = nextMobile();
|
||||
$clinicUserUuid = newUuid();
|
||||
$conn->executeStatement(
|
||||
'INSERT INTO users (uuid, mobile_number, password_hash, real_name, roles, status, created_at, updated_at) VALUES (?,?,?,?,?,1,?,?)',
|
||||
[$clinicUserUuid, $clinicMobile, $passwordHash, 'کلینیک تخصصی امید', '["ROLE_USER","ROLE_CLINIC"]', $now, $now]
|
||||
);
|
||||
$clinicUserId = (int) $conn->lastInsertId();
|
||||
|
||||
$clinicUuid = newUuid();
|
||||
$conn->executeStatement(
|
||||
'INSERT INTO clinics (uuid, user_id, name, info, address, telephone, is_24_7, working_days, latitude, longitude, city_id, province_id, representation_id, is_active, created_at, updated_at)
|
||||
VALUES (?,?,?,?,?,?,0,?,?,?,?,?,?,1,?,?)',
|
||||
[
|
||||
$clinicUuid, $clinicUserId,
|
||||
'کلینیک تخصصی امید تبریز',
|
||||
'کلینیک تخصصی امید تبریز با بیش از ۲۰ سال سابقه در ارائه خدمات درمانی تخصصی. مجهز به پیشرفتهترین تجهیزات پزشکی و دارای تیمی از متخصصان برجسته در رشتههای مختلف. پذیرش بیماران با بیمههای تامین اجتماعی، خدمات درمانی و بیمههای تکمیلی.',
|
||||
'تبریز، خیابان ارتش، نبش کوچه سوم، ساختمان امید، طبقه اول',
|
||||
'04133445566',
|
||||
'شنبه تا چهارشنبه ۸ تا ۲۰، پنجشنبه ۸ تا ۱۴',
|
||||
37.0833, 35.7167,
|
||||
101, 1, 101, // city, province, representation
|
||||
$now, $now,
|
||||
]
|
||||
);
|
||||
$clinicId = (int) $conn->lastInsertId();
|
||||
|
||||
// تخصصهای کلینیک
|
||||
foreach ([1, 2, 3, 4, 10, 40, 60, 80, 90, 100, 110] as $specId) {
|
||||
$conn->executeStatement('INSERT IGNORE INTO clinic_specialties (clinic_id, specialty_id) VALUES (?,?)', [$clinicId, $specId]);
|
||||
}
|
||||
// بیمههای کلینیک
|
||||
foreach ([1, 2, 3, 7, 8, 9] as $insId) {
|
||||
$conn->executeStatement('INSERT IGNORE INTO clinic_insurances (clinic_id, insurance_id) VALUES (?,?)', [$clinicId, $insId]);
|
||||
}
|
||||
// خدمات کلینیک
|
||||
foreach ([101, 102, 103, 201, 202, 203, 801, 802, 803] as $svcId) {
|
||||
$conn->executeStatement('INSERT IGNORE INTO clinic_services (clinic_id, service_id) VALUES (?,?)', [$clinicId, $svcId]);
|
||||
}
|
||||
|
||||
echo "✅ کلینیک امید تبریز ایجاد شد (id: $clinicId)\n\n";
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// بخش C — دکتر نمونه کامل (تبریز)
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
echo "👨⚕️ ایجاد دکتر نمونه...\n";
|
||||
|
||||
$sampleDocMobile = nextMobile();
|
||||
$sampleDocUserUuid = newUuid();
|
||||
$conn->executeStatement(
|
||||
'INSERT INTO users (uuid, mobile_number, password_hash, real_name, roles, status, created_at, updated_at) VALUES (?,?,?,?,?,1,?,?)',
|
||||
[$sampleDocUserUuid, $sampleDocMobile, $passwordHash, 'دکتر آرمان رضایی', '["ROLE_USER","ROLE_DOCTOR"]', $now, $now]
|
||||
);
|
||||
$sampleDocUserId = (int) $conn->lastInsertId();
|
||||
|
||||
$sampleDocUuid = newUuid();
|
||||
$conn->executeStatement(
|
||||
'INSERT INTO doctors (uuid, user_id, name, gender, medical_system_code, mobile_number, activity_time, degree, info, doctor_rate, doctor_rate_percentage, active_doctor_appointment, representation_id, created_at, updated_at)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,1,?,?,?)',
|
||||
[
|
||||
$sampleDocUuid, $sampleDocUserId,
|
||||
'دکتر آرمان رضایی',
|
||||
'man', 'IR-10001', $sampleDocMobile,
|
||||
mktime(0, 0, 0, 1, 1, 2008),
|
||||
'specialist',
|
||||
'متخصص قلب و عروق با بیش از ۱۶ سال سابقه بالینی. فارغالتحصیل دانشگاه علوم پزشکی تبریز با فلوشیپ قلب از دانشگاه تهران. عضو انجمن قلب ایران و مولف بیش از ۳۰ مقاله علمی در مجلات معتبر بینالمللی. دارای تخصص ویژه در آنژیوگرافی تشخیصی و درمانی، اکوکاردیوگرافی و درمان نارسایی قلبی.',
|
||||
4.8, 96.0,
|
||||
101,
|
||||
$now, $now,
|
||||
]
|
||||
);
|
||||
$sampleDocId = (int) $conn->lastInsertId();
|
||||
|
||||
// تخصصها
|
||||
foreach ([2, 3] as $specId) {
|
||||
$conn->executeStatement('INSERT IGNORE INTO doctor_specialties (doctor_id, specialty_id) VALUES (?,?)', [$sampleDocId, $specId]);
|
||||
}
|
||||
// خدمات
|
||||
foreach ([101, 102, 103, 104, 110] as $svcId) {
|
||||
$conn->executeStatement('INSERT IGNORE INTO doctor_expertise (doctor_id, service_id) VALUES (?,?)', [$sampleDocId, $svcId]);
|
||||
}
|
||||
// بیمهها
|
||||
foreach ([1, 2, 3, 7] as $insId) {
|
||||
$conn->executeStatement('INSERT IGNORE INTO doctor_insurances (doctor_id, insurance_id) VALUES (?,?)', [$sampleDocId, $insId]);
|
||||
}
|
||||
// شهر و استان
|
||||
$conn->executeStatement('INSERT IGNORE INTO doctor_cities (doctor_id, city_id) VALUES (?,?)', [$sampleDocId, 101]);
|
||||
$conn->executeStatement('INSERT IGNORE INTO doctor_provinces (doctor_id, province_id) VALUES (?,?)', [$sampleDocId, 1]);
|
||||
|
||||
// آدرس مطب شخصی
|
||||
$addrUuid1 = newUuid();
|
||||
$conn->executeStatement(
|
||||
'INSERT INTO doctor_addresses (uuid, doctor_id, clinic_id, city_id, province_id, type, name, address, telephone, created_at, updated_at)
|
||||
VALUES (?,?,NULL,?,?,?,?,?,?,?,?)',
|
||||
[
|
||||
$addrUuid1, $sampleDocId, 101, 1, 'personal',
|
||||
'مطب دکتر رضایی',
|
||||
'تبریز، خیابان آزادی، کوچه پانزدهم، ساختمان پارسیان، واحد ۱۲',
|
||||
'04132001122',
|
||||
$now, $now,
|
||||
]
|
||||
);
|
||||
$addrId1 = (int) $conn->lastInsertId();
|
||||
|
||||
// آدرس کلینیک
|
||||
$addrUuid2 = newUuid();
|
||||
$conn->executeStatement(
|
||||
'INSERT INTO doctor_addresses (uuid, doctor_id, clinic_id, city_id, province_id, type, name, address, telephone, created_at, updated_at)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?)',
|
||||
[
|
||||
$addrUuid2, $sampleDocId, $clinicId, 101, 1, 'clinic',
|
||||
'کلینیک تخصصی امید تبریز',
|
||||
'تبریز، خیابان ارتش، نبش کوچه سوم، ساختمان امید، طبقه اول',
|
||||
'04133445566',
|
||||
$now, $now,
|
||||
]
|
||||
);
|
||||
$addrId2 = (int) $conn->lastInsertId();
|
||||
|
||||
// clinic_doctors
|
||||
$conn->executeStatement('INSERT IGNORE INTO clinic_doctors (clinic_id, doctor_id) VALUES (?,?)', [$clinicId, $sampleDocId]);
|
||||
|
||||
// برنامه کاری (هر دو مطب — مطب اصلی)
|
||||
$scheduleJson = makeSchedule($addrId1, true);
|
||||
$scheduleUuid = newUuid();
|
||||
$conn->executeStatement(
|
||||
'INSERT INTO weekly_schedules (uuid, doctor_id, setting, created_at, updated_at) VALUES (?,?,?,?,?)',
|
||||
[$scheduleUuid, $sampleDocId, $scheduleJson, $now, $now]
|
||||
);
|
||||
|
||||
// منشی دکتر نمونه
|
||||
$secMobile = nextMobile();
|
||||
$secUserUuid = newUuid();
|
||||
$conn->executeStatement(
|
||||
'INSERT INTO users (uuid, mobile_number, password_hash, real_name, roles, status, created_at, updated_at) VALUES (?,?,?,?,?,1,?,?)',
|
||||
[$secUserUuid, $secMobile, $passwordHash, 'خانم نرگس صادقی', '["ROLE_USER","ROLE_SECRETARY"]', $now, $now]
|
||||
);
|
||||
$secUserId = (int) $conn->lastInsertId();
|
||||
|
||||
$secUuid = newUuid();
|
||||
$conn->executeStatement(
|
||||
'INSERT INTO doctor_secretaries (uuid, doctor_id, secretary_id, active, owner_type, clinic_id, created_at, updated_at) VALUES (?,?,?,1,?,NULL,?,?)',
|
||||
[$secUuid, $sampleDocId, $secUserId, 'doctor', $now, $now]
|
||||
);
|
||||
|
||||
echo "✅ دکتر نمونه (آرمان رضایی) ایجاد شد (id: $sampleDocId)\n";
|
||||
echo " 📍 مطب: id=$addrId1 | کلینیک امید: id=$addrId2\n";
|
||||
echo " 👩💼 منشی: خانم نرگس صادقی (موبایل: $secMobile)\n\n";
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// بخش D — ۱۰۰ دکتر به ازای هر شهر (bulk)
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
$targetCities = [101, 102, 103, 104, 105, 108, 111, 113, 117, 121, 122, 126, 128, 131, 132];
|
||||
$totalCreated = 0;
|
||||
|
||||
foreach ($targetCities as $cityId) {
|
||||
$provincId = $cityProvince[$cityId];
|
||||
$cityName = $cityNames[$cityId];
|
||||
$docCount = 0;
|
||||
|
||||
echo "🏙️ $cityName: ";
|
||||
|
||||
// flat list of 100 doctors from specialty groups
|
||||
$doctorQueue = [];
|
||||
foreach ($specialtyGroups as $group) {
|
||||
for ($n = 0; $n < $group['count']; $n++) {
|
||||
$doctorQueue[] = $group;
|
||||
}
|
||||
}
|
||||
|
||||
$nameIdx = 0;
|
||||
foreach ($doctorQueue as $idx => $group) {
|
||||
// تعیین جنسیت
|
||||
if ($group['gender_mix'] === 'female') {
|
||||
$gender = 'woman';
|
||||
$firstName = $femaleFirstNames[$nameIdx % count($femaleFirstNames)];
|
||||
} elseif ($group['gender_mix'] === 'male') {
|
||||
$gender = 'man';
|
||||
$firstName = $maleFirstNames[$nameIdx % count($maleFirstNames)];
|
||||
} else {
|
||||
$gender = ($idx % 3 === 0) ? 'woman' : 'man';
|
||||
$firstName = ($gender === 'woman')
|
||||
? $femaleFirstNames[$nameIdx % count($femaleFirstNames)]
|
||||
: $maleFirstNames[$nameIdx % count($maleFirstNames)];
|
||||
}
|
||||
$lastName = $lastNames[$nameIdx % count($lastNames)];
|
||||
$nameIdx++;
|
||||
|
||||
$primarySpec = $group['specs'][0];
|
||||
$specLabel = $specNames[$primarySpec] ?? 'پزشک';
|
||||
$degreeLabel = $degreeLabels[$group['degree']] ?? 'متخصص';
|
||||
$title = ($gender === 'woman') ? 'دکتر' : 'دکتر';
|
||||
$fullName = "$title $firstName $lastName";
|
||||
|
||||
$mobile = nextMobile();
|
||||
$userUuid = newUuid();
|
||||
$conn->executeStatement(
|
||||
'INSERT INTO users (uuid, mobile_number, password_hash, real_name, roles, status, created_at, updated_at) VALUES (?,?,?,?,?,1,?,?)',
|
||||
[$userUuid, $mobile, $passwordHash, $fullName, '["ROLE_USER","ROLE_DOCTOR"]', $now, $now]
|
||||
);
|
||||
$userId = (int) $conn->lastInsertId();
|
||||
|
||||
$rate = round(3.5 + mt_rand(0, 15) / 10, 1);
|
||||
$ratePercentage = $rate * 20.0;
|
||||
$startYear = 1995 + mt_rand(0, 20);
|
||||
$medCode = 'IR-' . str_pad((string)(10001 + $totalCreated + $docCount), 6, '0', STR_PAD_LEFT);
|
||||
|
||||
$info = "$degreeLabel $specLabel. فارغالتحصیل دانشگاه علوم پزشکی $cityName. "
|
||||
. "با " . (date('Y') - $startYear) . " سال سابقه بالینی در حوزه $specLabel. "
|
||||
. "پذیرش بیمههای تامین اجتماعی و خدمات درمانی.";
|
||||
|
||||
$docUuid = newUuid();
|
||||
$conn->executeStatement(
|
||||
'INSERT INTO doctors (uuid, user_id, name, gender, medical_system_code, mobile_number, activity_time, degree, info, doctor_rate, doctor_rate_percentage, active_doctor_appointment, representation_id, created_at, updated_at)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,1,?,?,?)',
|
||||
[
|
||||
$docUuid, $userId, $fullName, $gender, $medCode, $mobile,
|
||||
mktime(0, 0, 0, 1, 1, $startYear),
|
||||
$group['degree'], $info, $rate, $ratePercentage,
|
||||
$cityId,
|
||||
$now, $now,
|
||||
]
|
||||
);
|
||||
$docId = (int) $conn->lastInsertId();
|
||||
|
||||
// تخصصها
|
||||
foreach ($group['specs'] as $specId) {
|
||||
$conn->executeStatement('INSERT IGNORE INTO doctor_specialties (doctor_id, specialty_id) VALUES (?,?)', [$docId, $specId]);
|
||||
}
|
||||
|
||||
// خدمات (حداکثر ۳ خدمت)
|
||||
$services = array_slice($group['services'], 0, 3);
|
||||
foreach ($services as $svcId) {
|
||||
$conn->executeStatement('INSERT IGNORE INTO doctor_expertise (doctor_id, service_id) VALUES (?,?)', [$docId, $svcId]);
|
||||
}
|
||||
|
||||
// بیمهها: پایه + یک تکمیلی تصادفی
|
||||
$suppInsId = $supplementaryInsurances[mt_rand(0, count($supplementaryInsurances) - 1)];
|
||||
foreach (array_unique([1, 2, $suppInsId]) as $insId) {
|
||||
$conn->executeStatement('INSERT IGNORE INTO doctor_insurances (doctor_id, insurance_id) VALUES (?,?)', [$docId, $insId]);
|
||||
}
|
||||
|
||||
// شهر و استان
|
||||
$conn->executeStatement('INSERT IGNORE INTO doctor_cities (doctor_id, city_id) VALUES (?,?)', [$docId, $cityId]);
|
||||
$conn->executeStatement('INSERT IGNORE INTO doctor_provinces (doctor_id, province_id) VALUES (?,?)', [$docId, $provincId]);
|
||||
|
||||
// آدرس مطب
|
||||
$streetNum = mt_rand(1, 50);
|
||||
$buildingNo = mt_rand(1, 30);
|
||||
$addrUuid = newUuid();
|
||||
$conn->executeStatement(
|
||||
'INSERT INTO doctor_addresses (uuid, doctor_id, clinic_id, city_id, province_id, type, name, address, telephone, created_at, updated_at)
|
||||
VALUES (?,?,NULL,?,?,?,?,?,?,?,?)',
|
||||
[
|
||||
$addrUuid, $docId, $cityId, $provincId, 'personal',
|
||||
"مطب $fullName",
|
||||
$cityName . '، خیابان شهید بهشتی، کوچه ' . $streetNum . '، پلاک ' . $buildingNo,
|
||||
'0' . (4100000000 + mt_rand(10000000, 99999999)),
|
||||
$now, $now,
|
||||
]
|
||||
);
|
||||
$addrId = (int) $conn->lastInsertId();
|
||||
|
||||
// برنامه کاری
|
||||
$schedJson = makeSchedule($addrId, $idx % 4 !== 0);
|
||||
$schedUuid = newUuid();
|
||||
$conn->executeStatement(
|
||||
'INSERT INTO weekly_schedules (uuid, doctor_id, setting, created_at, updated_at) VALUES (?,?,?,?,?)',
|
||||
[$schedUuid, $docId, $schedJson, $now, $now]
|
||||
);
|
||||
|
||||
$docCount++;
|
||||
}
|
||||
|
||||
$totalCreated += $docCount;
|
||||
echo "$docCount دکتر ایجاد شد ✅\n";
|
||||
}
|
||||
|
||||
echo "\n✅ پایان — مجموع $totalCreated دکتر در " . count($targetCities) . " شهر ایجاد شد\n";
|
||||
echo "📱 رمز عبور همه کاربران: Test@1234\n";
|
||||
echo "📱 موبایل اول دکتر نمونه: $sampleDocMobile\n";
|
||||
@@ -1,261 +0,0 @@
|
||||
<?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";
|
||||
Reference in New Issue
Block a user