@AuburnMist
So here is the approach that seems to fit what you are looking for:
NOTE: for the below, there is one additional column needed for your SharePoint list - a numeric column called Year which will represent the fiscal year.
In the app:
3 dropdowns - one for the fiscal year, one for the person and one for the pattern. (I will call them ddYear, ddPerson, ddPattern)
1 Gallery - to display a year worth of schedule for the fiscal year that will also allow editing of the hours per day. (I will call it galSchedule)
1 Save icon - to save all changes. (I will call it icnSave)
1 Trash Icon - to remove an entire schedule for the year selected (I will call it icnRemove)
For ddYear -
Items property of Sequence(3, Year(Today())) This will provide three years to choose from, adjust as needed.
For ddPerson -
Items property of (Since we have not discussed logic for the person selection, it is just hard-written as) ["Angele", "Randy"]
For ddPattern -
Items property of:
Table(
{Value: 5, Pattern: Table({Day: [1, 2, 3, 4, 5], Hours: 7.5})},
{Value: 7, Pattern: Table({Day: [1, 2, 3, 4], Hours: 8}, {Day: [5], Hours: 5.5})},
{Value: 14, Pattern: Table({Day: [1, 2, 3, 9, 10, 11], Hours:8.5}, {Day: [4, 5, 12], Hours:8})}
)
(NOTE: This only includes the patterns for 5, 7 and 14 day cycles...additional can be added)
DisplayMode property of:
If(LookUp(Schedules, Title=ddPerson.Selected.Value && Year=ddYear.Selected.Value, true), Disabled, DisplayMode.Edit)
For galSchedule -
Items property of:
With({_fiscalYear: Value(ddYear.Selected.Value), _fiscalStartMonth: 4},
With({_items: Filter(Schedules, Year=_fiscalYear, Title=ddPerson.Selected.Value)},
ForAll(Sequence(DateDiff(Date(_fiscalYear, 1, 1), Date(_fiscalYear+1, 1, 1)), 0),
With({_date: DateAdd(Date(_fiscalYear, _fiscalStartMonth, 1), Value)},
{Date: _date,
_Item: LookUp(_items, Date=_date)
}
)
)
)
)
The template of the Gallery contains 3 controls: A label called lblDate, a label called lblDayType and a Textinput control called txtHours
The Text property of lblDate is: Text(ThisItem.Date, "mmmm dd, yyyy dddd")
The Text property of lblDayType is: If(IfError(Value(txtHours.Text), 0) =0, "Day of Rest", "Work Day")
The Default property of the txtHours controls is:
Coalesce(
ThisItem._Item.Hours,
With({_pattern: ddPattern.Selected.Pattern},
Coalesce(LookUp(_pattern, Weekday(ThisItem.Date, StartOfWeek.MondayZero) + 1 in Day, Hours), 0)
)
)
For icnSave -
OnSelect action of:
Patch(Schedules,
ForAll(Filter(Gallery3.AllItems, !(IfError(Value(txtHours.Text), 0) = _Item.Hours)),
{ID: _Item.ID,
Title: ddPerson.Selected.Value,
Date: Date,
Year: Value(ddYear.Selected.Value),
Day: Text(Date, "dddd"),
Hours: Value(txtHours.Text),
DayType: lblDayType.Text
}
)
)
For icnRemove -
OnSelect action of:
Remove(Schedules, Filter(Schedules, Year=Value(ddYear.Selected.Value) && Title=ddPerson.Selected.Value).ID)
DisplayMode property of:
If(ddPattern.DisplayMode=Edit, Disabled, Edit)
Putting it to work...
The app will allow you to select the fiscal year and the person. The gallery will show all dates for the fiscal year (accounts for leap years too).
If there is no schedule recorded for that person for the fiscal year, then the pattern dropdown will be enabled and the user can select the pattern of hours to apply. If there IS a schedule for the person for the fiscal year, then the gallery will be displaying what has been recorded previously (including any edits).
The user can edit any day and any hour amount if needed.
When the user hits save, the records are created if not existing already, or updated if already existing.


See how that works for you!