@kernhq/module-hr 0.13.2 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/contract/attendance.d.ts +35 -0
  2. package/dist/contract/attendance.d.ts.map +1 -1
  3. package/dist/contract/attendance.js +25 -1
  4. package/dist/contract/attendance.js.map +1 -1
  5. package/dist/contract/capabilities.d.ts.map +1 -1
  6. package/dist/contract/capabilities.js +10 -0
  7. package/dist/contract/capabilities.js.map +1 -1
  8. package/dist/contract/events.d.ts +17 -16
  9. package/dist/contract/events.d.ts.map +1 -1
  10. package/dist/contract/events.js +23 -16
  11. package/dist/contract/events.js.map +1 -1
  12. package/dist/contract/models.d.ts +1 -0
  13. package/dist/contract/models.d.ts.map +1 -1
  14. package/dist/contract/models.js +11 -0
  15. package/dist/contract/models.js.map +1 -1
  16. package/dist/contract/router.d.ts +12 -0
  17. package/dist/contract/router.d.ts.map +1 -1
  18. package/dist/contract/router.js +11 -3
  19. package/dist/contract/router.js.map +1 -1
  20. package/dist/contract/settings.d.ts +0 -1
  21. package/dist/contract/settings.d.ts.map +1 -1
  22. package/dist/contract/settings.js +11 -5
  23. package/dist/contract/settings.js.map +1 -1
  24. package/dist/server/index.d.ts +0 -1
  25. package/dist/server/index.d.ts.map +1 -1
  26. package/dist/server/jobs.d.ts.map +1 -1
  27. package/dist/server/jobs.js +13 -5
  28. package/dist/server/jobs.js.map +1 -1
  29. package/dist/server/router.d.ts +12 -0
  30. package/dist/server/router.d.ts.map +1 -1
  31. package/dist/server/router.js +99 -16
  32. package/dist/server/router.js.map +1 -1
  33. package/dist/server/services/access.d.ts +176 -0
  34. package/dist/server/services/access.d.ts.map +1 -0
  35. package/dist/server/services/access.js +260 -0
  36. package/dist/server/services/access.js.map +1 -0
  37. package/dist/server/services/people.d.ts +1 -0
  38. package/dist/server/services/people.d.ts.map +1 -1
  39. package/dist/server/services/people.js +3 -0
  40. package/dist/server/services/people.js.map +1 -1
  41. package/package.json +1 -1
  42. package/src/client/components/DayDetail.svelte +32 -14
  43. package/src/client/components/PersonPanel.svelte +66 -5
  44. package/src/client/components/redaction.ts +51 -0
  45. package/src/client/messages.ts +241 -22
  46. package/src/client/pages/DirectoryPage.svelte +45 -1
  47. package/src/client/permissions.ts +12 -4
  48. package/src/client/settings/AccrualSettings.svelte +596 -57
  49. package/src/client/settings/GeneralSettings.svelte +12 -9
  50. package/src/contract/attendance.ts +27 -1
  51. package/src/contract/capabilities.ts +10 -0
  52. package/src/contract/events.ts +23 -19
  53. package/src/contract/models.ts +11 -0
  54. package/src/contract/router.ts +11 -3
  55. package/src/contract/settings.ts +11 -5
