diff --git a/data.json b/data.json
index 980c281..58289ee 100644
--- a/data.json
+++ b/data.json
@@ -43,6 +43,27 @@
{ "id": 4, "cat": "Ақпарат", "title": "«Ақпаратқа қол жеткізу туралы» ҚР Заңы", "text": "Қоғамдық ақпаратқа қол жеткізу, құпия ақпаратты қорғау талаптары." },
{ "id": 5, "cat": "Этика", "title": "Компанияның Іскерлік этика кодексі", "text": "Қызметкерлердің мінез-құлық стандарттары, қарым-қатынас ережелері." }
],
+ "insider": [
+ { "title": "Инсайдерлік ақпарат дегеніміз не?", "text": "Бұл компания туралы әлі жарияланбаған, қызметкерге өз жұмысы барысында белгілі болған деректер: қаржылық көрсеткіштер, келісімшарттар, жаңалық сюжеттері, кадрлық шешімдер." },
+ { "title": "Таратуға тыйым салынады", "text": "Инсайдерлік ақпаратты эфирге шыққанға дейін немесе ресми жарияланғанға дейін үшінші тұлғаларға, әлеуметтік желілерде немесе таныстарға таратуға тыйым салынады." },
+ { "title": "Дереккөздерді құпия ұстау", "text": "Журналистер өз дереккөздерін құпия ұстауға міндетті. Дереккөздің атын ашу — еңбек тәртібін өрескел бұзу." },
+ { "title": "Не істеу керек?", "text": "Инсайдерлік ақпаратқа қол жеткізгенде және оны пайдалану қажет болғанда — комплаенс офицермен кеңесіңіз. Ақпарат тек қызметтік қажеттілік үшін пайдаланылады." },
+ { "title": "Жауапкершілік", "text": "Инсайдерлік ақпаратты тарату — тәртіптік жауапкершілікке әкеледі, ал ауыр жағдайларда ҚР заңнамасы бойынша қылмыстық жауапкершілікке де тартылуы мүмкін." }
+ ],
+ "giftRules": {
+ "allowed": [
+ "Құны 3 АЕК-тен аспайтын еске салу сыйлығы (күнтізбе, қалам, кесе)",
+ "Ресми іс-шарада берілген естелік сыйлықтар",
+ "Мерекелік корпоративтік сыйлықтар (компания атынан)",
+ "Іскерлік келіссөздердегі қонақжайлылық (кешкі ас, кофе)"
+ ],
+ "forbidden": [
+ "Ақша және оған балама (карта, купон, сертификат)",
+ "Құны 3 АЕК-тен асатын сыйлықтар",
+ "Қызметтік шешімге әсер ететін сыйлықтар (мүдделер қақтығысы)",
+ "Кез келген уақытта қолма-қол ақша немесе қарыз беру"
+ ]
+ },
"tests": [
{
"id": 1, "title": "Сыбайлас жемқорлыққа қарсы негіздер", "pass": 70,
@@ -63,8 +84,19 @@
{ "q": "Жемқорлық әрекетке қатысуды сұраса, не істеу керек?", "options": ["Келісу", "Бас тартып, комплаенс қызметіне хабарлау", "Ойланып жауап беру", "Ешкімге айтпау"], "correct": 1 },
{ "q": "Тест нәтижелері мен оқу материалдары кімге қажет?", "options": ["Тек HR-ға", "Барлық қызметкерлерге", "Тек админге", "Тек басшыларға"], "correct": 1 }
]
+ },
+ {
+ "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 }
+ ]
}
],
"complaints": [],
- "testResults": []
+ "testResults": [],
+ "directMessages": []
}
diff --git a/script.js b/script.js
index 32666b9..48b022a 100644
--- a/script.js
+++ b/script.js
@@ -20,6 +20,7 @@ var NAV = [
{ id: "home", ico: "🏠", title: "Басты бет" },
{ id: "org", ico: "🏛️", title: "Басшылық құрылымы" },
{ id: "contacts", ico: "📞", title: "Мемлекеттік органдар" },
+ { id: "insider", ico: "🔐", title: "Инсайдерлік ақпарат" },
{ id: "video", ico: "🎬", title: "Видео сабақтар" },
{ id: "laws", ico: "⚖️", title: "Заң нормалары" },
{ id: "complaints", ico: "✉️", title: "Шағым жәшігі" },
@@ -95,7 +96,38 @@ var MOCK_CONTENT = {
{ q: "Тест нәтижелері мен оқу материалдары кімге қажет?", options: ["Тек HR-ға", "Барлық қызметкерлерге", "Тек админге", "Тек басшыларға"], correct: 1 },
],
},
+ {
+ id: 3, title: "Инсайдерлік ақпарат және құпиялылық", dur: "10 сұрақ", pass: 70,
+ questions: [
+ { q: "Инсайдерлік ақпарат дегеніміз не?", options: ["Әріптестер туралы қауесет", "Компания туралы әлі жарияланбаған қызметтік деректер", "Әлеуметтік желідегі ақпарат", "Жалпыға белгілі жаңалықтар"], correct: 1 },
+ { q: "Жаңа сюжет эфирге шыққанға дейін оны танысқа айтуға бола ма?", options: ["Иә, егер ол жақын таныс болса", "Жоқ, инсайдерлік ақпаратты таратуға тыйым салынады", "Иә, бірақ тек SMS арқылы", "Болады, себебі бұл жай ғана жаңалық"], correct: 1 },
+ { q: "Дереккөздің атын басшылыққа ашуға бола ма?", options: ["Иә, міндетті түрде", "Жоқ, журналист дереккөзді құпия ұстайды", "Тек түскі үзілісте айтуға болады", "Тек жазбаша түрде"], correct: 1 },
+ { q: "Инсайдерлік ақпаратты таратқаны үшін не болады?", options: ["Ештеңе болмайды", "Тәртіптік жауапкершілік, ауыр жағдайда заң бойынша жауапкершілік", "Тек сөгіс беріледі", "Бонус өседі"], correct: 1 },
+ { q: "Қызметтік ақпаратты қай жерде талқылауға БОЛМАЙДЫ?", options: ["Кеңседе әріптестермен", "Көпшілік орындарда және әлеуметтік желілерде", "Ресми жиналыста", "Комплаенс офицермен кеңесте"], correct: 1 },
+ ],
+ },
],
+ insider: [
+ { title: "Инсайдерлік ақпарат дегеніміз не?", text: "Бұл компания туралы әлі жарияланбаған, қызметкерге өз жұмысы барысында белгілі болған деректер: қаржылық көрсеткіштер, келісімшарттар, жаңалық сюжеттері, кадрлық шешімдер." },
+ { title: "Таратуға тыйым салынады", text: "Инсайдерлік ақпаратты эфирге шыққанға дейін немесе ресми жарияланғанға дейін үшінші тұлғаларға, әлеуметтік желілерде немесе таныстарға таратуға тыйым салынады." },
+ { title: "Дереккөздерді құпия ұстау", text: "Журналистер өз дереккөздерін құпия ұстауға міндетті. Дереккөздің атын ашу — еңбек тәртібін өрескел бұзу." },
+ { title: "Не істеу керек?", text: "Инсайдерлік ақпаратқа қол жеткізгенде және оны пайдалану қажет болғанда — комплаенс офицермен кеңесіңіз. Ақпарат тек қызметтік қажеттілік үшін пайдаланылады." },
+ { title: "Жауапкершілік", text: "Инсайдерлік ақпаратты тарату — тәртіптік жауапкершілікке әкеледі, ал ауыр жағдайларда ҚР заңнамасы бойынша қылмыстық жауапкершілікке де тартылуы мүмкін." },
+ ],
+ giftRules: {
+ allowed: [
+ "Құны 3 АЕК-тен аспайтын еске салу сыйлығы (күнтізбе, қалам, кесе)",
+ "Ресми іс-шарада берілген естелік сыйлықтар",
+ "Мерекелік корпоративтік сыйлықтар (компания атынан)",
+ "Іскерлік келіссөздердегі қонақжайлылық (кешкі ас, кофе)",
+ ],
+ forbidden: [
+ "Ақша және оған балама (карта, купон, сертификат)",
+ "Құны 3 АЕК-тен асатын сыйлықтар",
+ "Қызметтік шешімге әсер ететін сыйлықтар (мүдделер қақтығысы)",
+ "Кез келген уақытта қолма-қол ақша немесе қарыз беру",
+ ],
+ },
};
/* ---------------- API ҚАБАТЫ ---------------- */
@@ -157,6 +189,7 @@ document.getElementById("loginForm").addEventListener("submit", async function (
state.content = MOCK_CONTENT;
state.complaints = lsGet("complaints", []);
state.testResults = lsGet("testResults", []);
+ state.directMessages = lsGet("directMessages", []);
enterApp();
return;
}
@@ -175,6 +208,10 @@ async function loadServerData() {
if (cp.ok) state.complaints = cp.data;
var tr = await apiGet("/api/test-results");
if (tr.ok) state.testResults = tr.data;
+ if (state.user && state.user.role === "admin") {
+ var dm = await apiGet("/api/direct-messages");
+ if (dm.ok) state.directMessages = dm.data;
+ }
}
function enterApp() {
@@ -215,6 +252,7 @@ function go(page) {
if (page === "home") renderHome(c);
else if (page === "org") renderOrg(c);
else if (page === "contacts") renderContacts(c);
+ else if (page === "insider") renderInsider(c);
else if (page === "video") renderVideo(c);
else if (page === "laws") renderLaws(c);
else if (page === "complaints") renderComplaints(c);
@@ -353,6 +391,21 @@ function renderLaws(el) {
laws.forEach(function (l) { if (cats.indexOf(l.cat) < 0) cats.push(l.cat); });
var html = pageTitle("⚖️ Заң нормалары мен комплаенс заңдар");
+
+ var gr = state.content && state.content.giftRules ? state.content.giftRules : null;
+ if (gr) {
+ html += '
';
+ html += '
🎁 Сыйлықтар ережесі
';
+ html += '
';
+ html += '
✅ Рұқсат етілген
';
+ gr.allowed.forEach(function (t) { html += '
' + esc(t) + "
"; });
+ html += "
";
+ html += '
🚫 Тыйым салынған
';
+ gr.forbidden.forEach(function (t) { html += '
' + esc(t) + "
"; });
+ html += "
";
+ html += "
";
+ }
+
html += '
';
html += '';
cats.forEach(function (c) { html += '"; });
@@ -373,10 +426,31 @@ function filterLaws(cat) {
document.getElementById("lawList").innerHTML = html || '
Табылмады
';
}
+/* ---------------- ИНСАЙДЕРЛІК АҚПАРАТ ---------------- */
+function renderInsider(el) {
+ var list = state.content && state.content.insider ? state.content.insider : [];
+ var html = pageTitle("🔐 Инсайдерлік ақпарат және құпиялылық");
+ html += '
Медиа саласында инсайдерлік ақпаратпен жұмыс — ең маңызды талаптардың бірі. Төмендегі ережелерді оқып, тест тапсыру ұсынылады.
';
+ list.forEach(function (item, i) {
+ html += '
';
+ html += '
' + (i + 1) + ". " + esc(item.title) + "
";
+ html += "
" + esc(item.text) + "
";
+ html += "
";
+ });
+ html += '
';
+ html += '
📝 Материалды оқыдыңыз ба?
';
+ html += '
«Инсайдерлік ақпарат және құпиялылық» тестін тапсырып, біліміңізді тексеріңіз.
';
+ html += '';
+ html += "
";
+ el.innerHTML = html;
+}
+
/* ---------------- ШАҒЫМ ЖӘШІГІ ---------------- */
function renderComplaints(el) {
var html = pageTitle("✉️ Шағым жәшігі");
- html += '
Жаңа шағым / өтініш
';
+
+ html += '
';
+ html += '
Жаңа шағым / өтініш
';
html += '
';
html += '';
html += '';
@@ -384,6 +458,15 @@ function renderComplaints(el) {
html += '';
html += '
';
+ html += '
🔒 Комплаенс офицерге жеке хат
';
+ html += '
';
+ html += '';
+ html += '';
+ html += '';
+ html += '';
+ html += '
';
+ html += "
";
+
html += '
Менің шағымдарым' + (state.user.role === "admin" ? " және барлық өтініштер" : "") + "
";
html += '';
el.innerHTML = html;
@@ -454,6 +537,32 @@ async function setComplaintStatus(id, status) {
else alert(res.error || "Қате");
}
+async function sendDirectMsg() {
+ var category = document.getElementById("dmCat").value;
+ var text = document.getElementById("dmText").value.trim();
+ var anonymous = document.getElementById("dmAnon").checked;
+ if (!text) { document.getElementById("dmMsg").innerHTML = '