---
id: object/codeunit/950
type: object
title: Codeunit 950 "Time Sheet Management"
summary: Codeunit 950 "Time Sheet Management" in Base Application (Microsoft.Projects.TimeSheet). 45 public procedures, 33 events. Present since at least BC23, still in BC30, changed in BC24-25, BC27-28.
tier: official
language: en
tags:
  - codeunit
  - base application
versions:
  introduced: null
  last_changed: "28"
  deprecated: null
review:
  state: derived
  by: null
  at: null
  flags: []
generated:
  at: "2026-10-11T00:31:51.816Z"
  pipeline: 0.2.0
  prompts: {}
  input_hash: c97087764ab6cce9aea6dabda535ff5f3a549ec0b5624e9d3010f5b50c9042f5
evidence:
  - kind: code
    url: https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Layers/W1/BaseApp/Projects/TimeSheet/TimeSheetManagement.Codeunit.al
    title: src/Layers/W1/BaseApp/Projects/TimeSheet/TimeSheetManagement.Codeunit.al (releases/29.x)
    date: null
    commit: ea08af5ef2d6a9b5c5af4a029288abbe2c883220
    t: null
    quote: null
links:
  learn: []
  objects: []
  features: []
  topics: []
  localizations: []
  videos: []
  posts: []
  guidelines: []
object_type: codeunit
object_id: 950
name: Time Sheet Management
namespace: Microsoft.Projects.TimeSheet
app: Base Application
extends: null
first_version: "23"
last_version: "30"
present_in:
  - "23"
  - "24"
  - "25"
  - "26"
  - "27"
  - "28"
  - "29"
  - "30"
changed_in:
  - "24"
  - "25"
  - "27"
  - "28"
source_major: "29"
obsolete: null
countries: []
ms_search_form_ids: []
counts:
  fields: 0
  procedures: 90
  events: 33
  subscribers: 0
relations:
  out: 0
  referenced_by: 0
  pages: 0
  extended_by: 0
  event_subscribers: 3
  calls: 0
  called_by: 31
  implements: 0
---

# Codeunit 950 "Time Sheet Management"

> Codeunit 950 "Time Sheet Management" in Base Application (Microsoft.Projects.TimeSheet). 45 public procedures, 33 events. Present since at least BC23, still in BC30, changed in BC24-25, BC27-28.

Base Application · Microsoft.Projects.TimeSheet · BC23-30 · [source at ea08af5e](https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Layers/W1/BaseApp/Projects/TimeSheet/TimeSheetManagement.Codeunit.al) · facts from BC29

## Properties

| Property | Value |
|---|---|
| Permissions | TableData "Time Sheet Posting Entry" = ri, TableData "Job Planning Line" = r, TableData Employee = r |

## Events published

