Kontierung auch bei besetzten Planstellen -- aus dem Organigramm heraus
Die Kostenstelle liess sich an genau einer Stelle aendern: auf der Seite Positionen, ueber die Karte einer Vakanz. Diese Seite zeigt aber nur unbesetzte und kuenftige Planstellen. Bei einer besetzten war die Kontierung damit nirgends zu erreichen -- im Bestand betrifft das 784 von 788, und dasselbe galt fuer ihre Taetigkeit. Die Angaben zu einer Einheit fuehren jetzt ihre Planstellen auf, besetzte eingeschlossen, mit Inhaber:in und Kostenstelle. Ein Klick oeffnet denselben Dialog wie auf Positionen, kein zweiter daneben. Was sich aendern laesst, entscheidet weiterhin die Datenbank: bei einer besetzten Stelle bleiben Einheit und Gueltigkeitsende gesperrt, weil ein Abteilungswechsel ueber eine Versetzung gehoert und nicht ueber die Stelle. Geladen wird erst beim Oeffnen und nur fuer diese eine Einheit. Alle 788 Planstellen in jede Zeichnung des Organigramms zu legen hiesse, fuer achtzig Einheiten zu laden, was man fuer eine braucht. EditPositionModal verlangt dafuer nicht mehr eine OpenPositionResolved, sondern nur noch die Felder, die er tatsaechlich liest. Die alte Signatur war der Grund, warum er nur dort aufzumachen war, wo unbesetzte Stellen entstehen.
This commit is contained in:
@@ -83,6 +83,35 @@ export function PositionTree({ employees, units, vacancies }: PositionTreeProps)
|
||||
|
||||
const tree = useMemo(() => buildUnitTree(units, employees, vacancies), [units, employees, vacancies]);
|
||||
|
||||
// Der Baum in der Form, die der Änderungsdialog einer Planstelle erwartet.
|
||||
// Aus denselben Daten gerechnet statt zusätzlich geladen: `hasChief` heisst
|
||||
// dort „diese Einheit hat schon eine Leitungsplanstelle", und das ist genau
|
||||
// die Leitung im Baum — besetzt oder als Vakanz.
|
||||
const unitOptions = useMemo(() => {
|
||||
const tiefe = new Map<string, number>();
|
||||
const berechne = (u: OrgUnitNode, gesehen: Set<string>): number => {
|
||||
const bekannt = tiefe.get(u.id);
|
||||
if (bekannt !== undefined) return bekannt;
|
||||
if (!u.parent_id || gesehen.has(u.id)) return 0;
|
||||
gesehen.add(u.id);
|
||||
const eltern = units.find((e) => e.id === u.parent_id);
|
||||
const d = eltern ? berechne(eltern, gesehen) + 1 : 0;
|
||||
tiefe.set(u.id, d);
|
||||
return d;
|
||||
};
|
||||
const mitLeitung = new Set([
|
||||
...employees.filter((e) => e.is_chief).map((e) => e.org_unit_id),
|
||||
...vacancies.filter((v) => v.is_chief).map((v) => v.org_unit_id),
|
||||
]);
|
||||
return units.map((u) => ({
|
||||
id: u.id,
|
||||
name: u.name,
|
||||
unit_type: u.unit_type,
|
||||
depth: berechne(u, new Set()),
|
||||
hasChief: mitLeitung.has(u.id),
|
||||
}));
|
||||
}, [units, employees, vacancies]);
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-4">
|
||||
<div className="flex justify-end">
|
||||
@@ -127,6 +156,7 @@ export function PositionTree({ employees, units, vacancies }: PositionTreeProps)
|
||||
<OrgUnitPanel
|
||||
unit={einheit}
|
||||
units={units}
|
||||
unitOptions={unitOptions}
|
||||
employees={employees}
|
||||
vacancies={vacancies}
|
||||
onAddUnit={onAddUnit}
|
||||
|
||||
Reference in New Issue
Block a user