feat: выбор организации сотрудника в изменении условий ТД
Условия меняются в одном трудовом договоре, а у совместителя их несколько. Как в командировке: пикер FullBase теперь выбирает человека (записи склеены по ИИН), а под ним — список его мест работы «Компания — должность — подразделение»; единственное место выбирается само. Маршрут строится по человеку и не ждёт выбора организации. Строка под полем и вложенная сетка, сжимавшая поля вида, убраны. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,7 @@ import { AadHttpClient, HttpClientResponse } from '@microsoft/sp-http';
|
||||
import { WebPartContext } from '@microsoft/sp-webpart-base';
|
||||
import { APPROVAL_API_CLIENT_ID, DICTIONARY_API_BASE_URL } from '../config';
|
||||
import { IEmployeeFullBaseRecord } from './models/IEmployeeFullBaseRecord';
|
||||
import { IEmployeeFullBasePerson } from './models/IEmployeeFullBasePerson';
|
||||
|
||||
// null из API → '' (см. IEmployeeFullBaseRecord).
|
||||
function textOrEmpty(value: unknown): string {
|
||||
@@ -58,3 +59,36 @@ export async function searchActiveEmployees(
|
||||
.filter((r) => !r.dismissalDate)
|
||||
.slice(0, maxResults);
|
||||
}
|
||||
|
||||
/** Чей это человек: ИИН, а без него — id записи (тогда запись считается отдельным человеком). */
|
||||
export function personKey(record: IEmployeeFullBaseRecord): string {
|
||||
return record.iin || record.id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Уникальный ключ места работы — для value в выпадающем списке. Не только id:
|
||||
* у совместителя на каждое место работы может прийти один и тот же id человека.
|
||||
*/
|
||||
export function workplaceKey(record: IEmployeeFullBaseRecord): string {
|
||||
return `${record.id}|${record.company}|${record.position}`;
|
||||
}
|
||||
|
||||
/** Человек из одной записи — когда остальные его места работы неизвестны (напр. просмотр заявки). */
|
||||
export function personFromWorkplace(record: IEmployeeFullBaseRecord): IEmployeeFullBasePerson {
|
||||
return { key: personKey(record), fio: record.fio, iin: record.iin, email: record.email, workplaces: [record] };
|
||||
}
|
||||
|
||||
/** Записи FullBase → люди (по ИИН), порядок — по первому появлению человека в ответе. */
|
||||
export function groupEmployeesByPerson(records: IEmployeeFullBaseRecord[]): IEmployeeFullBasePerson[] {
|
||||
const people: IEmployeeFullBasePerson[] = [];
|
||||
records.forEach((record) => {
|
||||
const person = people.find((p) => p.key === personKey(record));
|
||||
if (!person) {
|
||||
people.push(personFromWorkplace(record));
|
||||
return;
|
||||
}
|
||||
person.workplaces.push(record);
|
||||
if (!person.email) person.email = record.email;
|
||||
});
|
||||
return people;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user