- `OnAfterCalcActSchedFactBoxData(var TimeSheetHeader: Record "Time Sheet Header"; var TotalQtyText: Text; var TotalPresenceQty: Decimal; var AbsenceQty: Decimal)` (integration)
- `OnAfterCreateTSPostingEntry(TimeSheetDetail: Record "Time Sheet Detail"; var TimeSheetPostingEntry: Record "Time Sheet Posting Entry")` (integration)
- `OnAfterCopyPrevTimeSheetLines()` (integration)
- `OnAfterFilterAllLines(var TimeSheetLine: Record "Time Sheet Line"; ActionType: Option Submit,ReopenSubmitted,Approve,ReopenApproved,Reject)` (integration)
- `OnCalcStatusFactBoxDataOnAfterTimeSheetHeaderSetFilters(var TimeSheetHeader: Record "Time Sheet Header")` (integration)
- `OnCalcActSchedFactBoxDataOnAfterTimeSheetHeaderSetFilters(var TimeSheetHeader: Record "Time Sheet Header"; Calendar: Record Date)` (integration)
- `OnCalcActSchedFactBoxDataOnBeforeResouceCalcFields(var Resource: Record Resource; Calendar: Record Date)` (integration)
- `OnCheckInsertJobPlanningLine(JobPlanningLine: Record "Job Planning Line"; var JobPlanningLineBuffer: Record "Job Planning Line"; var SkipLine: Boolean)` (integration)
- `OnCopyPrevTimeSheetLinesOnBeforeCopyLine(var TimeSheetLine: Record "Time Sheet Line"; var IsHandled: Boolean)` (integration)
- `OnBeforeCheckJobJnlLine(var JobJnlLine: Record "Job Journal Line"; var IsHandled: Boolean)` (integration)
- `OnBeforeCheckResJnlLine(ResJournalLine: Record "Res. Journal Line"; var IsHandled: Boolean)` (integration)
- `OnBeforeFillJobPlanningBuffer(var JobPlanningLine: Record "Job Planning Line"; var JobPlanningLineBuffer: Record "Job Planning Line"; TimeSheetHeader: Record "Time Sheet Header"; var IsHandled: Boolean)` (integration)
- `OnBeforeFilterTimeSheets(var TimeSheetHeader: Record "Time Sheet Header"; FieldNo: Integer; ApplyToAdmin: Boolean; var IsHandled: Boolean)` (integration)
- `OnBeforeToTimeSheetLineInsert(var ToTimeSheetLine: Record "Time Sheet Line"; FromTimeSheetLine: Record "Time Sheet Line")` (integration)
- `OnCreateLinesFromJobPlanningOnBeforeTimeSheetLineInsert(var TimeSheetLine: Record "Time Sheet Line"; var JobPlanningLine: Record "Job Planning Line")` (integration)
- `OnAfterGetActivityInfo(var TimeSheetLine: Record "Time Sheet Line"; var ActivityCaption: Text[30]; var ActivityID: Code[20]; var ActivitySubCaption: Text[30]; var ActivitySubID: Code[20])` (integration)
- `OnFillJobPlanningBufferOnBeforeJobPlanningLineBufferInsert(JobPlanningLine: Record "Job Planning Line"; var JobPlanningLineBuffer: Record "Job Planning Line" temporary)` (integration)
- `OnFindTimeSheetArchiveOnAfterSetFilters(var TimeSheetHeaderArchive: Record "Time Sheet Header Archive")` (integration)
- `OnGetActivityInfoCaseTypeElse(var TimeSheetLine: Record "Time Sheet Line"; var ActivityCaption: Text[30]; var ActivityID: Code[20]; var ActivitySubCaption: Text[30]; var ActivitySubID: Code[20])` (integration)
  - subscribers: [Codeunit 6451 "Serv. Time Sheet Mgt."](../codeunit/6451.md) OnGetActivityInfoCaseTypeElse
- `OnCalcActSchedFactBoxDataOnAfterSetDateDescription(TimeSheetHeader: Record "Time Sheet Header"; Calendar: Record Date; var DateDescriptionForSpecificDate: Text[30])` (integration)
- `OnBeforeTimeSheetHeaderArchiveInsert(var TimeSheetHeaderArchive: Record "Time Sheet Header Archive"; TimeSheetHeader: Record "Time Sheet Header")` (integration)
- `OnBeforeTimeSheetLineArchiveInsert(var TimeSheetLineArchive: Record "Time Sheet Line Archive"; TimeSheetLine: Record "Time Sheet Line")` (integration)
- `OnBeforeTimeSheetDetailArchiveInsert(var TimeSheetDetailArchive: Record "Time Sheet Detail Archive"; TimeSheetDetail: Record "Time Sheet Detail")` (integration)
- `OnBeforeTimeSheetCmtLineArchiveInsert(var TimeSheetCmtLineArchive: Record "Time Sheet Cmt. Line Archive"; TimeSheetCommentLine: Record "Time Sheet Comment Line")` (integration)
- `OnBeforeCopyTimeSheetLine(var ToTimeSheetHeader: Record "Time Sheet Header"; var FromTimeSheetLine: Record "Time Sheet Line"; CopyComments: Boolean; var NextLineNo: Integer; var IsHandled: Boolean)` (integration)
- `OnBeforeCopyTimeSheetLineArchive(var ToTimeSheetHeader: Record "Time Sheet Header"; var FromTimeSheetLineArchive: Record "Time Sheet Line Archive"; CopyComments: Boolean; var NextLineNo: Integer; var IsHandled: Boolean)` (integration)
- `OnAfterCheckTimeSheetLineFieldsVisible(var WorkTypeCodeVisible: Boolean; var JobFieldsVisible: Boolean; var ChargeableVisible: Boolean; var ServiceOrderNoVisible: Boolean; var AbsenceCauseVisible: Boolean; var AssemblyOrderNoVisible: Boolean)` (integration)
- `OnBeforeCheckTimeSheetLineFieldsVisible(var ServiceOrderNoVisible: Boolean)` (integration)
  - subscribers: [Codeunit 6451 "Serv. Time Sheet Mgt."](../codeunit/6451.md) OnBeforeCheckTimeSheetLineFieldsVisible
