8 Commits

Author SHA1 Message Date
gorbenko.pavel 5a01533632 Реестр пакетов и ссылки на git.tnsu.kz — по https
Tests / frontend-test (pull_request) Successful in 3m14s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 17:02:06 +05:00
gorbenko.pavel 28a122667d Реестр пакетов: организация переименована Tansu → tansu
Tests / frontend-test (pull_request) Successful in 3m12s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 09:35:16 +05:00
gorbenko.pavel 7fffcde4e6 Обновлён @tnsu/ui-kit до 0.14.0, реестр @tnsu — организация Tansu
build-and-deploy / prepare (push) Successful in 1m59s
build-and-deploy / build-and-push (., Dockerfile, hr-appeals-web) (push) Successful in 49s
build-and-deploy / build-and-push (server, server/Dockerfile, hr-appeals-auth) (push) Successful in 7s
Tests / frontend-test (push) Successful in 4m11s
build-and-deploy / deploy (push) Successful in 15s
Все версии ui-kit скопированы в публичный реестр организации Tansu (контрольные суммы совпадают),
токен для установки больше не нужен. Сборка проекта проверена.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 16:47:31 +05:00
gorbenko.pavel 391ab66229 feat: добавляет крайний срок обработки обращения (AppealDueDate) (#4)
build-and-deploy / prepare (push) Successful in 1s
build-and-deploy / build-and-push (., Dockerfile, hr-appeals-web) (push) Successful in 8s
Tests / frontend-test (push) Successful in 14s
build-and-deploy / build-and-push (server, server/Dockerfile, hr-appeals-auth) (push) Successful in 4s
build-and-deploy / deploy (push) Successful in 15s
Срок считается как 5 рабочих дней от даты отправки, выходные не учитываются;
используется в форматировании представления списка обращений в SharePoint.

Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/hr-appeals/pulls/4
2026-09-09 12:07:22 +00:00
gorbenko.pavel 3583079abb feat: убирает недействующие компании из справочника формы (#3)
build-and-deploy / prepare (push) Successful in 1s
Tests / frontend-test (push) Successful in 12s
build-and-deploy / build-and-push (., Dockerfile, hr-appeals-web) (push) Successful in 14s
build-and-deploy / build-and-push (server, server/Dockerfile, hr-appeals-auth) (push) Successful in 8s
build-and-deploy / deploy (push) Successful in 15s
СЛМ (CL MANAGEMENT), Selin Invest, ОСН Беркут, ТехЛаб и Seline Holding Ltd
по сути не действуют — фильтруем их по Id при получении справочника
компаний из api.tnsu.kz, чтобы они не появлялись в выпадающем списке формы.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/hr-appeals/pulls/3
2026-09-09 06:59:05 +00:00
gorbenko.pavel 0d7211861e feat: справка о назначении обращения в HR на странице формы
build-and-deploy / prepare (push) Successful in 1s
Tests / frontend-test (push) Successful in 13s
build-and-deploy / build-and-push (server, server/Dockerfile, hr-appeals-auth) (push) Successful in 4s
build-and-deploy / build-and-push (., Dockerfile, hr-appeals-web) (push) Successful in 16s
build-and-deploy / deploy (push) Successful in 15s
2026-09-02 12:18:52 +05:00
admin 75c727e020 Merge branch 'main' of http://git.tnsu.kz/gorbenko.pavel/hr-appeals
build-and-deploy / prepare (push) Successful in 1s
Tests / frontend-test (push) Successful in 15s
build-and-deploy / build-and-push (., Dockerfile, hr-appeals-web) (push) Successful in 12s
build-and-deploy / build-and-push (server, server/Dockerfile, hr-appeals-auth) (push) Successful in 4s
build-and-deploy / deploy (push) Successful in 17s
sava
2026-08-28 11:19:36 +05:00
admin ef5ec10fdd fix: обновляет конфигурацию порта для hr-appeals-web на локальный адрес 2026-08-28 11:18:39 +05:00
9 changed files with 53 additions and 11 deletions
+1 -1
View File
@@ -1 +1 @@
@tnsu:registry=http://git.tnsu.kz/api/packages/timur.gorodetskiy/npm/ @tnsu:registry=https://git.tnsu.kz/api/packages/tansu/npm/
+1 -1
View File
@@ -11,7 +11,7 @@
- React 17 + TypeScript (строгий режим) - React 17 + TypeScript (строгий режим)
- Vite 6 - Vite 6
- SCSS Modules - SCSS Modules
- [`@tnsu/ui-kit`](http://git.tnsu.kz/timur.gorodetskiy/tnsu-ui-kit) — общие UI-компоненты - [`@tnsu/ui-kit`](https://git.tnsu.kz/timur.gorodetskiy/tnsu-ui-kit) — общие UI-компоненты
- Vitest — тесты бизнес-логики - Vitest — тесты бизнес-логики
React именно 17-й: `@tnsu/ui-kit` объявляет его в `peerDependencies`. React именно 17-й: `@tnsu/ui-kit` объявляет его в `peerDependencies`.
+1 -1
View File
@@ -3,7 +3,7 @@ services:
image: nexus.tnsu.kz:8082/hr-appeals-web:${IMAGE_TAG:-latest} image: nexus.tnsu.kz:8082/hr-appeals-web:${IMAGE_TAG:-latest}
restart: unless-stopped restart: unless-stopped
ports: ports:
- "80:80" - "127.0.0.1:8082:80"
depends_on: depends_on:
- hr-appeals-auth - hr-appeals-auth
+4 -4
View File
@@ -9,7 +9,7 @@
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@fluentui/react": "^8.106.4", "@fluentui/react": "^8.106.4",
"@tnsu/ui-kit": "^0.8.0", "@tnsu/ui-kit": "^0.14.0",
"react": "17.0.2", "react": "17.0.2",
"react-dom": "17.0.2", "react-dom": "17.0.2",
"tslib": "^2.3.1" "tslib": "^2.3.1"
@@ -1701,9 +1701,9 @@
} }
}, },
"node_modules/@tnsu/ui-kit": { "node_modules/@tnsu/ui-kit": {
"version": "0.8.0", "version": "0.14.0",
"resolved": "http://git.tnsu.kz/api/packages/timur.gorodetskiy/npm/%40tnsu%2Fui-kit/-/0.8.0/ui-kit-0.8.0.tgz", "resolved": "https://git.tnsu.kz/api/packages/tansu/npm/%40tnsu%2Fui-kit/-/0.14.0/ui-kit-0.14.0.tgz",
"integrity": "sha512-PdAxr09JVkbK8XmxSM5Lgfz1Iq56RGFsoz4bI1YBd8quPzM3g/r4gRqqjbhCxyemzfK1d4w4WJD0ZBSs8jJbdA==", "integrity": "sha512-Vun9AUM9jL8rttbsbKo5Yh6TUz1srkNqxiO6mmzebrSo1JOASNJqNjJPMTS+8Jt3MTrJPklvh0TbeqGQzw7qxQ==",
"license": "ISC", "license": "ISC",
"peerDependencies": { "peerDependencies": {
"@fluentui/react": "^8.106.4", "@fluentui/react": "^8.106.4",
+1 -1
View File
@@ -18,7 +18,7 @@
}, },
"dependencies": { "dependencies": {
"@fluentui/react": "^8.106.4", "@fluentui/react": "^8.106.4",
"@tnsu/ui-kit": "^0.8.0", "@tnsu/ui-kit": "^0.14.0",
"react": "17.0.2", "react": "17.0.2",
"react-dom": "17.0.2", "react-dom": "17.0.2",
"tslib": "^2.3.1" "tslib": "^2.3.1"
+15 -1
View File
@@ -11,6 +11,19 @@ export interface ICompany {
Name: string; Name: string;
} }
/**
* Компании из справочника, которые по сути не действуют и не должны попадать
* в форму (просьба HR, 2026-09-09): СЛМ (CL MANAGEMENT), Selin Invest,
* ОСН Беркут, ТехЛаб, Seline Holding Ltd.
*/
const EXCLUDED_COMPANY_IDS = new Set<string>([
'9de064a4-44c8-88ef-11ec-831c058b1141', // ТОО CL MANAGEMENT (СЛМ)
'15009595-005d-00fa-11ef-11309f5e395d', // ТОО Selin Invest
'8028beac-ac23-8fd8-11f0-5351706e5996', // ТОО ОСН Беркут
'15009595-005d-00fa-11ef-1131801d9f3e', // ТОО ТехЛаб
'03f4deac-f543-e8cf-11f1-84f51483f59e' // Частная компания Seline Holding Ltd
]);
let cached: { companies: ICompany[]; expiresAt: number } | null = null; let cached: { companies: ICompany[]; expiresAt: number } | null = null;
export async function getCompanies(): Promise<ICompany[]> { export async function getCompanies(): Promise<ICompany[]> {
@@ -29,7 +42,8 @@ export async function getCompanies(): Promise<ICompany[]> {
); );
} }
const companies = (await response.json()) as ICompany[]; const allCompanies = (await response.json()) as ICompany[];
const companies = allCompanies.filter((company) => !EXCLUDED_COMPANY_IDS.has(company.Id));
cached = { companies, expiresAt: Date.now() + CACHE_TTL_MS }; cached = { companies, expiresAt: Date.now() + CACHE_TTL_MS };
return companies; return companies;
} }
+21 -2
View File
@@ -24,8 +24,26 @@ export interface IFeedbackSubmission {
suggestion: string; suggestion: string;
} }
// 5 рабочих дней от текущей даты, выходные (сб/вс) не считаются днём срока —
// используется как крайний срок обработки обращения (AppealDueDate).
function addBusinessDays(from: Date, days: number): Date {
const result = new Date(from);
let remaining = days;
while (remaining > 0) {
result.setDate(result.getDate() + 1);
const dayOfWeek = result.getDay(); // 0 = воскресенье, 6 = суббота
if (dayOfWeek !== 0 && dayOfWeek !== 6) {
remaining -= 1;
}
}
return result;
}
// Имена полей — internal name столбцов списка SharePoint (Company/Name/Position/ // Имена полей — internal name столбцов списка SharePoint (Company/Name/Position/
// Type/IssueDescription/SuggestionText/WantsFeedback), не отображаемые названия. // Type/IssueDescription/SuggestionText/WantsFeedback/AppealDueDate), не
// отображаемые названия.
async function buildFields(data: IFeedbackSubmission): Promise<Record<string, unknown>> { async function buildFields(data: IFeedbackSubmission): Promise<Record<string, unknown>> {
const typeLabel = data.kind === 'other' ? data.kindOther : KIND_LABELS[data.kind]; const typeLabel = data.kind === 'other' ? data.kindOther : KIND_LABELS[data.kind];
const name = data.isAnonymous ? '' : data.fullName; const name = data.isAnonymous ? '' : data.fullName;
@@ -38,7 +56,8 @@ async function buildFields(data: IFeedbackSubmission): Promise<Record<string, un
Type: typeLabel, Type: typeLabel,
IssueDescription: data.situation, IssueDescription: data.situation,
SuggestionText: data.suggestion, SuggestionText: data.suggestion,
WantsFeedback: data.wantsFeedback WantsFeedback: data.wantsFeedback,
AppealDueDate: addBusinessDays(new Date(), 5).toISOString()
}; };
// Состав полей зависит от вида обращения и анонимности, поэтому часть строк // Состав полей зависит от вида обращения и анонимности, поэтому часть строк
+4
View File
@@ -20,6 +20,10 @@ export const FeedbackForm: React.FC = () => {
// (App.tsx) — второй здесь был бы дублем. Пустая строка убирает текст, // (App.tsx) — второй здесь был бы дублем. Пустая строка убирает текст,
// а гэпа не оставляет: у ui-kit пустой title-блок не создаёт строки. // а гэпа не оставляет: у ui-kit пустой title-блок не создаёт строки.
<FormCard title=""> <FormCard title="">
<div className={styles.notice}>
<Alert variant="ok">{TEXTS.helpText}</Alert>
</div>
{formError ? ( {formError ? (
<div className={styles.notice}> <div className={styles.notice}>
<Alert variant="err">{formError}</Alert> <Alert variant="err">{formError}</Alert>
+5
View File
@@ -6,6 +6,11 @@ export const TEXTS = {
pageTitle: 'Обращение', pageTitle: 'Обращение',
pageSubtitle: 'Данное обращение будет направлено в HR департамент', pageSubtitle: 'Данное обращение будет направлено в HR департамент',
helpText:
'Обращение в HR — единый канал для вопросов, предложений и обратной связи ' +
'сотрудников по трудовым отношениям, рабочим процессам, условиям труда, ' +
'взаимодействию, адаптации, развитию и другим вопросам, связанным с работой в компании.',
// Две сноски с разным числом звёздочек — как в исходной форме, чтобы читалось // Две сноски с разным числом звёздочек — как в исходной форме, чтобы читалось
// как два отдельных примечания, а не слитный абзац. Field рендерит их построчно. // как два отдельных примечания, а не слитный абзац. Field рендерит их построчно.
anonymousHint: anonymousHint: