cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
spow
Frequent Visitor

Leave Template - Include half day option

I have modified the Leave Template for a team within my company and this is working successfully. However, they require the ability to be able to book a half day's leave. I have looked at several posts within here asking the same question and have tried some of the recommended solutions but absolutely none of them work! This is the most recent one I tried but see that the person that raised it never got any further response when it didn't work for them either:

 

https://powerusers.microsoft.com/t5/Building-Power-Apps/My-leave-request-template-Balance-Add-Select...

 

I understand that the calculation will need to be added under the start date picker but just cannot get anything to work.

 

I would really appreciate some guidance as I've spent hours on trying to find a solution.

 

Thank you in anticipation.

19 REPLIES 19
ofmano89
Frequent Visitor

Yes

 5.JPG

4.JPG

 

but i have problem same you

 

6.JPG

Dovetail
Helper II
Helper II

Hi there @ofmano89 

Did you get it right? I am also facing the same issue.

Total time requested values are staying the same.

If you had a breakthrough, may you kindly assist?

 

Thanks

spow
Frequent Visitor

Thank you to everyone who took the time to respond to my post. I had to give up in the end as I could not get the half day option to work and have spent so much time trying to find a solution.

In the end I created a very simple app based on 2 Sharepoint lists and which is connected to a workflow which deals with approval and also cancellation of leave to update entitlement balances.

 

The annual leave template was nice on the face of it but sometimes less is more and what I have done is working so far for the team that required it.

On top of code suggested by @v-bofeng-msft , you will have to make a few more modifications. I managed to get it working fully. Below are the changes needed:

1. Add 2 more columns to the list: StartDateMeridian, & EndDateMeridian. Both of type string

 

2. HomeScreen: GalleryRequests ->OnSelect

Set(_selectedLeaveItem, ThisItem);

If(_managerView,
//If manager view, get user's leave balance record and determine any overlaps this request has from other people I manage
Set(_requesterBalanceRecord, LookUp(Balance, Year = Text(Year(Now())) && EmployeeEmail = ThisItem.Requester));
ClearCollect(RequestOverlaps, Filter(Leave, EndDate >= _selectedLeaveItem.StartDate && StartDate <= _selectedLeaveItem.EndDate
&& Requester <>_selectedLeaveItem.Requester));

If(CountRows(RequestOverlaps) > 0, Set(_requestOverlapMessage, Concat(Distinct(RequestOverlaps, Requester), Result, ", ")))
);

Concurrent(
//gather requester or approver info depending on view
If(_managerView,
Set(_requester, Office365Users.UserProfile(ThisItem.Requester)),
Set(_selectedApprover, Office365Users.UserProfile(ThisItem.Approver)); If(Office365Users.UserPhotoMetadata(_selectedApprover.Id).HasPhoto, Set(_selectedApproverPhoto, Office365Users.UserPhoto(_selectedApprover.Id)))),
//**** CALCULATION USED TO DETERMINE TOTAL WORK DAYS REQUESTED ****
Set(_inclusiveTotalDaysRequested, DateDiff(ThisItem.StartDate, ThisItem.EndDate, Days) + 1);
Set(_numFullWeeks, RoundDown(_inclusiveTotalDaysRequested / 7, 0));
Set(_numFullDaysPartialWeek, _inclusiveTotalDaysRequested - _numFullWeeks * 7);
Set(_startWeekday, Weekday(ThisItem.StartDate));
Set(_endWeekday, Weekday(ThisItem.EndDate));


//calculates the number of business days in the partial week left over after whole weeks are subtracted out of total days requested
If(_numFullDaysPartialWeek = 6,
If(_startWeekday <= 2, Set(_numPartialWeekdays, 5), Set(_numPartialWeekdays, 4)
),
_numFullDaysPartialWeek = 5,
If(_startWeekday = 2, Set(_numPartialWeekdays, 5), _startWeekday = 1 || _startWeekday = 3 || _startWeekday = 4, Set(_numPartialWeekdays, 4), Set(_numPartialWeekdays, 3)
),
_numFullDaysPartialWeek = 4,
If(_startWeekday = 2 || _startWeekday = 3, Set(_numPartialWeekdays, 4), _startWeekday = 1 || _startWeekday = 4, Set(_numPartialWeekdays, 3), Set(_numPartialWeekdays, 2)
),
_numFullDaysPartialWeek = 3,
If(_startWeekday = 6 || _startWeekday = 7, Set(_numPartialWeekdays, 1), _startWeekday = 1 || _startWeekday = 5, Set(_numPartialWeekdays, 2), Set(_numPartialWeekdays, 3)
),
_numFullDaysPartialWeek = 2,
If(_startWeekday = 7, Set(_numPartialWeekdays, 0), _startWeekday = 1 || _startWeekday = 6, Set(_numPartialWeekdays, 1), Set(_numPartialWeekdays, 2)),
_numFullDaysPartialWeek = 1,
If(_startWeekday = 1 || _startWeekday = 7, Set(_numPartialWeekdays, 0), Set(_numPartialWeekdays, 1)
),
_numFullDaysPartialWeek = 0, Set(_numPartialWeekdays, 0)
);
Set(_workDaysInRequest, _numFullWeeks * 5 + _numPartialWeekdays),
Set(_holidaysInRequest, CountIf(Holidays, StartDate >= ThisItem.StartDate, StartDate <= ThisItem.EndDate)),
Set(_isHalfDay,If(ThisItem.StartDateMeridian = ThisItem.EndDateMeridian, true, false))
);
Set(_requestedDays,If(_isHalfDay, _workDaysInRequest - _holidaysInRequest-0.5,_workDaysInRequest - _holidaysInRequest));
//**** END CALCULATION ****
Set(_showDetails, true);

 