- `OnCreateTSLineFromDocLineOnBeforeTimeSheetLineInsert(var TimeSheetLine: Record "Time Sheet Line"; TableID: Integer; OrderNo: Code[20]; OrderLineNo: Integer)` (integration)
  - subscribers: [Codeunit 6451 "Serv. Time Sheet Mgt."](../codeunit/6451.md) OnCreateTSLineFromDocLineOnBeforeTimeSheetLineInsert
- `OnBeforeTimeSheetDetailInsert(var ToTimeSheetDetail: Record "Time Sheet Detail"; FromTimeSheetDetail: Record "Time Sheet Detail"; var IsHandled: Boolean)` (integration)
- `OnCopyTimeSheetLineArchiveOnBeforeToTimeSheetLineInsert(var ToTimeSheetLine: Record "Time Sheet Line"; FromTimeSheetLineArchive: Record "Time Sheet Line Archive")` (integration)
- `OnBeforeCheckAccPeriod(Date: Date; var IsHandled: Boolean)` (integration)
- `OnBeforeCopyTimeSheetLineArchiveDetails(var FromTimeSheetLineArchive: Record "Time Sheet Line Archive"; var ToTimeSheetLine: Record "Time Sheet Line"; var IsHandled: Boolean)` (integration)

## Procedures

