diff --git a/data.json b/data.json index 58289ee..82aa1a4 100644 --- a/data.json +++ b/data.json @@ -1,54 +1,224 @@ { - "users": [ - { "login": "1001", "password": "Admin123", "name": "Асет (Комплаенс офицер)", "role": "admin" }, - { "login": "2001", "password": "Worker123", "name": "Айгүл Серікқызы", "role": "user" }, - { "login": "2002", "password": "Worker123", "name": "Бауыржан Нұрланұлы", "role": "user" }, - { "login": "2003", "password": "Worker123", "name": "Дана Қайратқызы", "role": "user" } - ], "announcements": [ - { "id": 1, "title": "Жылдық комплаенс оқуы басталды", "text": "Барлық қызметкерлер 1 қарашаға дейін «Сыбайлас жемқорлыққа қарсы» тестін тапсыруы қажет. Видео сабақтар мен заңдар бөлімін қарап шығыңыз.", "date": "2026-08-11" }, - { "id": 2, "title": "Мүдделер қақтығысын декларациялау", "text": "Қызметкерлер жыл сайын мүдделер қақтығысы туралы декларация толтырады. Нысан шағым жәшігі бөлімінен алуға болады.", "date": "2026-08-05" } + { + "id": 1, + "title": "Жылдық комплаенс оқуы басталды", + "text": "Барлық қызметкерлер 1 қарашаға дейін «Сыбайлас жемқорлыққа қарсы» тестін тапсыруы қажет. Видео сабақтар мен заңдар бөлімін қарап шығыңыз.", + "date": "2026-08-11" + }, + { + "id": 2, + "title": "Мүдделер қақтығысын декларациялау", + "text": "Қызметкерлер жыл сайын мүдделер қақтығысы туралы декларация толтырады. Нысан шағым жәшігі бөлімінен алуға болады.", + "date": "2026-08-05" + } ], "org": [ - { "level": 1, "name": "Бас директор", "person": "Ерлан Қасымов", "email": "e.kasymov@qonaev.kz", "phone": "+7 (727) 300-10-01" }, - { "level": 2, "name": "Басқарма төрағасы", "person": "Гүлнара Әбенова", "email": "g.abenova@qonaev.kz", "phone": "+7 (727) 300-10-02" }, - { "level": 3, "name": "Қаржы дирекциясы", "person": "Серік Жұмабаев", "email": "s.zhumabaev@qonaev.kz", "phone": "+7 (727) 300-10-03" }, - { "level": 3, "name": "Эфир дирекциясы", "person": "Айжан Төлегенова", "email": "a.tolegenova@qonaev.kz", "phone": "+7 (727) 300-10-04" }, - { "level": 3, "name": "Жаңалықтар дирекциясы", "person": "Марат Бекенов", "email": "m.bekenov@qonaev.kz", "phone": "+7 (727) 300-10-05" }, - { "level": 3, "name": "Техникалық дирекция", "person": "Нұрлан Сыдықов", "email": "n.sydykov@qonaev.kz", "phone": "+7 (727) 300-10-06" }, - { "level": 3, "name": "HR және әкімшілік", "person": "Ләззат Қалиева", "email": "l.kalieva@qonaev.kz", "phone": "+7 (727) 300-10-07" }, - { "level": 4, "name": "Комплаенс қызметі", "person": "Асет (сіз)", "email": "compliance@qonaev.kz", "phone": "+7 (727) 300-10-08" } + { + "level": 1, + "name": "Бас директор", + "person": "Ерлан Қасымов", + "email": "e.kasymov@qonaev.kz", + "phone": "+7 (727) 300-10-01" + }, + { + "level": 2, + "name": "Басқарма төрағасы", + "person": "Гүлнара Әбенова", + "email": "g.abenova@qonaev.kz", + "phone": "+7 (727) 300-10-02" + }, + { + "level": 3, + "name": "Қаржы дирекциясы", + "person": "Серік Жұмабаев", + "email": "s.zhumabaev@qonaev.kz", + "phone": "+7 (727) 300-10-03" + }, + { + "level": 3, + "name": "Эфир дирекциясы", + "person": "Айжан Төлегенова", + "email": "a.tolegenova@qonaev.kz", + "phone": "+7 (727) 300-10-04" + }, + { + "level": 3, + "name": "Жаңалықтар дирекциясы", + "person": "Марат Бекенов", + "email": "m.bekenov@qonaev.kz", + "phone": "+7 (727) 300-10-05" + }, + { + "level": 3, + "name": "Техникалық дирекция", + "person": "Нұрлан Сыдықов", + "email": "n.sydykov@qonaev.kz", + "phone": "+7 (727) 300-10-06" + }, + { + "level": 3, + "name": "HR және әкімшілік", + "person": "Ләззат Қалиева", + "email": "l.kalieva@qonaev.kz", + "phone": "+7 (727) 300-10-07" + }, + { + "level": 4, + "name": "Комплаенс қызметі", + "person": "Асет (сіз)", + "email": "compliance@qonaev.kz", + "phone": "+7 (727) 300-10-08" + } ], "contacts": [ - { "org": "Антикор (ҚР Антикоррупциялық қызметі) Алматы қаласы бойынша департаменті", "type": "Ресми телефон", "phone": "8 (727) 278-73-24", "email": "almaty@nab.gov.kz", "note": "Мекенжай: Жібек Жолы даңғылы, 15" }, - { "org": "Антикор бірыңғай Call-орталығы", "type": "Сенім телефоны", "phone": "1424", "email": "", "note": "Қазақстан бойынша қоңырау тегін" }, - { "org": "Антикор WhatsApp-чат-бот", "type": "WhatsApp", "phone": "8 777 000 1424", "email": "", "note": "Хабарлама жіберуге болады" }, - { "org": "Алматы қаласы прокуратурасы", "type": "Кеңсе", "phone": "8 (727) 225-40-86", "email": "", "note": "Мекенжай: Желтоқсан көшесі, 189" }, - { "org": "Алматы қаласы прокуратурасы", "type": "Кезекші прокурор", "phone": "8 (727) 330-80-51", "email": "", "note": "Тәулік бойы" }, - { "org": "ҚР Бас прокуратурасы Call-орталығы", "type": "Сенім телефоны", "phone": "115", "email": "", "note": "Дс-жм 09:00–18:30, қоңырау тегін" }, - { "org": "Алматы қаласы Еңбек инспекциясы басқармасы", "type": "Ресми телефон", "phone": "+7 (727) 338-22-42", "email": "upr_gitm@mail.ru", "note": "Мекенжай: Достық даңғылы, 85" }, - { "org": "Алматы қаласы Еңбек инспекциясы (канцелярия)", "type": "Телефон", "phone": "8 (727) 374-94-47", "email": "kgu2016@mail.ru", "note": "" }, - { "org": "Алматы қаласы бойынша Мемлекеттік кірістер департаменті", "type": "Ресми телефон", "phone": "8 (7272) 267-15-54", "email": "", "note": "Мекенжай: Бөгенбай батыр көшесі, 132" } + { + "org": "Антикор (ҚР Антикоррупциялық қызметі) Алматы қаласы бойынша департаменті", + "type": "Ресми телефон", + "phone": "8 (727) 278-73-24", + "email": "almaty@nab.gov.kz", + "note": "Мекенжай: Жібек Жолы даңғылы, 15" + }, + { + "org": "Антикор бірыңғай Call-орталығы", + "type": "Сенім телефоны", + "phone": "1424", + "email": "", + "note": "Қазақстан бойынша қоңырау тегін" + }, + { + "org": "Антикор WhatsApp-чат-бот", + "type": "WhatsApp", + "phone": "8 777 000 1424", + "email": "", + "note": "Хабарлама жіберуге болады" + }, + { + "org": "Алматы қаласы прокуратурасы", + "type": "Кеңсе", + "phone": "8 (727) 225-40-86", + "email": "", + "note": "Мекенжай: Желтоқсан көшесі, 189" + }, + { + "org": "Алматы қаласы прокуратурасы", + "type": "Кезекші прокурор", + "phone": "8 (727) 330-80-51", + "email": "", + "note": "Тәулік бойы" + }, + { + "org": "ҚР Бас прокуратурасы Call-орталығы", + "type": "Сенім телефоны", + "phone": "115", + "email": "", + "note": "Дс-жм 09:00–18:30, қоңырау тегін" + }, + { + "org": "Алматы қаласы Еңбек инспекциясы басқармасы", + "type": "Ресми телефон", + "phone": "+7 (727) 338-22-42", + "email": "upr_gitm@mail.ru", + "note": "Мекенжай: Достық даңғылы, 85" + }, + { + "org": "Алматы қаласы Еңбек инспекциясы (канцелярия)", + "type": "Телефон", + "phone": "8 (727) 374-94-47", + "email": "kgu2016@mail.ru", + "note": "" + }, + { + "org": "Алматы қаласы бойынша Мемлекеттік кірістер департаменті", + "type": "Ресми телефон", + "phone": "8 (7272) 267-15-54", + "email": "", + "note": "Мекенжай: Бөгенбай батыр көшесі, 132" + } ], "videos": [ - { "id": 1, "title": "Комплаенс деген не?", "desc": "Кіріспе: комплаенс жүйесінің негіздері, мақсаттары және рөлі.", "dur": "12 мин", "thumb": "https://picsum.photos/seed/compl1/480/270" }, - { "id": 2, "title": "Сыбайлас жемқорлыққа қарсы заңнама", "desc": "ҚР заңдары, тыйымдар мен жауапкершілік туралы негізгі ережелер.", "dur": "18 мин", "thumb": "https://picsum.photos/seed/compl2/480/270" }, - { "id": 3, "title": "Мүдделер қақтығысы", "desc": "Мүдделер қақтығысын қалай тану және декларациялау керек.", "dur": "15 мин", "thumb": "https://picsum.photos/seed/compl3/480/270" }, - { "id": 4, "title": "Сыйлықтар мен белгілер ережелері", "desc": "Қызметкерлерге қандай сыйлықтар қабылдауға рұқсат етіледі.", "dur": "10 мин", "thumb": "https://picsum.photos/seed/compl4/480/270" } + { + "id": 1, + "title": "Комплаенс деген не?", + "desc": "Кіріспе: комплаенс жүйесінің негіздері, мақсаттары және рөлі.", + "dur": "12 мин", + "thumb": "https://picsum.photos/seed/compl1/480/270" + }, + { + "id": 2, + "title": "Сыбайлас жемқорлыққа қарсы заңнама", + "desc": "ҚР заңдары, тыйымдар мен жауапкершілік туралы негізгі ережелер.", + "dur": "18 мин", + "thumb": "https://picsum.photos/seed/compl2/480/270" + }, + { + "id": 3, + "title": "Мүдделер қақтығысы", + "desc": "Мүдделер қақтығысын қалай тану және декларациялау керек.", + "dur": "15 мин", + "thumb": "https://picsum.photos/seed/compl3/480/270" + }, + { + "id": 4, + "title": "Сыйлықтар мен белгілер ережелері", + "desc": "Қызметкерлерге қандай сыйлықтар қабылдауға рұқсат етіледі.", + "dur": "10 мин", + "thumb": "https://picsum.photos/seed/compl4/480/270" + } ], "laws": [ - { "id": 1, "cat": "Антикор", "title": "«Сыбайлас жемқорлыққа қарсы іс-қимыл туралы» ҚР Заңы", "text": "Қызметкерлердің жемқорлық құқық бұзушылықтар жасауына тыйым салады, кірістер декларациясын міндеттейді." }, - { "id": 2, "cat": "Еңбек", "title": "ҚР Еңбек кодексі", "text": "Қызметкерлердің құқықтары мен міндеттері, еңбек тәртібі, жауапкершілік нормалары." }, - { "id": 3, "cat": "Антикор", "title": "Мүдделер қақтығысы туралы ереже", "text": "Компания ішіндегі мүдделер қақтығысын анықтау, жариялау және шешу тәртібі." }, - { "id": 4, "cat": "Ақпарат", "title": "«Ақпаратқа қол жеткізу туралы» ҚР Заңы", "text": "Қоғамдық ақпаратқа қол жеткізу, құпия ақпаратты қорғау талаптары." }, - { "id": 5, "cat": "Этика", "title": "Компанияның Іскерлік этика кодексі", "text": "Қызметкерлердің мінез-құлық стандарттары, қарым-қатынас ережелері." } + { + "id": 1, + "cat": "Антикор", + "title": "«Сыбайлас жемқорлыққа қарсы іс-қимыл туралы» ҚР Заңы", + "text": "Қызметкерлердің жемқорлық құқық бұзушылықтар жасауына тыйым салады, кірістер декларациясын міндеттейді." + }, + { + "id": 2, + "cat": "Еңбек", + "title": "ҚР Еңбек кодексі", + "text": "Қызметкерлердің құқықтары мен міндеттері, еңбек тәртібі, жауапкершілік нормалары." + }, + { + "id": 3, + "cat": "Антикор", + "title": "Мүдделер қақтығысы туралы ереже", + "text": "Компания ішіндегі мүдделер қақтығысын анықтау, жариялау және шешу тәртібі." + }, + { + "id": 4, + "cat": "Ақпарат", + "title": "«Ақпаратқа қол жеткізу туралы» ҚР Заңы", + "text": "Қоғамдық ақпаратқа қол жеткізу, құпия ақпаратты қорғау талаптары." + }, + { + "id": 5, + "cat": "Этика", + "title": "Компанияның Іскерлік этика кодексі", + "text": "Қызметкерлердің мінез-құлық стандарттары, қарым-қатынас ережелері." + } ], "insider": [ - { "title": "Инсайдерлік ақпарат дегеніміз не?", "text": "Бұл компания туралы әлі жарияланбаған, қызметкерге өз жұмысы барысында белгілі болған деректер: қаржылық көрсеткіштер, келісімшарттар, жаңалық сюжеттері, кадрлық шешімдер." }, - { "title": "Таратуға тыйым салынады", "text": "Инсайдерлік ақпаратты эфирге шыққанға дейін немесе ресми жарияланғанға дейін үшінші тұлғаларға, әлеуметтік желілерде немесе таныстарға таратуға тыйым салынады." }, - { "title": "Дереккөздерді құпия ұстау", "text": "Журналистер өз дереккөздерін құпия ұстауға міндетті. Дереккөздің атын ашу — еңбек тәртібін өрескел бұзу." }, - { "title": "Не істеу керек?", "text": "Инсайдерлік ақпаратқа қол жеткізгенде және оны пайдалану қажет болғанда — комплаенс офицермен кеңесіңіз. Ақпарат тек қызметтік қажеттілік үшін пайдаланылады." }, - { "title": "Жауапкершілік", "text": "Инсайдерлік ақпаратты тарату — тәртіптік жауапкершілікке әкеледі, ал ауыр жағдайларда ҚР заңнамасы бойынша қылмыстық жауапкершілікке де тартылуы мүмкін." } + { + "title": "Инсайдерлік ақпарат дегеніміз не?", + "text": "Бұл компания туралы әлі жарияланбаған, қызметкерге өз жұмысы барысында белгілі болған деректер: қаржылық көрсеткіштер, келісімшарттар, жаңалық сюжеттері, кадрлық шешімдер." + }, + { + "title": "Таратуға тыйым салынады", + "text": "Инсайдерлік ақпаратты эфирге шыққанға дейін немесе ресми жарияланғанға дейін үшінші тұлғаларға, әлеуметтік желілерде немесе таныстарға таратуға тыйым салынады." + }, + { + "title": "Дереккөздерді құпия ұстау", + "text": "Журналистер өз дереккөздерін құпия ұстауға міндетті. Дереккөздің атын ашу — еңбек тәртібін өрескел бұзу." + }, + { + "title": "Не істеу керек?", + "text": "Инсайдерлік ақпаратқа қол жеткізгенде және оны пайдалану қажет болғанда — комплаенс офицермен кеңесіңіз. Ақпарат тек қызметтік қажеттілік үшін пайдаланылады." + }, + { + "title": "Жауапкершілік", + "text": "Инсайдерлік ақпаратты тарату — тәртіптік жауапкершілікке әкеледі, ал ауыр жағдайларда ҚР заңнамасы бойынша қылмыстық жауапкершілікке де тартылуы мүмкін." + } ], "giftRules": { "allowed": [ @@ -66,37 +236,178 @@ }, "tests": [ { - "id": 1, "title": "Сыбайлас жемқорлыққа қарсы негіздер", "pass": 70, + "id": 1, + "title": "Сыбайлас жемқорлыққа қарсы негіздер", + "pass": 70, "questions": [ - { "q": "Сыбайлас жемқорлық құқық бұзушылық деген не?", "options": ["Қызметкердің өз өкілеттігін жеке байыту үшін пайдалануы", "Жұмысқа уақытында келу", "Каникулға шығу", "Басшымен сөйлесу"], "correct": 0 }, - { "q": "Қызметкерге қандай сыйлық қабылдауға рұқсат?", "options": ["Кез келген уақытта кез келген сыйлық", "Құны 3 АЕК-тен аспайтын және есепке алынған сыйлық", "Тек ақшалай", "Барлық сыйлыққа тыйым салынған"], "correct": 1 }, - { "q": "Мүдделер қақтығысы дегеніміз?", "options": ["Жұмыстағы дау", "Жеке мүдде мен қызметтік міндеттердің қайшылығы", "Екі қызметкердің таласы", "Жұмыс орнын ауыстыру"], "correct": 1 }, - { "q": "Жемқорлық фактісін қайда хабарлау керек?", "options": ["Барлығына айту", "Комплаенс қызметіне немесе шағым жәшігіне", "Әлеуметтік желіде жазу", "Үндемеу"], "correct": 1 }, - { "q": "Кірістер мен мүлік туралы декларация кімге міндетті?", "options": ["Тек басшыларға", "Заңда көрсетілген қызметкерлерге", "Ешкімге", "Тек шетелге шығатындарға"], "correct": 1 } + { + "q": "Сыбайлас жемқорлық құқық бұзушылық деген не?", + "options": [ + "Қызметкердің өз өкілеттігін жеке байыту үшін пайдалануы", + "Жұмысқа уақытында келу", + "Каникулға шығу", + "Басшымен сөйлесу" + ], + "correct": 0 + }, + { + "q": "Қызметкерге қандай сыйлық қабылдауға рұқсат?", + "options": [ + "Кез келген уақытта кез келген сыйлық", + "Құны 3 АЕК-тен аспайтын және есепке алынған сыйлық", + "Тек ақшалай", + "Барлық сыйлыққа тыйым салынған" + ], + "correct": 1 + }, + { + "q": "Мүдделер қақтығысы дегеніміз?", + "options": [ + "Жұмыстағы дау", + "Жеке мүдде мен қызметтік міндеттердің қайшылығы", + "Екі қызметкердің таласы", + "Жұмыс орнын ауыстыру" + ], + "correct": 1 + }, + { + "q": "Жемқорлық фактісін қайда хабарлау керек?", + "options": [ + "Барлығына айту", + "Комплаенс қызметіне немесе шағым жәшігіне", + "Әлеуметтік желіде жазу", + "Үндемеу" + ], + "correct": 1 + }, + { + "q": "Кірістер мен мүлік туралы декларация кімге міндетті?", + "options": [ + "Тек басшыларға", + "Заңда көрсетілген қызметкерлерге", + "Ешкімге", + "Тек шетелге шығатындарға" + ], + "correct": 1 + } ] }, { - "id": 2, "title": "Іскерлік этика кодексі", "pass": 70, + "id": 2, + "title": "Іскерлік этика кодексі", + "pass": 70, "questions": [ - { "q": "Іскерлік этика кодексінің мақсаты?", "options": ["Қызметкерлерді жазалау", "Мінез-құлық стандарттарын белгілеу", "Жалақыны азайту", "Каникулды қысқарту"], "correct": 1 }, - { "q": "Алқаптас әріптеске қалай қарау керек?", "options": ["Құрметпен және теңдікте", "Менсінбеу", "Елемеу", "Тек басшыларға ғана құрмет"], "correct": 0 }, - { "q": "Конфиденциалды ақпаратты не істеуге болмайды?", "options": ["Қауіпсіз жерде сақтау", "Үшінші тұлғаларға тарату", "Пароль қою", "Құлыптап қою"], "correct": 1 }, - { "q": "Жемқорлық әрекетке қатысуды сұраса, не істеу керек?", "options": ["Келісу", "Бас тартып, комплаенс қызметіне хабарлау", "Ойланып жауап беру", "Ешкімге айтпау"], "correct": 1 }, - { "q": "Тест нәтижелері мен оқу материалдары кімге қажет?", "options": ["Тек HR-ға", "Барлық қызметкерлерге", "Тек админге", "Тек басшыларға"], "correct": 1 } + { + "q": "Іскерлік этика кодексінің мақсаты?", + "options": [ + "Қызметкерлерді жазалау", + "Мінез-құлық стандарттарын белгілеу", + "Жалақыны азайту", + "Каникулды қысқарту" + ], + "correct": 1 + }, + { + "q": "Алқаптас әріптеске қалай қарау керек?", + "options": [ + "Құрметпен және теңдікте", + "Менсінбеу", + "Елемеу", + "Тек басшыларға ғана құрмет" + ], + "correct": 0 + }, + { + "q": "Конфиденциалды ақпаратты не істеуге болмайды?", + "options": [ + "Қауіпсіз жерде сақтау", + "Үшінші тұлғаларға тарату", + "Пароль қою", + "Құлыптап қою" + ], + "correct": 1 + }, + { + "q": "Жемқорлық әрекетке қатысуды сұраса, не істеу керек?", + "options": [ + "Келісу", + "Бас тартып, комплаенс қызметіне хабарлау", + "Ойланып жауап беру", + "Ешкімге айтпау" + ], + "correct": 1 + }, + { + "q": "Тест нәтижелері мен оқу материалдары кімге қажет?", + "options": [ + "Тек HR-ға", + "Барлық қызметкерлерге", + "Тек админге", + "Тек басшыларға" + ], + "correct": 1 + } ] }, { - "id": 3, "title": "Инсайдерлік ақпарат және құпиялылық", "pass": 70, + "id": 3, + "title": "Инсайдерлік ақпарат және құпиялылық", + "pass": 70, "questions": [ - { "q": "Инсайдерлік ақпарат дегеніміз не?", "options": ["Әріптестер туралы қауесет", "Компания туралы әлі жарияланбаған қызметтік деректер", "Әлеуметтік желідегі ақпарат", "Жалпыға белгілі жаңалықтар"], "correct": 1 }, - { "q": "Жаңа сюжет эфирге шыққанға дейін оны танысқа айтуға бола ма?", "options": ["Иә, егер ол жақын таныс болса", "Жоқ, инсайдерлік ақпаратты таратуға тыйым салынады", "Иә, бірақ тек SMS арқылы", "Болады, себебі бұл жай ғана жаңалық"], "correct": 1 }, - { "q": "Дереккөздің атын басшылыққа ашуға бола ма?", "options": ["Иә, міндетті түрде", "Жоқ, журналист дереккөзді құпия ұстайды", "Тек түскі үзілісте айтуға болады", "Тек жазбаша түрде"], "correct": 1 }, - { "q": "Инсайдерлік ақпаратты таратқаны үшін не болады?", "options": ["Ештеңе болмайды", "Тәртіптік жауапкершілік, ауыр жағдайда заң бойынша жауапкершілік", "Тек сөгіс беріледі", "Бонус өседі"], "correct": 1 }, - { "q": "Қызметтік ақпаратты қай жерде талқылауға БОЛМАЙДЫ?", "options": ["Кеңседе әріптестермен", "Көпшілік орындарда және әлеуметтік желілерде", "Ресми жиналыста", "Комплаенс офицермен кеңесте"], "correct": 1 } + { + "q": "Инсайдерлік ақпарат дегеніміз не?", + "options": [ + "Әріптестер туралы қауесет", + "Компания туралы әлі жарияланбаған қызметтік деректер", + "Әлеуметтік желідегі ақпарат", + "Жалпыға белгілі жаңалықтар" + ], + "correct": 1 + }, + { + "q": "Жаңа сюжет эфирге шыққанға дейін оны танысқа айтуға бола ма?", + "options": [ + "Иә, егер ол жақын таныс болса", + "Жоқ, инсайдерлік ақпаратты таратуға тыйым салынады", + "Иә, бірақ тек SMS арқылы", + "Болады, себебі бұл жай ғана жаңалық" + ], + "correct": 1 + }, + { + "q": "Дереккөздің атын басшылыққа ашуға бола ма?", + "options": [ + "Иә, міндетті түрде", + "Жоқ, журналист дереккөзді құпия ұстайды", + "Тек түскі үзілісте айтуға болады", + "Тек жазбаша түрде" + ], + "correct": 1 + }, + { + "q": "Инсайдерлік ақпаратты таратқаны үшін не болады?", + "options": [ + "Ештеңе болмайды", + "Тәртіптік жауапкершілік, ауыр жағдайда заң бойынша жауапкершілік", + "Тек сөгіс беріледі", + "Бонус өседі" + ], + "correct": 1 + }, + { + "q": "Қызметтік ақпаратты қай жерде талқылауға БОЛМАЙДЫ?", + "options": [ + "Кеңседе әріптестермен", + "Көпшілік орындарда және әлеуметтік желілерде", + "Ресми жиналыста", + "Комплаенс офицермен кеңесте" + ], + "correct": 1 + } ] } ], "complaints": [], "testResults": [], "directMessages": [] -} +} \ No newline at end of file diff --git a/index.html b/index.html index bf12e4c..d816683 100644 --- a/index.html +++ b/index.html @@ -23,6 +23,13 @@
+ +Демо: админ — 1001 / Admin123 · қызметкер — 2001 / Worker123
diff --git a/script.js b/script.js index 48b022a..3e9951a 100644 --- a/script.js +++ b/script.js @@ -25,6 +25,7 @@ var NAV = [ { id: "laws", ico: "⚖️", title: "Заң нормалары" }, { id: "complaints", ico: "✉️", title: "Шағым жәшігі" }, { id: "tests", ico: "📝", title: "Тесттер" }, + { id: "users", ico: "👥", title: "Қызметкерлер", admin: true }, { id: "stats", ico: "📊", title: "Дашборд", admin: true }, ]; @@ -172,6 +173,28 @@ function lsGet(k, def) { try { var v = JSON.parse(localStorage.getItem("qcom_" + function lsSet(k, v) { localStorage.setItem("qcom_" + k, JSON.stringify(v)); } /* ---------------- КІРУ ---------------- */ +document.getElementById("forgotBtn").addEventListener("click", function () { + document.getElementById("recoverBox").classList.toggle("hidden"); +}); + +document.getElementById("recoverGo").addEventListener("click", async function () { + var login = document.getElementById("recoverLogin").value.trim(); + var msg = document.getElementById("recoverMsg"); + if (!login) { msg.textContent = "Логиніңізді жазыңыз"; return; } + var res = await apiPost("/api/recover-password", { login: login }); + if (res.ok) { + msg.innerHTML = "" + esc(res.name) + ", жаңа құпия сөзіңіз: " + esc(res.password) + ""; + } else if (res.offline) { + var mu = MOCK_USERS.find(function (u) { return u.login === login; }); + if (!mu) { msg.textContent = "Мұндай логин табылмады"; return; } + var np = "Qonaev" + Math.floor(1000 + Math.random() * 9000); + mu.password = np; + msg.innerHTML = "" + esc(mu.name) + ", жаңа құпия сөзіңіз: " + np + " (демо-режим)"; + } else { + msg.textContent = res.error || "Қате"; + } +}); + document.getElementById("loginForm").addEventListener("submit", async function (e) { e.preventDefault(); var login = document.getElementById("loginNum").value.trim(); @@ -208,9 +231,11 @@ async function loadServerData() { if (cp.ok) state.complaints = cp.data; var tr = await apiGet("/api/test-results"); if (tr.ok) state.testResults = tr.data; + var dm = await apiGet("/api/direct-messages"); + if (dm.ok) state.directMessages = dm.data; if (state.user && state.user.role === "admin") { - var dm = await apiGet("/api/direct-messages"); - if (dm.ok) state.directMessages = dm.data; + var us = await apiGet("/api/users"); + if (us.ok) state.users = us.data; } } @@ -229,17 +254,28 @@ function enterApp() { function buildNav() { var nav = document.getElementById("nav"); nav.innerHTML = ""; + var newCount = newItemsCount(); NAV.forEach(function (item) { if (item.admin && state.user.role !== "admin") return; var b = document.createElement("button"); b.className = "nav-item" + (item.admin ? " admin-only" : ""); b.dataset.id = item.id; b.innerHTML = '' + item.ico + "" + item.title + ""; + if (state.user.role === "admin" && (item.id === "complaints" || item.id === "stats") && newCount > 0) { + b.innerHTML += '"; + } b.addEventListener("click", function () { go(item.id); }); nav.appendChild(b); }); } +function newItemsCount() { + var n = 0; + (state.complaints || []).forEach(function (c) { if (c.status === "new") n++; }); + (state.directMessages || []).forEach(function (m) { if (m.status === "new") n++; }); + return n; +} + function go(page) { state.curPage = page; document.querySelectorAll(".nav-item").forEach(function (n) { @@ -257,6 +293,7 @@ function go(page) { else if (page === "laws") renderLaws(c); else if (page === "complaints") renderComplaints(c); else if (page === "tests") renderTests(c); + else if (page === "users") renderUsers(c); else if (page === "stats") renderStats(c); } @@ -276,8 +313,18 @@ function renderHome(el) { html += 'Шағым жәшігіне және жеке хаттарға жаңа өтініштер келді. Жауап беру үшін «Шағым жәшігі» немесе «Дашборд» бөліміне өтіңіз.
'; + html += ''; + html += "' + esc(a.text) + "
" + esc(m.text) + "
"; + if (m.reply) { + html += '"; + } + if (state.user.role === "admin") { + html += '" + esc(c.text) + "
"; - if (state.user.role === "admin" && c.status !== "done") { - html += 'Логиндер мен құпия сөздер users.json файлында сақталады. Мұнда жаңа қызметкер қосуға, құпия сөз ауыстыруға және аккаунтты өшіруге болады.
| Логин | Аты-жөні | Рөл | Құпия сөз | |
|---|---|---|---|---|
| " + esc(u.login) + " | " + esc(u.name) + " | "; + html += '' + (u.role === "admin" ? "Админ" : "Қызметкер") + " | "; + html += '' + esc(u.password) + ''; + html += ' | '; + html += '' + (u.role !== "admin" ? '' : "") + " |
" + esc(c.text) + "
" + esc(c.text) + "
"; + if (c.reply) { + chtml += '"; + } + chtml += "' + esc(m.text) + "
"; - if (m.status !== "done") { - dhtml += '