From 1d773eb88283924f432db5051418c713c6411fae Mon Sep 17 00:00:00 2001 From: Onat Buyukakkus <55088871+onbuyuka@users.noreply.github.com> Date: Thu, 13 Aug 2026 15:06:30 +0200 Subject: [PATCH 1/3] Add API - Codeunits app with initial API codeunits New W1 app (id range 6007-6014, target Cloud) exposing selected non-data-bound Business Central operations as API codeunits under the microsoft/codeunits route. Includes five wrapper codeunits - No. Series, Approvals, Environment, Identity and Date Time - plus the objects permission set. The API subtype/publisher attributes depend on platform AB#641822 and will be added when it ships. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb90ebfd-967b-4ba4-98ec-57b054806669 --- src/Apps/W1/APICodeunits/app/.objidconfig | 3 + .../W1/APICodeunits/app/ExtensionLogo.png | Bin 0 -> 5446 bytes src/Apps/W1/APICodeunits/app/app.json | 26 ++++ .../src/Approvals/ApprovalsAPI.Codeunit.al | 57 +++++++ .../app/src/DateTime/DateTimeAPI.Codeunit.al | 144 ++++++++++++++++++ .../Environment/EnvironmentAPI.Codeunit.al | 143 +++++++++++++++++ .../app/src/Identity/IdentityAPI.Codeunit.al | 109 +++++++++++++ .../app/src/NoSeries/NoSeriesAPI.Codeunit.al | 119 +++++++++++++++ .../APICodeunitsObjects.PermissionSet.al | 20 +++ 9 files changed, 621 insertions(+) create mode 100644 src/Apps/W1/APICodeunits/app/.objidconfig create mode 100644 src/Apps/W1/APICodeunits/app/ExtensionLogo.png create mode 100644 src/Apps/W1/APICodeunits/app/app.json create mode 100644 src/Apps/W1/APICodeunits/app/src/Approvals/ApprovalsAPI.Codeunit.al create mode 100644 src/Apps/W1/APICodeunits/app/src/DateTime/DateTimeAPI.Codeunit.al create mode 100644 src/Apps/W1/APICodeunits/app/src/Environment/EnvironmentAPI.Codeunit.al create mode 100644 src/Apps/W1/APICodeunits/app/src/Identity/IdentityAPI.Codeunit.al create mode 100644 src/Apps/W1/APICodeunits/app/src/NoSeries/NoSeriesAPI.Codeunit.al create mode 100644 src/Apps/W1/APICodeunits/app/src/Permissions/APICodeunitsObjects.PermissionSet.al diff --git a/src/Apps/W1/APICodeunits/app/.objidconfig b/src/Apps/W1/APICodeunits/app/.objidconfig new file mode 100644 index 00000000000..8377a2dbdaf --- /dev/null +++ b/src/Apps/W1/APICodeunits/app/.objidconfig @@ -0,0 +1,3 @@ +{ + "appPoolId": "0ef705b60e6900f11232505938e0e8a87867b9eac95b5a0d58dd87d6cbb44014" +} diff --git a/src/Apps/W1/APICodeunits/app/ExtensionLogo.png b/src/Apps/W1/APICodeunits/app/ExtensionLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2c9a626cb9617350617c40cd73904129d4c108 GIT binary patch literal 5446 zcma)=S5VVywD$iAMIcgC2u+$uktV%J6$Dhev_NQrfC^Fsq!|cJ=^|Z`P&U*^N-uuwi#_w5i!*aB*89x5SkKKnv*ua91anhEW+omc005Zp+`e`1 zOsW4C1O3^nWxbYuCX9Z!?E(M*a`E2+jm<_J0|5K}om)4pLZ&wJ&3t(K(|ffcq#?ky z#^aeQO#|lO9vyUeb0ezqQtpipl3Sj#-xy!eh7lu@5+BnW zNhL-~3Zpw&1u=bMN*Q(sgYksq4dM>Iw7p&Qk_Su~b*PgEs#LK~^K}aDaTG_6Q?_tM<8wOS}`Z+?~Et8GB>T%(k7$9`DL!d5)f!ZoXco-vj+s_QLEs2cf zKM&F>#c9w|TmM9MFtl8L*cYQgl9khf5CYMR)DJOUf;M~a9|+ys@RYR zCusNC(CSlUk|r`qdS&ZKh$O=@#&e0>;W~S#|KjHdfLx!-J9r1JtP4RGIhS|Rm0eZ6 z7eOE~Zfo4Li~K^|&)d^-r?8Rh2Q}#ZjL=?VJZ7~hlp4(!U!0K%679I`OR&x54*0&4 znho|hKu)WR)4PUVA1}N;jXHg}AG+gSKQ6O_fEP^Y51!LwBERH09|t!GNx2KH4co>r zA%cgSHxh2Sezx-w!S5DTG#0zVCbnLM6BP}2P-G{8 zh**wJHj<652FS05bSQNx-0fS7^(wREYvZwpt;$!!k4H0U*iyhS8(syBDMv>L<)~LI zPl!Y^-cM{_J@{hY1=XJ#T=Ef(FD!I^r1^lca3c0ftVuvo-(%!Zn)C1bK{}-i*Jc); zIIc+o&iMgvboj&4`@5sF23MV!*zIVmA0>{1;*H*faMAG6EZ7XydTfaGyABAGx>)yl z@Y+|)SVxCx@!GWqspay7GBetK*s2@CJ?s{8v!(b|ShLb|O;3T1rAMB?DJ?Z`@013q zoyIvV84eYiS+?kRJOz`3AFcR~ZQ1Uq7wCnbSJ%-HZwhAnJ^4zDp2W8I)~WI7ush5> z&f3O)rj~2ZGr!c@=p3!n>jG-O#9`$7&WyF7bB}(rq4ldokUp5TY?E62r+YJbJp8Jf znDW3fYZ^nBQ9O}3?zH_*mZ9+G#HHnwop1Vfm!Df~{Z%D?5KzMN&RA>&#q8iCzTfAt zV#TyMeyyh8=M$8tyA|KeUwo_Q6Si)P)%n(W-*QE~08BG|>J!sQPq?IF;;%1ypP?Z` zK_0Un>p;9=9d675ELHboC0+fNMY&(;k(|=0TS>ka)BKI3q#)zx!Jp@zv0QfeEAjU< z=vI5@-d^A^-*#|P+b2QFiGxk4z<8Tp4p6{aOp88x>SQEa0M`VxX%IUb$bya!5EgRf6$fFw zp}jNTKUXjNe0x(;)Nu)Ij5K?QD0u6~mRHQ-!;6m#VP>)}=irAqy;f$e{W-EWnR75~ zm2b0u@r7ASk4x0oTqs9{f&F|eAmD*Gf^A;te7f}J{dXqLaH_4%D_(mnp0VmWhq>^E z&7>5*-mh>FX{w5SJf^#th&GrpOQk58U-+4 zq3$q~C4ySH7@lr>W+|c0`UF*ieC+3vC1$4m}F(ic|G7}QDt(t z7`#>$c4U-4LU_;nWHhdN9Fcv~L8h6M_}nW&EGTjgW(=c}uD9>eU^rDOrkNg_effOV z^8z_y=vNIt{`wOfgG2o^3ey`R!aP1=t7Mz@&MKK3>_BH_QkgNO@4IoQ-2d8EqsDg) zTMb-5lqlubRot-7!RD@+udO?O9_Da3XV5bvjW zXTb2psHUdeiIaI(lknQE_<+YlY31}R!VfoM_BuILQ{>Q89=LB5j;V|-yAW2gY82+~ zYlu~#*R(cHw2NO1h5xaiAD2oiIEQ-aQyA-D^y^z2ZHNfM{o(3M#SbqOP3>k9FOdDO z(t%c9hk)NCPe_8>=Y^U-_-6IwS-D0cE=pwdyLp!;r-fWiXtbUS$<dl!~WV$TR8 zP$KU?K>m?*O)mSGccn&kn|nj7NXFeo<0D=ue8s^~BK#P?J~gB}v5<0nK9GPipjT#9 zkm6yXFyLlgoUIDEVxw*0Z-WDqp8swCs(bcjAqdDLl1oUqYf#a`NjT6IO3?=P`FvUZ zlWC&lWb9_dexSz%N~-oscM`oC%b#KS|KS7AptwRX5h&1VDCKWzP{&??TFdF3h53&c zU(v)WhOr)#!V6Y6d7CzOO-@KF%@67>kh34@Exj7Rh}p5_0?yUeyC7@c7DHf+mW=~wpLeLYDA9#W-Ri*S|M@g zjPHH@qHrPuzq(+5y$V*UoFEg(g$$mRNUEF!C{IN3Rig{tU54W|OD_`M0G3u)B{WhC z*D?hTF7J+YdF8-Z-Uuw{3jBx`_!aus`uDDBecwuu&tsVpj2~DZJb2-!a2l??m{}er}lR6Lqu)-2+Vm)jr(g{nfQPx9-<^1d;k-d zkU{E^g7qwp+D`b+QtU5@+swaVKp9<`>sT~U)O!EEMBo!*)~s_<`6Yl z7fX2;ki>kVDfdietW1k;TYvaY({>?5X)&(d&_y<-J7Qa@b z(zwGCI=`P#^b>1>2#Y!9T5|AdtaU|zXxw9^KpIu6CAmQf$GzaeOJmYVsc3eh5%6lb z)t~(Ak2J`;KW_L6psME-h?xF6ryr4d{q;>-b`Q$L43T{r`{N?U6cqP(Q3f%kA8`c@ z<82KXjte|7u_Lo~MV!d%y$tYi(hzU$6t+*ml~Z&Mg{eK?@}^XEBK+-&j`Uv95x)=_ zZLs=Mpg_IuZenjm(~}b8Aggaaje8NX$A_7^G%-)!xtu)C{N|S<3hVOmU;{|i+q6zn zfr(1Ua*jF!%-dU3L}O2fvWAe%-4kxtXo_vJHF(AxSx)4AI8-$^uBQO_86Z_y%RZX4 zJpu5`pOAztxv?jXv9yx|r>#9!0|`71C-fli@v${6r+V$hgvcr|W_I`{=7*0s(PKQH zzn8r2+tSeD15stz|DIJ3%X%8EkyN?bsHhuq4(5D0Oewn_)-o)Nx$eNs{0V*ZTSVt4 z3ifXGGw5fBv+9b6d~Nl+08L4VbbZqf3DL^e?l@!uZVdWkdOpJPaE?{zF!ZI?c(vF3 zvX~OK4vktvm&R$MgNpiKA~&zT!1#H7!q1h7AQiuSNG9<=$64)Zym(UQ``(j#^hDzt}{aur0pS?mmBi&z4I0Jfieqh%Pa_A%N?_1OZHm-S{ zQ*)4(N_J;y7tRh0o>xs25-s9!M-)i;@I68#SGXB2XgS}N zx_r3%V)z1jLA_M&?)E^DT$kzdHMJF%e2w6BH@iI5tKWM+zcuhCsz@N0a_1RBvrdZx zjzD>V%;c4*$RkEv{zHuVyaB+ANl(iT8w{pJdziC7YcO2&(ciqGLhs@q-dNh! zkV_V_(_~$*>ND}j1yozMedYnu-_GKMh?IpP<@D+edeB4M%3@xr3oj{@mdFKoBVpm^)1_}Y^}rOWBSB|Uv)*-pTdiU ztW9~{qq5@iB+$QpbeJVKH^n^9vV})i>Z@2CHoY2$PC888c;#Yz-pHRK@EVheWhE!> zZzjPmy?0Ni8#=o_k6_s3DY7nS^&Bm}BW&ZfAuF7bQbDgAGM$dE)RM6RvdobKb&MhsYD4exRm9*jcHPjbz#rI?vj$u zPLF5Gjv|8}?ta9`&^H}Va3H;llghU-BC7pxo6?-eTP`7CUZHJrw{5 zhkDYeIYlhL%brQJ1X#<#fz#E}Z87Kj=Hde*f{l|A`9E my8jz0{9hgZgN;Rh%;ug!HJ{lE_@04L;EulOt!iDD=>G@$cU!Ii literal 0 HcmV?d00001 diff --git a/src/Apps/W1/APICodeunits/app/app.json b/src/Apps/W1/APICodeunits/app/app.json new file mode 100644 index 00000000000..deeb4969484 --- /dev/null +++ b/src/Apps/W1/APICodeunits/app/app.json @@ -0,0 +1,26 @@ +{ + "id": "2573cc59-1cfc-4991-85e4-32d0cc0f60e2", + "name": "API - Codeunits", + "publisher": "Microsoft", + "version": "29.0.0.0", + "brief": "Exposes selected Business Central operations as API codeunits.", + "description": "Provides non-data-bound API codeunits (unbound actions) under the microsoft/codeunits route, wrapping standard Business Central operations for programmatic and agent (MCP) access.", + "privacyStatement": "https://go.microsoft.com/fwlink/?linkid=724009", + "EULA": "https://go.microsoft.com/fwlink/?linkid=2009120", + "help": "https://go.microsoft.com/fwlink/?linkid=2103698", + "url": "https://go.microsoft.com/fwlink/?linkid=724011", + "contextSensitiveHelpUrl": "https://go.microsoft.com/fwlink/?linkid=2134520", + "logo": "ExtensionLogo.png", + "platform": "29.0.0.0", + "application": "29.0.0.0", + "target": "Cloud", + "idRanges": [ + { + "from": 6007, + "to": 6014 + } + ], + "features": [ + "TranslationFile" + ] +} diff --git a/src/Apps/W1/APICodeunits/app/src/Approvals/ApprovalsAPI.Codeunit.al b/src/Apps/W1/APICodeunits/app/src/Approvals/ApprovalsAPI.Codeunit.al new file mode 100644 index 00000000000..4d095e25bfa --- /dev/null +++ b/src/Apps/W1/APICodeunits/app/src/Approvals/ApprovalsAPI.Codeunit.al @@ -0,0 +1,57 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace Microsoft.API.Codeunits; + +using System.Automation; + +/// +/// API codeunit exposing workflow approval operations as non-data-bound (unbound) actions. +/// Wraps codeunit "Workflow Webhook Subscription" (1544). +/// +/// TODO(AB#641822): decorate with the API codeunit subtype (microsoft/codeunits) when the platform ships it. +codeunit 6008 "Approvals API" +{ + Access = Public; + InherentEntitlements = X; + InherentPermissions = X; + + /// Approves the specified workflow step instance. + /// The workflow step instance to approve. + procedure Approve(WorkflowStepInstanceId: Guid) + var + WorkflowWebhookSubscription: Codeunit "Workflow Webhook Subscription"; + begin + WorkflowWebhookSubscription.Approve(WorkflowStepInstanceId); + end; + + /// Rejects the specified workflow step instance. + /// The workflow step instance to reject. + procedure Reject(WorkflowStepInstanceId: Guid) + var + WorkflowWebhookSubscription: Codeunit "Workflow Webhook Subscription"; + begin + WorkflowWebhookSubscription.Reject(WorkflowStepInstanceId); + end; + + /// Cancels the specified workflow step instance. + /// The workflow step instance to cancel. + procedure Cancel(WorkflowStepInstanceId: Guid) + var + WorkflowWebhookSubscription: Codeunit "Workflow Webhook Subscription"; + begin + WorkflowWebhookSubscription.Cancel(WorkflowStepInstanceId); + end; + + /// Returns the email address of the direct approver for the given requestor. + /// The requestor's email address. + /// The direct approver's email address. + procedure GetDirectApprover(RequestorEmailAddress: Text): Text + var + WorkflowWebhookSubscription: Codeunit "Workflow Webhook Subscription"; + begin + exit(WorkflowWebhookSubscription.GetDirectApprover(RequestorEmailAddress)); + end; +} diff --git a/src/Apps/W1/APICodeunits/app/src/DateTime/DateTimeAPI.Codeunit.al b/src/Apps/W1/APICodeunits/app/src/DateTime/DateTimeAPI.Codeunit.al new file mode 100644 index 00000000000..1a1f5bf2cbb --- /dev/null +++ b/src/Apps/W1/APICodeunits/app/src/DateTime/DateTimeAPI.Codeunit.al @@ -0,0 +1,144 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace Microsoft.API.Codeunits; + +using System.DateTime; + +/// +/// API codeunit exposing date, time zone and recurrence operations as non-data-bound (unbound) actions. +/// Wraps "Recurrence Schedule" (4690), "Time Zone" (8720) and "Unix Timestamp" (8722). +/// +/// TODO(AB#641822): decorate with the API codeunit subtype (microsoft/codeunits) when the platform ships it. +codeunit 6012 "Date Time API" +{ + Access = Public; + InherentEntitlements = X; + InherentPermissions = X; + + /// Calculates the next occurrence of a recurrence after the given last occurrence. + /// The recurrence ID. + /// The last occurrence date/time. + procedure CalculateNextOccurrence(RecurrenceID: Guid; LastOccurrence: DateTime): DateTime + var + RecurrenceSchedule: Codeunit "Recurrence Schedule"; + begin + exit(RecurrenceSchedule.CalculateNextOccurrence(RecurrenceID, LastOccurrence)); + end; + + /// Returns a human-readable description of the recurrence. + /// The recurrence ID. + procedure RecurrenceDisplayText(RecurrenceID: Guid): Text + var + RecurrenceSchedule: Codeunit "Recurrence Schedule"; + begin + exit(RecurrenceSchedule.RecurrenceDisplayText(RecurrenceID)); + end; + + /// Creates a daily recurrence and returns its ID. + procedure CreateDaily(StartTime: Time; StartDate: Date; EndDate: Date; DaysBetween: Integer): Guid + var + RecurrenceSchedule: Codeunit "Recurrence Schedule"; + begin + exit(RecurrenceSchedule.CreateDaily(StartTime, StartDate, EndDate, DaysBetween)); + end; + + /// Creates a weekly recurrence and returns its ID. + procedure CreateWeekly(StartTime: Time; StartDate: Date; EndDate: Date; WeeksBetween: Integer; Monday: Boolean; Tuesday: Boolean; Wednesday: Boolean; Thursday: Boolean; Friday: Boolean; Saturday: Boolean; Sunday: Boolean): Guid + var + RecurrenceSchedule: Codeunit "Recurrence Schedule"; + begin + exit(RecurrenceSchedule.CreateWeekly(StartTime, StartDate, EndDate, WeeksBetween, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)); + end; + + /// Creates a monthly-by-day-of-month recurrence and returns its ID. + procedure CreateMonthlyByDay(StartTime: Time; StartDate: Date; EndDate: Date; MonthsBetween: Integer; DayOfMonth: Integer): Guid + var + RecurrenceSchedule: Codeunit "Recurrence Schedule"; + begin + exit(RecurrenceSchedule.CreateMonthlyByDay(StartTime, StartDate, EndDate, MonthsBetween, DayOfMonth)); + end; + + /// Returns the time zone offset for the given date/time in the current time zone. + procedure GetTimezoneOffset(SourceDateTime: DateTime): Duration + var + TimeZone: Codeunit "Time Zone"; + begin + exit(TimeZone.GetTimezoneOffset(SourceDateTime)); + end; + + /// Returns the time zone offset for the given date/time in the specified time zone. + procedure GetTimezoneOffset(SourceDateTime: DateTime; TimeZoneId: Text): Duration + var + TimeZone: Codeunit "Time Zone"; + begin + exit(TimeZone.GetTimezoneOffset(SourceDateTime, TimeZoneId)); + end; + + /// Returns the offset between two time zones for the given date/time. + procedure GetTimezoneOffset(SourceDateTime: DateTime; SourceTimeZoneId: Text; DestinationTimeZoneId: Text): Duration + var + TimeZone: Codeunit "Time Zone"; + begin + exit(TimeZone.GetTimezoneOffset(SourceDateTime, SourceTimeZoneId, DestinationTimeZoneId)); + end; + + /// Returns whether the specified time zone supports daylight saving time. + procedure TimeZoneSupportsDaylightSavingTime(TimeZoneId: Text): Boolean + var + TimeZone: Codeunit "Time Zone"; + begin + exit(TimeZone.TimeZoneSupportsDaylightSavingTime(TimeZoneId)); + end; + + /// Returns whether the given date/time is in daylight saving time for the specified time zone. + procedure IsDaylightSavingTime(DateTimeToCheck: DateTime; TimeZoneId: Text): Boolean + var + TimeZone: Codeunit "Time Zone"; + begin + exit(TimeZone.IsDaylightSavingTime(DateTimeToCheck, TimeZoneId)); + end; + + /// Returns the current Unix timestamp in seconds. + procedure CreateTimestampSeconds(): BigInteger + var + UnixTimestamp: Codeunit "Unix Timestamp"; + begin + exit(UnixTimestamp.CreateTimestampSeconds()); + end; + + /// Returns the Unix timestamp in seconds for the given date/time. + procedure CreateTimestampSeconds(DateTimeFrom: DateTime): BigInteger + var + UnixTimestamp: Codeunit "Unix Timestamp"; + begin + exit(UnixTimestamp.CreateTimestampSeconds(DateTimeFrom)); + end; + + /// Returns the current Unix timestamp in milliseconds. + procedure CreateTimestampMilliseconds(): BigInteger + var + UnixTimestamp: Codeunit "Unix Timestamp"; + begin + exit(UnixTimestamp.CreateTimestampMilliseconds()); + end; + + /// Returns the Unix timestamp in milliseconds for the given date/time. + procedure CreateTimestampMilliseconds(DateTimeFrom: DateTime): BigInteger + var + UnixTimestamp: Codeunit "Unix Timestamp"; + begin + exit(UnixTimestamp.CreateTimestampMilliseconds(DateTimeFrom)); + end; + + /// Converts a Unix timestamp back to a date/time. + /// The Unix timestamp. + procedure EvaluateTimestamp(Timestamp: BigInteger): DateTime + var + UnixTimestamp: Codeunit "Unix Timestamp"; + begin + exit(UnixTimestamp.EvaluateTimestamp(Timestamp)); + end; +} diff --git a/src/Apps/W1/APICodeunits/app/src/Environment/EnvironmentAPI.Codeunit.al b/src/Apps/W1/APICodeunits/app/src/Environment/EnvironmentAPI.Codeunit.al new file mode 100644 index 00000000000..1bfb7d190c8 --- /dev/null +++ b/src/Apps/W1/APICodeunits/app/src/Environment/EnvironmentAPI.Codeunit.al @@ -0,0 +1,143 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace Microsoft.API.Codeunits; + +using System.Azure.Identity; +using System.Environment; + +/// +/// API codeunit exposing environment, tenant and license context as non-data-bound (unbound) reads. +/// Wraps "Environment Information" (457), "Azure AD Tenant" (433) and "Tenant License State" (2300). +/// +/// TODO(AB#641822): decorate with the API codeunit subtype (microsoft/codeunits) when the platform ships it. +codeunit 6010 "Environment API" +{ + Access = Public; + InherentEntitlements = X; + InherentPermissions = X; + + /// Returns whether the environment is a production environment. + procedure IsProduction(): Boolean + var + EnvironmentInformation: Codeunit "Environment Information"; + begin + exit(EnvironmentInformation.IsProduction()); + end; + + /// Returns whether the environment is a sandbox environment. + procedure IsSandbox(): Boolean + var + EnvironmentInformation: Codeunit "Environment Information"; + begin + exit(EnvironmentInformation.IsSandbox()); + end; + + /// Returns whether the solution is running as SaaS. + procedure IsSaaS(): Boolean + var + EnvironmentInformation: Codeunit "Environment Information"; + begin + exit(EnvironmentInformation.IsSaaS()); + end; + + /// Returns the name of the environment. + procedure GetEnvironmentName(): Text + var + EnvironmentInformation: Codeunit "Environment Information"; + begin + exit(EnvironmentInformation.GetEnvironmentName()); + end; + + /// Returns the application family of the environment. + procedure GetApplicationFamily(): Text + var + EnvironmentInformation: Codeunit "Environment Information"; + begin + exit(EnvironmentInformation.GetApplicationFamily()); + end; + + /// Returns the installed version of the app with the given ID. + /// The app ID. + /// The installed major version, or 0 if not installed. + procedure VersionInstalled(AppID: Guid): Integer + var + EnvironmentInformation: Codeunit "Environment Information"; + begin + exit(EnvironmentInformation.VersionInstalled(AppID)); + end; + + /// Returns the Microsoft Entra (Azure AD) tenant ID. + procedure GetAadTenantId(): Text + var + AzureADTenant: Codeunit "Azure AD Tenant"; + begin + exit(AzureADTenant.GetAadTenantId()); + end; + + /// Returns the Microsoft Entra (Azure AD) tenant domain name. + procedure GetAadTenantDomainName(): Text + var + AzureADTenant: Codeunit "Azure AD Tenant"; + begin + exit(AzureADTenant.GetAadTenantDomainName()); + end; + + /// Returns the tenant's country/region letter code. + procedure GetCountryLetterCode(): Code[2] + var + AzureADTenant: Codeunit "Azure AD Tenant"; + begin + exit(AzureADTenant.GetCountryLetterCode()); + end; + + /// Returns the tenant's preferred language code. + procedure GetPreferredLanguage(): Code[2] + var + AzureADTenant: Codeunit "Azure AD Tenant"; + begin + exit(AzureADTenant.GetPreferredLanguage()); + end; + + /// Returns the current tenant license state. + procedure GetLicenseState(): Enum "Tenant License State" + var + TenantLicenseState: Codeunit "Tenant License State"; + begin + exit(TenantLicenseState.GetLicenseState()); + end; + + /// Returns whether the tenant is in trial mode. + procedure IsTrialMode(): Boolean + var + TenantLicenseState: Codeunit "Tenant License State"; + begin + exit(TenantLicenseState.IsTrialMode()); + end; + + /// Returns whether the tenant is in paid mode. + procedure IsPaidMode(): Boolean + var + TenantLicenseState: Codeunit "Tenant License State"; + begin + exit(TenantLicenseState.IsPaidMode()); + end; + + /// Returns the start date of the current license period. + procedure GetStartDate(): DateTime + var + TenantLicenseState: Codeunit "Tenant License State"; + begin + exit(TenantLicenseState.GetStartDate()); + end; + + /// Returns the end date of the current license period. + procedure GetEndDate(): DateTime + var + TenantLicenseState: Codeunit "Tenant License State"; + begin + exit(TenantLicenseState.GetEndDate()); + end; +} diff --git a/src/Apps/W1/APICodeunits/app/src/Identity/IdentityAPI.Codeunit.al b/src/Apps/W1/APICodeunits/app/src/Identity/IdentityAPI.Codeunit.al new file mode 100644 index 00000000000..a7a83e67b75 --- /dev/null +++ b/src/Apps/W1/APICodeunits/app/src/Identity/IdentityAPI.Codeunit.al @@ -0,0 +1,109 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace Microsoft.API.Codeunits; + +using System.Azure.Identity; +using System.Security.User; + +/// +/// API codeunit exposing identity, plan and login context as non-data-bound (unbound) reads. +/// Wraps "Azure AD Plan" (9016), "Azure AD Graph User" (9024), "Azure AD User Management" (9010) +/// and "User Login Time Tracker" (9026). +/// +/// TODO(AB#641822): decorate with the API codeunit subtype (microsoft/codeunits) when the platform ships it. +codeunit 6011 "Identity API" +{ + Access = Public; + InherentEntitlements = X; + InherentPermissions = X; + + /// Returns whether the given plan is assigned to the current user. + /// The plan ID. + procedure IsPlanAssignedToUser(PlanGUID: Guid): Boolean + var + AzureADPlan: Codeunit "Azure AD Plan"; + begin + exit(AzureADPlan.IsPlanAssignedToUser(PlanGUID)); + end; + + /// Returns whether the given plan is assigned to the specified user. + /// The plan ID. + /// The user security ID. + procedure IsPlanAssignedToUser(PlanGUID: Guid; UserGUID: Guid): Boolean + var + AzureADPlan: Codeunit "Azure AD Plan"; + begin + exit(AzureADPlan.IsPlanAssignedToUser(PlanGUID, UserGUID)); + end; + + /// Returns whether the current user is a delegated admin. + procedure IsUserDelegatedAdmin(): Boolean + var + AzureADGraphUser: Codeunit "Azure AD Graph User"; + begin + exit(AzureADGraphUser.IsUserDelegatedAdmin()); + end; + + /// Returns whether the current user is delegated. + procedure IsUserDelegated(): Boolean + var + AzureADGraphUser: Codeunit "Azure AD Graph User"; + begin + exit(AzureADGraphUser.IsUserDelegated()); + end; + + /// Returns whether the current user is a tenant admin. + procedure IsUserTenantAdmin(): Boolean + var + AzureADUserManagement: Codeunit "Azure AD User Management"; + begin + exit(AzureADUserManagement.IsUserTenantAdmin()); + end; + + /// Returns whether the specified user's permissions are customized. + /// The user security ID. + procedure ArePermissionsCustomized(UserSecurityId: Guid): Boolean + var + AzureADUserManagement: Codeunit "Azure AD User Management"; + begin + exit(AzureADUserManagement.ArePermissionsCustomized(UserSecurityId)); + end; + + /// Returns whether the specified user is logging in for the first time. + /// The user security ID. + procedure IsFirstLogin(UserSecurityID: Guid): Boolean + var + UserLoginTimeTracker: Codeunit "User Login Time Tracker"; + begin + exit(UserLoginTimeTracker.IsFirstLogin(UserSecurityID)); + end; + + /// Returns whether the current user logged in since the given date/time. + /// The date/time to check from. + procedure UserLoggedInSinceDateTime(FromDateTime: DateTime): Boolean + var + UserLoginTimeTracker: Codeunit "User Login Time Tracker"; + begin + exit(UserLoginTimeTracker.UserLoggedInSinceDateTime(FromDateTime)); + end; + + /// Returns the current user's penultimate login date/time. + procedure GetPenultimateLoginDateTime(): DateTime + var + UserLoginTimeTracker: Codeunit "User Login Time Tracker"; + begin + exit(UserLoginTimeTracker.GetPenultimateLoginDateTime()); + end; + + /// Returns the specified user's penultimate login date/time. + /// The user security ID. + procedure GetPenultimateLoginDateTime(UserSecurityID: Guid): DateTime + var + UserLoginTimeTracker: Codeunit "User Login Time Tracker"; + begin + exit(UserLoginTimeTracker.GetPenultimateLoginDateTime(UserSecurityID)); + end; +} diff --git a/src/Apps/W1/APICodeunits/app/src/NoSeries/NoSeriesAPI.Codeunit.al b/src/Apps/W1/APICodeunits/app/src/NoSeries/NoSeriesAPI.Codeunit.al new file mode 100644 index 00000000000..55348698b4b --- /dev/null +++ b/src/Apps/W1/APICodeunits/app/src/NoSeries/NoSeriesAPI.Codeunit.al @@ -0,0 +1,119 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace Microsoft.API.Codeunits; + +using Microsoft.Foundation.NoSeries; + +/// +/// API codeunit exposing No. Series operations as non-data-bound (unbound) actions. +/// Wraps codeunits "No. Series" (310) and "No. Series - Batch" (308). +/// +/// +/// TODO(AB#641822): once the platform ships the API codeunit subtype, decorate this codeunit with +/// Subtype = API and the APIPublisher = 'microsoft' / APIGroup = 'codeunits' / APIVersion properties +/// (and expose the procedures as the codeunit's service-enabled actions). Until then this is a plain +/// public codeunit so the wrapper logic can be authored ahead of the platform. +/// +codeunit 6007 "No. Series API" +{ + Access = Public; + InherentEntitlements = X; + InherentPermissions = X; + + /// Gets the next number in the number series, advancing the series. + /// The number series code. + /// The next number. + procedure GetNextNo(NoSeriesCode: Code[20]): Code[20] + var + NoSeries: Codeunit "No. Series"; + begin + exit(NoSeries.GetNextNo(NoSeriesCode)); + end; + + /// Gets the next number in the number series for the given usage date, advancing the series. + /// The number series code. + /// The date the number is used on. + /// The next number. + procedure GetNextNo(NoSeriesCode: Code[20]; UsageDate: Date): Code[20] + var + NoSeries: Codeunit "No. Series"; + begin + exit(NoSeries.GetNextNo(NoSeriesCode, UsageDate)); + end; + + /// Returns the next number in the series without advancing it. + /// The number series code. + /// The next number. + procedure PeekNextNo(NoSeriesCode: Code[20]): Code[20] + var + NoSeries: Codeunit "No. Series"; + begin + exit(NoSeries.PeekNextNo(NoSeriesCode)); + end; + + /// Returns the next number in the series for the given usage date without advancing it. + /// The number series code. + /// The date the number is used on. + /// The next number. + procedure PeekNextNo(NoSeriesCode: Code[20]; UsageDate: Date): Code[20] + var + NoSeries: Codeunit "No. Series"; + begin + exit(NoSeries.PeekNextNo(NoSeriesCode, UsageDate)); + end; + + /// Returns the last number used in the series. + /// The number series code. + /// The last number used. + procedure GetLastNoUsed(NoSeriesCode: Code[20]): Code[20] + var + NoSeries: Codeunit "No. Series"; + begin + exit(NoSeries.GetLastNoUsed(NoSeriesCode)); + end; + + /// Returns whether the number series requires numbers to be entered manually. + /// The number series code. + /// True if manual; otherwise false. + procedure IsManual(NoSeriesCode: Code[20]): Boolean + var + NoSeries: Codeunit "No. Series"; + begin + exit(NoSeries.IsManual(NoSeriesCode)); + end; + + /// Returns whether the number series assigns numbers automatically. + /// The number series code. + /// True if automatic; otherwise false. + procedure IsAutomatic(NoSeriesCode: Code[20]): Boolean + var + NoSeries: Codeunit "No. Series"; + begin + exit(NoSeries.IsAutomatic(NoSeriesCode)); + end; + + /// Returns whether the number series enforces date order. + /// The number series code. + /// True if the series is in date order; otherwise false. + procedure IsNoSeriesInDateOrder(NoSeriesCode: Code[20]): Boolean + var + NoSeries: Codeunit "No. Series"; + begin + exit(NoSeries.IsNoSeriesInDateOrder(NoSeriesCode)); + end; + + /// Simulates getting the next number given the last number used, without persisting state. + /// The number series code. + /// The date the number is used on. + /// The last number used to simulate from. + /// The simulated next number. + procedure SimulateGetNextNo(NoSeriesCode: Code[20]; UsageDate: Date; LastNoUsed: Code[20]): Code[20] + var + NoSeriesBatch: Codeunit "No. Series - Batch"; + begin + exit(NoSeriesBatch.SimulateGetNextNo(NoSeriesCode, UsageDate, LastNoUsed)); + end; +} diff --git a/src/Apps/W1/APICodeunits/app/src/Permissions/APICodeunitsObjects.PermissionSet.al b/src/Apps/W1/APICodeunits/app/src/Permissions/APICodeunitsObjects.PermissionSet.al new file mode 100644 index 00000000000..5fa46bbdcf4 --- /dev/null +++ b/src/Apps/W1/APICodeunits/app/src/Permissions/APICodeunitsObjects.PermissionSet.al @@ -0,0 +1,20 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace Microsoft.API.Codeunits; + +permissionset 6014 "API Codeunits - Objects" +{ + Access = Public; + Assignable = false; + Caption = 'API Codeunits - Objects'; + + Permissions = + codeunit "No. Series API" = X, + codeunit "Approvals API" = X, + codeunit "Environment API" = X, + codeunit "Identity API" = X, + codeunit "Date Time API" = X; +} From 0cbfb981fcf17ffa65d14b6941ae6a8dcad70a19 Mon Sep 17 00:00:00 2001 From: Onat Buyukakkus <55088871+onbuyuka@users.noreply.github.com> Date: Fri, 14 Aug 2026 21:51:25 +0200 Subject: [PATCH 2/3] Remove low-value/questionable API methods from API - Codeunits app Per review, drop API tools that add little value or cannot be used: - Date Time API: parameterless CreateTimestampSeconds() and CreateTimestampMilliseconds() (kept the DateTime overloads). - Approvals API: Approve, Reject and Cancel, which require a workflowStepInstanceId this toolset provides no way to discover (kept GetDirectApprover). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1b34da29-3e61-4831-9999-c4e3cce5f128 --- .../src/Approvals/ApprovalsAPI.Codeunit.al | 27 ------------------- .../app/src/DateTime/DateTimeAPI.Codeunit.al | 16 ----------- 2 files changed, 43 deletions(-) diff --git a/src/Apps/W1/APICodeunits/app/src/Approvals/ApprovalsAPI.Codeunit.al b/src/Apps/W1/APICodeunits/app/src/Approvals/ApprovalsAPI.Codeunit.al index 4d095e25bfa..ac621171e8a 100644 --- a/src/Apps/W1/APICodeunits/app/src/Approvals/ApprovalsAPI.Codeunit.al +++ b/src/Apps/W1/APICodeunits/app/src/Approvals/ApprovalsAPI.Codeunit.al @@ -18,33 +18,6 @@ codeunit 6008 "Approvals API" InherentEntitlements = X; InherentPermissions = X; - /// Approves the specified workflow step instance. - /// The workflow step instance to approve. - procedure Approve(WorkflowStepInstanceId: Guid) - var - WorkflowWebhookSubscription: Codeunit "Workflow Webhook Subscription"; - begin - WorkflowWebhookSubscription.Approve(WorkflowStepInstanceId); - end; - - /// Rejects the specified workflow step instance. - /// The workflow step instance to reject. - procedure Reject(WorkflowStepInstanceId: Guid) - var - WorkflowWebhookSubscription: Codeunit "Workflow Webhook Subscription"; - begin - WorkflowWebhookSubscription.Reject(WorkflowStepInstanceId); - end; - - /// Cancels the specified workflow step instance. - /// The workflow step instance to cancel. - procedure Cancel(WorkflowStepInstanceId: Guid) - var - WorkflowWebhookSubscription: Codeunit "Workflow Webhook Subscription"; - begin - WorkflowWebhookSubscription.Cancel(WorkflowStepInstanceId); - end; - /// Returns the email address of the direct approver for the given requestor. /// The requestor's email address. /// The direct approver's email address. diff --git a/src/Apps/W1/APICodeunits/app/src/DateTime/DateTimeAPI.Codeunit.al b/src/Apps/W1/APICodeunits/app/src/DateTime/DateTimeAPI.Codeunit.al index 1a1f5bf2cbb..ed4b9cb8fe1 100644 --- a/src/Apps/W1/APICodeunits/app/src/DateTime/DateTimeAPI.Codeunit.al +++ b/src/Apps/W1/APICodeunits/app/src/DateTime/DateTimeAPI.Codeunit.al @@ -101,14 +101,6 @@ codeunit 6012 "Date Time API" exit(TimeZone.IsDaylightSavingTime(DateTimeToCheck, TimeZoneId)); end; - /// Returns the current Unix timestamp in seconds. - procedure CreateTimestampSeconds(): BigInteger - var - UnixTimestamp: Codeunit "Unix Timestamp"; - begin - exit(UnixTimestamp.CreateTimestampSeconds()); - end; - /// Returns the Unix timestamp in seconds for the given date/time. procedure CreateTimestampSeconds(DateTimeFrom: DateTime): BigInteger var @@ -117,14 +109,6 @@ codeunit 6012 "Date Time API" exit(UnixTimestamp.CreateTimestampSeconds(DateTimeFrom)); end; - /// Returns the current Unix timestamp in milliseconds. - procedure CreateTimestampMilliseconds(): BigInteger - var - UnixTimestamp: Codeunit "Unix Timestamp"; - begin - exit(UnixTimestamp.CreateTimestampMilliseconds()); - end; - /// Returns the Unix timestamp in milliseconds for the given date/time. procedure CreateTimestampMilliseconds(DateTimeFrom: DateTime): BigInteger var From 1dc317d63830bd03e95f1893992726251c895f71 Mon Sep 17 00:00:00 2001 From: Onat Buyukakkus <55088871+onbuyuka@users.noreply.github.com> Date: Mon, 17 Aug 2026 13:30:47 +0200 Subject: [PATCH 3/3] Register API - Codeunits app in build metadata Add the new "API - Codeunits" app (src/Apps/W1/APICodeunits) to the build registration so it is compiled, translated and shipped like other W1 apps: - build/projects.json: new project entry (W1 path, hasTranslations, All countries, base ruleset), mirroring API Reports - Finance. - build/groups.json: group membership (AllExtensions, Financials, FinancialsExtensions, OnPrem, OnPremExtensions). - build/projects/Apps /.AL-Go/settings.json (all 23 country projects): add the app folder to appFolders. No test entry as the app has no test project yet. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1b34da29-3e61-4831-9999-c4e3cce5f128 --- build/groups.json | 20 ++++++++++++++++++++ build/projects.json | 11 +++++++++++ build/projects/Apps AT/.AL-Go/settings.json | 1 + build/projects/Apps AU/.AL-Go/settings.json | 1 + build/projects/Apps BE/.AL-Go/settings.json | 1 + build/projects/Apps CA/.AL-Go/settings.json | 1 + build/projects/Apps CH/.AL-Go/settings.json | 1 + build/projects/Apps CZ/.AL-Go/settings.json | 1 + build/projects/Apps DE/.AL-Go/settings.json | 1 + build/projects/Apps DK/.AL-Go/settings.json | 1 + build/projects/Apps ES/.AL-Go/settings.json | 1 + build/projects/Apps FI/.AL-Go/settings.json | 1 + build/projects/Apps FR/.AL-Go/settings.json | 1 + build/projects/Apps GB/.AL-Go/settings.json | 1 + build/projects/Apps IN/.AL-Go/settings.json | 1 + build/projects/Apps IS/.AL-Go/settings.json | 1 + build/projects/Apps IT/.AL-Go/settings.json | 1 + build/projects/Apps MX/.AL-Go/settings.json | 1 + build/projects/Apps NL/.AL-Go/settings.json | 1 + build/projects/Apps NO/.AL-Go/settings.json | 1 + build/projects/Apps NZ/.AL-Go/settings.json | 1 + build/projects/Apps RU/.AL-Go/settings.json | 1 + build/projects/Apps SE/.AL-Go/settings.json | 1 + build/projects/Apps US/.AL-Go/settings.json | 1 + build/projects/Apps W1/.AL-Go/settings.json | 1 + 25 files changed, 54 insertions(+) diff --git a/build/groups.json b/build/groups.json index a9f4624046c..00df47648f8 100644 --- a/build/groups.json +++ b/build/groups.json @@ -3768,6 +3768,26 @@ } ] }, + { + "name": "API - Codeunits", + "groups": [ + { + "name": "AllExtensions" + }, + { + "name": "Financials" + }, + { + "name": "FinancialsExtensions" + }, + { + "name": "OnPrem" + }, + { + "name": "OnPremExtensions" + } + ] + }, { "name": "API Reports - Finance", "groups": [ diff --git a/build/projects.json b/build/projects.json index 28918414ec0..a69ebf29315 100644 --- a/build/projects.json +++ b/build/projects.json @@ -2074,6 +2074,17 @@ "ruleSetPath": "$ENV:INETROOT\\App\\Rulesets\\app.ruleset.json", "ruleSetPathMinorRelease": "$ENV:INETROOT\\App\\Rulesets\\MinorRelease\\app.ruleset.json" }, + "API - Codeunits": { + "projectPath": "$env:INETROOT\\App\\BCApps\\src\\Apps\\W1\\APICodeunits\\app", + "dvdFolder": "Applications\\APICodeunits\\Source", + "hasTranslations": true, + "installOnEnvironmentUpdate": true, + "supportedCountries": "All", + "runStaticCodeAnalysis": true, + "logLevel": "warning", + "ruleSetPath": "$env:INETROOT\\App\\BCApps\\src\\rulesets\\base.ruleset.json", + "ruleSetPathMinorRelease": "$env:INETROOT\\App\\BCApps\\src\\rulesets\\minorrelease.ruleset.json" + }, "API Reports - Finance": { "projectPath": "$env:INETROOT\\App\\BCApps\\src\\Apps\\W1\\APIReportsFinance\\App", "dvdFolder": "Applications\\APIReportsFinance\\Source", diff --git a/build/projects/Apps AT/.AL-Go/settings.json b/build/projects/Apps AT/.AL-Go/settings.json index a941ae80704..2473f0836b5 100644 --- a/build/projects/Apps AT/.AL-Go/settings.json +++ b/build/projects/Apps AT/.AL-Go/settings.json @@ -17,6 +17,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps AU/.AL-Go/settings.json b/build/projects/Apps AU/.AL-Go/settings.json index bb25bf4ce29..410e294b76c 100644 --- a/build/projects/Apps AU/.AL-Go/settings.json +++ b/build/projects/Apps AU/.AL-Go/settings.json @@ -17,6 +17,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps BE/.AL-Go/settings.json b/build/projects/Apps BE/.AL-Go/settings.json index 9913c57c51b..8b12050ef0d 100644 --- a/build/projects/Apps BE/.AL-Go/settings.json +++ b/build/projects/Apps BE/.AL-Go/settings.json @@ -16,6 +16,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps CA/.AL-Go/settings.json b/build/projects/Apps CA/.AL-Go/settings.json index 3226cfa9235..66e45789d4b 100644 --- a/build/projects/Apps CA/.AL-Go/settings.json +++ b/build/projects/Apps CA/.AL-Go/settings.json @@ -22,6 +22,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps CH/.AL-Go/settings.json b/build/projects/Apps CH/.AL-Go/settings.json index 8b60f5d68a5..f9350778434 100644 --- a/build/projects/Apps CH/.AL-Go/settings.json +++ b/build/projects/Apps CH/.AL-Go/settings.json @@ -15,6 +15,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps CZ/.AL-Go/settings.json b/build/projects/Apps CZ/.AL-Go/settings.json index 851ea669fe3..e781762a518 100644 --- a/build/projects/Apps CZ/.AL-Go/settings.json +++ b/build/projects/Apps CZ/.AL-Go/settings.json @@ -28,6 +28,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps DE/.AL-Go/settings.json b/build/projects/Apps DE/.AL-Go/settings.json index 58702be9d19..636bae3e765 100644 --- a/build/projects/Apps DE/.AL-Go/settings.json +++ b/build/projects/Apps DE/.AL-Go/settings.json @@ -20,6 +20,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps DK/.AL-Go/settings.json b/build/projects/Apps DK/.AL-Go/settings.json index 1e2f2f3fffb..53fe8d4ad57 100644 --- a/build/projects/Apps DK/.AL-Go/settings.json +++ b/build/projects/Apps DK/.AL-Go/settings.json @@ -25,6 +25,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps ES/.AL-Go/settings.json b/build/projects/Apps ES/.AL-Go/settings.json index f383309ac4f..88f9c3b907e 100644 --- a/build/projects/Apps ES/.AL-Go/settings.json +++ b/build/projects/Apps ES/.AL-Go/settings.json @@ -20,6 +20,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps FI/.AL-Go/settings.json b/build/projects/Apps FI/.AL-Go/settings.json index c85a6613aaa..408bbcb89e9 100644 --- a/build/projects/Apps FI/.AL-Go/settings.json +++ b/build/projects/Apps FI/.AL-Go/settings.json @@ -14,6 +14,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps FR/.AL-Go/settings.json b/build/projects/Apps FR/.AL-Go/settings.json index 323da3a8324..7442780615b 100644 --- a/build/projects/Apps FR/.AL-Go/settings.json +++ b/build/projects/Apps FR/.AL-Go/settings.json @@ -22,6 +22,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps GB/.AL-Go/settings.json b/build/projects/Apps GB/.AL-Go/settings.json index f3eb657b20f..57e284b3aef 100644 --- a/build/projects/Apps GB/.AL-Go/settings.json +++ b/build/projects/Apps GB/.AL-Go/settings.json @@ -23,6 +23,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps IN/.AL-Go/settings.json b/build/projects/Apps IN/.AL-Go/settings.json index b7638551854..77b8f7d6ab1 100644 --- a/build/projects/Apps IN/.AL-Go/settings.json +++ b/build/projects/Apps IN/.AL-Go/settings.json @@ -21,6 +21,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkit/app", "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps IS/.AL-Go/settings.json b/build/projects/Apps IS/.AL-Go/settings.json index bc9d705e083..e4e2de63c12 100644 --- a/build/projects/Apps IS/.AL-Go/settings.json +++ b/build/projects/Apps IS/.AL-Go/settings.json @@ -12,6 +12,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps IT/.AL-Go/settings.json b/build/projects/Apps IT/.AL-Go/settings.json index b3b0ef01d8a..8d6fd14f35f 100644 --- a/build/projects/Apps IT/.AL-Go/settings.json +++ b/build/projects/Apps IT/.AL-Go/settings.json @@ -16,6 +16,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps MX/.AL-Go/settings.json b/build/projects/Apps MX/.AL-Go/settings.json index add984a89ec..fea4f5a8804 100644 --- a/build/projects/Apps MX/.AL-Go/settings.json +++ b/build/projects/Apps MX/.AL-Go/settings.json @@ -16,6 +16,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps NL/.AL-Go/settings.json b/build/projects/Apps NL/.AL-Go/settings.json index eede5ff5f0e..3ed4a95ebec 100644 --- a/build/projects/Apps NL/.AL-Go/settings.json +++ b/build/projects/Apps NL/.AL-Go/settings.json @@ -14,6 +14,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps NO/.AL-Go/settings.json b/build/projects/Apps NO/.AL-Go/settings.json index cd59a99e255..bb312cd74fa 100644 --- a/build/projects/Apps NO/.AL-Go/settings.json +++ b/build/projects/Apps NO/.AL-Go/settings.json @@ -17,6 +17,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps NZ/.AL-Go/settings.json b/build/projects/Apps NZ/.AL-Go/settings.json index bcdef5c80e0..90f536b8649 100644 --- a/build/projects/Apps NZ/.AL-Go/settings.json +++ b/build/projects/Apps NZ/.AL-Go/settings.json @@ -16,6 +16,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps RU/.AL-Go/settings.json b/build/projects/Apps RU/.AL-Go/settings.json index 44f7cbc7e03..cf564fa27ca 100644 --- a/build/projects/Apps RU/.AL-Go/settings.json +++ b/build/projects/Apps RU/.AL-Go/settings.json @@ -11,6 +11,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkit/app", "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps SE/.AL-Go/settings.json b/build/projects/Apps SE/.AL-Go/settings.json index cf8c5bb5aef..a1b49a2e6d2 100644 --- a/build/projects/Apps SE/.AL-Go/settings.json +++ b/build/projects/Apps SE/.AL-Go/settings.json @@ -16,6 +16,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps US/.AL-Go/settings.json b/build/projects/Apps US/.AL-Go/settings.json index d2061923cc1..c603a926adc 100644 --- a/build/projects/Apps US/.AL-Go/settings.json +++ b/build/projects/Apps US/.AL-Go/settings.json @@ -25,6 +25,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", "../../../src/Apps/W1/AMCBanking365Fundamentals/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app", diff --git a/build/projects/Apps W1/.AL-Go/settings.json b/build/projects/Apps W1/.AL-Go/settings.json index 190e361cae6..3aba95611be 100644 --- a/build/projects/Apps W1/.AL-Go/settings.json +++ b/build/projects/Apps W1/.AL-Go/settings.json @@ -8,6 +8,7 @@ "../../../src/Apps/W1/AIDevelopmentToolkit/app", "../../../src/Apps/W1/AIDevelopmentToolkitDesign/app", "../../../src/Apps/W1/AIDevelopmentToolkitEvaluation/app", + "../../../src/Apps/W1/APICodeunits/app", "../../../src/Apps/W1/APIReportsFinance/App", "../../../src/Apps/W1/APIV1/app", "../../../src/Apps/W1/APIV2/app",