- `IsUserTimeSheetAdmin(UserId: Text): Boolean`
- `FilterTimeSheets(var TimeSheetHeader: Record "Time Sheet Header"; FieldNo: Integer)`
- `FilterTimeSheets(var TimeSheetHeader: Record "Time Sheet Header"; FieldNo: Integer; ApplyToAdmin: Boolean)`
- `FilterAllTimeSheetLines(var TimeSheetLine: Record "Time Sheet Line"; ActionType: Option Submit,ReopenSubmitted,Approve,ReopenApproved,Reject)`
- `CheckTimeSheetNo(var TimeSheetHeader: Record "Time Sheet Header"; TimeSheetNo: Code[20])`
- `SetTimeSheetNo(TimeSheetNo: Code[20]; var TimeSheetLine: Record "Time Sheet Line")`
- `LookupOwnerTimeSheet(var TimeSheetNo: Code[20]; var TimeSheetLine: Record "Time Sheet Line"; var TimeSheetHeader: Record "Time Sheet Header")`
- `LookupApproverTimeSheet(var TimeSheetNo: Code[20]; var TimeSheetLine: Record "Time Sheet Line"; var TimeSheetHeader: Record "Time Sheet Header")`
- `FormatDate(Date: Date; DOWFormatType: Option Full,Short): Text[30]`
- `CheckAccPeriod(Date: Date)`
- `CheckResourceTimeSheetOwner(TimeSheetOwnerUserID: Code[50]; CurrResourceNo: Code[20])`
- `CalcStatusFactBoxData(var TimeSheetHeader: Record "Time Sheet Header"; var OpenQty: Decimal; var SubmittedQty: Decimal; var RejectedQty: Decimal; var ApprovedQty: Decimal; var PostedQty: Decimal; var TotalQuantity: Decimal)`
- `CalcActSchedFactBoxData(TimeSheetHeader: Record "Time Sheet Header"; var DateDescription: array[7] of Text[30]; var DateQuantity: array[7] of Text[30]; var TotalQtyText: Text[30]; var TotalPresenceQty: Decimal; var AbsenceQty: Decimal)`
- `CalcActSchedFactBoxData(TimeSheetHeader: Record "Time Sheet Header"; var DateDescription: array[7] of Text[30]; var DateQuantity: array[7] of Text[30]; var TotalQtyText: Text[30]; var TotalPresenceQty: Decimal; var AbsenceQty: Decimal; var TotalScheduledQty: Decimal)`
- `FormatActualSched(ActualQty: Decimal; ScheduledQty: Decimal): Text[30]`
- `FilterTimeSheetsArchive(var TimeSheetHeaderArchive: Record "Time Sheet Header Archive"; FieldNo: Integer)`
- `CheckTimeSheetArchiveNo(var TimeSheetHeaderArchive: Record "Time Sheet Header Archive"; TimeSheetNo: Code[20])`
- `GetTimeSheetDataCaption(TimeSheetHeader: Record "Time Sheet Header"): Text`
- `SetTimeSheetArchiveNo(TimeSheetNo: Code[20]; var TimeSheetLineArchive: Record "Time Sheet Line Archive")`
- `LookupOwnerTimeSheetArchive(var TimeSheetNo: Code[20]; var TimeSheetLineArchive: Record "Time Sheet Line Archive"; var TimeSheetHeaderArchive: Record "Time Sheet Header Archive")`
- `LookupApproverTimeSheetArchive(var TimeSheetNo: Code[20]; var TimeSheetLineArchive: Record "Time Sheet Line Archive"; var TimeSheetHeaderArchive: Record "Time Sheet Header Archive")`
- `CalcSummaryArcFactBoxData(TimeSheetHeaderArchive: Record "Time Sheet Header Archive"; var DateDescription: array[7] of Text[30]; var DateQuantity: array[7] of Decimal; var TotalQuantity: Decimal; var AbsenceQuantity: Decimal)`
- `MoveTimeSheetToArchive(TimeSheetHeader: Record "Time Sheet Header")`
- `CheckTimeSheetLineFieldsVisible(var WorkTypeCodeVisible: Boolean; var JobFieldsVisible: Boolean; var ChargeableVisible: Boolean; var ServiceOrderNoVisible: Boolean; var AbsenceCauseVisible: Boolean; var AssemblyOrderNoVisible: Boolean)`
- `SelectAndCopyTimeSheetLines(ToTimeSheetHeader: Record "Time Sheet Header"; CopyComments: Boolean)`
- `CheckCopyPrevTimeSheetLines(TimeSheetHeader: Record "Time Sheet Header")`
- `CopyPrevTimeSheetLines(ToTimeSheetHeader: Record "Time Sheet Header")`
- `CalcPrevTimeSheetLines(ToTimeSheetHeader: Record "Time Sheet Header"): Integer`
- `CheckCreateLinesFromJobPlanning(TimeSheetHeader: Record "Time Sheet Header"): Integer`
- `CreateLinesFromJobPlanning(TimeSheetHeader: Record "Time Sheet Header"): Integer`
- `CalcLinesFromJobPlanning(TimeSheetHeader: Record "Time Sheet Header"): Integer`
- `FindTimeSheet(var TimeSheetHeader: Record "Time Sheet Header"; Which: Option Prev,Next): Code[20]`
- `FindTimeSheetArchive(var TimeSheetHeaderArchive: Record "Time Sheet Header Archive"; Which: Option Prev,Next): Code[20]`
- `GetDateFilter(StartingDate: Date; EndingDate: Date): Text[30]`
- `CreateTSLineFromDocLine(TableID: Integer; ResourceNo: Code[20]; PostingDate: Date; DocumentNo: Code[20]; OrderNo: Code[20]; OrderLineNo: Integer; WorkTypeCode: Code[10]; Chargbl: Boolean; Desc: Text[100]; Quantity: Decimal)`
- `CreateTSLineFromAssemblyLine(AssemblyHeader: Record "Assembly Header"; AssemblyLine: Record "Assembly Line"; Qty: Decimal)`
- `CreateTSPostingEntry(TimeSheetDetail: Record "Time Sheet Detail"; Qty: Decimal; PostingDate: Date; DocumentNo: Code[20]; Desc: Text[100])`
- `CheckTSLineDetailPosting(TimeSheetNo: Code[20]; TimeSheetLineNo: Integer; TimeSheetDate: Date; QtyToPost: Decimal; QtyPerUnitOfMeasure: Decimal; var MaxAvailableQty: Decimal): Boolean`
- `CheckResJnlLine(ResJnlLine: Record "Res. Journal Line")`
- `CheckJobJnlLine(JobJnlLine: Record "Job Journal Line")`
- `CopyFilteredTimeSheetLinesToBuffer(var TimeSheetLineFrom: Record "Time Sheet Line"; var TimeSheetLineTo: Record "Time Sheet Line")`
- `UpdateTimeAllocation(TimeSheetLine: Record "Time Sheet Line"; AllocatedQty: array[7] of Decimal)`
- `GetActivityInfo(TimeSheetLine: Record "Time Sheet Line"; var ActivityCaption: Text[30]; var ActivityID: Code[20]; var ActivitySubCaption: Text[30]; var ActivitySubID: Code[20])`
- `ShowPostingEntries(TimeSheetNo: Code[20]; TimeSheetLineNo: Integer)`
- `FindNearestTimeSheetStartDate(Date: Date): Date`

