From f99d7d4e77fc45484185ebe77ce3723d6c9de12a Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Fri, 31 Oct 2025 21:53:09 +0100 Subject: [PATCH 01/37] Add files via upload --- CRM/Excels/Basvurular.xlsx | Bin 0 -> 14946 bytes CRM/Excels/FullSheets.xlsx | Bin 0 -> 30186 bytes CRM/Excels/Mentor.xlsx | Bin 0 -> 55807 bytes CRM/Excels/Mulakatlar.xlsx | Bin 0 -> 5559 bytes CRM/Excels/users.xlsx | Bin 0 -> 7972 bytes CRM/UI_s/Admin_Menu.ui | 289 +++++++++++ CRM/UI_s/Applications.ui | 488 ++++++++++++++++++ CRM/UI_s/Interviews.ui | 380 ++++++++++++++ CRM/UI_s/Login_Window.ui | 266 ++++++++++ CRM/UI_s/Mentor_Meeting_Page.ui | 382 ++++++++++++++ CRM/UI_s/Preference_Admin_Menu.ui | 297 +++++++++++ CRM/UI_s/Preference_Menu.ui | 259 ++++++++++ CRM/UI_s/Splash_Screen.ui | 108 ++++ CRM/UI_s/ZZZZZZ.txt | 15 + CRM/UI_s/logo/logo.qrc | 6 + CRM/UI_s/logo/logo_butun.png | Bin 0 -> 21438 bytes CRM/UI_s/logo/logo_icon.png | Bin 0 -> 309 bytes CRM/__pycache__/Login_Window.cpython-313.pyc | Bin 0 -> 10501 bytes CRM/__pycache__/Splash_Screen.cpython-313.pyc | Bin 0 -> 5228 bytes CRM/__pycache__/logo_rc.cpython-313.pyc | Bin 0 -> 873 bytes CRM/main.py | 114 ++++ 21 files changed, 2604 insertions(+) create mode 100644 CRM/Excels/Basvurular.xlsx create mode 100644 CRM/Excels/FullSheets.xlsx create mode 100644 CRM/Excels/Mentor.xlsx create mode 100644 CRM/Excels/Mulakatlar.xlsx create mode 100644 CRM/Excels/users.xlsx create mode 100644 CRM/UI_s/Admin_Menu.ui create mode 100644 CRM/UI_s/Applications.ui create mode 100644 CRM/UI_s/Interviews.ui create mode 100644 CRM/UI_s/Login_Window.ui create mode 100644 CRM/UI_s/Mentor_Meeting_Page.ui create mode 100644 CRM/UI_s/Preference_Admin_Menu.ui create mode 100644 CRM/UI_s/Preference_Menu.ui create mode 100644 CRM/UI_s/Splash_Screen.ui create mode 100644 CRM/UI_s/ZZZZZZ.txt create mode 100644 CRM/UI_s/logo/logo.qrc create mode 100644 CRM/UI_s/logo/logo_butun.png create mode 100644 CRM/UI_s/logo/logo_icon.png create mode 100644 CRM/__pycache__/Login_Window.cpython-313.pyc create mode 100644 CRM/__pycache__/Splash_Screen.cpython-313.pyc create mode 100644 CRM/__pycache__/logo_rc.cpython-313.pyc create mode 100644 CRM/main.py diff --git a/CRM/Excels/Basvurular.xlsx b/CRM/Excels/Basvurular.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..370bbd6263f8014e9c76fb692fc3799fc6665339 GIT binary patch literal 14946 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 literal 0 HcmV?d00001 diff --git a/CRM/Excels/FullSheets.xlsx b/CRM/Excels/FullSheets.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c792df5b4ecaae1850b12ddc13b22a29ebdb1e03 GIT binary patch literal 30186 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
  • Yo6ZPWk=6sF5Qk*Y8bxGqBEUsZngoCrRlJR*H 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 literal 0 HcmV?d00001 diff --git a/CRM/UI_s/Admin_Menu.ui b/CRM/UI_s/Admin_Menu.ui new file mode 100644 index 0000000..88065ce --- /dev/null +++ b/CRM/UI_s/Admin_Menu.ui @@ -0,0 +1,289 @@ + + + Form + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Nirmala UI + + + + Admin Menu + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 10 + 20 + 981 + 61 + + + + + Nirmala UI + 30 + 75 + true + + + + color: rgb(214, 30, 32); + + + ADMIN MENU + + + Qt::AlignCenter + + + + + + 710 + 100 + 201 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + SEND E-MAIL + + + + + + 90 + 100 + 451 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EVENT REGISTRATION + + + + + + 90 + 500 + 461 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RETURN TO ADMIN PREFERENCE MENU + + + + + + 710 + 500 + 201 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EXIT + + + + + + 90 + 190 + 821 + 291 + + + + background-color:rgb(255, 255, 255) + + + true + + + 194 + + + false + + + true + + + false + + + false + + + 28 + + + true + + + 23 + + + false + + + false + + + + Event Name + + + + + Start Time + + + + + Participant Email + + + + + Organizer Email + + + + + + + + + diff --git a/CRM/UI_s/Applications.ui b/CRM/UI_s/Applications.ui new file mode 100644 index 0000000..0d6e81b --- /dev/null +++ b/CRM/UI_s/Applications.ui @@ -0,0 +1,488 @@ + + + Form + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Nirmala UI + + + + Applications + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 10 + 20 + 981 + 61 + + + + + Nirmala UI + 30 + 75 + true + + + + color: rgb(214, 30, 32); + + + APPLICATIONS + + + Qt::AlignCenter + + + + + + 70 + 120 + 101 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + SEARCH + + + + + + 660 + 60 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RETURN PREFERENCE MENU + + + + + + 70 + 180 + 301 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + DEFINED MENTOR MEETING + + + + + + 390 + 240 + 251 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + ALL APPLICATIONS + + + + + + 180 + 120 + 461 + 51 + + + + + 15 + true + + + + border-style:solid; +border-width:3px; +border-radius:20px; +border-color: rgb(218, 30, 60); +color: rgb(104, 104, 104); +background-color: rgb(255, 255, 255); +border-color: rgb(220, 63, 65); + + + Enter the text you want to search for here + + + + + + 660 + 180 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + DIFFERENT REGISTRATION + + + + + + 70 + 240 + 301 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + UNDEFINED MENTOR MEETING + + + + + + 660 + 240 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + DUPLICATE REGISTRATION + + + + + + 390 + 180 + 251 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + Qt::LeftToRight + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + PREVIOUS VIT CHECK + + + + + + 660 + 120 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + APPLICATION FILTERING + + + + + + 70 + 310 + 861 + 261 + + + + background-color: rgb(255, 255, 255); + + + 136 + + + true + + + + DATE + + + + + FULL NAME + + + + + E-MAIL + + + + + PHONE NUMBER + + + + + POSTAL CODE + + + + + PROVINCE + + + + + CURRENT STATUS + + + + + + + + + diff --git a/CRM/UI_s/Interviews.ui b/CRM/UI_s/Interviews.ui new file mode 100644 index 0000000..e4b5cef --- /dev/null +++ b/CRM/UI_s/Interviews.ui @@ -0,0 +1,380 @@ + + + Form + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Nirmala UI + + + + Interviews + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 10 + 20 + 981 + 61 + + + + + Nirmala UI + 30 + 75 + true + + + + color: rgb(214, 30, 32); + + + INTERVIEWS + + + Qt::AlignCenter + + + + + + 70 + 120 + 101 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + SEARCH + + + + + + 660 + 120 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RETURN PREFERENCE MENU + + + + + + 70 + 190 + 301 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + SUBMITTED PROJECTS + + + + + + 180 + 120 + 461 + 51 + + + + + 15 + true + + + + border-style:solid; +border-width:3px; +border-radius:20px; + +color: rgb(104, 104, 104); +background-color: rgb(255, 255, 255); +border-color: rgb(220, 63, 65); + + + Enter the text you want to search for here + + + + + + 660 + 190 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EXIT + + + + + + 390 + 190 + 251 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + Qt::LeftToRight + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RECEIVED PROJECTS + + + + + + 70 + 270 + 861 + 281 + + + + background-color:rgb(255, 255, 255) + + + 283 + + + true + + + + Full Name + + + + Calibri + 9 + 75 + true + + + + + 255 + 255 + 255 + + + + + + 255 + 255 + 255 + + + + + + + Submission Date + + + + Calibri + 9 + 75 + true + + + + + 255 + 255 + 255 + + + + + + Delivery Date + + + + Calibri + 9 + 75 + true + + + + + + 255 + 255 + 255 + + + + + + + + + + + diff --git a/CRM/UI_s/Login_Window.ui b/CRM/UI_s/Login_Window.ui new file mode 100644 index 0000000..1a0ecf2 --- /dev/null +++ b/CRM/UI_s/Login_Window.ui @@ -0,0 +1,266 @@ + + + Form + + + true + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Modern + 15 + + + + Login Window + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + false + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 330 + 250 + 351 + 51 + + + + + Nirmala UI + 15 + true + + + + Qt::LeftToRight + + + border-style:solid; +border-width:3px; +border-radius:20px; +border-color: rgb(218, 30, 60); +color: rgb(104, 104, 104); +background-color: rgb(255, 255, 255); +border-color: rgb(220, 63, 65); + + + Qt::ImhNone + + + + + + Qt::AlignCenter + + + false + + + Enter your username + + + + + true + + + + 330 + 320 + 351 + 51 + + + + + Nirmala UI + 15 + true + + + + border-style:solid; +border-width:3px; +border-radius:20px; +border-color: rgb(218, 30, 60); +color: rgb(104, 104, 104); +background-color: rgb(255, 255, 255); +border-color: rgb(220, 63, 65); + + + QLineEdit::Password + + + Qt::AlignCenter + + + Enter your password + + + + + + 530 + 420 + 171 + 71 + + + + + Nirmala UI + 20 + 75 + true + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EXIT + + + + + true + + + + 310 + 420 + 171 + 71 + + + + + Nirmala UI + 20 + 75 + true + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + LOGIN + + + false + + + + + + 10 + 160 + 981 + 51 + + + + + Nirmala UI + 32 + 75 + true + false + + + + false + + + color: rgb(214, 30, 32); + + + CRM PROJECT + + + Qt::AlignCenter + + + + + + 280 + 40 + 431 + 111 + + + + image: url(:/logo/logo_butun.png); + + + + + + + + + + + diff --git a/CRM/UI_s/Mentor_Meeting_Page.ui b/CRM/UI_s/Mentor_Meeting_Page.ui new file mode 100644 index 0000000..4e76c7f --- /dev/null +++ b/CRM/UI_s/Mentor_Meeting_Page.ui @@ -0,0 +1,382 @@ + + + Form + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Nirmala UI + + + + Mentor Meeting Page + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 10 + 20 + 981 + 61 + + + + + Nirmala UI + 30 + 75 + true + + + + color: rgb(214, 30, 32); + + + MENTOR MEETING PAGE + + + Qt::AlignCenter + + + + + + 70 + 120 + 141 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + SEARCH + + + + + + 670 + 120 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RETURN PREFERENCE MENU + + + + + + 70 + 180 + 141 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + ALL MEETINGS + + + + + + 230 + 120 + 421 + 51 + + + + + 15 + true + + + + border-style:solid; +border-width:3px; +border-radius:20px; +border-color: rgb(218, 30, 60); +color: rgb(104, 104, 104); +background-color: rgb(255, 255, 255); +border-color: rgb(220, 63, 65); + + + Enter the text you want to search for here + + + + + + 670 + 180 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + Qt::LeftToRight + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EXIT + + + + + + 70 + 250 + 871 + 321 + + + + background-color:rgb(255, 255, 255) + + + false + + + 144 + + + 54 + + + true + + + + Meeting Date + + + + + Period + + + + + Full Name + + + + + Mentor + + + + + Evaluation + + + + + Current Status + + + + + + + 230 + 180 + 421 + 51 + + + + QPushButton { + font-size: 16px; + font-weight: bold; + font-family: Arial; + color: black; /* Siyah yazı rengi */ + + background-color: rgb(255, 255, 255); + border-radius: 8px; /* Köşe yuvarlama */ + padding: 8px; /* Küçük padding */ + border: none; + + /* Gölgelendirme eklemek için: */ + box-shadow: 3px 3px 6px rgba(0, 0, 0, 0.3); /* Gölgenin boyutu ve rengi */ +} + +QPushButton:hover { + background-color: #c0c0c0; /* Hover durumunda biraz daha koyu gri */ + /* Hover durumunda gölgeyi değiştirmek için */ + box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5); /* Hover sırasında daha belirgin gölge */ +} + + + + + It is appropriate to participate in the entire VIT project + + + + + It is appropriate to receive initial IT training within the VIT project and be directed to ITPH + + + + + It is appropriate to receive English training within the VIT project and be directed to ITPH + + + + + It is appropriate to be directly directed to ITPH within the scope of the VIT project + + + + + It is appropriate to be directed to a job through individual coaching + + + + + It would be more appropriate to participate in the next VIT project + + + + + Should be directed to another sector + + + + + Other + + + + + + + + + diff --git a/CRM/UI_s/Preference_Admin_Menu.ui b/CRM/UI_s/Preference_Admin_Menu.ui new file mode 100644 index 0000000..fe52eff --- /dev/null +++ b/CRM/UI_s/Preference_Admin_Menu.ui @@ -0,0 +1,297 @@ + + + Form + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Nirmala UI + + + + Preference Admin Menu + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255)); + +} + + + + + 10 + 20 + 981 + 61 + + + + + Nirmala UI + 30 + 75 + true + + + + color: rgb(214, 30, 32); + + + PREFERENCE ADMIN MENU + + + Qt::AlignCenter + + + + + + 510 + 160 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + APPLICATIONS + + + + + + 130 + 250 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + MENTOR MEETING + + + + + + 130 + 160 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + INTERVIEWS + + + + + + 130 + 420 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RETURN MAIN MENU + + + + + + 700 + 420 + 151 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EXIT + + + + + + 510 + 250 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + ADMIN MENU + + + + + + + + diff --git a/CRM/UI_s/Preference_Menu.ui b/CRM/UI_s/Preference_Menu.ui new file mode 100644 index 0000000..ea09aa0 --- /dev/null +++ b/CRM/UI_s/Preference_Menu.ui @@ -0,0 +1,259 @@ + + + Form + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Nirmala UI + + + + Preference Menu + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 10 + 20 + 981 + 61 + + + + + Nirmala UI + 30 + 75 + true + + + + color: rgb(214, 30, 32); + + + PREFERENCE MENU + + + Qt::AlignCenter + + + + + + 510 + 160 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + APPLICATIONS + + + + + + 130 + 250 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + MENTOR MEETING + + + + + + 130 + 160 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + INTERVIEWS + + + + + + 130 + 420 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RETURN MAIN MENU + + + + + + 700 + 420 + 151 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EXIT + + + + + + + + diff --git a/CRM/UI_s/Splash_Screen.ui b/CRM/UI_s/Splash_Screen.ui new file mode 100644 index 0000000..7a98524 --- /dev/null +++ b/CRM/UI_s/Splash_Screen.ui @@ -0,0 +1,108 @@ + + + Form + + + true + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Modern + 15 + + + + Login Window + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + false + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 10 + 130 + 971 + 250 + + + + image: url(:/logo/logo_butun.png); + + + + + + true + + + + + + 230 + 460 + 541 + 23 + + + + QProgressBar { + background: rgba(255, 255, 255, 0.25); /* Yarı saydam beyaz */ + border: 1px solid rgba(255, 255, 255, 0.4); + border-radius: 10px; + text-align: center; + color: rgba(255, 255, 255, 0.8); + font: bold 10pt "Segoe UI"; +} + +QProgressBar::chunk { + background-color: rgba(120, 120, 120, 0.85); /* Daha koyu gri dolum */ + border-radius: 10px; + margin: 1px; +} + + + + 24 + + + + + + + + diff --git a/CRM/UI_s/ZZZZZZ.txt b/CRM/UI_s/ZZZZZZ.txt new file mode 100644 index 0000000..5338947 --- /dev/null +++ b/CRM/UI_s/ZZZZZZ.txt @@ -0,0 +1,15 @@ +pyuic6 -x Splash_Screen.ui -o Splash_Screen.py + +pyuic6 -x Admin_Menu.ui -o Admin_Menu.py + +pyuic6 -x Applications.ui -o Applications.py + +pyuic6 -x Interviews.ui -o Interviews.py + +pyuic6 -x Login_Window.ui -o Login_Window.py + +pyuic6 -x Mentor_Meeting_Page.ui -o Mentor_Meeting_Page.py + +pyuic6 -x Preference_Admin_Menu.ui -o Preference_Admin_Menu.py + +pyuic6 -x Preference_Menu.ui -o Preference_Menu.py \ No newline at end of file diff --git a/CRM/UI_s/logo/logo.qrc b/CRM/UI_s/logo/logo.qrc new file mode 100644 index 0000000..ac423f8 --- /dev/null +++ b/CRM/UI_s/logo/logo.qrc @@ -0,0 +1,6 @@ + + + logo_butun.png + logo_icon.png + + diff --git a/CRM/UI_s/logo/logo_butun.png b/CRM/UI_s/logo/logo_butun.png new file mode 100644 index 0000000000000000000000000000000000000000..af86ffdbc7bf9df4b27589cae07e9143b747b733 GIT binary patch literal 21438 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 literal 0 HcmV?d00001 diff --git a/CRM/UI_s/logo/logo_icon.png b/CRM/UI_s/logo/logo_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0829f07664686324c7dc8b759386cacdf5bd4588 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s3?yAI>n{URHUT~%uI>dsx7D0)E7=3lEjgRp z$_}^WZEveNJ+ODh**!XX!p=4uZS3r&?vu{1kwF1CxPaO zlmz(&GXyL;^uPZ@GS8`ph6*Of|Nr0p-!aVe_!FS~6i*k&kP615{f<@V2ENB?w&`RUybuO>BEY^$3Rx;ajI`lC?W z^G9FTN3vW~ED8?s{;p{in(nqJZ*I~vwSKdj;Q1Sk>P;A;r}J_cZ4#Um#r5}^hi6dv z#JyfxM#25t>Td@gT{LfPajCic?Ul{n)|l;%`($RnC7R{%%`aVIK=(0ty85}Sb4q9e E0CgF8hyVZp literal 0 HcmV?d00001 diff --git a/CRM/__pycache__/Login_Window.cpython-313.pyc b/CRM/__pycache__/Login_Window.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8380cbe5cc289864023eabd3affb0d1ef3cab45 GIT binary patch literal 10501 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 p%!@u9`ef*jN1l1hJ{|nQ;BD^i@j!7 zY#c|ks)>qHyuX>^nPgzVU*^NXWECHXU!f>*i7Im=jFJr3;3#nCD3wH9qq}yX z0nki-I1GGEW!O7Lse#H8*CvCWRb8@9gEFs+|0$X4~VJ|m|ylCGt^!Yck!n=I_!r;-$= zc?$b@8vA))GldxvWgOrc9Lxk_L8~eu3!^H|ZqxyN%I6V<04AB(T&yCJ5;W(?_7L&3 zYcEh#GUp+HTyLXr&V+}A_w&p^MKeoX4LT@}Sn$#>`WifEpT_M>T+Q}1S^aM<|F0Cs z>YOj(~RMj z$el^Wx|!RiZI`|Eayl|gy1&^+rvD&8inu~EDzIq$Q`_8^Q^C6eQQ=KPV3I~dU6@2(zIzcI0 z=PW^SryRUHb7x%GfjsAM)Y)@q$UqHW%h&Ps15A0>wdxf*cJpP=Yq`$5Ivt4L`&zCG z4y`+H>#w^3d)$@lK%QuC)fYr!(!sm)mx}g2zLAgcU)eRvtnu? zgVjPVeI%tSDvq<)fJRP zzHV02)qK2%#hF>L<2WHb4itSoFb@pGD(Kz{dSJlbc86GO=w^(zf_V{xz729uZ+rxU z{73L><3GfUsGJouQk*SdrNiscY(X#B9>s<%$_gpstfUCU-;KW$0iQ#b?FPET+XQJ1Z5%CARZe zS%!)s=5e++zsPE;BBx&=sXsR4p+7=mT+o26C%;%m=+dHoL{#KVF3zSP91cWgB@m~@d68XEiv>1=Wj3uUh3xi7?BZEg#2Fd9f)EjFtiW|qDM%aS>1~DcZdPL5 zR;?!KQ?uWcQu?Hrm8=jf&*a2eMM_&i$ep|-Ve(qE!qYs!7a`uMq7|&nfl+x82pfUv zoQmZoh>581I+pa*yww1^mnE!|6YlKoC6tn!nb)Bv;N`5(gGN{G-g!}b2~F(tXs(0h zgq)MJg)G^{Vxfbahl# zlv7*fZd37kQIYt0Nz&mPVw@BYCSOoi7+B6qYF5&55p3Wf5w=a2;BZ!lv*BQU9@T;_*l$o3fP#CA#D?qE|wE)HGqRTP{1pyuAM59gvSCF zqe;pfCanO!O~f(eXj=?vU>Zq1saw`Mo{A?EnuN9FoQMkx$*G)l8q3$E~1GW5Q^ylM09$#%-)z%L5l~DgH5zp!y@808TY{AR%% zo-~Fh&EbSGoG8sC&6!zaX4agUH)iI|8O4}UN+@eSFj1?4T0a|oIR5GQqlQQPm%*)$nP80+E16z84t-J108x!)pht^P<7SJ^Mh1% zt(SXcW_7lNdS7B#xmiL3f7v>CBu>vzUHKTA=!k)itfrr$zD+o#+rP%iS25{0oAWT- zr>??S{&D0r@Y0W~yj{K9@Qq4y@FoB9FX4kXFAcBAiX8WK1FsMNq+Oj$HRCFDb++7Z zVobUB?U^S3N1V*(p)rfPOgh+B{o5U}Onyn$6)EP&rZBIl%>DhPN41XWBE1PwZ{ zoDxJ`$1=Q2Bux;0LD{;>E|3UgGLZjMG%|dL`j@XK(Esl=?F*cs%cO*W7?Ty{oFK&Z zSykjYBjA)3xLBOl2kii3lEv~B7*y?h(iV)#Bi-_AMbeSI(P!Z5y>9u%Jh?y0{|%Mn z?JLN(6VPwx)ekI2T9l#7N{dnolZUZuy@lQ@2W1!wfPjY-rF{s)b3aYfn|mm_{vTAQ zL3O@>uhbLt^4trG%+K>Q#ndb>t@-!=nW3dfTO;e?Ml*ci zN%+88_~5P6f2!VdXaB8J>rC+Du@A?V^%B##&Y+Lae|Y}e7uK1okI#K{ZkfM(<@S|3 Q-+0P2J+G&jX4}O70!gqCj{pDw literal 0 HcmV?d00001 diff --git a/CRM/__pycache__/logo_rc.cpython-313.pyc b/CRM/__pycache__/logo_rc.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea66a083771ea4662d014d62ef866e8d82ac3be1 GIT binary patch literal 873 zcmcgqO>fgc5S>ldZU{}A628U3iiD6Q)JtilQb0)Q1*)VpR=LCwjJrfuQ#&5pNWJkV zdPM5A{{~f#Ko&?yoO%n*A7Ez_hk`gW(!SmIW_M<1cE^=U8Kiw=nr9XOeh|q`a%JN+ zIURuo7Tbd744DB|0Si_Uixx+2X}1A2OP8qIS{+s=r@(;ToLM>}X0lA*i5mfmG12HQ zA@2vh02T?mZ<9Fjmj`|i<`wtcK+)(9?Ifeiu<4jEQVOnwndx#>lw;hIa0H#1qn(#B zQvm9+oDR>04xLrjDdnrxsaF;PCxzA-g*G*$DZ3W7MbC?3fo%~53A$p_iJk097=l?cGRVWWRGT*|)cSv5DS$VZZcZW8H4Fo3?5X zy32#ZY$1H+dvTsW!UY+EUNgES;RAf-<3_8isjYd> zZiKr&{-bMnNp3>AIbJ51C!l^{MMAa|Hu}Qxlfmywm!wX6w4970uH;};2UtpET3 literal 0 HcmV?d00001 diff --git a/CRM/main.py b/CRM/main.py new file mode 100644 index 0000000..e5795d3 --- /dev/null +++ b/CRM/main.py @@ -0,0 +1,114 @@ +import sys +import os +import pandas as pd +from PyQt6.QtWidgets import QApplication, QWidget, QMainWindow, QLabel +from PyQt6.QtCore import QTimer, Qt +from PyQt6.QtGui import QPixmap +from PyQt6.uic import loadUi + +# Klasör yolları +BASE_DIR = os.path.dirname(__file__) +UI_DIR = os.path.join(BASE_DIR, "UI_s") +IMG_DIR = os.path.join(UI_DIR, "logo") +EXCEL_DIR = os.path.join(BASE_DIR, "Excels") + +class SplashScreen(QWidget): + def __init__(self): + super().__init__() + splash_ui_path = os.path.join(UI_DIR, "Splash_Screen.ui") + loadUi(splash_ui_path, self) + self.setWindowTitle("CRM Splash Screen") + self.setFixedSize(1000, 600) + + # Logo yükleme + logo_path = os.path.join(IMG_DIR, "logo_butun.png") + if os.path.exists(logo_path): + self.label_logo.setPixmap(QPixmap(logo_path)) + self.label_logo.setScaledContents(True) + + self.counter = 0 + self.timer = QTimer() + self.timer.timeout.connect(self.update_progress) + self.timer.start(10) + + def update_progress(self): + self.counter += 1 + self.progressBar.setValue(self.counter) + if self.counter >= 100: + self.timer.stop() + self.show_login() + + def show_login(self): + self.login_window = LoginWindow() + self.login_window.show() + self.close() + + +class LoginWindow(QWidget): + def __init__(self): + super().__init__() + login_ui_path = os.path.join(UI_DIR, "Login_Window.ui") + loadUi(login_ui_path, self) + self.setWindowTitle("CRM Login") + self.setFixedSize(1000, 600) + + # Excel'den kullanıcıları oku + users_file = os.path.join(EXCEL_DIR, "users.xlsx") + if os.path.exists(users_file): + self.users_df = pd.read_excel(users_file) + else: + print("⚠️ Kullanıcı dosyası bulunamadı:", users_file) + self.users_df = pd.DataFrame(columns=["username", "password", "role"]) + + # Logo yükleme + logo_path = os.path.join(IMG_DIR, "logo_butun.png") + if os.path.exists(logo_path) and hasattr(self, "label"): + self.label.setPixmap(QPixmap(logo_path)) + self.label.setScaledContents(True) + + # Buton bağlantıları + self.pushButton_Exit.clicked.connect(self.close) + self.pushButton_Login.clicked.connect(self.login) + + def login(self): + username = self.lineEdit_username.text() + password = self.lineEdit_password.text() + + match = self.users_df[ + (self.users_df['username'] == username) & + (self.users_df['password'] == password) + ] + + if not match.empty: + role = match.iloc[0]['role'] + print(f"Giriş başarılı! Rol: {role}") + + if role == "admin": + ui_path = os.path.join(UI_DIR, "Preference_Admin_Menu.ui") + else: + ui_path = os.path.join(UI_DIR, "Preference_Menu.ui") + + self.dashboard = PreferenceWindow(ui_path) + self.dashboard.show() + self.close() + else: + print("❌ Hatalı kullanıcı adı veya şifre.") + + +class PreferenceWindow(QMainWindow): + def __init__(self, ui_path): + super().__init__() + loadUi(ui_path, self) + self.setWindowTitle("CRM Preferences") + self.setFixedSize(1000, 600) + + +def main(): + app = QApplication(sys.argv) + splash = SplashScreen() + splash.show() + sys.exit(app.exec()) + + +if __name__ == "__main__": + main() From 97abc1df94f67fc021d28f6f0215b73c50e2bdee Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Sat, 1 Nov 2025 22:03:21 +0100 Subject: [PATCH 02/37] Update Splash_Screen.ui --- CRM/UI_s/Splash_Screen.ui | 107 -------------------------------------- 1 file changed, 107 deletions(-) diff --git a/CRM/UI_s/Splash_Screen.ui b/CRM/UI_s/Splash_Screen.ui index 7a98524..d3f5a12 100644 --- a/CRM/UI_s/Splash_Screen.ui +++ b/CRM/UI_s/Splash_Screen.ui @@ -1,108 +1 @@ - - - Form - - - true - - - - 0 - 0 - 1000 - 600 - - - - - 0 - 0 - - - - - 1000 - 600 - - - - - 1000 - 600 - - - - - Modern - 15 - - - - Login Window - - - - :/logo/logo_icon.png:/logo/logo_icon.png - - - false - - - #Form{ -background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} - - - - - 10 - 130 - 971 - 250 - - - - image: url(:/logo/logo_butun.png); - - - - - - true - - - - - - 230 - 460 - 541 - 23 - - - - QProgressBar { - background: rgba(255, 255, 255, 0.25); /* Yarı saydam beyaz */ - border: 1px solid rgba(255, 255, 255, 0.4); - border-radius: 10px; - text-align: center; - color: rgba(255, 255, 255, 0.8); - font: bold 10pt "Segoe UI"; -} -QProgressBar::chunk { - background-color: rgba(120, 120, 120, 0.85); /* Daha koyu gri dolum */ - border-radius: 10px; - margin: 1px; -} - - - - 24 - - - - - - - - From fa9ecfd9cf1877d7e44cb805a138bc6d7edc072d Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Sat, 1 Nov 2025 22:03:47 +0100 Subject: [PATCH 03/37] Remove Preference_Menu.ui file --- CRM/UI_s/Preference_Menu.ui | 258 ------------------------------------ 1 file changed, 258 deletions(-) diff --git a/CRM/UI_s/Preference_Menu.ui b/CRM/UI_s/Preference_Menu.ui index ea09aa0..d3f5a12 100644 --- a/CRM/UI_s/Preference_Menu.ui +++ b/CRM/UI_s/Preference_Menu.ui @@ -1,259 +1 @@ - - - Form - - - - 0 - 0 - 1000 - 600 - - - - - 0 - 0 - - - - - 1000 - 600 - - - - - 1000 - 600 - - - - - Nirmala UI - - - - Preference Menu - - - - :/logo/logo_icon.png:/logo/logo_icon.png - - - #Form{ -background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} - - - - - 10 - 20 - 981 - 61 - - - - - Nirmala UI - 30 - 75 - true - - - - color: rgb(214, 30, 32); - - - PREFERENCE MENU - - - Qt::AlignCenter - - - - - - 510 - 160 - 341 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - APPLICATIONS - - - - - - 130 - 250 - 341 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - MENTOR MEETING - - - - - - 130 - 160 - 341 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - INTERVIEWS - - - - - - 130 - 420 - 341 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - RETURN MAIN MENU - - - - - - 700 - 420 - 151 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - EXIT - - - - - - - - From cab7cb3e9c043db2e80b5e2d36dc1a79b46b699d Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Sat, 1 Nov 2025 22:04:24 +0100 Subject: [PATCH 04/37] Remove Preference Admin Menu UI file --- CRM/UI_s/Preference_Admin_Menu.ui | 296 ------------------------------ 1 file changed, 296 deletions(-) diff --git a/CRM/UI_s/Preference_Admin_Menu.ui b/CRM/UI_s/Preference_Admin_Menu.ui index fe52eff..d3f5a12 100644 --- a/CRM/UI_s/Preference_Admin_Menu.ui +++ b/CRM/UI_s/Preference_Admin_Menu.ui @@ -1,297 +1 @@ - - - Form - - - - 0 - 0 - 1000 - 600 - - - - - 0 - 0 - - - - - 1000 - 600 - - - - - 1000 - 600 - - - - - Nirmala UI - - - - Preference Admin Menu - - - - :/logo/logo_icon.png:/logo/logo_icon.png - - - #Form{ -background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255)); -} - - - - - 10 - 20 - 981 - 61 - - - - - Nirmala UI - 30 - 75 - true - - - - color: rgb(214, 30, 32); - - - PREFERENCE ADMIN MENU - - - Qt::AlignCenter - - - - - - 510 - 160 - 341 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - APPLICATIONS - - - - - - 130 - 250 - 341 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - MENTOR MEETING - - - - - - 130 - 160 - 341 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - INTERVIEWS - - - - - - 130 - 420 - 341 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - RETURN MAIN MENU - - - - - - 700 - 420 - 151 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - EXIT - - - - - - 510 - 250 - 341 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - ADMIN MENU - - - - - - - - From a58a4c5dca1290aa40de8025ddd29eb7d7fe4574 Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Sat, 1 Nov 2025 22:04:38 +0100 Subject: [PATCH 05/37] Remove CRM application implementation Removed the entire implementation of the CRM application, including the splash screen, login window, and preference window. --- CRM/main.py | 113 ---------------------------------------------------- 1 file changed, 113 deletions(-) diff --git a/CRM/main.py b/CRM/main.py index e5795d3..d3f5a12 100644 --- a/CRM/main.py +++ b/CRM/main.py @@ -1,114 +1 @@ -import sys -import os -import pandas as pd -from PyQt6.QtWidgets import QApplication, QWidget, QMainWindow, QLabel -from PyQt6.QtCore import QTimer, Qt -from PyQt6.QtGui import QPixmap -from PyQt6.uic import loadUi -# Klasör yolları -BASE_DIR = os.path.dirname(__file__) -UI_DIR = os.path.join(BASE_DIR, "UI_s") -IMG_DIR = os.path.join(UI_DIR, "logo") -EXCEL_DIR = os.path.join(BASE_DIR, "Excels") - -class SplashScreen(QWidget): - def __init__(self): - super().__init__() - splash_ui_path = os.path.join(UI_DIR, "Splash_Screen.ui") - loadUi(splash_ui_path, self) - self.setWindowTitle("CRM Splash Screen") - self.setFixedSize(1000, 600) - - # Logo yükleme - logo_path = os.path.join(IMG_DIR, "logo_butun.png") - if os.path.exists(logo_path): - self.label_logo.setPixmap(QPixmap(logo_path)) - self.label_logo.setScaledContents(True) - - self.counter = 0 - self.timer = QTimer() - self.timer.timeout.connect(self.update_progress) - self.timer.start(10) - - def update_progress(self): - self.counter += 1 - self.progressBar.setValue(self.counter) - if self.counter >= 100: - self.timer.stop() - self.show_login() - - def show_login(self): - self.login_window = LoginWindow() - self.login_window.show() - self.close() - - -class LoginWindow(QWidget): - def __init__(self): - super().__init__() - login_ui_path = os.path.join(UI_DIR, "Login_Window.ui") - loadUi(login_ui_path, self) - self.setWindowTitle("CRM Login") - self.setFixedSize(1000, 600) - - # Excel'den kullanıcıları oku - users_file = os.path.join(EXCEL_DIR, "users.xlsx") - if os.path.exists(users_file): - self.users_df = pd.read_excel(users_file) - else: - print("⚠️ Kullanıcı dosyası bulunamadı:", users_file) - self.users_df = pd.DataFrame(columns=["username", "password", "role"]) - - # Logo yükleme - logo_path = os.path.join(IMG_DIR, "logo_butun.png") - if os.path.exists(logo_path) and hasattr(self, "label"): - self.label.setPixmap(QPixmap(logo_path)) - self.label.setScaledContents(True) - - # Buton bağlantıları - self.pushButton_Exit.clicked.connect(self.close) - self.pushButton_Login.clicked.connect(self.login) - - def login(self): - username = self.lineEdit_username.text() - password = self.lineEdit_password.text() - - match = self.users_df[ - (self.users_df['username'] == username) & - (self.users_df['password'] == password) - ] - - if not match.empty: - role = match.iloc[0]['role'] - print(f"Giriş başarılı! Rol: {role}") - - if role == "admin": - ui_path = os.path.join(UI_DIR, "Preference_Admin_Menu.ui") - else: - ui_path = os.path.join(UI_DIR, "Preference_Menu.ui") - - self.dashboard = PreferenceWindow(ui_path) - self.dashboard.show() - self.close() - else: - print("❌ Hatalı kullanıcı adı veya şifre.") - - -class PreferenceWindow(QMainWindow): - def __init__(self, ui_path): - super().__init__() - loadUi(ui_path, self) - self.setWindowTitle("CRM Preferences") - self.setFixedSize(1000, 600) - - -def main(): - app = QApplication(sys.argv) - splash = SplashScreen() - splash.show() - sys.exit(app.exec()) - - -if __name__ == "__main__": - main() From 0efea1a3e85bb806b130d0c08d1a227c3958e0e8 Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Sat, 1 Nov 2025 22:05:16 +0100 Subject: [PATCH 06/37] Delete Admin_Menu.ui Removed the entire Admin Menu UI file. --- CRM/UI_s/Admin_Menu.ui | 288 ----------------------------------------- 1 file changed, 288 deletions(-) diff --git a/CRM/UI_s/Admin_Menu.ui b/CRM/UI_s/Admin_Menu.ui index 88065ce..d3f5a12 100644 --- a/CRM/UI_s/Admin_Menu.ui +++ b/CRM/UI_s/Admin_Menu.ui @@ -1,289 +1 @@ - - - Form - - - - 0 - 0 - 1000 - 600 - - - - - 0 - 0 - - - - - 1000 - 600 - - - - - 1000 - 600 - - - - - Nirmala UI - - - - Admin Menu - - - - :/logo/logo_icon.png:/logo/logo_icon.png - - - #Form{ -background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} - - - - - 10 - 20 - 981 - 61 - - - - - Nirmala UI - 30 - 75 - true - - - - color: rgb(214, 30, 32); - - - ADMIN MENU - - - Qt::AlignCenter - - - - - - 710 - 100 - 201 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - SEND E-MAIL - - - - - - 90 - 100 - 451 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - EVENT REGISTRATION - - - - - - 90 - 500 - 461 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - RETURN TO ADMIN PREFERENCE MENU - - - - - - 710 - 500 - 201 - 71 - - - - - Nirmala UI - 18 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - EXIT - - - - - - 90 - 190 - 821 - 291 - - - - background-color:rgb(255, 255, 255) - - - true - - - 194 - - - false - - - true - - - false - - - false - - - 28 - - - true - - - 23 - - - false - - - false - - - - Event Name - - - - - Start Time - - - - - Participant Email - - - - - Organizer Email - - - - - - - - - From 31f05f62dd95ac37d624443ae70e0e1c8643b030 Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Sat, 1 Nov 2025 22:05:27 +0100 Subject: [PATCH 07/37] Clear Applications.ui file Removed the entire content of the Applications.ui file. --- CRM/UI_s/Applications.ui | 487 --------------------------------------- 1 file changed, 487 deletions(-) diff --git a/CRM/UI_s/Applications.ui b/CRM/UI_s/Applications.ui index 0d6e81b..d3f5a12 100644 --- a/CRM/UI_s/Applications.ui +++ b/CRM/UI_s/Applications.ui @@ -1,488 +1 @@ - - - Form - - - - 0 - 0 - 1000 - 600 - - - - - 0 - 0 - - - - - 1000 - 600 - - - - - 1000 - 600 - - - - - Nirmala UI - - - - Applications - - - - :/logo/logo_icon.png:/logo/logo_icon.png - - - #Form{ -background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} - - - - - 10 - 20 - 981 - 61 - - - - - Nirmala UI - 30 - 75 - true - - - - color: rgb(214, 30, 32); - - - APPLICATIONS - - - Qt::AlignCenter - - - - - - 70 - 120 - 101 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - SEARCH - - - - - - 660 - 60 - 271 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - RETURN PREFERENCE MENU - - - - - - 70 - 180 - 301 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - DEFINED MENTOR MEETING - - - - - - 390 - 240 - 251 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - ALL APPLICATIONS - - - - - - 180 - 120 - 461 - 51 - - - - - 15 - true - - - - border-style:solid; -border-width:3px; -border-radius:20px; -border-color: rgb(218, 30, 60); -color: rgb(104, 104, 104); -background-color: rgb(255, 255, 255); -border-color: rgb(220, 63, 65); - - - Enter the text you want to search for here - - - - - - 660 - 180 - 271 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - DIFFERENT REGISTRATION - - - - - - 70 - 240 - 301 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - UNDEFINED MENTOR MEETING - - - - - - 660 - 240 - 271 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - DUPLICATE REGISTRATION - - - - - - 390 - 180 - 251 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - Qt::LeftToRight - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - PREVIOUS VIT CHECK - - - - - - 660 - 120 - 271 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - APPLICATION FILTERING - - - - - - 70 - 310 - 861 - 261 - - - - background-color: rgb(255, 255, 255); - - - 136 - - - true - - - - DATE - - - - - FULL NAME - - - - - E-MAIL - - - - - PHONE NUMBER - - - - - POSTAL CODE - - - - - PROVINCE - - - - - CURRENT STATUS - - - - - - - - - From bf46ce1a0d7712c601b5f43ded552ffb2b2a0eea Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Sat, 1 Nov 2025 22:05:37 +0100 Subject: [PATCH 08/37] Update Interviews.ui --- CRM/UI_s/Interviews.ui | 379 ----------------------------------------- 1 file changed, 379 deletions(-) diff --git a/CRM/UI_s/Interviews.ui b/CRM/UI_s/Interviews.ui index e4b5cef..d3f5a12 100644 --- a/CRM/UI_s/Interviews.ui +++ b/CRM/UI_s/Interviews.ui @@ -1,380 +1 @@ - - - Form - - - - 0 - 0 - 1000 - 600 - - - - - 0 - 0 - - - - - 1000 - 600 - - - - - 1000 - 600 - - - - - Nirmala UI - - - - Interviews - - - - :/logo/logo_icon.png:/logo/logo_icon.png - - - #Form{ -background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} - - - - - 10 - 20 - 981 - 61 - - - - - Nirmala UI - 30 - 75 - true - - - - color: rgb(214, 30, 32); - - - INTERVIEWS - - - Qt::AlignCenter - - - - - - 70 - 120 - 101 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - SEARCH - - - - - - 660 - 120 - 271 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - RETURN PREFERENCE MENU - - - - - - 70 - 190 - 301 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - SUBMITTED PROJECTS - - - - - - 180 - 120 - 461 - 51 - - - - - 15 - true - - - - border-style:solid; -border-width:3px; -border-radius:20px; - -color: rgb(104, 104, 104); -background-color: rgb(255, 255, 255); -border-color: rgb(220, 63, 65); - - - Enter the text you want to search for here - - - - - - 660 - 190 - 271 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - EXIT - - - - - - 390 - 190 - 251 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - Qt::LeftToRight - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - RECEIVED PROJECTS - - - - - - 70 - 270 - 861 - 281 - - - - background-color:rgb(255, 255, 255) - - - 283 - - - true - - - - Full Name - - - - Calibri - 9 - 75 - true - - - - - 255 - 255 - 255 - - - - - - 255 - 255 - 255 - - - - - - - Submission Date - - - - Calibri - 9 - 75 - true - - - - - 255 - 255 - 255 - - - - - - Delivery Date - - - - Calibri - 9 - 75 - true - - - - - - 255 - 255 - 255 - - - - - - - - - - - From 95b93639f537042fc856c6a6355283ade460dc35 Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Sat, 1 Nov 2025 22:05:47 +0100 Subject: [PATCH 09/37] Remove Login_Window.ui file --- CRM/UI_s/Login_Window.ui | 265 --------------------------------------- 1 file changed, 265 deletions(-) diff --git a/CRM/UI_s/Login_Window.ui b/CRM/UI_s/Login_Window.ui index 1a0ecf2..d3f5a12 100644 --- a/CRM/UI_s/Login_Window.ui +++ b/CRM/UI_s/Login_Window.ui @@ -1,266 +1 @@ - - - Form - - - true - - - - 0 - 0 - 1000 - 600 - - - - - 0 - 0 - - - - - 1000 - 600 - - - - - 1000 - 600 - - - - - Modern - 15 - - - - Login Window - - - - :/logo/logo_icon.png:/logo/logo_icon.png - - - false - - - #Form{ -background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} - - - - - 330 - 250 - 351 - 51 - - - - - Nirmala UI - 15 - true - - - - Qt::LeftToRight - - - border-style:solid; -border-width:3px; -border-radius:20px; -border-color: rgb(218, 30, 60); -color: rgb(104, 104, 104); -background-color: rgb(255, 255, 255); -border-color: rgb(220, 63, 65); - - - Qt::ImhNone - - - - - - Qt::AlignCenter - - - false - - - Enter your username - - - - - true - - - - 330 - 320 - 351 - 51 - - - - - Nirmala UI - 15 - true - - - - border-style:solid; -border-width:3px; -border-radius:20px; -border-color: rgb(218, 30, 60); -color: rgb(104, 104, 104); -background-color: rgb(255, 255, 255); -border-color: rgb(220, 63, 65); - - - QLineEdit::Password - - - Qt::AlignCenter - - - Enter your password - - - - - - 530 - 420 - 171 - 71 - - - - - Nirmala UI - 20 - 75 - true - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - EXIT - - - - - true - - - - 310 - 420 - 171 - 71 - - - - - Nirmala UI - 20 - 75 - true - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - LOGIN - - - false - - - - - - 10 - 160 - 981 - 51 - - - - - Nirmala UI - 32 - 75 - true - false - - - - false - - - color: rgb(214, 30, 32); - - - CRM PROJECT - - - Qt::AlignCenter - - - - - - 280 - 40 - 431 - 111 - - - - image: url(:/logo/logo_butun.png); - - - - - - - - - - - From df0cad00054cfe898d9bc3f3f05f5c43d82e8db9 Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Sat, 1 Nov 2025 22:05:57 +0100 Subject: [PATCH 10/37] Update Mentor_Meeting_Page.ui --- CRM/UI_s/Mentor_Meeting_Page.ui | 381 -------------------------------- 1 file changed, 381 deletions(-) diff --git a/CRM/UI_s/Mentor_Meeting_Page.ui b/CRM/UI_s/Mentor_Meeting_Page.ui index 4e76c7f..d3f5a12 100644 --- a/CRM/UI_s/Mentor_Meeting_Page.ui +++ b/CRM/UI_s/Mentor_Meeting_Page.ui @@ -1,382 +1 @@ - - - Form - - - - 0 - 0 - 1000 - 600 - - - - - 0 - 0 - - - - - 1000 - 600 - - - - - 1000 - 600 - - - - - Nirmala UI - - - - Mentor Meeting Page - - - - :/logo/logo_icon.png:/logo/logo_icon.png - - - #Form{ -background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} - - - - - 10 - 20 - 981 - 61 - - - - - Nirmala UI - 30 - 75 - true - - - - color: rgb(214, 30, 32); - - - MENTOR MEETING PAGE - - - Qt::AlignCenter - - - - - - 70 - 120 - 141 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - SEARCH - - - - - - 670 - 120 - 271 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - RETURN PREFERENCE MENU - - - - - - 70 - 180 - 141 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - ALL MEETINGS - - - - - - 230 - 120 - 421 - 51 - - - - - 15 - true - - - - border-style:solid; -border-width:3px; -border-radius:20px; -border-color: rgb(218, 30, 60); -color: rgb(104, 104, 104); -background-color: rgb(255, 255, 255); -border-color: rgb(220, 63, 65); - - - Enter the text you want to search for here - - - - - - 670 - 180 - 271 - 51 - - - - - Nirmala UI - 15 - 50 - false - - - - Qt::LeftToRight - - - QPushButton{ - color: rgb(214, 30, 32); - background-color: rgb(253, 253, 253); -} - -QPushButton::hover{ - background-color: rgb(226, 92, 93); - color: rgb(255, 255, 255); -} - -QPushButton::pressed{ - background-color: rgb(216, 37, 39); -} - - - EXIT - - - - - - 70 - 250 - 871 - 321 - - - - background-color:rgb(255, 255, 255) - - - false - - - 144 - - - 54 - - - true - - - - Meeting Date - - - - - Period - - - - - Full Name - - - - - Mentor - - - - - Evaluation - - - - - Current Status - - - - - - - 230 - 180 - 421 - 51 - - - - QPushButton { - font-size: 16px; - font-weight: bold; - font-family: Arial; - color: black; /* Siyah yazı rengi */ - - background-color: rgb(255, 255, 255); - border-radius: 8px; /* Köşe yuvarlama */ - padding: 8px; /* Küçük padding */ - border: none; - - /* Gölgelendirme eklemek için: */ - box-shadow: 3px 3px 6px rgba(0, 0, 0, 0.3); /* Gölgenin boyutu ve rengi */ -} - -QPushButton:hover { - background-color: #c0c0c0; /* Hover durumunda biraz daha koyu gri */ - /* Hover durumunda gölgeyi değiştirmek için */ - box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5); /* Hover sırasında daha belirgin gölge */ -} - - - - - It is appropriate to participate in the entire VIT project - - - - - It is appropriate to receive initial IT training within the VIT project and be directed to ITPH - - - - - It is appropriate to receive English training within the VIT project and be directed to ITPH - - - - - It is appropriate to be directly directed to ITPH within the scope of the VIT project - - - - - It is appropriate to be directed to a job through individual coaching - - - - - It would be more appropriate to participate in the next VIT project - - - - - Should be directed to another sector - - - - - Other - - - - - - - - - From f3fa1c266dc396d9d9b8d044e5d657554e46b52e Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Mon, 3 Nov 2025 20:35:09 +0100 Subject: [PATCH 11/37] main olusturuldu Implement main application window with mouse drag support. --- CRM/main.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/CRM/main.py b/CRM/main.py index d3f5a12..3a20e0b 100644 --- a/CRM/main.py +++ b/CRM/main.py @@ -1 +1,42 @@ +# main.py +import sys +import os +import pandas as pd +from PyQt6.QtWidgets import QApplication, QWidget +from PyQt6.QtCore import QTimer, Qt, QPoint +from PyQt6.QtGui import QPixmap +from PyQt6.uic import loadUi +# ==== KLASÖR YOLLARI ==== # +BASE_DIR = os.path.dirname(__file__) +UI_DIR = os.path.join(BASE_DIR, "UI_s") +IMG_DIR = os.path.join(UI_DIR, "logo") +EXCEL_DIR = os.path.join(BASE_DIR, "Excels") + +# ==== GLOBAL DEĞİŞKEN ==== # +last_window_pos = None # Son pencere pozisyonunu saklamak için + +# ==== BASE WINDOW ==== # +class BaseWindow(QWidget): + def __init__(self): + super().__init__() + self.oldPos = None + + def mousePressEvent(self, event): + if event.button() == Qt.MouseButton.LeftButton: + self.oldPos = event.globalPosition().toPoint() + + def mouseMoveEvent(self, event): + import main # global değişkeni güncel tutmak için if event.buttons() == Qt.MouseButton.LeftButton: + delta = event.globalPosition().toPoint() - self.oldPos + self.move(self.x() + delta.x(), self.y() + delta.y()) + self.oldPos = event.globalPosition().toPoint() + main.last_window_pos = self.pos() + + def move_to_last_position(self): + import main + if main.last_window_pos: + self.move(main.last_window_pos) + else: + # İlk sefer için, mevcut konumu kaydet + main.last_window_pos = self.pos() From 7842672911e4828c352615719036f4c7c13580fb Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Mon, 3 Nov 2025 20:36:24 +0100 Subject: [PATCH 12/37] artik dosya tamam --- CRM/main.py | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) diff --git a/CRM/main.py b/CRM/main.py index 3a20e0b..de370aa 100644 --- a/CRM/main.py +++ b/CRM/main.py @@ -40,3 +40,189 @@ def move_to_last_position(self): else: # İlk sefer için, mevcut konumu kaydet main.last_window_pos = self.pos() + + +# ==== SPLASH SCREEN ==== # +class SplashScreen(BaseWindow): + def __init__(self): + super().__init__() + loadUi(os.path.join(UI_DIR, "Splash_Screen.ui"), self) + self.setWindowTitle("CRM Splash Screen") + self.setFixedSize(1000, 600) + self.setWindowFlag(Qt.WindowType.FramelessWindowHint) + self.move_to_last_position() + + logo_path = os.path.join(IMG_DIR, "logo_butun.png") + if os.path.exists(logo_path): + self.label_logo.setPixmap(QPixmap(logo_path)) + self.label_logo.setScaledContents(True) + + self.counter = 0 + self.timer = QTimer() + self.timer.timeout.connect(self.update_progress) + self.timer.start(10) + + def update_progress(self): + self.counter += 1 + self.progressBar.setValue(self.counter) + if self.counter >= 100: + self.timer.stop() + self.show_login() + + def show_login(self): + self.login_window = LoginWindow() + self.login_window.show() + self.close() + + +# ==== LOGIN WINDOW ==== # +class LoginWindow(BaseWindow): + def __init__(self): + super().__init__() + loadUi(os.path.join(UI_DIR, "Login_Window.ui"), self) + self.setWindowTitle("CRM Login") + self.setFixedSize(1000, 600) + self.setWindowFlag(Qt.WindowType.FramelessWindowHint) + self.move_to_last_position() + + logo_path = os.path.join(IMG_DIR, "logo_butun.png") + if os.path.exists(logo_path): + self.label.setPixmap(QPixmap(logo_path)) + self.label.setScaledContents(True) + + users_file = os.path.join(EXCEL_DIR, "users.xlsx") + self.users_df = pd.read_excel(users_file) + + self.pushButton_Exit.clicked.connect(self.close) + self.pushButton_Login.clicked.connect(self.login) + + def login(self): + username = self.lineEdit_username.text() + password = self.lineEdit_password.text() + + match = self.users_df[ + (self.users_df['username'] == username) & + (self.users_df['password'] == password) + ] + + if not match.empty: + role = match.iloc[0]['role'].lower() + print(f"Giriş başarılı! Rol: {role}") + if role == "admin": + self.dashboard = PreferenceAdminMenu(role=role) + else: + self.dashboard = PreferenceMenu(role=role) + self.dashboard.show() + self.close() + else: + print("Hatalı kullanıcı adı veya şifre.") + + def keyPressEvent(self, event): + if event.key() in (Qt.Key.Key_Return, Qt.Key.Key_Enter): + self.login() + + +# ==== ADMIN REEFERENCE MENU ==== # +class PreferenceAdminMenu(BaseWindow): + def __init__(self, role="admin"): + super().__init__() + self.role = role + loadUi(os.path.join(UI_DIR, "Preference_Admin_Menu.ui"), self) + self.setWindowTitle("Admin Menu") + self.setFixedSize(1000, 600) + self.setWindowFlag(Qt.WindowType.FramelessWindowHint) + self.move_to_last_position() + + self.pushButton_INTERVIEWS.clicked.connect(self.open_interviews) + self.pushButton_APPLICATIONS.clicked.connect(self.open_applications) + self.pushButton_Mentor_Meeting.clicked.connect(self.open_mentor_meeting) + self.pushButton_ADMIN_MENU.clicked.connect(self.open_admin_settings) + self.pushButton_Return_Main_menu.clicked.connect(self.return_to_login) + self.pushButton_Exit.clicked.connect(self.close) + + def open_interviews(self): + from interviews_page import InterviewsWindow + self.interviews_window = InterviewsWindow(role=self.role) + self.interviews_window.show() + self.close() + + def open_applications(self): + from applications_page import ApplicationsWindow + self.app_window = ApplicationsWindow(role=self.role) + self.app_window.show() + self.close() + + def open_mentor_meeting(self): + from mentor_meeting_page import MentorMeetingWindow + self.mentor_meeting_window = MentorMeetingWindow(role=self.role) + self.mentor_meeting_window.show() + self.close() + + def open_admin_settings(self): + from admin_menu_page import AdminMenuWindow + self.admin_menu = AdminMenuWindow(role=self.role) + self.admin_menu.show() + self.close() + + def return_to_login(self): + self.login = LoginWindow() + self.login.show() + self.close() + + +# ==== USER REEFERENCE MENU ==== # +class PreferenceMenu(BaseWindow): + def __init__(self, role="user"): + super().__init__() + self.role = role + loadUi(os.path.join(UI_DIR, "Preference_Menu.ui"), self) + self.setWindowTitle("User Menu") + self.setFixedSize(1000, 600) + self.setWindowFlag(Qt.WindowType.FramelessWindowHint) + self.move_to_last_position() + + if hasattr(self, "pushButton_INTERVIEWS"): + self.pushButton_INTERVIEWS.clicked.connect(self.open_interviews) + if hasattr(self, "pushButton_APPLICATIONS"): + self.pushButton_APPLICATIONS.clicked.connect(self.open_applications) + if hasattr(self, "pushButton_Mentor_Meeting"): + self.pushButton_Mentor_Meeting.clicked.connect(self.open_mentor_meeting) + if hasattr(self, "pushButton_Return_Main_menu"): + self.pushButton_Return_Main_menu.clicked.connect(self.return_to_login) + if hasattr(self, "pushButton_Exit"): + self.pushButton_Exit.clicked.connect(self.close) + + def open_interviews(self): + from interviews_page import InterviewsWindow + self.interviews_window = InterviewsWindow(role=self.role) + self.interviews_window.show() + self.close() + + def open_applications(self): + from applications_page import ApplicationsWindow + self.app_window = ApplicationsWindow(role=self.role) + self.app_window.show() + self.close() + + def open_mentor_meeting(self): + from mentor_meeting_page import MentorMeetingWindow + self.mentor_meeting_window = MentorMeetingWindow(role=self.role) + self.mentor_meeting_window.show() + self.close() + + def return_to_login(self): + self.login = LoginWindow() + self.login.show() + self.close() + + +# ==== MAIN ==== # +def main(): + app = QApplication(sys.argv) + splash = SplashScreen() + splash.show() + sys.exit(app.exec()) + + +if __name__ == "__main__": + main() From 4c8c65633a64694586e6d99a0f5d4e57f7ab6e01 Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Mon, 3 Nov 2025 20:52:55 +0100 Subject: [PATCH 13/37] Add files via upload --- CRM/Excels/Interviews.xlsx | Bin 0 -> 5559 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 CRM/Excels/Interviews.xlsx diff --git a/CRM/Excels/Interviews.xlsx b/CRM/Excels/Interviews.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..549481321bce6b3eb6db71766a4d8523b82d869a GIT binary patch literal 5559 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 OkYTS(tP~Re9Q7~IXE Date: Mon, 3 Nov 2025 20:54:45 +0100 Subject: [PATCH 14/37] Add files via upload --- CRM/UI_s/Admin_Menu.ui | 288 ++++++++++++++++++ CRM/UI_s/Applications.ui | 490 ++++++++++++++++++++++++++++++ CRM/UI_s/Interviews.ui | 382 +++++++++++++++++++++++ CRM/UI_s/Login_Window.ui | 271 +++++++++++++++++ CRM/UI_s/Mentor_Meeting_Page.ui | 384 +++++++++++++++++++++++ CRM/UI_s/Preference_Admin_Menu.ui | 296 ++++++++++++++++++ CRM/UI_s/Preference_Menu.ui | 258 ++++++++++++++++ CRM/UI_s/Splash_Screen.ui | 107 +++++++ CRM/UI_s/ZZZZZZ.txt | 2 +- 9 files changed, 2477 insertions(+), 1 deletion(-) diff --git a/CRM/UI_s/Admin_Menu.ui b/CRM/UI_s/Admin_Menu.ui index d3f5a12..88065ce 100644 --- a/CRM/UI_s/Admin_Menu.ui +++ b/CRM/UI_s/Admin_Menu.ui @@ -1 +1,289 @@ + + + Form + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Nirmala UI + + + + Admin Menu + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 10 + 20 + 981 + 61 + + + + + Nirmala UI + 30 + 75 + true + + + + color: rgb(214, 30, 32); + + + ADMIN MENU + + + Qt::AlignCenter + + + + + + 710 + 100 + 201 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + SEND E-MAIL + + + + + + 90 + 100 + 451 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EVENT REGISTRATION + + + + + + 90 + 500 + 461 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RETURN TO ADMIN PREFERENCE MENU + + + + + + 710 + 500 + 201 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EXIT + + + + + + 90 + 190 + 821 + 291 + + + + background-color:rgb(255, 255, 255) + + + true + + + 194 + + + false + + + true + + + false + + + false + + + 28 + + + true + + + 23 + + + false + + + false + + + + Event Name + + + + + Start Time + + + + + Participant Email + + + + + Organizer Email + + + + + + + + + diff --git a/CRM/UI_s/Applications.ui b/CRM/UI_s/Applications.ui index d3f5a12..872db8e 100644 --- a/CRM/UI_s/Applications.ui +++ b/CRM/UI_s/Applications.ui @@ -1 +1,491 @@ + + + Form + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Nirmala UI + + + + Applications + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 10 + 20 + 981 + 61 + + + + + Nirmala UI + 30 + 75 + true + + + + color: rgb(214, 30, 32); + + + APPLICATIONS + + + Qt::AlignCenter + + + + + + 70 + 120 + 101 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + SEARCH + + + + + + 660 + 60 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RETURN PREFERENCE MENU + + + + + + 70 + 180 + 301 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + DEFINED MENTOR MEETING + + + + + + 390 + 240 + 251 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + ALL APPLICATIONS + + + + + + 180 + 120 + 461 + 51 + + + + + 15 + true + + + + Qt::ClickFocus + + + border-style:solid; +border-width:3px; +border-radius:20px; +border-color: rgb(218, 30, 60); +color: rgb(104, 104, 104); +background-color: rgb(255, 255, 255); +border-color: rgb(220, 63, 65); + + + Enter the text you want to search for here + + + + + + 660 + 180 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + DIFFERENT REGISTRATION + + + + + + 70 + 240 + 301 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + UNDEFINED MENTOR MEETING + + + + + + 660 + 240 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + DUPLICATE REGISTRATION + + + + + + 390 + 180 + 251 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + Qt::LeftToRight + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + PREVIOUS VIT CHECK + + + + + + 660 + 120 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + APPLICATION FILTERING + + + + + + 70 + 310 + 861 + 261 + + + + background-color: rgb(255, 255, 255); + + + 136 + + + true + + + + DATE + + + + + FULL NAME + + + + + E-MAIL + + + + + PHONE NUMBER + + + + + POSTAL CODE + + + + + PROVINCE + + + + + CURRENT STATUS + + + + + + + + + diff --git a/CRM/UI_s/Interviews.ui b/CRM/UI_s/Interviews.ui index d3f5a12..4af1679 100644 --- a/CRM/UI_s/Interviews.ui +++ b/CRM/UI_s/Interviews.ui @@ -1 +1,383 @@ + + + Form + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Nirmala UI + + + + Interviews + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 10 + 20 + 981 + 61 + + + + + Nirmala UI + 30 + 75 + true + + + + color: rgb(214, 30, 32); + + + INTERVIEWS + + + Qt::AlignCenter + + + + + + 70 + 120 + 101 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + SEARCH + + + + + + 660 + 120 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RETURN PREFERENCE MENU + + + + + + 70 + 190 + 301 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + SUBMITTED PROJECTS + + + + + + 180 + 120 + 461 + 51 + + + + + 15 + true + + + + Qt::ClickFocus + + + border-style:solid; +border-width:3px; +border-radius:20px; + +color: rgb(104, 104, 104); +background-color: rgb(255, 255, 255); +border-color: rgb(220, 63, 65); + + + Enter the text you want to search for here + + + + + + 660 + 190 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EXIT + + + + + + 390 + 190 + 251 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + Qt::LeftToRight + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RECEIVED PROJECTS + + + + + + 70 + 270 + 861 + 281 + + + + background-color:rgb(255, 255, 255) + + + 283 + + + true + + + + Full Name + + + + Calibri + 9 + 75 + true + + + + + 255 + 255 + 255 + + + + + + 255 + 255 + 255 + + + + + + + Submission Date + + + + Calibri + 9 + 75 + true + + + + + 255 + 255 + 255 + + + + + + Delivery Date + + + + Calibri + 9 + 75 + true + + + + + + 255 + 255 + 255 + + + + + + + + + + + diff --git a/CRM/UI_s/Login_Window.ui b/CRM/UI_s/Login_Window.ui index d3f5a12..7e4cf60 100644 --- a/CRM/UI_s/Login_Window.ui +++ b/CRM/UI_s/Login_Window.ui @@ -1 +1,272 @@ + + + Form + + + true + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Modern + 15 + + + + Login Window + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + false + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 330 + 250 + 351 + 51 + + + + + Nirmala UI + 15 + true + + + + Qt::ClickFocus + + + Qt::LeftToRight + + + border-style:solid; +border-width:3px; +border-radius:20px; +border-color: rgb(218, 30, 60); +color: rgb(104, 104, 104); +background-color: rgb(255, 255, 255); +border-color: rgb(220, 63, 65); + + + Qt::ImhNone + + + + + + Qt::AlignCenter + + + false + + + Enter your username + + + + + true + + + + 330 + 320 + 351 + 51 + + + + + Nirmala UI + 15 + true + + + + Qt::ClickFocus + + + border-style:solid; +border-width:3px; +border-radius:20px; +border-color: rgb(218, 30, 60); +color: rgb(104, 104, 104); +background-color: rgb(255, 255, 255); +border-color: rgb(220, 63, 65); + + + QLineEdit::Password + + + Qt::AlignCenter + + + Enter your password + + + + + + 530 + 420 + 171 + 71 + + + + + Nirmala UI + 20 + 75 + true + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EXIT + + + + + true + + + + 310 + 420 + 171 + 71 + + + + + Nirmala UI + 20 + 75 + true + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + LOGIN + + + false + + + + + + 10 + 160 + 981 + 51 + + + + + Nirmala UI + 32 + 75 + true + false + + + + false + + + color: rgb(214, 30, 32); + + + CRM PROJECT + + + Qt::AlignCenter + + + + + + 280 + 40 + 431 + 111 + + + + image: url(:/logo/logo_butun.png); + + + + + + + + + + + diff --git a/CRM/UI_s/Mentor_Meeting_Page.ui b/CRM/UI_s/Mentor_Meeting_Page.ui index d3f5a12..a546536 100644 --- a/CRM/UI_s/Mentor_Meeting_Page.ui +++ b/CRM/UI_s/Mentor_Meeting_Page.ui @@ -1 +1,385 @@ + + + Form + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Nirmala UI + + + + Mentor Meeting Page + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 10 + 20 + 981 + 61 + + + + + Nirmala UI + 30 + 75 + true + + + + color: rgb(214, 30, 32); + + + MENTOR MEETING PAGE + + + Qt::AlignCenter + + + + + + 70 + 120 + 141 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + SEARCH + + + + + + 670 + 120 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RETURN PREFERENCE MENU + + + + + + 70 + 180 + 141 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + ALL MEETINGS + + + + + + 230 + 120 + 421 + 51 + + + + + 15 + true + + + + Qt::ClickFocus + + + border-style:solid; +border-width:3px; +border-radius:20px; +border-color: rgb(218, 30, 60); +color: rgb(104, 104, 104); +background-color: rgb(255, 255, 255); +border-color: rgb(220, 63, 65); + + + Enter the text you want to search for here + + + + + + 670 + 180 + 271 + 51 + + + + + Nirmala UI + 15 + 50 + false + + + + Qt::LeftToRight + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EXIT + + + + + + 70 + 250 + 871 + 321 + + + + background-color:rgb(255, 255, 255) + + + false + + + 144 + + + 54 + + + true + + + + Meeting Date + + + + + Period + + + + + Full Name + + + + + Mentor + + + + + Evaluation + + + + + Current Status + + + + + + + 230 + 180 + 421 + 51 + + + + QPushButton { + font-size: 16px; + font-weight: bold; + font-family: Arial; + color: black; /* Siyah yazı rengi */ + + background-color: rgb(255, 255, 255); + border-radius: 8px; /* Köşe yuvarlama */ + padding: 8px; /* Küçük padding */ + border: none; + + /* Gölgelendirme eklemek için: */ + box-shadow: 3px 3px 6px rgba(0, 0, 0, 0.3); /* Gölgenin boyutu ve rengi */ +} + +QPushButton:hover { + background-color: #c0c0c0; /* Hover durumunda biraz daha koyu gri */ + /* Hover durumunda gölgeyi değiştirmek için */ + box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5); /* Hover sırasında daha belirgin gölge */ +} + + + + + It is appropriate to participate in the entire VIT project + + + + + It is appropriate to receive initial IT training within the VIT project and be directed to ITPH + + + + + It is appropriate to receive English training within the VIT project and be directed to ITPH + + + + + It is appropriate to be directly directed to ITPH within the scope of the VIT project + + + + + It is appropriate to be directed to a job through individual coaching + + + + + It would be more appropriate to participate in the next VIT project + + + + + Should be directed to another sector + + + + + Other + + + + + + + + + diff --git a/CRM/UI_s/Preference_Admin_Menu.ui b/CRM/UI_s/Preference_Admin_Menu.ui index d3f5a12..fe52eff 100644 --- a/CRM/UI_s/Preference_Admin_Menu.ui +++ b/CRM/UI_s/Preference_Admin_Menu.ui @@ -1 +1,297 @@ + + + Form + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Nirmala UI + + + + Preference Admin Menu + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255)); +} + + + + + 10 + 20 + 981 + 61 + + + + + Nirmala UI + 30 + 75 + true + + + + color: rgb(214, 30, 32); + + + PREFERENCE ADMIN MENU + + + Qt::AlignCenter + + + + + + 510 + 160 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + APPLICATIONS + + + + + + 130 + 250 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + MENTOR MEETING + + + + + + 130 + 160 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + INTERVIEWS + + + + + + 130 + 420 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RETURN MAIN MENU + + + + + + 700 + 420 + 151 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EXIT + + + + + + 510 + 250 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + ADMIN MENU + + + + + + + + diff --git a/CRM/UI_s/Preference_Menu.ui b/CRM/UI_s/Preference_Menu.ui index d3f5a12..ea09aa0 100644 --- a/CRM/UI_s/Preference_Menu.ui +++ b/CRM/UI_s/Preference_Menu.ui @@ -1 +1,259 @@ + + + Form + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Nirmala UI + + + + Preference Menu + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 10 + 20 + 981 + 61 + + + + + Nirmala UI + 30 + 75 + true + + + + color: rgb(214, 30, 32); + + + PREFERENCE MENU + + + Qt::AlignCenter + + + + + + 510 + 160 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + APPLICATIONS + + + + + + 130 + 250 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + MENTOR MEETING + + + + + + 130 + 160 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + INTERVIEWS + + + + + + 130 + 420 + 341 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + RETURN MAIN MENU + + + + + + 700 + 420 + 151 + 71 + + + + + Nirmala UI + 18 + 50 + false + + + + QPushButton{ + color: rgb(214, 30, 32); + background-color: rgb(253, 253, 253); +} + +QPushButton::hover{ + background-color: rgb(226, 92, 93); + color: rgb(255, 255, 255); +} + +QPushButton::pressed{ + background-color: rgb(216, 37, 39); +} + + + EXIT + + + + + + + + diff --git a/CRM/UI_s/Splash_Screen.ui b/CRM/UI_s/Splash_Screen.ui index d3f5a12..7a98524 100644 --- a/CRM/UI_s/Splash_Screen.ui +++ b/CRM/UI_s/Splash_Screen.ui @@ -1 +1,108 @@ + + + Form + + + true + + + + 0 + 0 + 1000 + 600 + + + + + 0 + 0 + + + + + 1000 + 600 + + + + + 1000 + 600 + + + + + Modern + 15 + + + + Login Window + + + + :/logo/logo_icon.png:/logo/logo_icon.png + + + false + + + #Form{ +background-color: qconicalgradient(cx:0.114, cy:0.113318, angle:134.3, stop:0 rgba(214, 28, 30, 255), stop:1 rgba(255, 255, 255, 255));} + + + + + 10 + 130 + 971 + 250 + + + + image: url(:/logo/logo_butun.png); + + + + + + true + + + + + + 230 + 460 + 541 + 23 + + + + QProgressBar { + background: rgba(255, 255, 255, 0.25); /* Yarı saydam beyaz */ + border: 1px solid rgba(255, 255, 255, 0.4); + border-radius: 10px; + text-align: center; + color: rgba(255, 255, 255, 0.8); + font: bold 10pt "Segoe UI"; +} +QProgressBar::chunk { + background-color: rgba(120, 120, 120, 0.85); /* Daha koyu gri dolum */ + border-radius: 10px; + margin: 1px; +} + + + + 24 + + + + + + + + diff --git a/CRM/UI_s/ZZZZZZ.txt b/CRM/UI_s/ZZZZZZ.txt index 5338947..6c518b9 100644 --- a/CRM/UI_s/ZZZZZZ.txt +++ b/CRM/UI_s/ZZZZZZ.txt @@ -12,4 +12,4 @@ pyuic6 -x Mentor_Meeting_Page.ui -o Mentor_Meeting_Page.py pyuic6 -x Preference_Admin_Menu.ui -o Preference_Admin_Menu.py -pyuic6 -x Preference_Menu.ui -o Preference_Menu.py \ No newline at end of file +pyuic6 -x Preference_Menu.ui -o Preference_Menu.py From f4e898e6688e8ca9b984b7b50c82d029c40324ef Mon Sep 17 00:00:00 2001 From: Faruk Furtana <94264525+ifafurt@users.noreply.github.com> Date: Mon, 3 Nov 2025 20:55:11 +0100 Subject: [PATCH 15/37] Add files via upload --- CRM/admin_menu_page.py | 34 +++++++++++++++++++++++++++ CRM/applications_page.py | 37 ++++++++++++++++++++++++++++++ CRM/interviews_page.py | 47 ++++++++++++++++++++++++++++++++++++++ CRM/main.py | 2 +- CRM/mentor_meeting_page.py | 34 +++++++++++++++++++++++++++ 5 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 CRM/admin_menu_page.py create mode 100644 CRM/applications_page.py create mode 100644 CRM/interviews_page.py create mode 100644 CRM/mentor_meeting_page.py diff --git a/CRM/admin_menu_page.py b/CRM/admin_menu_page.py new file mode 100644 index 0000000..5941873 --- /dev/null +++ b/CRM/admin_menu_page.py @@ -0,0 +1,34 @@ +import os +from PyQt6.uic import loadUi +from PyQt6.QtCore import Qt +from main import BaseWindow + +BASE_DIR = os.path.dirname(__file__) +UI_DIR = os.path.join(BASE_DIR, "UI_s") + +class AdminMenuWindow(BaseWindow): + def __init__(self, role="admin"): + super().__init__() + self.role = role + loadUi(os.path.join(UI_DIR, "Admin_Menu.ui"), self) + self.setWindowTitle("Admin Menu") + self.setFixedSize(1000, 600) + self.setWindowFlag(Qt.WindowType.FramelessWindowHint) + self.move_to_last_position() + + self.pushButton_SEND_EMAIL.clicked.connect(self.send_email) + self.pushButton_EVENT_REGISTRATION.clicked.connect(self.register_event) + self.pushButton_Return_TO_ADMIN_PREFERENCE_menu.clicked.connect(self.return_to_admin_pref_menu) + self.pushButton_Exit.clicked.connect(self.close) + + def send_email(self): + print("📧 Send Email clicked") + + def register_event(self): + print("🗓 Event Registration clicked") + + def return_to_admin_pref_menu(self): + from main import PreferenceAdminMenu + self.pref_menu = PreferenceAdminMenu(role=self.role) + self.pref_menu.show() + self.close() \ No newline at end of file diff --git a/CRM/applications_page.py b/CRM/applications_page.py new file mode 100644 index 0000000..9d2cdc3 --- /dev/null +++ b/CRM/applications_page.py @@ -0,0 +1,37 @@ +import os +from PyQt6.uic import loadUi +from PyQt6.QtCore import Qt +from main import BaseWindow + +BASE_DIR = os.path.dirname(__file__) +UI_DIR = os.path.join(BASE_DIR, "UI_s") + +class ApplicationsWindow(BaseWindow): + def __init__(self, role="admin"): + super().__init__() + self.role = role + loadUi(os.path.join(UI_DIR, "Applications.ui"), self) + self.setWindowTitle("Applications") + self.setFixedSize(1000, 600) + self.setWindowFlag(Qt.WindowType.FramelessWindowHint) + self.move_to_last_position() + + self.pushButton_RETURN_REFERENCE_MENU.clicked.connect(self.return_to_menu) + self.pushButton_SEARCH.clicked.connect(self.search_action) + self.pushButton_ALL_APPLICATIONS.clicked.connect(self.show_all_applications) + + def return_to_menu(self): + from main import PreferenceAdminMenu, PreferenceMenu + if self.role.lower() == "admin": + self.pref_menu = PreferenceAdminMenu(role=self.role) + else: + self.pref_menu = PreferenceMenu(role=self.role) + self.pref_menu.show() + self.close() + + def search_action(self): + text = self.lineEdit.text().strip() + print(f"Arama yapılıyor: {text}") + + def show_all_applications(self): + print("Tüm başvurular listeleniyor...") \ No newline at end of file diff --git a/CRM/interviews_page.py b/CRM/interviews_page.py new file mode 100644 index 0000000..3990464 --- /dev/null +++ b/CRM/interviews_page.py @@ -0,0 +1,47 @@ +# interviews_page.py + +import os +from PyQt6.uic import loadUi +from PyQt6.QtCore import Qt +from main import BaseWindow +from PyQt6 import QtWidgets + +BASE_DIR = os.path.dirname(__file__) +UI_DIR = os.path.join(BASE_DIR, "UI_s") + + +class InterviewsWindow(BaseWindow): + def __init__(self, role="admin"): + super().__init__() + self.role = role + loadUi(os.path.join(UI_DIR, "Interviews.ui"), self) + self.setWindowTitle("Interviews") + self.setFixedSize(1000, 600) + self.setWindowFlag(Qt.WindowType.FramelessWindowHint) + self.move_to_last_position() + + # Butonları bağla + self.pushButton_Return_REFERENCE_menu.clicked.connect(self.return_to_menu) + self.pushButton_EXIT.clicked.connect(self.close) + self.pushButton_SEARCH.clicked.connect(self.search_action) + self.pushButton_SUBMITTED_PROJECTS.clicked.connect(self.show_submitted_projects) + self.pushButton_RECEIVED_PROJECTS.clicked.connect(self.show_received_projects) + + def return_to_menu(self): + from main import PreferenceAdminMenu, PreferenceMenu + if self.role.lower() == "admin": + self.pref_menu = PreferenceAdminMenu(role=self.role) + else: + self.pref_menu = PreferenceMenu(role=self.role) + self.pref_menu.show() + self.close() + + def search_action(self): + text = self.lineEdit.text().strip() + print(f"🔍 Searching for: {text}") + + def show_submitted_projects(self): + print("📤 Showing submitted projects...") + + def show_received_projects(self): + print("📥 Showing received projects...") diff --git a/CRM/main.py b/CRM/main.py index de370aa..2e63d95 100644 --- a/CRM/main.py +++ b/CRM/main.py @@ -225,4 +225,4 @@ def main(): if __name__ == "__main__": - main() + main() \ No newline at end of file diff --git a/CRM/mentor_meeting_page.py b/CRM/mentor_meeting_page.py new file mode 100644 index 0000000..f41d92b --- /dev/null +++ b/CRM/mentor_meeting_page.py @@ -0,0 +1,34 @@ +import os +from PyQt6.uic import loadUi +from PyQt6.QtCore import Qt +from main import BaseWindow + +BASE_DIR = os.path.dirname(__file__) +UI_DIR = os.path.join(BASE_DIR, "UI_s") + +class MentorMeetingWindow(BaseWindow): + def __init__(self, role="admin"): + super().__init__() + self.role = role + loadUi(os.path.join(UI_DIR, "Mentor_Meeting_Page.ui"), self) + self.setWindowTitle("Mentor Meeting Page") + self.setFixedSize(1000, 600) + self.setWindowFlag(Qt.WindowType.FramelessWindowHint) + self.move_to_last_position() + + self.pushButton_Return_REFERENCE_menu.clicked.connect(self.return_to_menu) + self.pushButton_EXIT.clicked.connect(self.close) + self.pushButton_SEARCH.clicked.connect(self.search_action) + + def return_to_menu(self): + from main import PreferenceAdminMenu, PreferenceMenu + if self.role.lower() == "admin": + self.pref_menu = PreferenceAdminMenu(role=self.role) + else: + self.pref_menu = PreferenceMenu(role=self.role) + self.pref_menu.show() + self.close() + + def search_action(self): + text = self.lineEdit.text().strip() + print(f"🔍 Mentor Meeting search: {text}") \ No newline at end of file From 66dc3fd2288f8b1156f336794950bbe3fdc5ea37 Mon Sep 17 00:00:00 2001 From: rumeysa1017 Date: Tue, 4 Nov 2025 21:42:31 +0100 Subject: [PATCH 16/37] Add files via upload --- CRM/mentor_meeting_page.py | 1 - 1 file changed, 1 deletion(-) diff --git a/CRM/mentor_meeting_page.py b/CRM/mentor_meeting_page.py index f41d92b..9d40b8d 100644 --- a/CRM/mentor_meeting_page.py +++ b/CRM/mentor_meeting_page.py @@ -13,7 +13,6 @@ def __init__(self, role="admin"): loadUi(os.path.join(UI_DIR, "Mentor_Meeting_Page.ui"), self) self.setWindowTitle("Mentor Meeting Page") self.setFixedSize(1000, 600) - self.setWindowFlag(Qt.WindowType.FramelessWindowHint) self.move_to_last_position() self.pushButton_Return_REFERENCE_menu.clicked.connect(self.return_to_menu) From 9402e533af222085c0beb51fdb2650fe379b647b Mon Sep 17 00:00:00 2001 From: rumeysa1017 Date: Tue, 4 Nov 2025 21:42:55 +0100 Subject: [PATCH 17/37] Add files via upload --- CRM/Applications.py | 157 +++++++++++++++++++++++++++++++++++++++ CRM/admin_menu_page.py | 1 - CRM/applications_page.py | 1 - CRM/interviews_page.py | 1 - CRM/main.py | 43 ++++++----- 5 files changed, 182 insertions(+), 21 deletions(-) create mode 100644 CRM/Applications.py diff --git a/CRM/Applications.py b/CRM/Applications.py new file mode 100644 index 0000000..a207789 --- /dev/null +++ b/CRM/Applications.py @@ -0,0 +1,157 @@ +import sys +import os +import pandas as pd +from PyQt6.QtWidgets import QApplication, QWidget, QTableWidgetItem +from PyQt6.uic import loadUi +from PyQt6.QtCore import Qt +from main import BaseWindow + +# Klasör yolları +BASE_DIR = os.path.dirname(__file__) +UI_DIR = os.path.join(BASE_DIR, "UI_s") +EXCEL_DIR = os.path.join(BASE_DIR, "Excels") + +class ApplicationsWindow(BaseWindow): + def __init__(self, role="admin"): + super().__init__() + self.role = role + loadUi(os.path.join(UI_DIR, "Applications.ui"), self) + self.setWindowTitle("Applications") + self.setFixedSize(1000, 600) + self.move_to_last_position() + + # Excel dosyalarını yükle + self.applications_file = os.path.join(EXCEL_DIR, "Basvurular.xlsx") + self.vit1_file = os.path.join(EXCEL_DIR, "VIT1.xlsx") + self.vit2_file = os.path.join(EXCEL_DIR, "VIT2.xlsx") + + self.df = pd.read_excel(self.applications_file) if os.path.exists(self.applications_file) else pd.DataFrame() + self.vit1_df = pd.read_excel(self.vit1_file) if os.path.exists(self.vit1_file) else pd.DataFrame() + self.vit2_df = pd.read_excel(self.vit2_file) if os.path.exists(self.vit2_file) else pd.DataFrame() + + # Butonlara fonksiyon bağla + self.pushButton_SEARCH.clicked.connect(self.search_applications) + self.pushButton_ALL_APPLICATIONS.clicked.connect(self.load_all_applications) + self.pushButton_DEFINED_MENTOR_MEETING.clicked.connect(self.show_defined_mentor) + self.pushButton_UNDEFINED_MENTOR_MEETING.clicked.connect(self.show_undefined_mentor) + self.pushButton_DUPLICATE_REGISTRATION.clicked.connect(self.show_duplicates) + self.pushButton_PREVIOUS_VIT_CHECK.clicked.connect(self.show_previous_vit) + self.pushButton_DIFFERENT_REGISTRATION.clicked.connect(self.show_different) + self.pushButton_APPLICATION_FILTERING.clicked.connect(self.filter_applications) + self.pushButton_RETURN_REFERENCE_MENU.clicked.connect(self.return_to_menu) + + # ---------------- Fonksiyonlar ---------------- # + + def display_data(self, df): + """DataFrame'i tabloya yazdır.""" + self.tableWidget.clearContents() # önceki içerikleri temizle + self.tableWidget.setRowCount(0) # satır sayısını sıfırla + if df.empty: + print("Gösterilecek kayıt yok.") + return + df = df.reset_index(drop=True) # ← indeksleri sıfırla + self.tableWidget.setRowCount(len(df)) + self.tableWidget.setColumnCount(len(df.columns)) + self.tableWidget.setHorizontalHeaderLabels(df.columns) + for row_idx, row in df.iterrows(): + for col_idx, value in enumerate(row): + item = QTableWidgetItem(str(value)) + item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) + self.tableWidget.setItem(row_idx, col_idx, item) + + + def search_applications(self): + """Arama fonksiyonu: lineEdit içindeki metin ile isim/soyisim araması.""" + try: + search_text = self.lineEdit.text().strip().lower() + print("Arama metni:", search_text) + + if 'Adınız Soyadınız' not in self.df.columns: + print("'Adınız Soyadınız' sütunu bulunamadı.") + return + + if not search_text: + self.display_data(self.df) + return + + # Veriyi temizle + df_clean = self.df.copy() + df_clean['Adınız Soyadınız'] = df_clean['Adınız Soyadınız'].astype(str).str.lower().str.strip() + + # Arama mantığı: içinde geçiyorsa eşleştir + mask = df_clean['Adınız Soyadınız'].apply(lambda x: search_text in x) + filtered_df = df_clean[mask].reset_index(drop=True) + + print("Arama sonucu:", filtered_df[['Adınız Soyadınız']].to_string(index=False)) + + self.display_data(filtered_df) + except Exception as e: + print(f"Search Error: {e}") + + + def load_all_applications(self): + """Tüm başvuruları tabloya yazdır.""" + self.display_data(self.df) + + def show_defined_mentor(self): + if 'Mentor gorusmesi' in self.df.columns: + filtered_df = self.df[self.df['Mentor gorusmesi'] == 'OK'] + print(f"Mentoru atanmış adaylar: {len(filtered_df)} kayıt bulundu.") + self.display_data(filtered_df) + + def show_undefined_mentor(self): + if 'Mentor gorusmesi' in self.df.columns: + filtered_df = self.df[self.df['Mentor gorusmesi'] == 'ATANMADI'] + print(f"Mentoru atanmamış adaylar: {len(filtered_df)} kayıt bulundu.") + self.display_data(filtered_df) + + + def show_duplicates(self): + """Aynı isim ve e-posta ile kayıtlı adayları göster.""" + if all(col in self.df.columns for col in ['Adınız Soyadınız', 'Mail adresiniz']): + duplicates = self.df[self.df.duplicated(subset=['Adınız Soyadınız', 'Mail adresiniz'], keep=False)] + self.display_data(duplicates) + + def filter_applications(self): + """Duplicate kayıtları filtrele ve sadece tekil göster.""" + if all(col in self.df.columns for col in ['Adınız Soyadınız', 'Mail adresiniz']): + filtered = self.df.drop_duplicates(subset=['Adınız Soyadınız', 'Mail adresiniz']) + self.display_data(filtered) + + def show_previous_vit(self): + """VIT1 veya VIT2 ile ortak adayları göster.""" + if self.vit1_df.empty and self.vit2_df.empty: + print("VIT1 ve VIT2 dosyaları bulunamadı.") + self.tableWidget.setRowCount(0) + return + vit_all = pd.concat([self.vit1_df, self.vit2_df], ignore_index=True) + common = self.df.merge(vit_all, how='inner', on=['Adınız Soyadınız', 'Mail adresiniz']) + self.display_data(common) + + def show_different(self): + """VIT1 ve VIT2’de olmayan adayları göster.""" + if self.vit1_df.empty and self.vit2_df.empty: + print("VIT1 ve VIT2 dosyaları bulunamadı.") + self.tableWidget.setRowCount(0) + return + vit_all = pd.concat([self.vit1_df, self.vit2_df], ignore_index=True) + different = self.df.merge(vit_all, how='left', on=['Adınız Soyadınız', 'Mail adresiniz'], indicator=True) + different = different[different['_merge'] == 'left_only'].drop(columns=['_merge']) + self.display_data(different) + + def return_to_menu(self): + from main import PreferenceAdminMenu, PreferenceMenu + if self.role.lower() == "admin": + self.pref_menu = PreferenceAdminMenu(role=self.role) + else: + self.pref_menu = PreferenceMenu(role=self.role) + self.pref_menu.show() + self.close() + + +# ----------------- Main ----------------- # +if __name__ == "__main__": + app = QApplication(sys.argv) + window = ApplicationsWindow(role="admin") + window.show() + sys.exit(app.exec()) diff --git a/CRM/admin_menu_page.py b/CRM/admin_menu_page.py index 5941873..a99050a 100644 --- a/CRM/admin_menu_page.py +++ b/CRM/admin_menu_page.py @@ -13,7 +13,6 @@ def __init__(self, role="admin"): loadUi(os.path.join(UI_DIR, "Admin_Menu.ui"), self) self.setWindowTitle("Admin Menu") self.setFixedSize(1000, 600) - self.setWindowFlag(Qt.WindowType.FramelessWindowHint) self.move_to_last_position() self.pushButton_SEND_EMAIL.clicked.connect(self.send_email) diff --git a/CRM/applications_page.py b/CRM/applications_page.py index 9d2cdc3..e89c725 100644 --- a/CRM/applications_page.py +++ b/CRM/applications_page.py @@ -13,7 +13,6 @@ def __init__(self, role="admin"): loadUi(os.path.join(UI_DIR, "Applications.ui"), self) self.setWindowTitle("Applications") self.setFixedSize(1000, 600) - self.setWindowFlag(Qt.WindowType.FramelessWindowHint) self.move_to_last_position() self.pushButton_RETURN_REFERENCE_MENU.clicked.connect(self.return_to_menu) diff --git a/CRM/interviews_page.py b/CRM/interviews_page.py index 3990464..45ae442 100644 --- a/CRM/interviews_page.py +++ b/CRM/interviews_page.py @@ -17,7 +17,6 @@ def __init__(self, role="admin"): loadUi(os.path.join(UI_DIR, "Interviews.ui"), self) self.setWindowTitle("Interviews") self.setFixedSize(1000, 600) - self.setWindowFlag(Qt.WindowType.FramelessWindowHint) self.move_to_last_position() # Butonları bağla diff --git a/CRM/main.py b/CRM/main.py index 2e63d95..3563596 100644 --- a/CRM/main.py +++ b/CRM/main.py @@ -1,13 +1,12 @@ -# main.py import sys import os import pandas as pd -from PyQt6.QtWidgets import QApplication, QWidget -from PyQt6.QtCore import QTimer, Qt, QPoint -from PyQt6.QtGui import QPixmap +from PyQt6.QtWidgets import QApplication, QWidget, QMainWindow, QLabel +from PyQt6.QtCore import QTimer, Qt +from PyQt6.QtGui import QPixmap, QIcon from PyQt6.uic import loadUi -# ==== KLASÖR YOLLARI ==== # +# Klasör yolları BASE_DIR = os.path.dirname(__file__) UI_DIR = os.path.join(BASE_DIR, "UI_s") IMG_DIR = os.path.join(UI_DIR, "logo") @@ -41,22 +40,26 @@ def move_to_last_position(self): # İlk sefer için, mevcut konumu kaydet main.last_window_pos = self.pos() + self.setWindowIcon(QIcon("UI_s/logo/logo_icon.png")) + -# ==== SPLASH SCREEN ==== # class SplashScreen(BaseWindow): def __init__(self): super().__init__() - loadUi(os.path.join(UI_DIR, "Splash_Screen.ui"), self) + splash_ui_path = os.path.join(UI_DIR, "Splash_Screen.ui") + loadUi(splash_ui_path, self) self.setWindowTitle("CRM Splash Screen") self.setFixedSize(1000, 600) - self.setWindowFlag(Qt.WindowType.FramelessWindowHint) self.move_to_last_position() + # Logo yükleme logo_path = os.path.join(IMG_DIR, "logo_butun.png") if os.path.exists(logo_path): self.label_logo.setPixmap(QPixmap(logo_path)) self.label_logo.setScaledContents(True) + + self.counter = 0 self.timer = QTimer() self.timer.timeout.connect(self.update_progress) @@ -75,24 +78,30 @@ def show_login(self): self.close() -# ==== LOGIN WINDOW ==== # class LoginWindow(BaseWindow): def __init__(self): super().__init__() - loadUi(os.path.join(UI_DIR, "Login_Window.ui"), self) + login_ui_path = os.path.join(UI_DIR, "Login_Window.ui") + loadUi(login_ui_path, self) self.setWindowTitle("CRM Login") self.setFixedSize(1000, 600) - self.setWindowFlag(Qt.WindowType.FramelessWindowHint) self.move_to_last_position() + # Excel'den kullanıcıları oku + users_file = os.path.join(EXCEL_DIR, "users.xlsx") + if os.path.exists(users_file): + self.users_df = pd.read_excel(users_file) + else: + print("⚠️ Kullanıcı dosyası bulunamadı:", users_file) + self.users_df = pd.DataFrame(columns=["username", "password", "role"]) + + # Logo yükleme logo_path = os.path.join(IMG_DIR, "logo_butun.png") - if os.path.exists(logo_path): + if os.path.exists(logo_path) and hasattr(self, "label"): self.label.setPixmap(QPixmap(logo_path)) self.label.setScaledContents(True) - users_file = os.path.join(EXCEL_DIR, "users.xlsx") - self.users_df = pd.read_excel(users_file) - + # Buton bağlantıları self.pushButton_Exit.clicked.connect(self.close) self.pushButton_Login.clicked.connect(self.login) @@ -130,7 +139,6 @@ def __init__(self, role="admin"): loadUi(os.path.join(UI_DIR, "Preference_Admin_Menu.ui"), self) self.setWindowTitle("Admin Menu") self.setFixedSize(1000, 600) - self.setWindowFlag(Qt.WindowType.FramelessWindowHint) self.move_to_last_position() self.pushButton_INTERVIEWS.clicked.connect(self.open_interviews) @@ -147,7 +155,7 @@ def open_interviews(self): self.close() def open_applications(self): - from applications_page import ApplicationsWindow + from Applications import ApplicationsWindow #applications_page yerine Applications olarak düzelttim self.app_window = ApplicationsWindow(role=self.role) self.app_window.show() self.close() @@ -178,7 +186,6 @@ def __init__(self, role="user"): loadUi(os.path.join(UI_DIR, "Preference_Menu.ui"), self) self.setWindowTitle("User Menu") self.setFixedSize(1000, 600) - self.setWindowFlag(Qt.WindowType.FramelessWindowHint) self.move_to_last_position() if hasattr(self, "pushButton_INTERVIEWS"): From b8ef061091f25caca96ed5b0d583a7c6c2196072 Mon Sep 17 00:00:00 2001 From: rumeysa1017 Date: Tue, 4 Nov 2025 21:43:34 +0100 Subject: [PATCH 18/37] Add files via upload --- CRM/UI_s/Applications.ui | 3 --- 1 file changed, 3 deletions(-) diff --git a/CRM/UI_s/Applications.ui b/CRM/UI_s/Applications.ui index 872db8e..a0cdb3f 100644 --- a/CRM/UI_s/Applications.ui +++ b/CRM/UI_s/Applications.ui @@ -230,9 +230,6 @@ QPushButton::pressed{ true - - Qt::ClickFocus - border-style:solid; border-width:3px; From 3d0393f0909827c03fdd5c2b926fcd62d05d1b7f Mon Sep 17 00:00:00 2001 From: rumeysa1017 Date: Tue, 4 Nov 2025 21:43:55 +0100 Subject: [PATCH 19/37] Add files via upload --- CRM/Excels/VIT1.xlsx | Bin 0 -> 12714 bytes CRM/Excels/VIT2.xlsx | Bin 0 -> 10479 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 CRM/Excels/VIT1.xlsx create mode 100644 CRM/Excels/VIT2.xlsx diff --git a/CRM/Excels/VIT1.xlsx b/CRM/Excels/VIT1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5cdbc5f9f15c4934f540524a97608a999e710f65 GIT binary patch literal 12714 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 literal 0 HcmV?d00001 diff --git a/CRM/Excels/VIT2.xlsx b/CRM/Excels/VIT2.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fc4ba80f8ba8c8656ef7b03fd760cd66028aaa26 GIT binary patch literal 10479 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 QNY6k2=h#+@>bJZ91Mu62Q~&?~ literal 0 HcmV?d00001 From 19572be86399bde13e07ee1738557e2fe95dcb8d Mon Sep 17 00:00:00 2001 From: rumeysa1017 Date: Tue, 4 Nov 2025 23:17:25 +0100 Subject: [PATCH 20/37] Update Applications.py --- CRM/Applications.py | 91 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 71 insertions(+), 20 deletions(-) diff --git a/CRM/Applications.py b/CRM/Applications.py index a207789..20bd5a5 100644 --- a/CRM/Applications.py +++ b/CRM/Applications.py @@ -16,6 +16,31 @@ def __init__(self, role="admin"): super().__init__() self.role = role loadUi(os.path.join(UI_DIR, "Applications.ui"), self) + self.table_columns = [ + "DATE", + "FULL NAME", + "E-MAIL", + "PHONE NUMBER", + "POSTAL CODE", + "PROVINCE", + "CURRENT STATUS" + ] + + # Tabloda gösterilecek sütunlar ve Excel karşılıkları + self.column_mapping = { + "DATE": "Zaman damgası", + "FULL NAME": "Adınız Soyadınız", + "E-MAIL": "Mail adresiniz", + "PHONE NUMBER": "Telefon Numaranız", + "POSTAL CODE": "Posta Kodunuz", + "PROVINCE": "Yaşadığınız Eyalet", + "CURRENT STATUS": "Şu anki durumunuz" + } + + # UI'da gösterilecek sütun sırası + self.table_columns = list(self.column_mapping.keys()) + + self.setWindowTitle("Applications") self.setFixedSize(1000, 600) self.move_to_last_position() @@ -43,23 +68,42 @@ def __init__(self, role="admin"): # ---------------- Fonksiyonlar ---------------- # def display_data(self, df): - """DataFrame'i tabloya yazdır.""" - self.tableWidget.clearContents() # önceki içerikleri temizle - self.tableWidget.setRowCount(0) # satır sayısını sıfırla - if df.empty: - print("Gösterilecek kayıt yok.") - return - df = df.reset_index(drop=True) # ← indeksleri sıfırla - self.tableWidget.setRowCount(len(df)) - self.tableWidget.setColumnCount(len(df.columns)) - self.tableWidget.setHorizontalHeaderLabels(df.columns) - for row_idx, row in df.iterrows(): - for col_idx, value in enumerate(row): - item = QTableWidgetItem(str(value)) - item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) - self.tableWidget.setItem(row_idx, col_idx, item) - - + """DataFrame'i tabloya yazdır — sadece UI'de tanımlı sütunları gösterir.""" + try: + self.tableWidget.clearContents() + self.tableWidget.setRowCount(0) + + if df is None or df.empty: + print(" Gösterilecek kayıt yok veya DataFrame boş.") + return + + # Sadece mapping'teki Excel sütunlarını al, sıralı olarak UI başlıklarına koy + display_df = pd.DataFrame() + for ui_col in self.table_columns: + excel_col = self.column_mapping[ui_col] + if excel_col not in df.columns: + print(f" Hata: '{excel_col}' sütunu DataFrame'de bulunamadı.") + return + display_df[ui_col] = df[excel_col] + + display_df = display_df.reset_index(drop=True) + + self.tableWidget.setRowCount(len(display_df)) + self.tableWidget.setColumnCount(len(self.table_columns)) + self.tableWidget.setHorizontalHeaderLabels(self.table_columns) + + for row_idx, row in display_df.iterrows(): + for col_idx, value in enumerate(row): + item = QTableWidgetItem(str(value)) + item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) + self.tableWidget.setItem(row_idx, col_idx, item) + + print(f" {len(display_df)} kayıt tabloya yüklendi.\n") + + except Exception as e: + print(f"display_data() Hatası: {e}") + + def search_applications(self): """Arama fonksiyonu: lineEdit içindeki metin ile isim/soyisim araması.""" try: @@ -91,18 +135,21 @@ def search_applications(self): def load_all_applications(self): """Tüm başvuruları tabloya yazdır.""" + print("Tüm başvurular yükleniyor...") + print(f"Toplam kayıt sayısı: {len(self.df)}") self.display_data(self.df) + print("Tüm başvurular görüntülendi.\n") def show_defined_mentor(self): if 'Mentor gorusmesi' in self.df.columns: filtered_df = self.df[self.df['Mentor gorusmesi'] == 'OK'] - print(f"Mentoru atanmış adaylar: {len(filtered_df)} kayıt bulundu.") + print(f"Mentoru atanmış adaylar filtrelendi: {len(filtered_df)} kayıt bulundu.") self.display_data(filtered_df) def show_undefined_mentor(self): if 'Mentor gorusmesi' in self.df.columns: filtered_df = self.df[self.df['Mentor gorusmesi'] == 'ATANMADI'] - print(f"Mentoru atanmamış adaylar: {len(filtered_df)} kayıt bulundu.") + print(f"Mentoru atanmamış adaylar filtrelendi: {len(filtered_df)} kayıt bulundu.") self.display_data(filtered_df) @@ -110,13 +157,15 @@ def show_duplicates(self): """Aynı isim ve e-posta ile kayıtlı adayları göster.""" if all(col in self.df.columns for col in ['Adınız Soyadınız', 'Mail adresiniz']): duplicates = self.df[self.df.duplicated(subset=['Adınız Soyadınız', 'Mail adresiniz'], keep=False)] + print(f"Mükerrer kayıtlar bulundu: {len(duplicates)}") self.display_data(duplicates) def filter_applications(self): """Duplicate kayıtları filtrele ve sadece tekil göster.""" if all(col in self.df.columns for col in ['Adınız Soyadınız', 'Mail adresiniz']): - filtered = self.df.drop_duplicates(subset=['Adınız Soyadınız', 'Mail adresiniz']) + filtered = self.df.drop_duplicates(subset=['Adınız Soyadınız', 'Mail adresiniz'], keep='first') self.display_data(filtered) + print("Tekil kayıtlar başarıyla listelendi.\n") def show_previous_vit(self): """VIT1 veya VIT2 ile ortak adayları göster.""" @@ -126,6 +175,7 @@ def show_previous_vit(self): return vit_all = pd.concat([self.vit1_df, self.vit2_df], ignore_index=True) common = self.df.merge(vit_all, how='inner', on=['Adınız Soyadınız', 'Mail adresiniz']) + print(f"VIT1/VIT2 ile ortak kayıtlar bulundu: {len(common)}") self.display_data(common) def show_different(self): @@ -137,6 +187,7 @@ def show_different(self): vit_all = pd.concat([self.vit1_df, self.vit2_df], ignore_index=True) different = self.df.merge(vit_all, how='left', on=['Adınız Soyadınız', 'Mail adresiniz'], indicator=True) different = different[different['_merge'] == 'left_only'].drop(columns=['_merge']) + print(f"VIT1/VIT2’de olmayan adaylar: {len(different)}") self.display_data(different) def return_to_menu(self): From bf14946a919f6150a536123988fe74ad1fcfcae9 Mon Sep 17 00:00:00 2001 From: ZEYNEP Date: Wed, 5 Nov 2025 21:31:54 +0100 Subject: [PATCH 21/37] Add files via upload --- interviews_page.py | 163 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 interviews_page.py diff --git a/interviews_page.py b/interviews_page.py new file mode 100644 index 0000000..dace925 --- /dev/null +++ b/interviews_page.py @@ -0,0 +1,163 @@ + +import os +import pandas as pd +from PyQt6.uic import loadUi +from PyQt6.QtCore import Qt +from PyQt6.QtWidgets import QMessageBox, QTableWidgetItem, QApplication +from main import BaseWindow + +BASE_DIR = os.path.dirname(__file__) +UI_DIR = os.path.join(BASE_DIR, "UI_s") +EXCEL_PATH = os.path.join(BASE_DIR, "Excels", "Interviews.xlsx") + + +class InterviewsWindow(BaseWindow): + def __init__(self, role="admin"): + super().__init__() + self.role = role + loadUi(os.path.join(UI_DIR, "Interviews.ui"), self) + self.setWindowTitle("Interviews") + self.setFixedSize(1000, 600) + self.setWindowFlag(Qt.WindowType.FramelessWindowHint) + self.move_to_last_position() + + # Excel yükleme ve normalize edilmiş kolon isimleri + if os.path.exists(EXCEL_PATH): + try: + self.df = pd.read_excel(EXCEL_PATH) + except Exception as e: + QMessageBox.critical(self, "Dosya Hatası", f"Excel okunamadı:\n{e}") + self.df = pd.DataFrame() + else: + QMessageBox.critical(self, "Dosya Hatası", f"Excel dosyası bulunamadı:\n{EXCEL_PATH}") + self.df = pd.DataFrame() + + # Normalize: ayrıca indekslenmiş küçük harfli isimlere erişim için bir yardımcı dict oluştur + # (orijinal sütun adlarını koruyoruz ancak lowercase anahtarlarla arama yapacağız) + self.col_map = {} + if not self.df.empty: + for c in self.df.columns: + self.col_map[c.strip().lower()] = c # map: lowercase -> gerçek sütun adı + + # Olası sütun isimlerini tespit et (Türkçe ve İngilizce olasılıkları) + self.name_col = self._pick_column(["full name", "adınız soyadınız", "adınız soyadınız", "ad soyad", "adiniz soyadiniz"]) + self.submitted_col = self._pick_column(["submitted project", "proje gonderilis tarihi", "proje gönderiliş tarihi", "project submitted", "submitted"]) + self.received_col = self._pick_column(["received project", "projenin gelis tarihi", "proje gelis tarihi", "received"]) + + # Bağlantılar + self.pushButton_Return_REFERENCE_menu.clicked.connect(self.return_to_menu) + self.pushButton_EXIT.clicked.connect(self.close) + self.pushButton_SEARCH.clicked.connect(self.search_action) + self.pushButton_SUBMITTED_PROJECTS.clicked.connect(self.show_submitted_projects) + self.pushButton_RECEIVED_PROJECTS.clicked.connect(self.show_received_projects) + + # Tablo başlıkları (UI'da Türkçe görünmesini istersen burayı bırak) + self.tableWidget.setColumnCount(3) + self.tableWidget.setHorizontalHeaderLabels([ + "Adı Soyadı", "Proje Gönderiliş Tarihi", "Proje Geliş Tarihi" + ]) + + + def _pick_column(self, candidates): + """Verilen anahtar listesine göre ilk eşleşen gerçek sütun adını döndürür.""" + if self.df.empty: + return None + lower_cols = [c.lower().strip() for c in self.df.columns] + for cand in candidates: + cand_low = cand.lower().strip() + for i, lc in enumerate(lower_cols): + # Tam veya içinde eşleşme kabul edelim + if cand_low == lc or cand_low in lc or lc in cand_low: + return self.df.columns[i] + return None + + def fill_table(self, data: pd.DataFrame): + """Tabloyu verilen DataFrame'e göre doldurur (görsel Türkçe başlıklar).""" + self.tableWidget.setRowCount(0) + for row_idx, row in data.reset_index(drop=True).iterrows(): + self.tableWidget.insertRow(row_idx) + # Eğer sütun yoksa boş string koy + name_val = row.get(self.name_col, "") if self.name_col in row.index else row.get("Adınız Soyadınız", "") + sub_val = row.get(self.submitted_col, "") if self.submitted_col in row.index else row.get("Proje gonderilis tarihi", "") + rec_val = row.get(self.received_col, "") if self.received_col in row.index else row.get("Projenin gelis tarihi", "") + + self.tableWidget.setItem(row_idx, 0, QTableWidgetItem("" if pd.isna(name_val) else str(name_val))) + self.tableWidget.setItem(row_idx, 1, QTableWidgetItem("" if pd.isna(sub_val) else str(sub_val))) + self.tableWidget.setItem(row_idx, 2, QTableWidgetItem("" if pd.isna(rec_val) else str(rec_val))) + self.tableWidget.resizeColumnsToContents() + + def search_action(self): + """NAME sütununda BAŞLANGIÇ (startswith) araması yapar, case-insensitive.""" + if self.name_col is None: + QMessageBox.critical(self, "Hata", "Ad/Soyad sütunu bulunamadı (Excel).") + return + text = self.lineEdit.text().strip() + if text == "": + QMessageBox.information(self, "Bilgi", "Lütfen arama kutusuna bir metin girin.") + return + + # Case-insensitive, baştan eşleşme. NaN güvenli. + series = self.df[self.name_col].astype(str).str.strip() + mask = series.str.lower().str.startswith(text.lower(), na=False) + filtered = self.df[mask] + if filtered.empty: + QMessageBox.information(self, "Sonuç Yok", f"'{text}' ile başlayan isim bulunamadı.") + # istersen tümünü gösterme, şu an sadece uyarı + else: + self.fill_table(filtered) + + + def show_submitted_projects(self): + # """Projesini göndermiş adayları göster.""" + # Sütun adlarını normalize et (boşlukları ve büyük harfleri temizle) + self.df.columns = [col.strip().upper() for col in self.df.columns] + + if "SUBMITTED PROJECT" not in self.df.columns: + QMessageBox.critical(self, "Hata", "'SUBMITTED PROJECT' sütunu Excel dosyasında bulunamadı.") + return + + # Boş olmayan satırları filtrele + submitted = self.df[self.df["SUBMITTED PROJECT"].notna() & (self.df["SUBMITTED PROJECT"].astype(str).str.strip() != "")] + + if submitted.empty: + QMessageBox.information(self, "Bilgi", "Proje göndermiş aday bulunamadı.") + else: + self.fill_table(submitted) + + + + def show_received_projects(self): + # """Projesi GELMİŞ adayları göster.""" + if self.received_col is None: + QMessageBox.critical(self, "Hata", "Received (geliş) sütunu bulunamadı.") + return + + r = self.df[self.received_col] + mask = r.notna() & (r.astype(str).str.strip() != "") + res = self.df[mask] + if res.empty: + QMessageBox.information(self, "Bilgi", "Projesi gelmiş aday bulunamadı.") + else: + self.fill_table(res) + + + + + def return_to_menu(self): + from main import PreferenceAdminMenu, PreferenceMenu + if self.role.lower() == "admin": + self.pref_menu = PreferenceAdminMenu(role=self.role) + else: + self.pref_menu = PreferenceMenu(role=self.role) + self.pref_menu.show() + self.close() + + +# standalone test +if __name__ == "__main__": + import sys + app = QApplication(sys.argv) + w = InterviewsWindow(role="admin") + w.show() + sys.exit(app.exec()) + From 2ac34dc0be25b16c889451715b789a19646599f3 Mon Sep 17 00:00:00 2001 From: rumeysa1017 Date: Wed, 5 Nov 2025 22:53:33 +0100 Subject: [PATCH 22/37] Update mentor_meeting_page.py --- CRM/mentor_meeting_page.py | 71 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/CRM/mentor_meeting_page.py b/CRM/mentor_meeting_page.py index 9d40b8d..0b9bbc3 100644 --- a/CRM/mentor_meeting_page.py +++ b/CRM/mentor_meeting_page.py @@ -1,10 +1,13 @@ import os +import pandas as pd from PyQt6.uic import loadUi from PyQt6.QtCore import Qt +from PyQt6.QtWidgets import QTableWidgetItem from main import BaseWindow BASE_DIR = os.path.dirname(__file__) UI_DIR = os.path.join(BASE_DIR, "UI_s") +EXCEL_DIR = os.path.join(BASE_DIR, "Excels") class MentorMeetingWindow(BaseWindow): def __init__(self, role="admin"): @@ -15,9 +18,34 @@ def __init__(self, role="admin"): self.setFixedSize(1000, 600) self.move_to_last_position() + # Excel dosyasını yükle + self.excel_file = os.path.join(EXCEL_DIR, "Mentor.xlsx") + if os.path.exists(self.excel_file): + df_full = pd.read_excel(self.excel_file, header=None) + + # İstenmeyen sütunları çıkar: + # Pandas sütunları 0-index, yani 2. = 1, 6. = 5, 7. = 6 + cols_to_use = [0, 2, 3, 4, 7, 8] # 0=Interview Date, 2=Applicant Name, 3=Mentor Name, 4=IT Knowledge Level, 7=Workload Level, 8=Comments + self.df = df_full.iloc[:, cols_to_use] + self.df.columns = ["Interview Date", "Applicant Name", "Mentor Name", + "IT Knowledge Level", "Workload Level", "Comments"] + else: + self.df = pd.DataFrame(columns=["Interview Date", "Applicant Name", "Mentor Name", + "IT Knowledge Level", "Workload Level", "Comments"]) + print("Mentor Excel file not found!") + + # Buton bağlantıları self.pushButton_Return_REFERENCE_menu.clicked.connect(self.return_to_menu) self.pushButton_EXIT.clicked.connect(self.close) self.pushButton_SEARCH.clicked.connect(self.search_action) + self.pushButton_ALL_MEETINGS.clicked.connect(self.show_all_records) # "All Records" butonu + + # Tablonun başlıklarını ayarla + self.tableWidget.setColumnCount(6) + self.tableWidget.setHorizontalHeaderLabels(self.df.columns) + + # Tüm kayıtları göster başlangıçta + self.show_all_records() def return_to_menu(self): from main import PreferenceAdminMenu, PreferenceMenu @@ -28,6 +56,45 @@ def return_to_menu(self): self.pref_menu.show() self.close() + def show_all_records(self): + self.populate_table(self.df) + def search_action(self): - text = self.lineEdit.text().strip() - print(f"🔍 Mentor Meeting search: {text}") \ No newline at end of file + """Search by Applicant or Mentor Name, display all if empty""" + try: + search_text = self.lineEdit.text().strip().lower() + if not search_text: + self.show_all_records() + return + + df_clean = self.df.copy() + df_clean['Applicant Name'] = df_clean['Applicant Name'].astype(str).str.lower().str.strip() + df_clean['Mentor Name'] = df_clean['Mentor Name'].astype(str).str.lower().str.strip() + + mask = df_clean['Applicant Name'].apply(lambda x: search_text in x) | \ + df_clean['Mentor Name'].apply(lambda x: search_text in x) + + filtered_df = df_clean[mask].reset_index(drop=True) + self.populate_table(filtered_df) + + except Exception as e: + print(f"Search Error: {e}") + + + def populate_table(self, df_to_show): + self.tableWidget.setRowCount(len(df_to_show)) + for row_idx, row in df_to_show.iterrows(): + for col_idx, value in enumerate(row): + item = QTableWidgetItem(str(value)) + self.tableWidget.setItem(row_idx, col_idx, item) + self.tableWidget.resizeColumnsToContents() + + +if __name__ == "__main__": + import sys + from PyQt6.QtWidgets import QApplication + + app = QApplication(sys.argv) + window = MentorMeetingWindow(role="admin") + window.show() + sys.exit(app.exec()) From 05064ab572744eb13f32b7506afe7732ac7f7f30 Mon Sep 17 00:00:00 2001 From: rumeysa1017 Date: Wed, 5 Nov 2025 23:04:18 +0100 Subject: [PATCH 23/37] Update Mentor_Meeting_Page.ui sutun isimleri guncellendi --- CRM/UI_s/Mentor_Meeting_Page.ui | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/CRM/UI_s/Mentor_Meeting_Page.ui b/CRM/UI_s/Mentor_Meeting_Page.ui index a546536..572f000 100644 --- a/CRM/UI_s/Mentor_Meeting_Page.ui +++ b/CRM/UI_s/Mentor_Meeting_Page.ui @@ -194,9 +194,6 @@ QPushButton::pressed{ true - - Qt::ClickFocus - border-style:solid; border-width:3px; @@ -280,27 +277,27 @@ QPushButton::pressed{ - Period + Applicant Name - Full Name + Mentor Name - Mentor + IT Knowledge Level - Evaluation + Workload Level - Current Status + Comments From c837c3579a64783a50a217f5df7edcf274c4a092 Mon Sep 17 00:00:00 2001 From: rumeysa1017 Date: Fri, 7 Nov 2025 13:22:42 +0100 Subject: [PATCH 24/37] hatalar duzeltildi --- CRM/Applications.py | 134 ++++++++++++++++++++++---------------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/CRM/Applications.py b/CRM/Applications.py index 20bd5a5..1bb6f48 100644 --- a/CRM/Applications.py +++ b/CRM/Applications.py @@ -1,7 +1,7 @@ import sys import os import pandas as pd -from PyQt6.QtWidgets import QApplication, QWidget, QTableWidgetItem +from PyQt6.QtWidgets import QApplication, QHeaderView, QTableWidgetItem from PyQt6.uic import loadUi from PyQt6.QtCore import Qt from main import BaseWindow @@ -11,39 +11,33 @@ UI_DIR = os.path.join(BASE_DIR, "UI_s") EXCEL_DIR = os.path.join(BASE_DIR, "Excels") + class ApplicationsWindow(BaseWindow): def __init__(self, role="admin"): super().__init__() self.role = role loadUi(os.path.join(UI_DIR, "Applications.ui"), self) - self.table_columns = [ - "DATE", - "FULL NAME", - "E-MAIL", - "PHONE NUMBER", - "POSTAL CODE", - "PROVINCE", - "CURRENT STATUS" - ] - - # Tabloda gösterilecek sütunlar ve Excel karşılıkları - self.column_mapping = { - "DATE": "Zaman damgası", - "FULL NAME": "Adınız Soyadınız", - "E-MAIL": "Mail adresiniz", - "PHONE NUMBER": "Telefon Numaranız", - "POSTAL CODE": "Posta Kodunuz", - "PROVINCE": "Yaşadığınız Eyalet", - "CURRENT STATUS": "Şu anki durumunuz" - } - - # UI'da gösterilecek sütun sırası - self.table_columns = list(self.column_mapping.keys()) + # Excel başlıkları ve UI başlıkları artık aynı + self.table_columns = [ + "DATE", + "FULL NAME", + "E-MAIL", + "PHONE NUMBER", + "POSTAL CODE", + "PROVINCE", + "CURRENT STATUS" + ] self.setWindowTitle("Applications") self.setFixedSize(1000, 600) self.move_to_last_position() + + header = self.tableWidget.horizontalHeader() + header.setSectionResizeMode(QHeaderView.ResizeMode.Fixed) + column_widths = [100, 200, 150, 120, 120, 200] # tablo sütun sayısına göre ayarla + for col, width in enumerate(column_widths): + self.tableWidget.setColumnWidth(col, width) # Excel dosyalarını yükle self.applications_file = os.path.join(EXCEL_DIR, "Basvurular.xlsx") @@ -56,36 +50,41 @@ def __init__(self, role="admin"): # Butonlara fonksiyon bağla self.pushButton_SEARCH.clicked.connect(self.search_applications) + self.lineEdit.textChanged.connect(self.search_applications) # CANLI ARAMA self.pushButton_ALL_APPLICATIONS.clicked.connect(self.load_all_applications) + self.pushButton_ALL_APPLICATIONS.clicked.connect(self.clear_search_input) self.pushButton_DEFINED_MENTOR_MEETING.clicked.connect(self.show_defined_mentor) + self.pushButton_DEFINED_MENTOR_MEETING.clicked.connect(self.clear_search_input) self.pushButton_UNDEFINED_MENTOR_MEETING.clicked.connect(self.show_undefined_mentor) + self.pushButton_UNDEFINED_MENTOR_MEETING.clicked.connect(self.clear_search_input) self.pushButton_DUPLICATE_REGISTRATION.clicked.connect(self.show_duplicates) + self.pushButton_DUPLICATE_REGISTRATION.clicked.connect(self.clear_search_input) self.pushButton_PREVIOUS_VIT_CHECK.clicked.connect(self.show_previous_vit) + self.pushButton_PREVIOUS_VIT_CHECK.clicked.connect(self.clear_search_input) self.pushButton_DIFFERENT_REGISTRATION.clicked.connect(self.show_different) + self.pushButton_DIFFERENT_REGISTRATION.clicked.connect(self.clear_search_input) self.pushButton_APPLICATION_FILTERING.clicked.connect(self.filter_applications) + self.pushButton_APPLICATION_FILTERING.clicked.connect(self.clear_search_input) self.pushButton_RETURN_REFERENCE_MENU.clicked.connect(self.return_to_menu) # ---------------- Fonksiyonlar ---------------- # + def clear_search_input(self): + self.lineEdit.clear() #Herhangi bir butona basildiginda onceki yapilan arama silinsin def display_data(self, df): - """DataFrame'i tabloya yazdır — sadece UI'de tanımlı sütunları gösterir.""" + """DataFrame'i tabloya yazdır — artık UI başlıkları Excel başlıkları ile aynı.""" try: self.tableWidget.clearContents() self.tableWidget.setRowCount(0) if df is None or df.empty: - print(" Gösterilecek kayıt yok veya DataFrame boş.") + print("Gösterilecek kayıt yok veya DataFrame boş.") return - # Sadece mapping'teki Excel sütunlarını al, sıralı olarak UI başlıklarına koy - display_df = pd.DataFrame() - for ui_col in self.table_columns: - excel_col = self.column_mapping[ui_col] - if excel_col not in df.columns: - print(f" Hata: '{excel_col}' sütunu DataFrame'de bulunamadı.") - return - display_df[ui_col] = df[excel_col] - + display_df = df.copy() + for col in self.table_columns: + if col not in display_df.columns: + display_df[col] = "" display_df = display_df.reset_index(drop=True) self.tableWidget.setRowCount(len(display_df)) @@ -93,77 +92,70 @@ def display_data(self, df): self.tableWidget.setHorizontalHeaderLabels(self.table_columns) for row_idx, row in display_df.iterrows(): - for col_idx, value in enumerate(row): + for col_idx, col_name in enumerate(self.table_columns): + value = row[col_name] if col_name in row else "" item = QTableWidgetItem(str(value)) item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.tableWidget.setItem(row_idx, col_idx, item) - print(f" {len(display_df)} kayıt tabloya yüklendi.\n") + print(f"{len(display_df)} kayıt tabloya yüklendi.\n") except Exception as e: print(f"display_data() Hatası: {e}") - def search_applications(self): - """Arama fonksiyonu: lineEdit içindeki metin ile isim/soyisim araması.""" + """LineEdit içindeki metin ile FULL NAME araması.""" try: search_text = self.lineEdit.text().strip().lower() print("Arama metni:", search_text) - if 'Adınız Soyadınız' not in self.df.columns: - print("'Adınız Soyadınız' sütunu bulunamadı.") + if 'FULL NAME' not in self.df.columns: + print("'FULL NAME' sütunu bulunamadı.") return if not search_text: self.display_data(self.df) return - # Veriyi temizle df_clean = self.df.copy() - df_clean['Adınız Soyadınız'] = df_clean['Adınız Soyadınız'].astype(str).str.lower().str.strip() - - # Arama mantığı: içinde geçiyorsa eşleştir - mask = df_clean['Adınız Soyadınız'].apply(lambda x: search_text in x) + df_clean['FULL NAME'] = df_clean['FULL NAME'].astype(str).str.lower().str.strip() + mask = df_clean['FULL NAME'].apply(lambda x: search_text in x) filtered_df = df_clean[mask].reset_index(drop=True) - print("Arama sonucu:", filtered_df[['Adınız Soyadınız']].to_string(index=False)) - + print("Arama sonucu:", filtered_df[['FULL NAME']].to_string(index=False)) self.display_data(filtered_df) + + except Exception as e: print(f"Search Error: {e}") - def load_all_applications(self): - """Tüm başvuruları tabloya yazdır.""" - print("Tüm başvurular yükleniyor...") print(f"Toplam kayıt sayısı: {len(self.df)}") self.display_data(self.df) print("Tüm başvurular görüntülendi.\n") def show_defined_mentor(self): - if 'Mentor gorusmesi' in self.df.columns: - filtered_df = self.df[self.df['Mentor gorusmesi'] == 'OK'] + if 'MENTOR MEETING' in self.df.columns: + filtered_df = self.df[self.df['MENTOR MEETING'] == 'OK'] print(f"Mentoru atanmış adaylar filtrelendi: {len(filtered_df)} kayıt bulundu.") self.display_data(filtered_df) def show_undefined_mentor(self): - if 'Mentor gorusmesi' in self.df.columns: - filtered_df = self.df[self.df['Mentor gorusmesi'] == 'ATANMADI'] + if 'MENTOR MEETING' in self.df.columns: + filtered_df = self.df[self.df['MENTOR MEETING'] == 'ATANMADI'] print(f"Mentoru atanmamış adaylar filtrelendi: {len(filtered_df)} kayıt bulundu.") self.display_data(filtered_df) - def show_duplicates(self): - """Aynı isim ve e-posta ile kayıtlı adayları göster.""" - if all(col in self.df.columns for col in ['Adınız Soyadınız', 'Mail adresiniz']): - duplicates = self.df[self.df.duplicated(subset=['Adınız Soyadınız', 'Mail adresiniz'], keep=False)] + if all(col in self.df.columns for col in ['FULL NAME', 'E-MAIL']): + duplicates = self.df[self.df.duplicated(subset=['FULL NAME', 'E-MAIL'], keep=False)] print(f"Mükerrer kayıtlar bulundu: {len(duplicates)}") self.display_data(duplicates) def filter_applications(self): - """Duplicate kayıtları filtrele ve sadece tekil göster.""" - if all(col in self.df.columns for col in ['Adınız Soyadınız', 'Mail adresiniz']): - filtered = self.df.drop_duplicates(subset=['Adınız Soyadınız', 'Mail adresiniz'], keep='first') + """Tekil kayıtları göster (FULL NAME + E-MAIL).""" + if all(col in self.df.columns for col in ['FULL NAME', 'E-MAIL']): + filtered = self.df.drop_duplicates(subset=['FULL NAME', 'E-MAIL'], keep='first') self.display_data(filtered) print("Tekil kayıtlar başarıyla listelendi.\n") @@ -173,10 +165,15 @@ def show_previous_vit(self): print("VIT1 ve VIT2 dosyaları bulunamadı.") self.tableWidget.setRowCount(0) return + vit_all = pd.concat([self.vit1_df, self.vit2_df], ignore_index=True) - common = self.df.merge(vit_all, how='inner', on=['Adınız Soyadınız', 'Mail adresiniz']) - print(f"VIT1/VIT2 ile ortak kayıtlar bulundu: {len(common)}") - self.display_data(common) + + # Sadece FULL NAME ve E-MAIL ile merge yap, orijinal df’den diğer sütunları al + common_keys = ['FULL NAME', 'E-MAIL'] + merged = self.df.merge(vit_all[common_keys], how='inner', on=common_keys) + print(f"VIT1/VIT2 ile ortak kayıtlar bulundu: {len(merged)}") + self.display_data(merged) + def show_different(self): """VIT1 ve VIT2’de olmayan adayları göster.""" @@ -184,12 +181,15 @@ def show_different(self): print("VIT1 ve VIT2 dosyaları bulunamadı.") self.tableWidget.setRowCount(0) return + vit_all = pd.concat([self.vit1_df, self.vit2_df], ignore_index=True) - different = self.df.merge(vit_all, how='left', on=['Adınız Soyadınız', 'Mail adresiniz'], indicator=True) - different = different[different['_merge'] == 'left_only'].drop(columns=['_merge']) + keys = ['FULL NAME', 'E-MAIL'] + different_keys = self.df.merge(vit_all[keys], how='left', on=keys, indicator=True) + different = self.df[different_keys['_merge'] == 'left_only'] print(f"VIT1/VIT2’de olmayan adaylar: {len(different)}") self.display_data(different) + def return_to_menu(self): from main import PreferenceAdminMenu, PreferenceMenu if self.role.lower() == "admin": From 7f7c9b5611e60f79986bd294d54de10e8873c5ec Mon Sep 17 00:00:00 2001 From: rumeysa1017 Date: Fri, 7 Nov 2025 13:23:48 +0100 Subject: [PATCH 25/37] Hatalar duzeltildi --- CRM/mentor_meeting_page.py | 67 +++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/CRM/mentor_meeting_page.py b/CRM/mentor_meeting_page.py index 0b9bbc3..2ac189e 100644 --- a/CRM/mentor_meeting_page.py +++ b/CRM/mentor_meeting_page.py @@ -2,7 +2,7 @@ import pandas as pd from PyQt6.uic import loadUi from PyQt6.QtCore import Qt -from PyQt6.QtWidgets import QTableWidgetItem +from PyQt6.QtWidgets import QTableWidgetItem, QHeaderView from main import BaseWindow BASE_DIR = os.path.dirname(__file__) @@ -17,15 +17,21 @@ def __init__(self, role="admin"): self.setWindowTitle("Mentor Meeting Page") self.setFixedSize(1000, 600) self.move_to_last_position() + + header = self.tableWidget.horizontalHeader() + header.setSectionResizeMode(QHeaderView.ResizeMode.Fixed) + column_widths = [100, 200, 150, 120, 120, 200] # tablo sütun sayısına göre ayarla + for col, width in enumerate(column_widths): + self.tableWidget.setColumnWidth(col, width) # Excel dosyasını yükle self.excel_file = os.path.join(EXCEL_DIR, "Mentor.xlsx") if os.path.exists(self.excel_file): df_full = pd.read_excel(self.excel_file, header=None) - # İstenmeyen sütunları çıkar: + # İstenmeyen sütunları çıkar: 2., 6., 7. # Pandas sütunları 0-index, yani 2. = 1, 6. = 5, 7. = 6 - cols_to_use = [0, 2, 3, 4, 7, 8] # 0=Interview Date, 2=Applicant Name, 3=Mentor Name, 4=IT Knowledge Level, 7=Workload Level, 8=Comments + cols_to_use = [0, 2, 3, 4, 7, 5] # 0=Interview Date, 2=Applicant Name, 3=Mentor Name, 4=IT Knowledge Level, 7=Workload Level, 5=Comments self.df = df_full.iloc[:, cols_to_use] self.df.columns = ["Interview Date", "Applicant Name", "Mentor Name", "IT Knowledge Level", "Workload Level", "Comments"] @@ -38,7 +44,11 @@ def __init__(self, role="admin"): self.pushButton_Return_REFERENCE_menu.clicked.connect(self.return_to_menu) self.pushButton_EXIT.clicked.connect(self.close) self.pushButton_SEARCH.clicked.connect(self.search_action) - self.pushButton_ALL_MEETINGS.clicked.connect(self.show_all_records) # "All Records" butonu + self.lineEdit.textChanged.connect(self.search_action) # CANLI ARAMA + self.pushButton_ALL_MEETINGS.clicked.connect(self.show_all_records) + self.pushButton_ALL_MEETINGS.clicked.connect(self.clear_search_input) + self.comboBox.currentTextChanged.connect(self.filter_by_comment) + self.comboBox.currentTextChanged.connect(self.clear_search_input) # Tablonun başlıklarını ayarla self.tableWidget.setColumnCount(6) @@ -46,6 +56,9 @@ def __init__(self, role="admin"): # Tüm kayıtları göster başlangıçta self.show_all_records() + + def clear_search_input(self): + self.lineEdit.clear() def return_to_menu(self): from main import PreferenceAdminMenu, PreferenceMenu @@ -55,9 +68,54 @@ def return_to_menu(self): self.pref_menu = PreferenceMenu(role=self.role) self.pref_menu.show() self.close() + + def filter_by_comment(self, text): + """ComboBox seçimine göre Comments sütununu filtrele.""" + try: + if 'Comments' not in self.df.columns: + print("'Comments' sütunu bulunamadı.") + return + + if text == "" or text == "All": + # Seçim yoksa tüm veriyi göster + self.display_data(self.df) + return + + filtered_df = self.df[self.df['Comments'] == text].reset_index(drop=True) + self.display_data(filtered_df) + print(f"ComboBox filtreleme: '{text}' seçildi, {len(filtered_df)} kayıt bulundu.") + except Exception as e: + print(f"filter_by_comment Hatası: {e}") def show_all_records(self): self.populate_table(self.df) + + def display_data(self, df): + """DataFrame'i Mentor Meeting tablosuna yazdırır.""" + try: + self.tableWidget.clearContents() + self.tableWidget.setRowCount(0) + + if df is None or df.empty: + print("Gösterilecek kayıt yok veya DataFrame boş.") + return + + # Tablonun sütun sayısını ayarla + self.tableWidget.setRowCount(len(df)) + self.tableWidget.setColumnCount(len(df.columns)) + self.tableWidget.setHorizontalHeaderLabels(df.columns.tolist()) + + for row_idx, row in df.iterrows(): + for col_idx, value in enumerate(row): + item = QTableWidgetItem(str(value)) + item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) + self.tableWidget.setItem(row_idx, col_idx, item) + + print(f"{len(df)} kayıt tabloya yüklendi.\n") + + except Exception as e: + print(f"display_data() Hatası: {e}") + def search_action(self): """Search by Applicant or Mentor Name, display all if empty""" @@ -76,6 +134,7 @@ def search_action(self): filtered_df = df_clean[mask].reset_index(drop=True) self.populate_table(filtered_df) + except Exception as e: print(f"Search Error: {e}") From 9003ed877539bb4f9972f4d10544cf26886c4d7e Mon Sep 17 00:00:00 2001 From: rumeysa1017 Date: Fri, 7 Nov 2025 13:25:00 +0100 Subject: [PATCH 26/37] Basliklar ingilizceye cevirildi --- CRM/Excels/Basvurular.xlsx | Bin 14946 -> 20393 bytes CRM/Excels/Mentor.xlsx | Bin 55807 -> 76769 bytes CRM/Excels/VIT1.xlsx | Bin 12714 -> 12426 bytes CRM/Excels/VIT2.xlsx | Bin 10479 -> 12696 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/CRM/Excels/Basvurular.xlsx b/CRM/Excels/Basvurular.xlsx index 370bbd6263f8014e9c76fb692fc3799fc6665339..4c11b5225680f5d2836926ae971c6f26405f6091 100644 GIT binary patch literal 20393 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 diff --git a/CRM/Excels/Mentor.xlsx b/CRM/Excels/Mentor.xlsx index ad2d84c8bf89920d1eda7b98db07240171bc8e91..021c357f305a41d82a63c9b4ab5df8c98cf621d4 100644 GIT binary patch literal 76769 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 LAeEhkS_uCioaBl$ literal 55807 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 delta 8594 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 A4gdfE diff --git a/CRM/Excels/VIT2.xlsx b/CRM/Excels/VIT2.xlsx index fc4ba80f8ba8c8656ef7b03fd760cd66028aaa26..c7077d920d5b15da7ca857f8432fabbb34ad102d 100644 GIT binary patch delta 8561 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 From 8f426f27d006e95c7764be0f5c229066a56cf626 Mon Sep 17 00:00:00 2001 From: rumeysa1017 Date: Fri, 7 Nov 2025 13:32:05 +0100 Subject: [PATCH 27/37] ComboBox guncellendi --- CRM/UI_s/Mentor_Meeting_Page.ui | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CRM/UI_s/Mentor_Meeting_Page.ui b/CRM/UI_s/Mentor_Meeting_Page.ui index 572f000..8aa5a32 100644 --- a/CRM/UI_s/Mentor_Meeting_Page.ui +++ b/CRM/UI_s/Mentor_Meeting_Page.ui @@ -335,42 +335,42 @@ QPushButton:hover { - It is appropriate to participate in the entire VIT project + VIT projesinin tamamına katılması uygun olur - It is appropriate to receive initial IT training within the VIT project and be directed to ITPH + VIT projesi ilk IT eğitimi alıp ITPH a yönlendirilmesi uygun olur - It is appropriate to receive English training within the VIT project and be directed to ITPH + VIT projesi ingilizce eğitimi alıp ITPH a yönlendirilmesi uygun olur - It is appropriate to be directly directed to ITPH within the scope of the VIT project + VIT projesi kapsamında direkt ITPH a yönlendirilmesi uygun olur. - It is appropriate to be directed to a job through individual coaching + Direkt bireysel koçluk ile işe yönlendirilmesi uygun olur - It would be more appropriate to participate in the next VIT project + Bir sonraki VIT projesine katilmasi daha uygun olur - Should be directed to another sector + Başka bir sektöre yönlendirilmeli - Other + Diger From 39d50622e171751cc60d979a28b193851d9c79ec Mon Sep 17 00:00:00 2001 From: ZEYNEP Date: Sat, 8 Nov 2025 08:19:24 +0100 Subject: [PATCH 28/37] Update admin_menu_page.py Added email sending and ODS file reading functionality to AdminMenuWindow. --- CRM/admin_menu_page.py | 210 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 201 insertions(+), 9 deletions(-) diff --git a/CRM/admin_menu_page.py b/CRM/admin_menu_page.py index a99050a..07a8033 100644 --- a/CRM/admin_menu_page.py +++ b/CRM/admin_menu_page.py @@ -1,33 +1,225 @@ + +#admin_menu_page.py + import os +import sys +import smtplib +from email.mime.text import MIMEText + from PyQt6.uic import loadUi from PyQt6.QtCore import Qt -from main import BaseWindow +from PyQt6.QtWidgets import ( + QApplication, + QMessageBox, + QTableWidgetItem, +) + +# ---- BaseWindow: main.py'den geliyorsa kullan, yoksa QWidget'e düş ---- +try: + from main import BaseWindow # proje içinden çalışırken +except Exception: + from PyQt6.QtWidgets import QWidget as BaseWindow # tek başına koşarken + +# ---- ODS okuma için odfpy ---- +from odf.opendocument import load as odf_load +from odf.table import Table, TableRow, TableCell +from odf.text import P + BASE_DIR = os.path.dirname(__file__) UI_DIR = os.path.join(BASE_DIR, "UI_s") +EXCEL_DIR = os.path.join(BASE_DIR, "Excels") # Event.ods burada olmalı + class AdminMenuWindow(BaseWindow): - def __init__(self, role="admin"): + def __init__(self, role: str = "admin"): super().__init__() + ui_path = os.path.join(UI_DIR, "Admin_Menu.ui") + + # UI yükle (sessiz çökme yaşanmaması için try/except) + try: + loadUi(ui_path, self) + except Exception as e: + QMessageBox.critical( + self, "UI Load Error", + f"Failed to load UI file:\n{ui_path}\n\n{e}" + ) + raise + self.role = role - loadUi(os.path.join(UI_DIR, "Admin_Menu.ui"), self) self.setWindowTitle("Admin Menu") self.setFixedSize(1000, 600) - self.move_to_last_position() + self.setWindowFlag(Qt.WindowType.FramelessWindowHint) + # BaseWindow varsa pencere konumunu korur + if hasattr(self, "move_to_last_position"): + self.move_to_last_position() - self.pushButton_SEND_EMAIL.clicked.connect(self.send_email) + # --- Buttons --- self.pushButton_EVENT_REGISTRATION.clicked.connect(self.register_event) + self.pushButton_SEND_EMAIL.clicked.connect(self.send_email) self.pushButton_Return_TO_ADMIN_PREFERENCE_menu.clicked.connect(self.return_to_admin_pref_menu) self.pushButton_Exit.clicked.connect(self.close) - def send_email(self): - print("📧 Send Email clicked") + # --- Table hardening --- + # Kolon sayısı UI'da 4; başlıklar UI içinde zaten yazılı + self.tableWidget.setColumnCount(4) + self.tableWidget.setSortingEnabled(False) + # ========================= + # 1) ODS → tabloya yükle + # ========================= def register_event(self): - print("🗓 Event Registration clicked") + """ + Excels/Event.ods içindeki ilk çalışma sayfasını okur ve tabloya basar. + Sütun beklenen sıra: + 0: Event Name + 1: Start Time + 2: Participant Email + 3: Organizer Email + """ + ods_path = os.path.join(EXCEL_DIR, "Event.ods") + if not os.path.exists(ods_path): + QMessageBox.warning(self, "Missing File", f"Event.ods not found:\n{ods_path}") + return + + try: + doc = odf_load(ods_path) + table = doc.spreadsheet.getElementsByType(Table)[0] + + rows = [] + for row in table.getElementsByType(TableRow): + vals = [] + for cell in row.getElementsByType(TableCell): + # ODS hücresindeki tüm satırlarını birleştir + txt_parts = [str(p) for p in cell.getElementsByType(P)] + vals.append(" ".join(txt_parts).strip()) + # Satırda tamamen boş olmayan bir değer varsa ekle + if any(v.strip() for v in vals): + rows.append(vals) + + # İlk satır başlık ise at (başlık kontrolü gevşek) + if rows and self._looks_like_header(rows[0]): + rows = rows[1:] + + # Tabloya yaz + self.tableWidget.clearContents() + self.tableWidget.setRowCount(len(rows)) + for r, row_vals in enumerate(rows): + for c in range(4): + text = row_vals[c] if c < len(row_vals) else "" + item = QTableWidgetItem(text) + item.setFlags(Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable) + self.tableWidget.setItem(r, c, item) + + # İstenirse başarı popup’ı gösterilebilir; sunum için sessiz bırakıyoruz. + # QMessageBox.information(self, "Success", "Events loaded successfully!") + except Exception as e: + QMessageBox.critical(self, "Read Error", f"Failed to read ODS:\n{e}") + + def _looks_like_header(self, first_row): + header_tokens = ["event", "name", "start", "time", "email", "participant", "organizer"] + joined = " ".join(first_row).lower() + return any(tok in joined for tok in header_tokens) + + # ========================= + # 2) Gerçek e-posta gönder + # ========================= + def send_email(self): + """ + Tablo satırlarını dolaşır; 2. ve 3. sütundaki adreslere + etkinlik adına göre basit bir bilgilendirme maili yollar. + Gmail ile çalışır: 2-Adımlı Doğrulama açık + App Password gerekli. + """ + rows = self.tableWidget.rowCount() + if rows == 0: + QMessageBox.warning(self, "No Data", "No events loaded.") + return + + # ---- SMTP ayarlarını BURAYA koy ---- + SMTP_SERVER = "smtp.gmail.com" + SMTP_PORT = 587 + SENDER_EMAIL = "your_email@gmail.com" # <-- kendi adresin + SENDER_PASSWORD = "your_app_password" # <-- Gmail App Password + + # Basit doğrulama + if "your_email" in SENDER_EMAIL or "your_app_password" in SENDER_PASSWORD: + QMessageBox.warning( + self, "Setup Required", + "Please set SENDER_EMAIL and SENDER_PASSWORD (Gmail App Password)." + ) + return + + try: + server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT, timeout=20) + server.starttls() + server.login(SENDER_EMAIL, SENDER_PASSWORD) + + total_sent = 0 + + for r in range(rows): + event_name = self._safe_item_text(r, 0) + participant = self._safe_item_text(r, 2) + organizer = self._safe_item_text(r, 3) + + # adresleri virgül/ noktalı virgül ile ayırmayı destekle + targets = [] + targets += self._split_emails(participant) + targets += self._split_emails(organizer) + + if not targets: + continue + + msg = MIMEText( + f"Hello,\n\nThis is a reminder for the event:\n\n" + f" {event_name}\n\n" + f"Best regards,\nCRM Bot" + ) + msg["Subject"] = f"Event Reminder – {event_name}" + msg["From"] = SENDER_EMAIL + + for to_addr in targets: + msg["To"] = to_addr + server.sendmail(SENDER_EMAIL, to_addr, msg.as_string()) + total_sent += 1 + + server.quit() + QMessageBox.information(self, "Emails Sent", f"Successfully sent {total_sent} email(s).") + + except smtplib.SMTPAuthenticationError as e: + QMessageBox.critical( + self, "Auth Error", + "SMTP authentication failed.\n\n" + "Gmail için:\n" + "1) Google hesabında 2-Adımlı Doğrulama açık olmalı\n" + "2) App Password oluşturup SENDER_PASSWORD olarak kullanmalısın.\n\n" + f"Details:\n{e}" + ) + except Exception as e: + QMessageBox.critical(self, "Email Error", f"Failed to send emails:\n{e}") + + def _safe_item_text(self, row: int, col: int) -> str: + it = self.tableWidget.item(row, col) + return it.text().strip() if it else "" + + def _split_emails(self, raw: str) -> list[str]: + if not raw: + return [] + # virgül veya noktalı virgül ile ayır + parts = [p.strip() for p in raw.replace(";", ",").split(",")] + # boşları ayıkla, çok basit bir '@' kontrolü + return [p for p in parts if p and "@" in p] + def return_to_admin_pref_menu(self): from main import PreferenceAdminMenu self.pref_menu = PreferenceAdminMenu(role=self.role) self.pref_menu.show() - self.close() \ No newline at end of file + self.close() + + +# ---- Tek başına çalıştırma (runner) ---- +if __name__ == "__main__": + app = QApplication(sys.argv) + w = AdminMenuWindow() + w.show() + sys.exit(app.exec()) From 5b1b74e405b3f879fe928b2434184d12af866d41 Mon Sep 17 00:00:00 2001 From: ZEYNEP Date: Sat, 8 Nov 2025 08:21:39 +0100 Subject: [PATCH 29/37] Update interviews_page.py Refactor InterviewsWindow to include Excel integration and table display. --- CRM/interviews_page.py | 166 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 155 insertions(+), 11 deletions(-) diff --git a/CRM/interviews_page.py b/CRM/interviews_page.py index 45ae442..cdadd2b 100644 --- a/CRM/interviews_page.py +++ b/CRM/interviews_page.py @@ -1,13 +1,16 @@ -# interviews_page.py - +# interview_page import os +import pandas as pd from PyQt6.uic import loadUi from PyQt6.QtCore import Qt +from PyQt6.QtWidgets import QMessageBox, QTableWidgetItem, QApplication from main import BaseWindow -from PyQt6 import QtWidgets +from PyQt6.QtWidgets import QHeaderView + BASE_DIR = os.path.dirname(__file__) UI_DIR = os.path.join(BASE_DIR, "UI_s") +EXCEL_PATH = os.path.join(BASE_DIR, "Excels", "Interviews.xlsx") class InterviewsWindow(BaseWindow): @@ -17,15 +20,156 @@ def __init__(self, role="admin"): loadUi(os.path.join(UI_DIR, "Interviews.ui"), self) self.setWindowTitle("Interviews") self.setFixedSize(1000, 600) + self.setWindowFlag(Qt.WindowType.FramelessWindowHint) self.move_to_last_position() + # Tablo başlıkları + self.tableWidget.setColumnCount(3) + self.tableWidget.setHorizontalHeaderLabels([ + "Full Name", "Submitted Project", "Received Project" +]) + header = self.tableWidget.horizontalHeader() + header.setStretchLastSection(True) + header.setSectionResizeMode(0, QHeaderView.ResizeMode.Stretch) + header.setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch) + header.setSectionResizeMode(2, QHeaderView.ResizeMode.Stretch) + + + # Excel yükleme ve normalize edilmiş kolon isimleri + if os.path.exists(EXCEL_PATH): + try: + self.df = pd.read_excel(EXCEL_PATH) + except Exception as e: + QMessageBox.critical(self, "Dosya Hatası", f"Excel okunamadı:\n{e}") + self.df = pd.DataFrame() + else: + QMessageBox.critical(self, "Dosya Hatası", f"Excel dosyası bulunamadı:\n{EXCEL_PATH}") + self.df = pd.DataFrame() - # Butonları bağla + # Normalize: ayrıca indekslenmiş küçük harfli isimlere erişim için bir yardımcı dict oluştur + # (orijinal sütun adlarını koruyoruz ancak lowercase anahtarlarla arama yapacağız) + self.col_map = {} + if not self.df.empty: + for c in self.df.columns: + self.col_map[c.strip().lower()] = c # map: lowercase -> gerçek sütun adı + + # Olası sütun isimlerini tespit et (Türkçe ve İngilizce olasılıkları) + self.name_col = self._pick_column(["full name", "adınız soyadınız", "adınız soyadınız", "ad soyad", "adiniz soyadiniz"]) + self.submitted_col = self._pick_column(["submitted project", "proje gonderilis tarihi", "proje gönderiliş tarihi", "project submitted", "submitted"]) + self.received_col = self._pick_column(["received project", "projenin gelis tarihi", "proje gelis tarihi", "received"]) + + # Bağlantılar self.pushButton_Return_REFERENCE_menu.clicked.connect(self.return_to_menu) self.pushButton_EXIT.clicked.connect(self.close) self.pushButton_SEARCH.clicked.connect(self.search_action) self.pushButton_SUBMITTED_PROJECTS.clicked.connect(self.show_submitted_projects) self.pushButton_RECEIVED_PROJECTS.clicked.connect(self.show_received_projects) + + + def _pick_column(self, candidates): + """Verilen anahtar listesine göre ilk eşleşen gerçek sütun adını döndürür.""" + if self.df.empty: + return None + lower_cols = [c.lower().strip() for c in self.df.columns] + for cand in candidates: + cand_low = cand.lower().strip() + for i, lc in enumerate(lower_cols): + # Tam veya içinde eşleşme kabul edelim + if cand_low == lc or cand_low in lc or lc in cand_low: + return self.df.columns[i] + return None + + def fill_table(self, data: pd.DataFrame): + # verilen DataFrame'i TableWidget'e yazmak + self.tableWidget.setRowCount(0) + for row_idx, row in data.reset_index(drop=True).iterrows(): + self.tableWidget.insertRow(row_idx) + # Eğer sütun yoksa boş string koy + name_val = row.get(self.name_col, "") if self.name_col in row.index else row.get("Adınız Soyadınız", "") + sub_val = row.get(self.submitted_col, "") if self.submitted_col in row.index else row.get("Proje gonderilis tarihi", "") + rec_val = row.get(self.received_col, "") if self.received_col in row.index else row.get("Projenin gelis tarihi", "") + + self.tableWidget.setItem(row_idx, 0, QTableWidgetItem("" if pd.isna(name_val) else str(name_val))) + self.tableWidget.setItem(row_idx, 1, QTableWidgetItem("" if pd.isna(sub_val) else str(sub_val))) + self.tableWidget.setItem(row_idx, 2, QTableWidgetItem("" if pd.isna(rec_val) else str(rec_val))) + + + def search_action(self): + """NAME sütununda BAŞLANGIÇ (startswith) araması yapar, case-insensitive.""" + if self.name_col is None: + QMessageBox.critical(self, "Error", "Name column could not be found in the Excel file.") + return + text = self.lineEdit.text().strip() + if text == "": + QMessageBox.information(self, "INFO", "Please enter text to search.") + return + + # Case-insensitive, baştan eşleşme. NaN güvenli. + series = self.df[self.name_col].astype(str).str.strip() + mask = series.str.lower().str.startswith(text.lower(), na=False) + filtered = self.df[mask] + if filtered.empty: + QMessageBox.information(self, "No Results ", f"No names starting with '{text}' were found.") + # istersen tümünü gösterme, şu an sadece uyarı + else: + self.fill_table(filtered) + + def keyPressEvent(self, event): + if event.key() in (Qt.Key.Key_Return, Qt.Key.Key_Enter): + self.search_action() + + + + + def show_submitted_projects(self): + # """Displays all candidates who have SUBMITTED a project.""" + col = self.submitted_col + if col is None: + for c in self.df.columns: + low = c.strip().lower() + if "submitted" in low or ("send" in low) or ("gonder" in low): + col = c + break + + if col is None: + QMessageBox.critical(self, "Error", "'Submitted Project' column not found in the Excel file.") + return + + mask = self.df[col].notna() & (self.df[col].astype(str).str.strip() != "") + submitted = self.df[mask] + + if submitted.empty: + QMessageBox.information(self, "Info", "No candidates with submitted projects found.") + else: + self.fill_table(submitted) + + + + def show_received_projects(self): + # """Displays all candidates whose projects have been RECEIVED.""" + col = self.received_col + if col is None: + for c in self.df.columns: + low = c.strip().lower() + if "received" in low or "gel" in low or "delivered" in low: + col = c + break + + if col is None: + QMessageBox.critical(self, "Error", "'Received Project' column not found in the Excel file.") + return + + mask = self.df[col].notna() & (self.df[col].astype(str).str.strip() != "") + received = self.df[mask] + + if received.empty: + QMessageBox.information(self, "Info", "No candidates with received projects found.") + else: + self.fill_table(received) + + + + def return_to_menu(self): from main import PreferenceAdminMenu, PreferenceMenu if self.role.lower() == "admin": @@ -35,12 +179,12 @@ def return_to_menu(self): self.pref_menu.show() self.close() - def search_action(self): - text = self.lineEdit.text().strip() - print(f"🔍 Searching for: {text}") - def show_submitted_projects(self): - print("📤 Showing submitted projects...") +# test +if __name__ == "__main__": + import sys + app = QApplication(sys.argv) + w = InterviewsWindow(role="admin") + w.show() + sys.exit(app.exec()) - def show_received_projects(self): - print("📥 Showing received projects...") From d4d1e32b5b57c06929aabd4e69147964350ac6be Mon Sep 17 00:00:00 2001 From: ZEYNEP Date: Sat, 8 Nov 2025 08:35:44 +0100 Subject: [PATCH 30/37] Update interviews_page.py --- CRM/interviews_page.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CRM/interviews_page.py b/CRM/interviews_page.py index cdadd2b..b6f6b9d 100644 --- a/CRM/interviews_page.py +++ b/CRM/interviews_page.py @@ -45,14 +45,13 @@ def __init__(self, role="admin"): QMessageBox.critical(self, "Dosya Hatası", f"Excel dosyası bulunamadı:\n{EXCEL_PATH}") self.df = pd.DataFrame() - # Normalize: ayrıca indekslenmiş küçük harfli isimlere erişim için bir yardımcı dict oluştur - # (orijinal sütun adlarını koruyoruz ancak lowercase anahtarlarla arama yapacağız) + self.col_map = {} if not self.df.empty: for c in self.df.columns: self.col_map[c.strip().lower()] = c # map: lowercase -> gerçek sütun adı - # Olası sütun isimlerini tespit et (Türkçe ve İngilizce olasılıkları) + # Olası sütun isimlerini tespit ediliyor (Türkçe ve İngilizce olasılıkları) self.name_col = self._pick_column(["full name", "adınız soyadınız", "adınız soyadınız", "ad soyad", "adiniz soyadiniz"]) self.submitted_col = self._pick_column(["submitted project", "proje gonderilis tarihi", "proje gönderiliş tarihi", "project submitted", "submitted"]) self.received_col = self._pick_column(["received project", "projenin gelis tarihi", "proje gelis tarihi", "received"]) @@ -110,7 +109,7 @@ def search_action(self): filtered = self.df[mask] if filtered.empty: QMessageBox.information(self, "No Results ", f"No names starting with '{text}' were found.") - # istersen tümünü gösterme, şu an sadece uyarı + else: self.fill_table(filtered) @@ -188,3 +187,4 @@ def return_to_menu(self): w.show() sys.exit(app.exec()) + From 1bbf946d8bc30aef3501bab8adf3c72ea96608f4 Mon Sep 17 00:00:00 2001 From: ZEYNEP Date: Sat, 8 Nov 2025 08:37:54 +0100 Subject: [PATCH 31/37] Update admin_menu_page.py --- CRM/admin_menu_page.py | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/CRM/admin_menu_page.py b/CRM/admin_menu_page.py index 07a8033..be25bdc 100644 --- a/CRM/admin_menu_page.py +++ b/CRM/admin_menu_page.py @@ -14,7 +14,6 @@ QTableWidgetItem, ) -# ---- BaseWindow: main.py'den geliyorsa kullan, yoksa QWidget'e düş ---- try: from main import BaseWindow # proje içinden çalışırken except Exception: @@ -59,9 +58,7 @@ def __init__(self, role: str = "admin"): self.pushButton_SEND_EMAIL.clicked.connect(self.send_email) self.pushButton_Return_TO_ADMIN_PREFERENCE_menu.clicked.connect(self.return_to_admin_pref_menu) self.pushButton_Exit.clicked.connect(self.close) - - # --- Table hardening --- - # Kolon sayısı UI'da 4; başlıklar UI içinde zaten yazılı + self.tableWidget.setColumnCount(4) self.tableWidget.setSortingEnabled(False) @@ -71,11 +68,6 @@ def __init__(self, role: str = "admin"): def register_event(self): """ Excels/Event.ods içindeki ilk çalışma sayfasını okur ve tabloya basar. - Sütun beklenen sıra: - 0: Event Name - 1: Start Time - 2: Participant Email - 3: Organizer Email """ ods_path = os.path.join(EXCEL_DIR, "Event.ods") if not os.path.exists(ods_path): @@ -111,9 +103,7 @@ def register_event(self): item.setFlags(Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable) self.tableWidget.setItem(r, c, item) - # İstenirse başarı popup’ı gösterilebilir; sunum için sessiz bırakıyoruz. - # QMessageBox.information(self, "Success", "Events loaded successfully!") - + except Exception as e: QMessageBox.critical(self, "Read Error", f"Failed to read ODS:\n{e}") @@ -223,3 +213,4 @@ def return_to_admin_pref_menu(self): w = AdminMenuWindow() w.show() sys.exit(app.exec()) + From 2c4a04cd0f11833dbf3ca0b60897fe3c2dfcb30d Mon Sep 17 00:00:00 2001 From: rumeysa1017 Date: Sat, 8 Nov 2025 16:44:27 +0100 Subject: [PATCH 32/37] Update Applications.py bazi butonlarin siralamasini degistirmem gerekti. --- CRM/Applications.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/CRM/Applications.py b/CRM/Applications.py index 1bb6f48..eead662 100644 --- a/CRM/Applications.py +++ b/CRM/Applications.py @@ -51,20 +51,20 @@ def __init__(self, role="admin"): # Butonlara fonksiyon bağla self.pushButton_SEARCH.clicked.connect(self.search_applications) self.lineEdit.textChanged.connect(self.search_applications) # CANLI ARAMA - self.pushButton_ALL_APPLICATIONS.clicked.connect(self.load_all_applications) self.pushButton_ALL_APPLICATIONS.clicked.connect(self.clear_search_input) - self.pushButton_DEFINED_MENTOR_MEETING.clicked.connect(self.show_defined_mentor) + self.pushButton_ALL_APPLICATIONS.clicked.connect(self.load_all_applications) self.pushButton_DEFINED_MENTOR_MEETING.clicked.connect(self.clear_search_input) - self.pushButton_UNDEFINED_MENTOR_MEETING.clicked.connect(self.show_undefined_mentor) + self.pushButton_DEFINED_MENTOR_MEETING.clicked.connect(self.show_defined_mentor) self.pushButton_UNDEFINED_MENTOR_MEETING.clicked.connect(self.clear_search_input) - self.pushButton_DUPLICATE_REGISTRATION.clicked.connect(self.show_duplicates) + self.pushButton_UNDEFINED_MENTOR_MEETING.clicked.connect(self.show_undefined_mentor) self.pushButton_DUPLICATE_REGISTRATION.clicked.connect(self.clear_search_input) - self.pushButton_PREVIOUS_VIT_CHECK.clicked.connect(self.show_previous_vit) + self.pushButton_DUPLICATE_REGISTRATION.clicked.connect(self.show_duplicates) self.pushButton_PREVIOUS_VIT_CHECK.clicked.connect(self.clear_search_input) - self.pushButton_DIFFERENT_REGISTRATION.clicked.connect(self.show_different) + self.pushButton_PREVIOUS_VIT_CHECK.clicked.connect(self.show_previous_vit) self.pushButton_DIFFERENT_REGISTRATION.clicked.connect(self.clear_search_input) - self.pushButton_APPLICATION_FILTERING.clicked.connect(self.filter_applications) + self.pushButton_DIFFERENT_REGISTRATION.clicked.connect(self.show_different) self.pushButton_APPLICATION_FILTERING.clicked.connect(self.clear_search_input) + self.pushButton_APPLICATION_FILTERING.clicked.connect(self.filter_applications) self.pushButton_RETURN_REFERENCE_MENU.clicked.connect(self.return_to_menu) # ---------------- Fonksiyonlar ---------------- # @@ -206,3 +206,4 @@ def return_to_menu(self): window = ApplicationsWindow(role="admin") window.show() sys.exit(app.exec()) + From 38839742730538b31d5eea79304c9786c7c78cb0 Mon Sep 17 00:00:00 2001 From: rumeysa1017 Date: Sat, 8 Nov 2025 17:58:12 +0100 Subject: [PATCH 33/37] Add files via upload From 3da012e6b9f5e796bf8325b900096540a018017c Mon Sep 17 00:00:00 2001 From: ZEYNEP Date: Sun, 9 Nov 2025 11:17:48 +0100 Subject: [PATCH 34/37] Add files via upload --- CRM/Excels/Event.ods | Bin 0 -> 21466 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 CRM/Excels/Event.ods diff --git a/CRM/Excels/Event.ods b/CRM/Excels/Event.ods new file mode 100644 index 0000000000000000000000000000000000000000..dbdb80b3c555d300561acbab96fd0aff3ff5e7f5 GIT binary patch literal 21466 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 z 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 literal 0 HcmV?d00001 From 75635f1f34fd10a7cc2b413ec99e086baa605847 Mon Sep 17 00:00:00 2001 From: ZEYNEP Date: Sun, 9 Nov 2025 14:57:24 +0100 Subject: [PATCH 35/37] Add files via upload --- CRM/Excels/Event.xlsx | Bin 0 -> 9997 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 CRM/Excels/Event.xlsx diff --git a/CRM/Excels/Event.xlsx b/CRM/Excels/Event.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0d252ead884db97b1d5e45088fdde4596a14f567 GIT binary patch literal 9997 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 literal 0 HcmV?d00001 From 0c49705d0027669477c3417db20763bcb49eb236 Mon Sep 17 00:00:00 2001 From: ZEYNEP Date: Sun, 9 Nov 2025 14:59:10 +0100 Subject: [PATCH 36/37] Add files via upload .ods uzantili dosya cikarildi yerine .xlsx uzantili dosya konuldu. --- CRM/admin_menu_page.py | 221 ++++++++++++++++++++--------------------- 1 file changed, 106 insertions(+), 115 deletions(-) diff --git a/CRM/admin_menu_page.py b/CRM/admin_menu_page.py index be25bdc..b28d5d2 100644 --- a/CRM/admin_menu_page.py +++ b/CRM/admin_menu_page.py @@ -1,47 +1,41 @@ -#admin_menu_page.py - import os import sys import smtplib from email.mime.text import MIMEText +import pandas as pd from PyQt6.uic import loadUi from PyQt6.QtCore import Qt from PyQt6.QtWidgets import ( QApplication, QMessageBox, - QTableWidgetItem, + QTableWidgetItem ) try: - from main import BaseWindow # proje içinden çalışırken + from main import BaseWindow except Exception: - from PyQt6.QtWidgets import QWidget as BaseWindow # tek başına koşarken - -# ---- ODS okuma için odfpy ---- -from odf.opendocument import load as odf_load -from odf.table import Table, TableRow, TableCell -from odf.text import P + from PyQt6.QtWidgets import QWidget as BaseWindow BASE_DIR = os.path.dirname(__file__) UI_DIR = os.path.join(BASE_DIR, "UI_s") -EXCEL_DIR = os.path.join(BASE_DIR, "Excels") # Event.ods burada olmalı +EXCEL_DIR = os.path.join(BASE_DIR, "Excels") # Event.xlsx burada olacak class AdminMenuWindow(BaseWindow): - def __init__(self, role: str = "admin"): + def __init__(self, role="admin"): super().__init__() + ui_path = os.path.join(UI_DIR, "Admin_Menu.ui") - # UI yükle (sessiz çökme yaşanmaması için try/except) try: loadUi(ui_path, self) except Exception as e: QMessageBox.critical( self, "UI Load Error", - f"Failed to load UI file:\n{ui_path}\n\n{e}" + f"Failed to load UI:\n{ui_path}\n\n{e}" ) raise @@ -49,94 +43,82 @@ def __init__(self, role: str = "admin"): self.setWindowTitle("Admin Menu") self.setFixedSize(1000, 600) self.setWindowFlag(Qt.WindowType.FramelessWindowHint) - # BaseWindow varsa pencere konumunu korur + if hasattr(self, "move_to_last_position"): self.move_to_last_position() - # --- Buttons --- + # --- Button connections --- self.pushButton_EVENT_REGISTRATION.clicked.connect(self.register_event) self.pushButton_SEND_EMAIL.clicked.connect(self.send_email) self.pushButton_Return_TO_ADMIN_PREFERENCE_menu.clicked.connect(self.return_to_admin_pref_menu) self.pushButton_Exit.clicked.connect(self.close) - + self.tableWidget.setColumnCount(4) - self.tableWidget.setSortingEnabled(False) - # ========================= - # 1) ODS → tabloya yükle - # ========================= + + + # 1) Excel (Event.xlsx) → Tabloya yükleme + def register_event(self): - """ - Excels/Event.ods içindeki ilk çalışma sayfasını okur ve tabloya basar. - """ - ods_path = os.path.join(EXCEL_DIR, "Event.ods") - if not os.path.exists(ods_path): - QMessageBox.warning(self, "Missing File", f"Event.ods not found:\n{ods_path}") + excel_path = os.path.join(EXCEL_DIR, "Event.xlsx") + + if not os.path.exists(excel_path): + QMessageBox.warning(self, "Missing File", f"Event.xlsx not found:\n{excel_path}") return try: - doc = odf_load(ods_path) - table = doc.spreadsheet.getElementsByType(Table)[0] - - rows = [] - for row in table.getElementsByType(TableRow): - vals = [] - for cell in row.getElementsByType(TableCell): - # ODS hücresindeki tüm satırlarını birleştir - txt_parts = [str(p) for p in cell.getElementsByType(P)] - vals.append(" ".join(txt_parts).strip()) - # Satırda tamamen boş olmayan bir değer varsa ekle - if any(v.strip() for v in vals): - rows.append(vals) - - # İlk satır başlık ise at (başlık kontrolü gevşek) - if rows and self._looks_like_header(rows[0]): - rows = rows[1:] - - # Tabloya yaz - self.tableWidget.clearContents() - self.tableWidget.setRowCount(len(rows)) - for r, row_vals in enumerate(rows): - for c in range(4): - text = row_vals[c] if c < len(row_vals) else "" - item = QTableWidgetItem(text) - item.setFlags(Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable) - self.tableWidget.setItem(r, c, item) - - + df = pd.read_excel(excel_path) + + required_columns = [ + "EVENT NAME", + "START TIME", + "PARTICIPANT E-MAIL", + "ORGANIZER E-MAIL" + ] + + for col in required_columns: + if col not in df.columns: + QMessageBox.critical( + self, + "Column Error", + f"Missing column in Event.xlsx:\n'{col}'" + ) + return + + self.tableWidget.setRowCount(0) + + for row_idx, row in df.iterrows(): + self.tableWidget.insertRow(row_idx) + self.tableWidget.setItem(row_idx, 0, QTableWidgetItem(str(row["EVENT NAME"]))) + self.tableWidget.setItem(row_idx, 1, QTableWidgetItem(str(row["START TIME"]))) + self.tableWidget.setItem(row_idx, 2, QTableWidgetItem(str(row["PARTICIPANT E-MAIL"]))) + self.tableWidget.setItem(row_idx, 3, QTableWidgetItem(str(row["ORGANIZER E-MAIL"]))) + except Exception as e: - QMessageBox.critical(self, "Read Error", f"Failed to read ODS:\n{e}") + QMessageBox.critical(self, "Excel Error", f"Failed to read Event.xlsx:\n{e}") - def _looks_like_header(self, first_row): - header_tokens = ["event", "name", "start", "time", "email", "participant", "organizer"] - joined = " ".join(first_row).lower() - return any(tok in joined for tok in header_tokens) - # ========================= - # 2) Gerçek e-posta gönder - # ========================= + # 2-Gerçek Mail Gönderme (Gmail App Password gerekli) + def send_email(self): - """ - Tablo satırlarını dolaşır; 2. ve 3. sütundaki adreslere - etkinlik adına göre basit bir bilgilendirme maili yollar. - Gmail ile çalışır: 2-Adımlı Doğrulama açık + App Password gerekli. - """ rows = self.tableWidget.rowCount() + if rows == 0: QMessageBox.warning(self, "No Data", "No events loaded.") return - # ---- SMTP ayarlarını BURAYA koy ---- SMTP_SERVER = "smtp.gmail.com" SMTP_PORT = 587 - SENDER_EMAIL = "your_email@gmail.com" # <-- kendi adresin - SENDER_PASSWORD = "your_app_password" # <-- Gmail App Password - # Basit doğrulama - if "your_email" in SENDER_EMAIL or "your_app_password" in SENDER_PASSWORD: + # BURAYI KENDİ GMAIL HESABINLA DOLDURACAKSIN + SENDER_EMAIL = "your_email@gmail.com" + SENDER_PASSWORD = "your_app_password" # Gmail App Password + + if "your_email" in SENDER_EMAIL: QMessageBox.warning( - self, "Setup Required", - "Please set SENDER_EMAIL and SENDER_PASSWORD (Gmail App Password)." + self, + "Setup Needed", + "Please set your Gmail address and App Password in the code." ) return @@ -145,72 +127,81 @@ def send_email(self): server.starttls() server.login(SENDER_EMAIL, SENDER_PASSWORD) - total_sent = 0 + sent_count = 0 for r in range(rows): - event_name = self._safe_item_text(r, 0) - participant = self._safe_item_text(r, 2) - organizer = self._safe_item_text(r, 3) + event_name = self._safe(r, 0) + participant = self._safe(r, 2) + organizer = self._safe(r, 3) - # adresleri virgül/ noktalı virgül ile ayırmayı destekle - targets = [] - targets += self._split_emails(participant) - targets += self._split_emails(organizer) + emails = self._split_emails(participant) + self._split_emails(organizer) - if not targets: + if not emails: continue msg = MIMEText( f"Hello,\n\nThis is a reminder for the event:\n\n" - f" {event_name}\n\n" - f"Best regards,\nCRM Bot" + f"{event_name}\n\nBest regards,\nCRM System" ) msg["Subject"] = f"Event Reminder – {event_name}" msg["From"] = SENDER_EMAIL - for to_addr in targets: - msg["To"] = to_addr - server.sendmail(SENDER_EMAIL, to_addr, msg.as_string()) - total_sent += 1 + for email in emails: + msg["To"] = email + server.sendmail(SENDER_EMAIL, email, msg.as_string()) + sent_count += 1 server.quit() - QMessageBox.information(self, "Emails Sent", f"Successfully sent {total_sent} email(s).") - except smtplib.SMTPAuthenticationError as e: + QMessageBox.information(self, "Success", f"Emails sent: {sent_count}") + + except smtplib.SMTPAuthenticationError: QMessageBox.critical( - self, "Auth Error", - "SMTP authentication failed.\n\n" - "Gmail için:\n" - "1) Google hesabında 2-Adımlı Doğrulama açık olmalı\n" - "2) App Password oluşturup SENDER_PASSWORD olarak kullanmalısın.\n\n" - f"Details:\n{e}" + self, + "Authentication Error", + "Gmail blocked the login.\n" + "You MUST use a Gmail App Password:\n" + "Google Account → Security → App Passwords." ) except Exception as e: - QMessageBox.critical(self, "Email Error", f"Failed to send emails:\n{e}") + QMessageBox.critical(self, "Email Error", str(e)) + - def _safe_item_text(self, row: int, col: int) -> str: - it = self.tableWidget.item(row, col) - return it.text().strip() if it else "" + def _safe(self, r, c): + item = self.tableWidget.item(r, c) + return item.text().strip() if item else "" - def _split_emails(self, raw: str) -> list[str]: - if not raw: + def _split_emails(self, text): + if not text: return [] - # virgül veya noktalı virgül ile ayır - parts = [p.strip() for p in raw.replace(";", ",").split(",")] - # boşları ayıkla, çok basit bir '@' kontrolü - return [p for p in parts if p and "@" in p] - + parts = [p.strip() for p in text.replace(";", ",").split(",")] + return [p for p in parts if "@" in p] + + + # RETURN — Admin Preference Menu’ye geri dön + def return_to_admin_pref_menu(self): - from main import PreferenceAdminMenu - self.pref_menu = PreferenceAdminMenu(role=self.role) - self.pref_menu.show() + try: + from main import PreferenceAdminMenu + except ImportError: + try: + from __main__ import PreferenceAdminMenu + except ImportError: + QMessageBox.warning(self, "Return Error", + "Cannot return — main module not found.") + return + + window = PreferenceAdminMenu(role=self.role) + window.show() self.close() - -# ---- Tek başına çalıştırma (runner) ---- + + if __name__ == "__main__": app = QApplication(sys.argv) w = AdminMenuWindow() w.show() sys.exit(app.exec()) + + From 90d07f69ef24c321af2bda804eedec9e2824ad0e Mon Sep 17 00:00:00 2001 From: ZEYNEP Date: Sun, 9 Nov 2025 16:42:38 +0100 Subject: [PATCH 37/37] Add files via upload --- CRM/admin_menu_page.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/CRM/admin_menu_page.py b/CRM/admin_menu_page.py index b28d5d2..a1c5514 100644 --- a/CRM/admin_menu_page.py +++ b/CRM/admin_menu_page.py @@ -179,21 +179,25 @@ def _split_emails(self, text): # RETURN — Admin Preference Menu’ye geri dön - def return_to_admin_pref_menu(self): + # 1) Normal durumda: proje main.py'den çalışınca try: from main import PreferenceAdminMenu except ImportError: + # 2) Python main.py'yi __main__ olarak çalıştırdıysa burası devreye girer try: from __main__ import PreferenceAdminMenu except ImportError: - QMessageBox.warning(self, "Return Error", - "Cannot return — main module not found.") - return - - window = PreferenceAdminMenu(role=self.role) - window.show() + QMessageBox.warning( + self, + "Return Error", + "Cannot return to previous menu because main module was not found." + ) + return + self.new_window = PreferenceAdminMenu(role=self.role) # REFERANS ÖNEMLİ + self.new_window.show() self.close() +