@@ -58,7 +58,7 @@ export const en: Record<string, Message> = {
58
58
  'hr.accr_days_field_hint': 'Before seniority tiers, proration and part-time hours.',
59
59
  'hr.accr_days_per_year': { one: '{count} day a year', other: '{count} days a year' },
60
60
  'hr.accr_desc':
61
- 'How leave is earned over time: the policies, who each one applies to, and what the next run would credit.',
61
+ 'How leave is earned over time and what survives the turn of the year: the policies, who each one applies to, and what the next run would credit.',
62
62
  'hr.accr_duplicate': 'Duplicate',
63
63
  'hr.accr_edit_retroactive':
64
64
  'An edit rewrites what was true in the past, and anything already credited from it becomes hard to explain. To change the rules from a date, duplicate this policy and give the copy a later start.',
@@ -287,6 +287,7 @@ export const en: Record<string, Message> = {
287
287
  'hr.att_corrections_error': 'Corrections you have asked for could not be loaded',
288
288
  'hr.att_corrections_pending': 'Corrections you have asked for',
289
289
  'hr.att_locked_no_change': 'This month is closed for payroll, so a correction cannot move its figures.',
290
+ 'hr.att_method_auto': 'Closed automatically',
290
291
  'hr.att_method_device': 'Terminal',
291
292
  'hr.att_method_import': 'Imported',
292
293
  'hr.att_method_kiosk': 'Kiosk',
@@ -491,6 +492,44 @@ export const en: Record<string, Message> = {
491
492
  'hr.capability_off_title': 'Turn {name} off?',
492
493
  'hr.capability_requires': 'Needs {name}',
493
494
  'hr.capability_write_error': 'That switch could not be changed. Nothing was saved.',
495
+ 'hr.cf_cap': 'Days that carry over',
496
+ 'hr.cf_cap_hint':
497
+ 'The most that survives the turn of the year. Anything above it lapses, and the ledger records the lapse.',
498
+ 'hr.cf_cap_zero':
499
+ 'Nothing carries at zero: the whole remaining balance is written off on 31 December, as an expiry entry somebody can point at.',
500
+ 'hr.cf_carries_nothing': 'Nothing carries',
501
+ 'hr.cf_col_carries': 'Carries over',
502
+ 'hr.cf_col_deadline': 'Deadline',
503
+ 'hr.cf_create_title': 'New carry-forward policy',
504
+ 'hr.cf_deadline_short': { one: '{count} month to use it', other: '{count} months to use it' },
505
+ 'hr.cf_edit_title': 'Edit carry-forward policy',
506
+ 'hr.cf_error': 'Carry-forward policies could not be loaded',
507
+ 'hr.cf_error_leave_type': 'Pick the leave type it carries.',
508
+ 'hr.cf_expires': 'Carried leave expires',
509
+ 'hr.cf_expires_hint':
510
+ 'Counted from 1 January, when the new leave year opens — not from the day the job runs.',
511
+ 'hr.cf_job_note':
512
+ "A job carries the balance over on each office's own 2 January, once December has been credited, and takes carried leave away on the day it lapses. Both halves are written to the ledger.",
513
+ 'hr.cf_leave_type_hint': 'Which balance carries over.',
514
+ 'hr.cf_months': 'Months to use it',
515
+ 'hr.cf_months_hint':
516
+ 'Between 1 and 24. Three months means carried leave survives the whole of March and is gone on 1 April.',
517
+ 'hr.cf_needs_accrual':
518
+ 'There is no accrual policy, so nothing can carry: a cap in days needs the length of a working day, and only an accrual policy states one.',
519
+ 'hr.cf_needs_accrual_note':
520
+ 'The cap is in days, and only an accrual policy says how long a day is. Somebody with no accrual policy carries nothing at all.',
521
+ 'hr.cf_no_deadline': 'No deadline',
522
+ 'hr.cf_no_default':
523
+ 'No carry-forward policy sits on the workspace, so anybody with nothing nearer keeps nothing at the turn of the year.',
524
+ 'hr.cf_none': 'No carry-forward policies yet',
525
+ 'hr.cf_none_desc':
526
+ 'Nothing moves into the new year without one. An unused balance stays in the year it was earned, and the new year starts from what accrues in it.',
527
+ 'hr.cf_section': 'Carry-forward',
528
+ 'hr.cf_section_desc':
529
+ 'What is left when a leave year ends: how much of it survives into the next one, and how long there is to use it.',
530
+ 'hr.cf_unassign_no_fallback':
531
+ 'There is no carry-forward policy on any rung below this one, so nothing of theirs carries into the new year.',
532
+ 'hr.cf_unassign_title': 'Stop carrying leave for {subject}?',
494
533
  'hr.chain_actions_for': 'Actions for {name}',
495
534
  'hr.chain_add_approver': 'Add an approver',
496
535
  'hr.chain_add_step': 'Add a step',
@@ -1125,7 +1164,7 @@ export const en: Record<string, Message> = {
1125
1164
  'hr.periods_kind_hint': 'What the month is closed for. Either kind closes the same days.',
1126
1165
  'hr.periods_lock': 'Close',
1127
1166
  'hr.periods_lock_adjustments':
1128
- 'A policy change dated inside it becomes an adjustment in an open period instead. You can reopen the period later, with a reason.',
1167
+ 'A policy change dated inside it leaves those days exactly as they were closed, so anything it owes has to be recorded by hand as an adjustment in an open period. You can reopen the period later, with a reason.',
1129
1168
  'hr.periods_lock_body': 'Every recorded day inside this period stops being recomputable, for {scope}.',
1130
1169
  'hr.periods_lock_confirm': 'Close the period',
1131
1170
  'hr.periods_lock_error': 'The period could not be closed',
@@ -1176,6 +1215,9 @@ export const en: Record<string, Message> = {
1176
1215
  'hr.person_create_error': 'This person could not be added — nothing was saved',
1177
1216
  'hr.person_created': '{name} is in the directory',
1178
1217
  'hr.person_error': 'This person could not be loaded',
1218
+ 'hr.person_hidden': 'Hidden',
1219
+ 'hr.person_hidden_hint':
1220
+ 'Personal contact details and employment dates are shown only for the people you are responsible for.',
1179
1221
  'hr.person_manage_denied': 'You cannot add people to this workspace',
1180
1222
  'hr.person_offboard_error': 'The employment could not be ended — nothing was changed',
1181
1223
  'hr.person_offboarded': '{name} has left',
@@ -1184,8 +1226,10 @@ export const en: Record<string, Message> = {
1184
1226
  'hr.person_updated': 'Saved',
1185
1227
  'hr.personal_email': 'Personal email',
1186
1228
  'hr.phone': 'Phone',
1229
+ 'hr.policy_kind_accrual': 'Accrual',
1230
+ 'hr.policy_kind_carry_forward': 'Carry-forward',
1187
1231
  'hr.reject': 'Reject',
1188
- 'hr.reject_confirm_body': 'They are notified and nothing changes for them. They can send a new request.',
1232
+ 'hr.reject_confirm_body': 'Nothing changes for them. They can send a new request.',
1189
1233
  'hr.reject_confirm_title': 'Reject this request?',
1190
1234
  'hr.request_leave': 'Request time off',
1191
1235
  'hr.retry': 'Try again',
@@ -1209,7 +1253,7 @@ export const en: Record<string, Message> = {
1209
1253
  'hr.schedule_assigned': '{name} is on this schedule from {date}',
1210
1254
  'hr.schedule_auto_out': 'Close a forgotten shift after',
1211
1255
  'hr.schedule_auto_out_hint':
1212
- 'Somebody who never clocks out is clocked out automatically once this long has passed, and the day is flagged for review. Left off, the day waits for a correction.',
1256
+ 'Somebody who never clocks out is clocked out automatically once this long has passed, and the day counts as that long rather than staying marked unfinished. Left off, the day stays open and waits for a correction.',
1213
1257
  'hr.schedule_auto_out_off': 'Leave it for a human',
1214
1258
  'hr.schedule_break': 'Break',
1215
1259
  'hr.schedule_break_hint': "The break is unpaid and comes off the day's total.",
@@ -1387,7 +1431,7 @@ export const ar: Record<string, Message> = {
1387
1431
  other: '{count} يوم سنويًا',
1388
1432
  },
1389
1433
  'hr.accr_desc':
1390
- 'كيف تُكتسب الإجازة مع الوقت: السياسات، ومن تنطبق عليه كل واحدة، وما الذي ستضيفه عملية التشغيل التالية.',
1434
+ 'كيف تُكتسب الإجازة مع الوقت وما الذي يعبر رأس السنة: السياسات، ومن تنطبق عليه كل واحدة، وما الذي ستضيفه عملية التشغيل التالية.',
1391
1435
  'hr.accr_duplicate': 'نسخ',
1392
1436
  'hr.accr_edit_retroactive':
1393
1437
  'التحرير يعيد كتابة ما كان صحيحًا في الماضي، فيصعب تفسير كل ما أُضيف بناءً عليه. لتغيير القواعد اعتبارًا من تاريخ معيّن، انسخ هذه السياسة وامنح النسخة تاريخ بدء لاحقًا.',
@@ -1674,6 +1718,7 @@ export const ar: Record<string, Message> = {
1674
1718
  'hr.att_corrections_error': 'تعذّر تحميل التصحيحات التي طلبتها',
1675
1719
  'hr.att_corrections_pending': 'التصحيحات التي طلبتها',
1676
1720
  'hr.att_locked_no_change': 'أُغلق هذا الشهر للرواتب، فلا يستطيع التصحيح تغيير أرقامه.',
1721
+ 'hr.att_method_auto': 'أُغلق تلقائيًا',
1677
1722
  'hr.att_method_device': 'جهاز',
1678
1723
  'hr.att_method_import': 'مستورد',
1679
1724
  'hr.att_method_kiosk': 'كشك',
@@ -1887,6 +1932,48 @@ export const ar: Record<string, Message> = {
1887
1932
  'hr.capability_off_title': 'إيقاف {name}؟',
1888
1933
  'hr.capability_requires': 'يتطلب {name}',
1889
1934
  'hr.capability_write_error': 'تعذّر تغيير هذا المفتاح. لم يُحفظ أي شيء.',
1935
+ 'hr.cf_cap': 'الأيام التي تُرحَّل',
1936
+ 'hr.cf_cap_hint': 'هذا أقصى ما يعبر رأس السنة. وما زاد عليه تنتهي صلاحيته، ويسجّل الدفتر ذلك.',
1937
+ 'hr.cf_cap_zero':
1938
+ 'عند الصفر لا يُرحَّل شيء: يُشطب الرصيد المتبقي كله في 31 ديسمبر بقيد انتهاء صلاحية يمكن الإشارة إليه.',
1939
+ 'hr.cf_carries_nothing': 'لا شيء يُرحَّل',
1940
+ 'hr.cf_col_carries': 'المُرحَّل',
1941
+ 'hr.cf_col_deadline': 'المهلة',
1942
+ 'hr.cf_create_title': 'سياسة ترحيل جديدة',
1943
+ 'hr.cf_deadline_short': {
1944
+ zero: '{count} شهر للاستخدام',
1945
+ one: 'شهر واحد للاستخدام',
1946
+ two: 'شهران للاستخدام',
1947
+ few: '{count} أشهر للاستخدام',
1948
+ many: '{count} شهرًا للاستخدام',
1949
+ other: '{count} شهر للاستخدام',
1950
+ },
1951
+ 'hr.cf_edit_title': 'تعديل سياسة الترحيل',
1952
+ 'hr.cf_error': 'تعذّر تحميل سياسات الترحيل',
1953
+ 'hr.cf_error_leave_type': 'اختر نوع الإجازة الذي يُرحَّل.',
1954
+ 'hr.cf_expires': 'الإجازة المُرحَّلة تنتهي صلاحيتها',
1955
+ 'hr.cf_expires_hint': 'تُحتسب من 1 يناير، حين تبدأ سنة الإجازات الجديدة، لا من يوم تشغيل المهمة.',
1956
+ 'hr.cf_job_note':
1957
+ 'تُرحّل مهمة تلقائية الرصيدَ في الثاني من يناير بتوقيت كل مكتب، بعد إضافة ديسمبر، وتسحب الإجازة المُرحَّلة في اليوم الذي تنتهي فيه صلاحيتها. ويُسجَّل النصفان كلاهما في الدفتر.',
1958
+ 'hr.cf_leave_type_hint': 'أي رصيد يُرحَّل.',
1959
+ 'hr.cf_months': 'المهلة بالأشهر',
1960
+ 'hr.cf_months_hint': 'بين 1 و24. ثلاثة أشهر تعني أن الإجازة المُرحَّلة تبقى طوال مارس وتنتهي في 1 أبريل.',
1961
+ 'hr.cf_needs_accrual':
1962
+ 'لا توجد سياسة استحقاق، لذلك لا يمكن ترحيل شيء: السقف بالأيام يحتاج طول يوم العمل، ولا تذكره إلا سياسة الاستحقاق.',
1963
+ 'hr.cf_needs_accrual_note':
1964
+ 'السقف بالأيام، ولا تقول طولَ اليوم إلا سياسة الاستحقاق. ومن لا سياسة استحقاق له لا يُرحَّل له شيء إطلاقًا.',
1965
+ 'hr.cf_no_deadline': 'بلا مهلة',
1966
+ 'hr.cf_no_default':
1967
+ 'لا توجد سياسة ترحيل على مستوى مساحة العمل، لذلك لا يحتفظ بشيء عند رأس السنة كل من لا تنطبق عليه سياسة أقرب.',
1968
+ 'hr.cf_none': 'لا توجد سياسات ترحيل بعد',
1969
+ 'hr.cf_none_desc':
1970
+ 'بدون سياسة كهذه لا ينتقل شيء إلى السنة الجديدة. الرصيد غير المستخدم يبقى في السنة التي اكتُسب فيها، وتبدأ السنة الجديدة بما يُكتسب فيها.',
1971
+ 'hr.cf_section': 'الترحيل',
1972
+ 'hr.cf_section_desc':
1973
+ 'ما يتبقّى عند نهاية سنة الإجازات: كم منه ينتقل إلى السنة التالية، وكم من الوقت يبقى لاستخدامه.',
1974
+ 'hr.cf_unassign_no_fallback':
1975
+ 'لا توجد سياسة ترحيل على أي درجة أدنى من هذه، فلا ينتقل لهم شيء إلى السنة الجديدة.',
1976
+ 'hr.cf_unassign_title': 'إيقاف الترحيل لـ {subject}؟',
1890
1977
  'hr.chain_actions_for': 'إجراءات {name}',
1891
1978
  'hr.chain_add_approver': 'إضافة موقّع',
1892
1979
  'hr.chain_add_step': 'إضافة خطوة',
@@ -2602,7 +2689,7 @@ export const ar: Record<string, Message> = {
2602
2689
  'hr.periods_kind_hint': 'سبب إغلاق الشهر. وكلا النوعين يُغلق الأيام نفسها.',
2603
2690
  'hr.periods_lock': 'إغلاق',
2604
2691
  'hr.periods_lock_adjustments':
2605
- 'أي تغيير في السياسات يقع تاريخه داخلها يصبح تسوية في فترة مفتوحة بدل ذلك. ويمكنك إعادة فتح الفترة لاحقاً مع ذكر السبب.',
2692
+ 'أي تغيير في السياسات يقع تاريخه داخلها يترك تلك الأيام كما أُغلقت، فما يترتّب عليه يُسجَّل يدويًا كتسوية في فترة مفتوحة. ويمكنك إعادة فتح الفترة لاحقاً مع ذكر السبب.',
2606
2693
  'hr.periods_lock_body': 'كل يوم مسجَّل داخل هذه الفترة يتوقف عن قابلية إعادة الاحتساب، بالنسبة إلى {scope}.',
2607
2694
  'hr.periods_lock_confirm': 'إغلاق الفترة',
2608
2695
  'hr.periods_lock_error': 'تعذّر إغلاق الفترة',
@@ -2659,6 +2746,8 @@ export const ar: Record<string, Message> = {
2659
2746
  'hr.person_create_error': 'تعذّرت إضافة هذا الشخص — لم يُحفظ شيء',
2660
2747
  'hr.person_created': 'أُضيف {name} إلى الدليل',
2661
2748
  'hr.person_error': 'تعذّر تحميل سجل هذا الشخص',
2749
+ 'hr.person_hidden': 'مخفي',
2750
+ 'hr.person_hidden_hint': 'تظهر بيانات الاتصال الشخصية وتواريخ التوظيف للأشخاص المسؤول عنهم فقط.',
2662
2751
  'hr.person_manage_denied': 'ليست لديك صلاحية إضافة أشخاص إلى مساحة العمل هذه',
2663
2752
  'hr.person_offboard_error': 'تعذّر إنهاء التوظيف — لم يتغيّر شيء',
2664
2753
  'hr.person_offboarded': 'غادر {name}',
@@ -2667,8 +2756,10 @@ export const ar: Record<string, Message> = {
2667
2756
  'hr.person_updated': 'حُفظ',
2668
2757
  'hr.personal_email': 'البريد الشخصي',
2669
2758
  'hr.phone': 'الهاتف',
2759
+ 'hr.policy_kind_accrual': 'استحقاق',
2760
+ 'hr.policy_kind_carry_forward': 'ترحيل',
2670
2761
  'hr.reject': 'رفض',
2671
- 'hr.reject_confirm_body': 'يصله إشعار ولا يتغيّر شيء بالنسبة له. يمكنه إرسال طلب جديد.',
2762
+ 'hr.reject_confirm_body': 'لا يتغيّر شيء بالنسبة له. يمكنه إرسال طلب جديد.',
2672
2763
  'hr.reject_confirm_title': 'رفض هذا الطلب؟',
2673
2764
  'hr.request_leave': 'طلب إجازة',
2674
2765
  'hr.retry': 'أعد المحاولة',
@@ -2692,7 +2783,7 @@ export const ar: Record<string, Message> = {
2692
2783
  'hr.schedule_assigned': '{name} على هذه المناوبة اعتبارًا من {date}',
2693
2784
  'hr.schedule_auto_out': 'إغلاق المناوبة المنسية بعد',
2694
2785
  'hr.schedule_auto_out_hint':
2695
- 'من ينسى تسجيل الانصراف يُسجَّل انصرافه تلقائيًا بعد هذه المدة، ويُعلَّم اليوم للمراجعة. وإذا كان الخيار متوقفًا، ينتظر اليوم تصحيحًا.',
2786
+ 'من ينسى تسجيل الانصراف يُسجَّل انصرافه تلقائيًا بعد هذه المدة، وتُحتسب له هذه المدة بدل أن يبقى اليوم معلَّمًا كغير مكتمل. وإذا كان الخيار متوقفًا، يبقى اليوم مفتوحًا في انتظار تصحيح.',
2696
2787
  'hr.schedule_auto_out_off': 'اتركها لشخص',
2697
2788
  'hr.schedule_break': 'الاستراحة',
2698
2789
  'hr.schedule_break_hint': 'الاستراحة غير مدفوعة وتُخصم من إجمالي اليوم.',
@@ -2855,7 +2946,7 @@ export const de: Record<string, Message> = {
2855
2946
  'hr.accr_days_field_hint': 'Vor Senioritätsstufen, anteiliger Berechnung und Teilzeitstunden.',
2856
2947
  'hr.accr_days_per_year': { one: '{count} Tag pro Jahr', other: '{count} Tage pro Jahr' },
2857
2948
  'hr.accr_desc':
2858
- 'Wie Urlaub über die Zeit entsteht: die Regeln, für wen jede gilt, und was der nächste Lauf gutschreiben würde.',
2949
+ 'Wie Urlaub mit der Zeit entsteht und was den Jahreswechsel übersteht: die Regeln, für wen jede gilt, und was der nächste Lauf gutschreiben würde.',
2859
2950
  'hr.accr_duplicate': 'Duplizieren',
2860
2951
  'hr.accr_edit_retroactive':
2861
2952
  'Eine Änderung schreibt auch die Vergangenheit um, und alles daraus bereits Gutgeschriebene lässt sich kaum noch erklären. Um die Regeln ab einem Datum zu ändern, duplizieren Sie diese Regel und geben der Kopie einen späteren Beginn.',
@@ -3096,6 +3187,7 @@ export const de: Record<string, Message> = {
3096
3187
  'hr.att_corrections_pending': 'Von Ihnen beantragte Korrekturen',
3097
3188
  'hr.att_locked_no_change':
3098
3189
  'Dieser Monat ist für die Lohnabrechnung geschlossen; eine Korrektur ändert seine Zahlen nicht mehr.',
3190
+ 'hr.att_method_auto': 'Automatisch geschlossen',
3099
3191
  'hr.att_method_device': 'Terminal',
3100
3192
  'hr.att_method_import': 'Importiert',
3101
3193
  'hr.att_method_kiosk': 'Kiosk',
@@ -3310,6 +3402,44 @@ export const de: Record<string, Message> = {
3310
3402
  'hr.capability_off_title': '{name} ausschalten?',
3311
3403
  'hr.capability_requires': 'Erfordert {name}',
3312
3404
  'hr.capability_write_error': 'Dieser Schalter konnte nicht geändert werden. Es wurde nichts gespeichert.',
3405
+ 'hr.cf_cap': 'Tage, die übertragen werden',
3406
+ 'hr.cf_cap_hint':
3407
+ 'Höchstens so viel übersteht den Jahreswechsel. Alles darüber verfällt, und das Konto hält den Verfall fest.',
3408
+ 'hr.cf_cap_zero':
3409
+ 'Bei null wird nichts übertragen: der gesamte Restsaldo wird am 31. Dezember abgeschrieben — als Verfallsbuchung, auf die man zeigen kann.',
3410
+ 'hr.cf_carries_nothing': 'Kein Übertrag',
3411
+ 'hr.cf_col_carries': 'Übertrag',
3412
+ 'hr.cf_col_deadline': 'Frist',
3413
+ 'hr.cf_create_title': 'Neue Übertragsregel',
3414
+ 'hr.cf_deadline_short': { one: '{count} Monat Zeit', other: '{count} Monate Zeit' },
3415
+ 'hr.cf_edit_title': 'Übertragsregel bearbeiten',
3416
+ 'hr.cf_error': 'Die Übertragsregeln konnten nicht geladen werden',
3417
+ 'hr.cf_error_leave_type': 'Wählen Sie die Abwesenheitsart, die übertragen wird.',
3418
+ 'hr.cf_expires': 'Übertragener Urlaub verfällt',
3419
+ 'hr.cf_expires_hint':
3420
+ 'Gezählt ab dem 1. Januar, wenn das neue Urlaubsjahr beginnt — nicht ab dem Tag, an dem der Job läuft.',
3421
+ 'hr.cf_job_note':
3422
+ 'Ein Job überträgt den Saldo am jeweils eigenen 2. Januar jedes Standorts, sobald der Dezember gutgeschrieben ist, und nimmt übertragenen Urlaub an dem Tag weg, an dem er verfällt. Beide Hälften stehen im Konto.',
3423
+ 'hr.cf_leave_type_hint': 'Welcher Saldo übertragen wird.',
3424
+ 'hr.cf_months': 'Monate Zeit',
3425
+ 'hr.cf_months_hint':
3426
+ 'Zwischen 1 und 24. Drei Monate heißt: übertragener Urlaub gilt den ganzen März und ist am 1. April weg.',
3427
+ 'hr.cf_needs_accrual':
3428
+ 'Es gibt keine Anspruchsregel, also kann nichts übertragen werden: eine Obergrenze in Tagen braucht die Länge eines Arbeitstages, und die steht nur in einer Anspruchsregel.',
3429
+ 'hr.cf_needs_accrual_note':
3430
+ 'Die Obergrenze steht in Tagen, und nur eine Anspruchsregel sagt, wie lang ein Tag ist. Wer keine Anspruchsregel hat, überträgt überhaupt nichts.',
3431
+ 'hr.cf_no_deadline': 'Ohne Frist',
3432
+ 'hr.cf_no_default':
3433
+ 'Auf dem Arbeitsbereich liegt keine Übertragsregel — wer keine nähere hat, behält zum Jahreswechsel nichts.',
3434
+ 'hr.cf_none': 'Noch keine Übertragsregeln',
3435
+ 'hr.cf_none_desc':
3436
+ 'Ohne eine solche Regel geht nichts ins neue Jahr über. Ein nicht genommener Saldo bleibt in dem Jahr, in dem er entstanden ist, und das neue Jahr beginnt mit dem, was in ihm entsteht.',
3437
+ 'hr.cf_section': 'Übertrag',
3438
+ 'hr.cf_section_desc':
3439
+ 'Was am Ende eines Urlaubsjahres übrig ist: wie viel davon ins nächste Jahr übergeht und wie lange Zeit bleibt, es zu nehmen.',
3440
+ 'hr.cf_unassign_no_fallback':
3441
+ 'Auf keiner Stufe darunter liegt eine Übertragsregel — es geht nichts von ihnen ins neue Jahr über.',
3442
+ 'hr.cf_unassign_title': 'Übertrag für {subject} beenden?',
3313
3443
  'hr.chain_actions_for': 'Aktionen für {name}',
3314
3444
  'hr.chain_add_approver': 'Freigebende Person hinzufügen',
3315
3445
  'hr.chain_add_step': 'Schritt hinzufügen',
@@ -3970,7 +4100,7 @@ export const de: Record<string, Message> = {
3970
4100
  'hr.periods_kind_hint': 'Wofür der Monat geschlossen wird. Beide Arten schließen dieselben Tage.',
3971
4101
  'hr.periods_lock': 'Schließen',
3972
4102
  'hr.periods_lock_adjustments':
3973
- 'Eine Richtlinienänderung mit einem Datum darin wird stattdessen zu einer Korrektur in einem offenen Zeitraum. Sie können den Zeitraum später mit einer Begründung wieder öffnen.',
4103
+ 'Eine Richtlinienänderung mit einem Datum darin lässt diese Tage genau so, wie sie geschlossen wurden; was sich daraus ergibt, muss von Hand als Korrektur in einem offenen Zeitraum erfasst werden. Sie können den Zeitraum später mit einer Begründung wieder öffnen.',
3974
4104
  'hr.periods_lock_body': 'Jeder erfasste Tag in diesem Zeitraum wird nicht mehr neu berechnet, für {scope}.',
3975
4105
  'hr.periods_lock_confirm': 'Zeitraum schließen',
3976
4106
  'hr.periods_lock_error': 'Der Zeitraum konnte nicht geschlossen werden',
@@ -4022,6 +4152,9 @@ export const de: Record<string, Message> = {
4022
4152
  'hr.person_create_error': 'Diese Person konnte nicht hinzugefügt werden — es wurde nichts gespeichert',
4023
4153
  'hr.person_created': '{name} steht im Verzeichnis',
4024
4154
  'hr.person_error': 'Der Eintrag dieser Person konnte nicht geladen werden',
4155
+ 'hr.person_hidden': 'Ausgeblendet',
4156
+ 'hr.person_hidden_hint':
4157
+ 'Private Kontaktdaten und Beschäftigungsdaten werden nur für die Personen angezeigt, für die Sie zuständig sind.',
4025
4158
  'hr.person_manage_denied': 'Sie dürfen zu diesem Workspace keine Personen hinzufügen',
4026
4159
  'hr.person_offboard_error': 'Die Beschäftigung konnte nicht beendet werden — es wurde nichts geändert',
4027
4160
  'hr.person_offboarded': '{name} ist ausgeschieden',
@@ -4030,9 +4163,10 @@ export const de: Record<string, Message> = {
4030
4163
  'hr.person_updated': 'Gespeichert',
4031
4164
  'hr.personal_email': 'Private E-Mail',
4032
4165
  'hr.phone': 'Telefon',
4166
+ 'hr.policy_kind_accrual': 'Anspruch',
4167
+ 'hr.policy_kind_carry_forward': 'Übertrag',
4033
4168
  'hr.reject': 'Ablehnen',
4034
- 'hr.reject_confirm_body':
4035
- 'Die Person wird benachrichtigt; für sie ändert sich nichts. Sie kann einen neuen Antrag stellen.',
4169
+ 'hr.reject_confirm_body': 'Für die Person ändert sich nichts. Sie kann einen neuen Antrag stellen.',
4036
4170
  'hr.reject_confirm_title': 'Diesen Antrag ablehnen?',
4037
4171
  'hr.request_leave': 'Abwesenheit beantragen',
4038
4172
  'hr.retry': 'Erneut versuchen',
@@ -4056,7 +4190,7 @@ export const de: Record<string, Message> = {
4056
4190
  'hr.schedule_assigned': '{name} steht ab {date} auf diesem Modell',
4057
4191
  'hr.schedule_auto_out': 'Vergessene Schicht schließen nach',
4058
4192
  'hr.schedule_auto_out_hint':
4059
- 'Wer sich nicht ausstempelt, wird nach dieser Zeit automatisch ausgestempelt, und der Tag wird zur Prüfung markiert. Ist die Option aus, wartet der Tag auf eine Korrektur.',
4193
+ 'Wer sich nicht ausstempelt, wird nach dieser Zeit automatisch ausgestempelt, und der Tag zählt diese Zeit, statt weiter als unfertig markiert zu bleiben. Ist die Option aus, bleibt der Tag offen und wartet auf eine Korrektur.',
4060
4194
  'hr.schedule_auto_out_off': 'Einem Menschen überlassen',
4061
4195
  'hr.schedule_break': 'Pause',
4062
4196
  'hr.schedule_break_hint': 'Die Pause ist unbezahlt und wird vom Tagesergebnis abgezogen.',
@@ -4224,7 +4358,7 @@ export const fa: Record<string, Message> = {
4224
4358
  'hr.accr_days_field_hint': 'پیش از پله‌های سابقه، محاسبهٔ نسبی و ساعت‌های پاره‌وقت.',
4225
4359
  'hr.accr_days_per_year': { one: '{count} روز در سال', other: '{count} روز در سال' },
4226
4360
  'hr.accr_desc':
4227
- 'اینکه مرخصی به‌مرور چطور تعلق می‌گیرد: قاعده‌ها، اینکه هرکدام برای چه کسی است، و اجرای بعدی چه چیزی اضافه می‌کند.',
4361
+ 'مرخصی چطور به مرور به دست می‌آید و چه چیزی از سرِ سال عبور می‌کند: قاعده‌ها، اینکه هرکدام برای چه کسی است، و اجرای بعدی چه چیزی اضافه می‌کند.',
4228
4362
  'hr.accr_duplicate': 'رونوشت',
4229
4363
  'hr.accr_edit_retroactive':
4230
4364
  'ویرایش، چیزی را که در گذشته درست بوده هم بازنویسی می‌کند و توضیح‌دادن آنچه از آن اضافه شده سخت می‌شود. برای تغییر قاعده از یک تاریخ به بعد، از این قاعده رونوشت بگیرید و به رونوشت شروع دیرتری بدهید.',
@@ -4448,6 +4582,7 @@ export const fa: Record<string, Message> = {
4448
4582
  'hr.att_corrections_error': 'اصلاح‌هایی که خواسته‌اید بارگذاری نشد',
4449
4583
  'hr.att_corrections_pending': 'اصلاح‌هایی که خواسته‌اید',
4450
4584
  'hr.att_locked_no_change': 'این ماه برای حقوق و دستمزد بسته شده و اصلاح، ارقام آن را جابه‌جا نمی‌کند.',
4585
+ 'hr.att_method_auto': 'بستن خودکار',
4451
4586
  'hr.att_method_device': 'دستگاه',
4452
4587
  'hr.att_method_import': 'واردشده',
4453
4588
  'hr.att_method_kiosk': 'کیوسک',
@@ -4651,6 +4786,43 @@ export const fa: Record<string, Message> = {
4651
4786
  'hr.capability_off_title': '{name} خاموش شود؟',
4652
4787
  'hr.capability_requires': 'نیاز به {name}',
4653
4788
  'hr.capability_write_error': 'این کلید تغییر نکرد. چیزی ذخیره نشد.',
4789
+ 'hr.cf_cap': 'روزهایی که منتقل می‌شوند',
4790
+ 'hr.cf_cap_hint':
4791
+ 'بیشترین چیزی که از سرِ سال عبور می‌کند. هر چه بیشتر از آن باشد منقضی می‌شود و دفتر آن را ثبت می‌کند.',
4792
+ 'hr.cf_cap_zero':
4793
+ 'با صفر چیزی منتقل نمی‌شود: تمام ماندهٔ باقی در ۳۱ دسامبر با یک ثبتِ انقضا که می‌شود به آن اشاره کرد، حذف می‌شود.',
4794
+ 'hr.cf_carries_nothing': 'چیزی منتقل نمی‌شود',
4795
+ 'hr.cf_col_carries': 'انتقال',
4796
+ 'hr.cf_col_deadline': 'مهلت',
4797
+ 'hr.cf_create_title': 'قاعدهٔ انتقالی تازه',
4798
+ 'hr.cf_deadline_short': { one: '{count} ماه فرصت', other: '{count} ماه فرصت' },
4799
+ 'hr.cf_edit_title': 'ویرایش قاعدهٔ انتقالی',
4800
+ 'hr.cf_error': 'قاعده‌های انتقالی بارگذاری نشد',
4801
+ 'hr.cf_error_leave_type': 'نوع مرخصی‌ای که منتقل می‌شود را انتخاب کنید.',
4802
+ 'hr.cf_expires': 'مرخصی منتقل‌شده منقضی می‌شود',
4803
+ 'hr.cf_expires_hint':
4804
+ 'از یکم ژانویه، وقتی سال مرخصی تازه باز می‌شود، شمرده می‌شود — نه از روزی که کار خودکار اجرا می‌شود.',
4805
+ 'hr.cf_job_note':
4806
+ 'یک کار خودکار، دوم ژانویهٔ خودِ هر دفتر و پس از آنکه دسامبر اضافه شد، مانده را منتقل می‌کند و مرخصی منتقل‌شده را روزی که منقضی می‌شود برمی‌دارد. هر دو نیمه در دفتر ثبت می‌شود.',
4807
+ 'hr.cf_leave_type_hint': 'کدام مانده منتقل می‌شود.',
4808
+ 'hr.cf_months': 'مهلت (ماه)',
4809
+ 'hr.cf_months_hint': 'بین ۱ تا ۲۴. سه ماه یعنی مرخصی منتقل‌شده تمام مارس هست و یکم آوریل دیگر نیست.',
4810
+ 'hr.cf_needs_accrual':
4811
+ 'هیچ قاعدهٔ انباشتی نیست، پس چیزی نمی‌تواند منتقل شود: سقفی که به روز است طول یک روز کاری را لازم دارد و فقط قاعدهٔ انباشت آن را می‌گوید.',
4812
+ 'hr.cf_needs_accrual_note':
4813
+ 'سقف به روز است و فقط قاعدهٔ انباشت می‌گوید یک روز چقدر است. کسی که قاعدهٔ انباشت ندارد اصلاً چیزی منتقل نمی‌کند.',
4814
+ 'hr.cf_no_deadline': 'بی‌مهلت',
4815
+ 'hr.cf_no_default':
4816
+ 'هیچ قاعدهٔ انتقالی روی فضای کاری نیست، پس هرکس قاعدهٔ نزدیک‌تری نداشته باشد سرِ سال نو چیزی برایش نمی‌ماند.',
4817
+ 'hr.cf_none': 'هنوز قاعدهٔ انتقالی نیست',
4818
+ 'hr.cf_none_desc':
4819
+ 'بدون چنین قاعده‌ای چیزی به سال جدید نمی‌رود. ماندهٔ استفاده‌نشده در همان سالی که به دست آمده می‌ماند و سال جدید از آنچه در خودش انباشته می‌شود شروع می‌کند.',
4820
+ 'hr.cf_section': 'انتقالی',
4821
+ 'hr.cf_section_desc':
4822
+ 'آنچه در پایان سال مرخصی می‌ماند: چقدرش به سال بعد می‌رود و چقدر وقت هست که استفاده شود.',
4823
+ 'hr.cf_unassign_no_fallback':
4824
+ 'در هیچ پلهٔ پایین‌تر از این، قاعدهٔ انتقالی نیست؛ پس چیزی از آن‌ها به سال بعد نمی‌رود.',
4825
+ 'hr.cf_unassign_title': 'انتقالی برای {subject} متوقف شود؟',
4654
4826
  'hr.chain_actions_for': 'کارهای {name}',
4655
4827
  'hr.chain_add_approver': 'افزودن تأییدکننده',
4656
4828
  'hr.chain_add_step': 'افزودن مرحله',
@@ -5284,7 +5456,7 @@ export const fa: Record<string, Message> = {
5284
5456
  'hr.periods_kind_hint': 'ماه برای چه بسته می‌شود. هر دو نوع همان روزها را می‌بندند.',
5285
5457
  'hr.periods_lock': 'بستن',
5286
5458
  'hr.periods_lock_adjustments':
5287
- 'تغییر سیاستی که تاریخش درون دوره باشد، به‌جای بازنویسی، در یک دورهٔ باز به اصلاحیه تبدیل می‌شود. بعداً می‌توانید دوره را با ذکر دلیل بازگشایی کنید.',
5459
+ 'تغییر سیاستی که تاریخش درون دوره باشد، آن روزها را همان‌گونه که بسته شده‌اند رها می‌کند؛ پس هرچه از آن برمی‌آید باید دستی به‌صورت اصلاحیه در یک دورهٔ باز ثبت شود. بعداً می‌توانید دوره را با ذکر دلیل بازگشایی کنید.',
5288
5460
  'hr.periods_lock_body': 'هر روز ثبت‌شده در این دوره برای {scope} دیگر بازمحاسبه نمی‌شود.',
5289
5461
  'hr.periods_lock_confirm': 'بستن دوره',
5290
5462
  'hr.periods_lock_error': 'دوره بسته نشد',
@@ -5335,6 +5507,9 @@ export const fa: Record<string, Message> = {
5335
5507
  'hr.person_create_error': 'این فرد اضافه نشد — چیزی ذخیره نشد',
5336
5508
  'hr.person_created': '{name} به فهرست اضافه شد',
5337
5509
  'hr.person_error': 'پروندهٔ این فرد بارگیری نشد',
5510
+ 'hr.person_hidden': 'پنهان',
5511
+ 'hr.person_hidden_hint':
5512
+ 'اطلاعات تماس شخصی و تاریخ‌های استخدام تنها برای افرادی نمایش داده می‌شود که مسئول آن‌ها هستید.',
5338
5513
  'hr.person_manage_denied': 'شما اجازهٔ افزودن فرد به این فضای کاری را ندارید',
5339
5514
  'hr.person_offboard_error': 'پایان همکاری ثبت نشد — چیزی عوض نشد',
5340
5515
  'hr.person_offboarded': '{name} رفته است',
@@ -5343,9 +5518,10 @@ export const fa: Record<string, Message> = {
5343
5518
  'hr.person_updated': 'ذخیره شد',
5344
5519
  'hr.personal_email': 'ایمیل شخصی',
5345
5520
  'hr.phone': 'تلفن',
5521
+ 'hr.policy_kind_accrual': 'انباشت',
5522
+ 'hr.policy_kind_carry_forward': 'انتقالی',
5346
5523
  'hr.reject': 'رد',
5347
- 'hr.reject_confirm_body':
5348
- 'به او اطلاع داده می‌شود و چیزی برایش تغییر نمی‌کند. می‌تواند درخواست تازه‌ای بفرستد.',
5524
+ 'hr.reject_confirm_body': 'چیزی برایش تغییر نمی‌کند. می‌تواند درخواست تازه‌ای بفرستد.',
5349
5525
  'hr.reject_confirm_title': 'این درخواست رد شود؟',
5350
5526
  'hr.request_leave': 'درخواست مرخصی',
5351
5527
  'hr.retry': 'تلاش دوباره',
@@ -5369,7 +5545,7 @@ export const fa: Record<string, Message> = {
5369
5545
  'hr.schedule_assigned': '{name} از {date} روی این شیفت است',
5370
5546
  'hr.schedule_auto_out': 'بستن خودکار شیفت فراموش‌شده پس از',
5371
5547
  'hr.schedule_auto_out_hint':
5372
- 'کسی که خروج نزده، پس از این مدت به‌طور خودکار خارج می‌شود و آن روز برای بررسی علامت می‌خورد. اگر خاموش باشد، روز منتظر اصلاح می‌ماند.',
5548
+ 'کسی که خروج نزده، پس از این مدت به‌طور خودکار خارج می‌شود و همان مدت برای آن روز حساب می‌شود، به‌جای اینکه روز ناتمام علامت بخورد. اگر خاموش باشد، روز باز می‌ماند و منتظر اصلاح است.',
5373
5549
  'hr.schedule_auto_out_off': 'به عهدهٔ یک نفر بگذار',
5374
5550
  'hr.schedule_break': 'استراحت',
5375
5551
  'hr.schedule_break_hint': 'استراحت بدون حقوق است و از مجموع روز کم می‌شود.',
@@ -5533,7 +5709,7 @@ export const tr: Record<string, Message> = {
5533
5709
  'hr.accr_days_field_hint': 'Kıdem kademeleri, oranlama ve yarı zamanlı saatler uygulanmadan önce.',
5534
5710
  'hr.accr_days_per_year': { one: 'Yılda {count} gün', other: 'Yılda {count} gün' },
5535
5711
  'hr.accr_desc':
5536
- 'İznin zamanla nasıl hak edildiği: kurallar, her birinin kime uygulandığı ve bir sonraki çalıştırmanın ne ekleyeceği.',
5712
+ 'İznin zamanla nasıl hak edildiği ve yıl dönümünden nelerin geçtiği: kurallar, her birinin kime uygulandığı ve bir sonraki çalıştırmanın ne ekleyeceği.',
5537
5713
  'hr.accr_duplicate': 'Kopyala',
5538
5714
  'hr.accr_edit_retroactive':
5539
5715
  'Bir düzenleme geçmişte doğru olanı da değiştirir ve buradan eklenmiş her şeyin açıklanması zorlaşır. Kuralları belirli bir tarihten itibaren değiştirmek için bu kuralı kopyalayın ve kopyaya daha geç bir başlangıç verin.',
@@ -5762,6 +5938,7 @@ export const tr: Record<string, Message> = {
5762
5938
  'hr.att_corrections_error': 'İstediğiniz düzeltmeler yüklenemedi',
5763
5939
  'hr.att_corrections_pending': 'İstediğiniz düzeltmeler',
5764
5940
  'hr.att_locked_no_change': 'Bu ay bordro için kapatıldı; düzeltme rakamları değiştiremez.',
5941
+ 'hr.att_method_auto': 'Otomatik kapatıldı',
5765
5942
  'hr.att_method_device': 'Terminal',
5766
5943
  'hr.att_method_import': 'Aktarıldı',
5767
5944
  'hr.att_method_kiosk': 'Kiosk',
@@ -5964,6 +6141,43 @@ export const tr: Record<string, Message> = {
5964
6141
  'hr.capability_off_title': '{name} kapatılsın mı?',
5965
6142
  'hr.capability_requires': '{name} gerekir',
5966
6143
  'hr.capability_write_error': 'Bu anahtar değiştirilemedi. Hiçbir şey kaydedilmedi.',
6144
+ 'hr.cf_cap': 'Devreden gün sayısı',
6145
+ 'hr.cf_cap_hint': 'Yıl dönümünü en fazla bu kadarı geçer. Üstü kalan süresi dolar ve defter bunu kaydeder.',
6146
+ 'hr.cf_cap_zero':
6147
+ "Sıfırda hiçbir şey devretmez: kalan bakiyenin tamamı 31 Aralık'ta, gösterilebilir bir 'süresi doldu' kaydıyla silinir.",
6148
+ 'hr.cf_carries_nothing': 'Devir yok',
6149
+ 'hr.cf_col_carries': 'Devreden',
6150
+ 'hr.cf_col_deadline': 'Son kullanım',
6151
+ 'hr.cf_create_title': 'Yeni devir kuralı',
6152
+ 'hr.cf_deadline_short': { one: '{count} ay süre', other: '{count} ay süre' },
6153
+ 'hr.cf_edit_title': 'Devir kuralını düzenle',
6154
+ 'hr.cf_error': 'Devir kuralları yüklenemedi',
6155
+ 'hr.cf_error_leave_type': 'Hangi izin türünü devredeceğini seçin.',
6156
+ 'hr.cf_expires': 'Devreden izin süresi dolar',
6157
+ 'hr.cf_expires_hint':
6158
+ "Yeni izin yılının başladığı 1 Ocak'tan itibaren sayılır; işin çalıştığı günden değil.",
6159
+ 'hr.cf_job_note':
6160
+ "Bir iş, her ofisin kendi 2 Ocak'ında, aralık eklendikten sonra bakiyeyi devreder ve devredilen izni süresi dolduğu gün geri alır. İki yarısı da deftere yazılır.",
6161
+ 'hr.cf_leave_type_hint': 'Hangi bakiyenin devredeceği.',
6162
+ 'hr.cf_months': 'Kullanım süresi (ay)',
6163
+ 'hr.cf_months_hint':
6164
+ "1 ile 24 arasında. Üç ay demek, devreden izin mart ayı boyunca geçerlidir ve 1 Nisan'da yoktur.",
6165
+ 'hr.cf_needs_accrual':
6166
+ 'Hakediş kuralı yok, bu yüzden hiçbir şey devredemez: gün cinsinden bir üst sınır, bir iş gününün uzunluğuna ihtiyaç duyar ve bunu yalnızca bir hakediş kuralı söyler.',
6167
+ 'hr.cf_needs_accrual_note':
6168
+ 'Üst sınır gün cinsindendir ve bir günün ne kadar sürdüğünü yalnızca hakediş kuralı söyler. Hakediş kuralı olmayan hiçbir şey devretmez.',
6169
+ 'hr.cf_no_deadline': 'Süresiz',
6170
+ 'hr.cf_no_default':
6171
+ 'Çalışma alanında bir devir kuralı yok; daha yakın bir kuralı olmayan hiç kimse yıl dönümünde hiçbir şey saklamıyor.',
6172
+ 'hr.cf_none': 'Henüz devir kuralı yok',
6173
+ 'hr.cf_none_desc':
6174
+ 'Böyle bir kural olmadan yeni yıla hiçbir şey geçmez. Kullanılmayan bakiye hak edildiği yılda kalır ve yeni yıl, o yıl hak edilenle başlar.',
6175
+ 'hr.cf_section': 'Devir',
6176
+ 'hr.cf_section_desc':
6177
+ 'Bir izin yılı bittiğinde kalanlar: ne kadarı gelecek yıla geçer ve kullanmak için ne kadar süre kalır.',
6178
+ 'hr.cf_unassign_no_fallback':
6179
+ 'Bunun altındaki hiçbir basamakta devir kuralı yok; bu yüzden onlardan yeni yıla hiçbir şey geçmez.',
6180
+ 'hr.cf_unassign_title': '{subject} için devir dursun mu?',
5967
6181
  'hr.chain_actions_for': '{name} için işlemler',
5968
6182
  'hr.chain_add_approver': 'Onaylayan ekle',
5969
6183
  'hr.chain_add_step': 'Adım ekle',
@@ -6602,7 +6816,7 @@ export const tr: Record<string, Message> = {
6602
6816
  'hr.periods_kind_hint': 'Ayın ne için kapatıldığı. İki tür de aynı günleri kapatır.',
6603
6817
  'hr.periods_lock': 'Kapat',
6604
6818
  'hr.periods_lock_adjustments':
6605
- 'Tarihi dönemin içine düşen bir politika değişikliği, geçmişi yeniden yazmak yerine açık bir dönemde düzeltmeye dönüşür. Dönemi daha sonra gerekçesini yazarak yeniden açabilirsiniz.',
6819
+ 'Tarihi dönemin içine düşen bir politika değişikliği o günleri kapatıldıkları hâlde bırakır; doğurduğu fark açık bir dönemde elle düzeltme olarak kaydedilmelidir. Dönemi daha sonra gerekçesini yazarak yeniden açabilirsiniz.',
6606
6820
  'hr.periods_lock_body': 'Bu dönemdeki her kayıtlı gün {scope} için yeniden hesaplanamaz olur.',
6607
6821
  'hr.periods_lock_confirm': 'Dönemi kapat',
6608
6822
  'hr.periods_lock_error': 'Dönem kapatılamadı',
@@ -6653,6 +6867,9 @@ export const tr: Record<string, Message> = {
6653
6867
  'hr.person_create_error': 'Bu kişi eklenemedi — hiçbir şey kaydedilmedi',
6654
6868
  'hr.person_created': '{name} dizine eklendi',
6655
6869
  'hr.person_error': 'Bu kişinin kaydı yüklenemedi',
6870
+ 'hr.person_hidden': 'Gizli',
6871
+ 'hr.person_hidden_hint':
6872
+ 'Kişisel iletişim bilgileri ve çalışma tarihleri yalnızca sorumlu olduğunuz kişiler için gösterilir.',
6656
6873
  'hr.person_manage_denied': 'Bu çalışma alanına kişi ekleme yetkiniz yok',
6657
6874
  'hr.person_offboard_error': 'İş bitirilemedi — hiçbir şey değişmedi',
6658
6875
  'hr.person_offboarded': '{name} ayrıldı',
@@ -6661,8 +6878,10 @@ export const tr: Record<string, Message> = {
6661
6878
  'hr.person_updated': 'Kaydedildi',
6662
6879
  'hr.personal_email': 'Kişisel e-posta',
6663
6880
  'hr.phone': 'Telefon',
6881
+ 'hr.policy_kind_accrual': 'Hakediş',
6882
+ 'hr.policy_kind_carry_forward': 'Devir',
6664
6883
  'hr.reject': 'Reddet',
6665
- 'hr.reject_confirm_body': 'Bildirim alır ve kendisi için hiçbir şey değişmez. Yeni bir talep gönderebilir.',
6884
+ 'hr.reject_confirm_body': 'Kendisi için hiçbir şey değişmez. Yeni bir talep gönderebilir.',
6666
6885
  'hr.reject_confirm_title': 'Bu talep reddedilsin mi?',
6667
6886
  'hr.request_leave': 'İzin talep et',
6668
6887
  'hr.retry': 'Yeniden dene',
@@ -6686,7 +6905,7 @@ export const tr: Record<string, Message> = {
6686
6905
  'hr.schedule_assigned': '{name}, {date} tarihinden itibaren bu vardiyada',
6687
6906
  'hr.schedule_auto_out': 'Unutulan çıkışı şu süre sonra kapat',
6688
6907
  'hr.schedule_auto_out_hint':
6689
- 'Çıkış yapmayı unutan kişi bu süre dolunca otomatik olarak çıkarılır ve gün incelemeye işaretlenir. Kapalıyken gün bir düzeltme bekler.',
6908
+ 'Çıkış yapmayı unutan kişi bu süre dolunca otomatik olarak çıkarılır ve gün, tamamlanmamış olarak işaretli kalmak yerine bu kadar sayılır. Kapalıyken gün açık kalır ve bir düzeltme bekler.',
6690
6909
  'hr.schedule_auto_out_off': 'Bir insana bırak',
6691
6910
  'hr.schedule_break': 'Mola',
6692
6911
  'hr.schedule_break_hint': 'Mola ücretsizdir ve günün toplamından düşülür.',
@@ -25,6 +25,7 @@ import { getHrApi } from '../api-instance.js'
25
25
  import DecisionDialog from '../components/DecisionDialog.svelte'
26
26
  import PersonFormDialog from '../components/PersonFormDialog.svelte'
27
27
  import PersonPanel from '../components/PersonPanel.svelte'
28
+ import { personnelVisibility } from '../components/redaction.js'
28
29
  import { t } from '../i18n.js'
29
30
  import type { ApprovalRequest } from '../index.js'
30
31
  import { canHr, HR_CAPABILITIES } from '../permissions.js'
@@ -426,6 +427,23 @@ function localTime(timezone: string | null, _tick: number): string | null {
426
427
  const started = (iso: string | null) =>
427
428
  iso ? formatDate(`${iso}T00:00:00`, { month: 'short', year: 'numeric' }) : '—'
428
429
 
430
+ /**
431
+ * Whether this row's start date is blank because the server withheld it.
432
+ *
433
+ * The hire date is one of the four fields `HrAccessService` nulls for a reader outside its scope,
434
+ * and it arrives here as a null like any other — so the em dash this column drew for it said
435
+ * "never started", about everybody in the company, to every colleague without a widening key.
436
+ *
437
+ * `personnelVisibility` answers `unknown` for a reader whose scope only the server can resolve, and
438
+ * an unknown row keeps the dash: a dash over an empty field is imprecise, and "Hidden" over one is
439
+ * a lie. Both are marked once, under the table, rather than per row.
440
+ */
441
+ const startWithheld = (person: { userId: string | null; hiredOn: string | null }) =>
442
+ !person.hiredOn && personnelVisibility(person) === 'withheld'
443
+
444
+ /** Whether anything on the page is actually marked — the sentence must not outlive the marks. */
445
+ const anyWithheld = $derived(people.some(startWithheld))
446
+
429
447
  /** `formatCount` caps at 99 for badges. A headcount is a real number and must not read "99+". */
430
448
  const count = (n: number) => formatCount(n, Number.MAX_SAFE_INTEGER)
431
449
 
@@ -543,7 +561,11 @@ const tileCount = (n: number | null) => (n === null ? '—' : count(n))
543
561
  </span>
544
562
  <span class="cell role" role="cell">{person.employeeNo ?? '—'}</span>
545
563
  <span class="cell muted" role="cell">{person.officeName ?? '—'}</span>
546
- <span class="cell muted" role="cell">{started(person.hiredOn)}</span>
564
+ <span class="cell muted" role="cell">
565
+ {#if startWithheld(person)}
566
+ <span class="withheld"><Icon name="eye-off" size={12} strokeWidth={1.8} />{t('person_hidden')}</span>
567
+ {:else}{started(person.hiredOn)}{/if}
568
+ </span>
547
569
  <span class="cell num" role="cell" title={person.timezone ?? ''}>{time ?? '—'}</span>
548
570
  <span class="cell" role="cell">
549
571
  <Badge tone={statusTone(person.status)}>{statusLabel(person.status)}</Badge>
@@ -573,6 +595,14 @@ const tileCount = (n: number | null) => (n === null ? '—' : count(n))
573
595
  {:else}
574
596
  <EmptyState icon="users" title={t('no_people')} description={t('no_people_desc')} />
575
597
  {/if}
598
+
599
+ <!--
600
+ Once for the table, not once per row. A marked cell says which fact is missing and this says
601
+ why it is missing — a column of "Hidden" with nothing accounting for it reads as a fault.
602
+ -->
603
+ {#if anyWithheld}
604
+ <p class="hint">{t('person_hidden_hint')}</p>
605
+ {/if}
576
606
  </section>
577
607
 
578
608
  <aside>
@@ -759,6 +789,20 @@ const tileCount = (n: number | null) => (n === null ? '—' : count(n))
759
789
  .role {
760
790
  font-size: 13px;
761
791
  }
792
+ /* A colour, never opacity, for the same reason `.sub` and `.muted` above use one. */
793
+ .withheld {
794
+ display: inline-flex;
795
+ align-items: center;
796
+ gap: 5px;
797
+ min-inline-size: 0;
798
+ }
799
+ .hint {
800
+ margin: 10px 0 0;
801
+ max-inline-size: 68ch;
802
+ font-size: 12px;
803
+ line-height: 1.45;
804
+ color: var(--kern-ink-500);
805
+ }
762
806
  .num {
763
807
  font-size: 13px;
764
808
  color: var(--kern-ink-500);
@@ -23,10 +23,18 @@ export function canHr(permission: HrPermission): boolean {
23
23
  }
24
24
 
25
25
  /**
26
- * Whether the viewer can see anybody's record but their own.
26
+ * Whether the viewer reads the personnel record behind a directory card, for anybody but themselves.
27
27
  *
28
- * Three widths that do not imply one another a country HR manager must not silently become a
29
- * global one so "can this person open somebody else's page" is asked once, here.
28
+ * Not "can they open somebody else's page"everybody can, and should. `hr.person.view` is a
29
+ * `member` default and the directory is meant to be read. What the three widening keys decide is
30
+ * how much of each person comes back: personal email, phone, hire date and termination date are the
31
+ * personnel record, and the server nulls all four for anybody outside the reader's scope.
32
+ *
33
+ * The three do not imply one another — a country HR manager must not silently become a global one —
34
+ * so a screen asks the union once, here. It is only a hint: which *people* fall inside a team or an
35
+ * office is resolved on the server from the org chart, so a screen may not conclude from `true`
36
+ * that a particular person's record is readable. Render what came back; use this to decide whether
37
+ * a "personal details" section is worth offering at all.
30
38
  */
31
- export const canSeeOthers = (): boolean =>
39
+ export const canSeeFullRecords = (): boolean =>
32
40
  canHr('personViewTeam') || canHr('personViewOffice') || canHr('personViewAll')