Plus 12 local procedures.

## Triggers

OnRun

## Called by

From the extracted call graph of BC29 (graphify-al on the snapshot checkout): calls whose target is known from a declared type or an `Object::"Name"` argument. Interface dispatch and calls through events are not counted, so the list is not complete.

- [Page 952 "Manager Time Sheet"](../page/952.md) (5 calls: `FindTimeSheet → FindTimeSheet`, `FindTimeSheet → SetTimeSheetNo`, `OnOpenPage → SetTimeSheetNo`, …)
- [Page 974 "Time Sheet Lines Subform"](../page/974.md) (5 calls: `FilterAllLines → FilterAllTimeSheetLines`, `OnOpenPage → CheckTimeSheetLineFieldsVisible`, `Process → CopyFilteredTimeSheetLinesToBuffer`, …)
- [Page 959 "Time Sheet Archive"](../page/959.md) (4 calls: `FindTimeSheet → FindTimeSheetArchive`, `FindTimeSheet → SetTimeSheetArchiveNo`, `OnOpenPage → SetTimeSheetArchiveNo`, …)
- [Page 961 "Manager Time Sheet Archive"](../page/961.md) (4 calls: `FindTimeSheet → FindTimeSheetArchive`, `FindTimeSheet → SetTimeSheetArchiveNo`, `OnOpenPage → SetTimeSheetArchiveNo`, …)
- [Codeunit 6451 "Serv. Time Sheet Mgt."](../codeunit/6451.md) (3 calls: `CheckServiceLine → CheckTSLineDetailPosting`, `CreateTSLineFromServiceLine → CreateTSLineFromDocLine`, `CreateTSLineFromServiceShptLine → CreateTSLineFromDocLine`)
- [Page 949 "Time Sheet Lines"](../page/949.md) (3 calls: `GetDataFromTimeSheetArchiveQuery → IsUserTimeSheetAdmin`, `GetDataFromTimeSheetQuery → IsUserTimeSheetAdmin`, `OnOpenPage → CheckTimeSheetLineFieldsVisible`)
- [Page 973 "Time Sheet Card"](../page/973.md) (3 calls: `CheckSetDefaultOwnerFilter → FilterTimeSheets`, `FilterAllLines → FilterAllTimeSheetLines`, `GetDataCaption → GetTimeSheetDataCaption`)
- [Table 950 "Time Sheet Header"](../table/950.md) (3 calls: `FindCurrentTimeSheetNo → FilterTimeSheets`, `FindLastTimeSheetNo → FilterTimeSheets`, `FindTimeSheetList → FilterTimeSheets`)
- [Codeunit 952 "Time Sheet Chart Mgt."](../codeunit/952.md) (2 calls: `DrillDown → SetTimeSheetNo`, `OnOpenPage → FindNearestTimeSheetStartDate`)
- [Page 954 "Manager Time Sheet by Job"](../page/954.md) (2 calls: `Process → CopyFilteredTimeSheetLinesToBuffer`, `SetColumns → FormatDate`)
- [Page 957 "Time Sheet Status FactBox"](../page/957.md) (2 calls: `UpdateData → CalcStatusFactBoxData`, `UpdateDataInclFilters → CalcStatusFactBoxData`)
- [Table 952 "Time Sheet Detail"](../table/952.md) (2 calls: `OnInsert → CheckAccPeriod`, `OnModify → CheckAccPeriod`)
- [Codeunit 1011 "Job Jnl.-Check Line"](../codeunit/1011.md) (1 call: `RunCheck → CheckJobJnlLine`)
- [Codeunit 211 "Res. Jnl.-Check Line"](../codeunit/211.md) (1 call: `RunCheck → CheckResJnlLine`)
- [Codeunit 212 "Res. Jnl.-Post Line"](../codeunit/212.md) (1 call: `PostTimeSheetDetail → CreateTSPostingEntry`)
- [Codeunit 900 "Assembly-Post"](../codeunit/900.md) (1 call: `PostResourceConsumption → CreateTSLineFromAssemblyLine`)
- [Codeunit 951 "Time Sheet Approval Management"](../codeunit/951.md) (1 call: `PostAbsence → CreateTSPostingEntry`)
- [Page 946 "Time Sheet Line List"](../page/946.md) (1 call: `OnOpenPage → CheckTimeSheetLineFieldsVisible`)
- [Page 951 "Time Sheet List"](../page/951.md) (1 call: `OnOpenPage → FilterTimeSheets`)
- [Page 953 "Manager Time Sheet List"](../page/953.md) (1 call: `OnOpenPage → FilterTimeSheets`)
- [Page 956 "Actual/Sched. Summary FactBox"](../page/956.md) (1 call: `UpdateData → CalcActSchedFactBoxData`)
- [Page 960 "Time Sheet Archive List"](../page/960.md) (1 call: `OnOpenPage → FilterTimeSheetsArchive`)
- [Page 962 "Manager Time Sheet Arc. List"](../page/962.md) (1 call: `OnOpenPage → FilterTimeSheetsArchive`)
- [Page 964 "Period Summary Archive FactBox"](../page/964.md) (1 call: `UpdateData → CalcSummaryArcFactBoxData`)
- [Page 970 "Time Sheet Allocation"](../page/970.md) (1 call: `OnOpenPage → FormatDate`)
- [Page 971 "Activity Details FactBox"](../page/971.md) (1 call: `OnAfterGetRecord → GetActivityInfo`)
- [Page 975 "Time Sheet Archive Card"](../page/975.md) (1 call: `CheckSetDefaultOwnerFilter → FilterTimeSheetsArchive`)
- [Page 976 "Time Sheet Archive Subform"](../page/976.md) (1 call: `SetColumns → FormatDate`)
- [Report 951 "Suggest Res. Jnl. Lines"](../report/951.md) (1 call: `OnPreReport → GetDateFilter`)
- [Report 952 "Suggest Job Jnl. Lines"](../report/952.md) (1 call: `OnPostReport → GetDateFilter`)
- [Table 954 "Time Sheet Header Archive"](../table/954.md) (1 call: `FindLastTimeSheetArchiveNo → FilterTimeSheetsArchive`)

## Across versions

- Present in: BC23-30
- Changed (declaration) in: BC24-25, BC27-28

Source: AL metadata extracted from the code (names, ids, signatures, properties); no code bodies (D10).

## Ask your agent

Procedure bodies are not stored here (D10). The call sections above are our own, per object, from the BC29 call graph. For a procedure body or the calls of one procedure, ask bc-code-atlas (external, by Stefan Maron, MIT; default corpus w1-28), which the bc-observatory plugin connects: `bcatlas_resolve_node(object_type: "codeunit", object_name: "Time Sheet Management")`, then `bcatlas_get_procedure_body` or `bcatlas_get_neighbors` on the returned id.