3. NewRequestScreen->OnVisible

Reset(Radio1ForLeaveStartDatePicker);
Reset(Radio2ForLeaveEndDatePicker);
Concurrent(
Select(LeaveStartDatePicker),
Set(_navMenuSelect, ""),
If(!_editingRequest && !_changingApprover,
Set(_leaveStart, Today());
Set(_leaveEnd, Today());
Set(_leaveTitle, "");
Set(_leaveDetail, "");
Reset(LeaveEndDatePicker);
Reset(LeaveStartDatePicker);
Reset(TextInput1);
Reset(TextInput1_1);
Set(_selectedApprover, Office365Users.Manager(_myProfile.Id));
Set(_leaveStartMeridian,"AM");
Set(_leaveEndMeridian,"AM");
Set(_selectedApproverPhoto,
If(Office365Users.UserPhotoMetadata(_selectedApprover.Id).HasPhoto, Office365Users.UserPhoto(_selectedApprover.Id))
)
,
_editingRequest && !_changingApprover,
Set(_selectedApprover, Office365Users.UserProfile(GalleryRequests.Selected.Approver));
Set(_selectedApproverPhoto, Office365Users.UserPhoto(GalleryRequests.Selected.Approver));
Set(_leaveStart, GalleryRequests.Selected.StartDate);
Set(_leaveEnd, GalleryRequests.Selected.EndDate);
If(_leaveEnd < Today(), Notify("This event occurred in the past and cannot be resubmitted without first changing the dates", NotificationType.Warning));
Set(_selectedLeaveType, GalleryRequests.Selected.LeaveType);
Set(_leaveTitle, GalleryRequests.Selected.Title);
Set(_leaveDetail, GalleryRequests.Selected.Detail);
Set(_leaveStartMeridian, GalleryRequests.Selected.StartDateMeridian);
Set(_leaveEndMeridian, GalleryRequests.Selected.EndDateMeridian);
)
);
Set(_changingApprover, false)

 

4. ConfirmationScreen-> OnVisible

 

If(
_submittingRequest,
Concurrent(
Set(
_navMenuSelect,
""
),
//if editing a request, revise the record that is being edited, otherwise create a new one
Patch(
Leave,
If(
_editingRequest,
LookUp(
Leave,
LeaveID = GalleryRequests.Selected.LeaveID
),
Defaults(Leave)
),
{
Title: TextInput1.Text,
Detail: TextInput1_1.Text,
StartDate: LeaveStartDatePicker.SelectedDate,
EndDate: LeaveEndDatePicker.SelectedDate,
LeaveType: _selectedLeaveType,
Approver: _selectedApprover.UserPrincipalName,
Status: "Pending",
Requester: _myProfile.UserPrincipalName,
StartDateMeridian:Radio1ForLeaveStartDatePicker.Selected.Value,
EndDateMeridian:Radio2ForLeaveEndDatePicker.Selected.Value,
LeaveID: If(
_editingRequest,
GalleryRequests.Selected.LeaveID,
Text(
Now(),
DateTimeFormat.LongDateTime24
) & _myProfile.UserPrincipalName
)
}
),
//create email template data specific to the request
ClearCollect(
TemplateData,
{
Field: "{SubmitterName}",
Data: _myProfile.DisplayName
},
{
Field: "{LeaveType}",
Data: _selectedLeaveType
},
{
Field: "{LeaveTitle}",
Data: TextInput1.Text
},
{
Field: "{LeaveDescript}",
Data: TextInput1_1.Text
},
{
Field: "{LeaveStart}",
Data: Text(
LeaveStartDatePicker.SelectedDate,
"[$-en-US]mmm. dd, yyyy"
)
},
{
Field: "{LeaveEnd}",
Data: Text(
LeaveEndDatePicker.SelectedDate,
"[$-en-US]mmm. dd, yyyy"
)
}
)
);
//substitute template data values for placeholder
ForAll(
TemplateData,
Patch(
EmailTemplate,
First(EmailTemplate),
{
Value: Substitute(
First(EmailTemplate).Value,
Field,
Data
)
}
)
);
//send email with email template
Office365Outlook.SendEmailV2(
_selectedApprover.UserPrincipalName,
"New Leave Request",
First(EmailTemplate).Value,
{Importance: "Normal"}
);

//reset all user nput fields
Set(
_submittingRequest,
false
);
Set(
_leaveStart,
Today()
);
Set(
_leaveEnd,
Today()
);
Set(
_leaveTitle,
""
);
Set(
_leaveDetail,
""
);
Set(
_selectedLeaveType,
Blank()
);
Reset(TextInput1);
Reset(TextInput1_1);
//reset email template to placeholder values when finished (see phone version for an alternate method of doing this)
ClearCollect(
EmailTemplate,
"<html>
<head>
<meta http-equiv=""Content-Type"" content=""text/html; charset=us-ascii"">
</head>
<body>
<p>
There is a leave request from: {SubmitterName} pending your approval. <ul><li>Type: {LeaveType}</li><li>Title: {LeaveTitle}</li><li>Description: {LeaveDescript}</li><li>Start Date: {LeaveStart}</li><li>End Date: {LeaveEnd}</li>" & "</p>
</body>
</html>"
);

)

 

 

zmm14
Helper III
Helper III

Hi I did all this and cant get it to work

zmm14_0-1624955238069.png

 

zmm14_1-1624955316706.png

 

After adding the 2 columns to datasource, refresh it and the error will go.

Dovetail
Helper II
Helper II

Hello there,

The patch function on number 4 of the provided code is throwing an error:

"This type of argument 'LeaveType' does not match the expected type 'Text'. Found type error"

Dovetail_1-1626379998805.png

May you please assist on how to get rid of this error.

 

Thank you

HI Moreshwar, On what sheet of the datasourse do I add the twocolumns?

Hello SHewson - Add the columns in Leave worksheet.

Hello Dovetail - Check your _leaveTypeVariable, it should be of type text. For testing you may want to hardcode values and tryout.

Helpful resources

Announcements
Power Platform Conf 2022 768x460.jpg

Join us for Microsoft Power Platform Conference

The first Microsoft-sponsored Power Platform Conference is coming in September. 100+ speakers, 150+ sessions, and what's new and next for Power Platform.

May UG Leader Call Carousel 768x460.png

June User Group Leader Call

Join us on June 28 for our monthly User Group leader call!

PA Virtual Workshop Carousel 768x460.png

Register for a Free Workshop

This training provides practical hands-on experience in creating Power Apps solutions in a full-day of instructor-led App creation workshop.

PA.JPG

New Release Planning Portal (Preview)

Check out our new release planning portal, an interactive way to plan and prepare for upcoming features in Power Platform.

Top Solution Authors
Users online (1,357)