Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Date only frontend #801

Merged
merged 33 commits into from
Dec 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
a284e5c
Update calculation functions to work with date only
PabloDinella Sep 12, 2024
e474d32
Add a unit test in CalculateMissingMonitoringRequirementInstances
PabloDinella Sep 16, 2024
9c28da0
Include unit tests for the ongoing bug of a completion in the same da…
PabloDinella Sep 26, 2024
bc8c7aa
Create new logic for calculating missing requirements in recurrence p…
PabloDinella Oct 22, 2024
4c05fad
Update calculation for per child policies
PabloDinella Oct 31, 2024
50372d5
Remove `isFirst` param from recurrence calculations
PabloDinella Nov 1, 2024
a9aa293
Review comments & minor edits
LarsKemmann Nov 4, 2024
c2b9c0a
Move DateOfInterest to a new file and convert to record
PabloDinella Nov 4, 2024
a76dcf1
Clean up unnecessary params and tidy up recursion function
PabloDinella Nov 4, 2024
824290e
Improve semantics for GetPossiblyDiscontinuousWindowBasedOnChildLocat…
PabloDinella Nov 5, 2024
e1408ca
Create a dedicated ChildLocation for ReferralCalculations and improve…
PabloDinella Nov 5, 2024
5572931
Simplify GetWindow functions
PabloDinella Nov 5, 2024
291cf87
Code cleanup (namespaces & sealing records)
LarsKemmann Nov 5, 2024
ed3f722
Suggestion to change recursion with conditions to a loop with iterator
LarsKemmann Nov 5, 2024
3382975
Converted CalculateDatesOfInterest recursion with conditions to iterator
LarsKemmann Nov 5, 2024
7534ecc
Fixed while-plus-one condition
LarsKemmann Nov 5, 2024
86dbd61
Renamed method arguments for consistency
LarsKemmann Nov 5, 2024
942f423
Remaining code cleanup challenge
LarsKemmann Nov 5, 2024
b77c81d
WIP: New approach to calculating windows of requirement completion
PabloDinella Nov 6, 2024
ab3e710
Fixes in discontinuous timeline logic and Timeline methods improvements
PabloDinella Nov 7, 2024
5d48916
Names cleanup
PabloDinella Nov 7, 2024
98b136e
WIP restart policies when child change location to a new volunteer fa…
PabloDinella Nov 8, 2024
9601ed7
Restart policies when child location family changes
PabloDinella Nov 8, 2024
7e4ee6a
Some cleanup and method renaming
PabloDinella Nov 11, 2024
a74918a
Some more cleanup and unit tests addition
PabloDinella Nov 11, 2024
b83d8be
Rename DateOnlyTimeline.FirstDay and LastDay to Start and End
PabloDinella Nov 11, 2024
73118e0
Update CalculateMissingMonitoringRequirementInstancesForChildCareOccu…
PabloDinella Nov 13, 2024
232aabd
Add csharpier and format ReferralCalculations.cs
PabloDinella Nov 13, 2024
467b71e
Make ReferralCalculations.cs timezone agnostic (move timezone convers…
PabloDinella Nov 19, 2024
972edc9
Now the ReferralCalculations only works with DateOnly
PabloDinella Nov 21, 2024
542813b
Rename ReferralEntryForCalculation to ReferralEntry
PabloDinella Nov 22, 2024
5ce0344
Move date conversion methods into a utility
PabloDinella Nov 22, 2024
3202fbf
Format dates as date only in arrangement monitoring requirements
PabloDinella Nov 25, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .config/dotnet-tools.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"version": 1,
"isRoot": true,
"tools": {
"csharpier": {
"version": "0.29.2",
"commands": [
"dotnet-csharpier"
]
}
}
}
6 changes: 6 additions & 0 deletions .csharpierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"printWidth": 120,
"useTabs": false,
"tabWidth": 4,
"endOfLine": "auto"
}
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,8 @@ public async Task<ImmutableList<Permission>> AuthorizeUserAccessAsync(

internal static bool IsPermissionSetApplicable(ContextualPermissionSet permissionSet,
AuthorizationContext context, Family? userFamily, Family? targetFamily,
bool targetFamilyIsVolunteerFamily, ImmutableList<ReferralEntry> userFamilyReferrals,
ImmutableList<ReferralEntry> targetFamilyReferrals, ImmutableList<ReferralEntry> assignedReferrals,
bool targetFamilyIsVolunteerFamily, ImmutableList<Resources.Referrals.ReferralEntry> userFamilyReferrals,
ImmutableList<Resources.Referrals.ReferralEntry> targetFamilyReferrals, ImmutableList<Resources.Referrals.ReferralEntry> assignedReferrals,
ImmutableList<Guid> userFamilyCommunities, ImmutableList<Guid> targetFamilyCommunities,
ImmutableList<(Guid Id, string CommunityRole)> userCommunityRoleAssignments)
{
Expand Down Expand Up @@ -522,10 +522,10 @@ internal Referral DiscloseReferral(Referral referral,
: ImmutableList<string>.Empty,
CompletedRequirements = contextPermissions.Contains(Permission.ViewReferralProgress)
? referral.CompletedRequirements
: ImmutableList<CompletedRequirementInfo>.Empty,
: ImmutableList<Resources.CompletedRequirementInfo>.Empty,
ExemptedRequirements = contextPermissions.Contains(Permission.ViewReferralProgress)
? referral.ExemptedRequirements
: ImmutableList<ExemptedRequirementInfo>.Empty,
: ImmutableList<Resources.ExemptedRequirementInfo>.Empty,
MissingRequirements = contextPermissions.Contains(Permission.ViewReferralProgress)
? referral.MissingRequirements
: ImmutableList<string>.Empty,
Expand All @@ -537,7 +537,7 @@ internal Referral DiscloseReferral(Referral referral,
: null,
Arrangements = referral.Arrangements
.Select(arrangement =>
arrangement with
(arrangement with
{
ChildLocationHistory = contextPermissions.Contains(Permission.ViewChildLocationHistory)
? arrangement.ChildLocationHistory
Expand All @@ -550,10 +550,10 @@ arrangement with
: null,
CompletedRequirements = contextPermissions.Contains(Permission.ViewArrangementProgress)
? arrangement.CompletedRequirements
: ImmutableList<CompletedRequirementInfo>.Empty,
: ImmutableList<Resources.CompletedRequirementInfo>.Empty,
ExemptedRequirements = contextPermissions.Contains(Permission.ViewArrangementProgress)
? arrangement.ExemptedRequirements
: ImmutableList<ExemptedRequirementInfo>.Empty,
: ImmutableList<Resources.ExemptedRequirementInfo>.Empty,
MissingRequirements = contextPermissions.Contains(Permission.ViewArrangementProgress)
? arrangement.MissingRequirements
: contextPermissions.Contains(Permission.ViewAssignedArrangementProgress)
Expand All @@ -564,41 +564,41 @@ arrangement with
: ImmutableList<MissingArrangementRequirement>.Empty,
IndividualVolunteerAssignments = contextPermissions.Contains(Permission.ViewAssignments)
? arrangement.IndividualVolunteerAssignments
.Select(iva => iva with
.Select(iva => (iva with
{
CompletedRequirements = contextPermissions.Contains(Permission.ViewArrangementProgress)
? iva.CompletedRequirements
: contextPermissions.Contains(Permission.ViewAssignedArrangementProgress)
&& iva.FamilyId == userFamily?.Id
? iva.CompletedRequirements
: ImmutableList<CompletedRequirementInfo>.Empty,
: ImmutableList<Resources.CompletedRequirementInfo>.Empty,
ExemptedRequirements = contextPermissions.Contains(Permission.ViewArrangementProgress)
? iva.ExemptedRequirements
: contextPermissions.Contains(Permission.ViewAssignedArrangementProgress)
&& iva.FamilyId == userFamily?.Id
? iva.ExemptedRequirements
: ImmutableList<ExemptedRequirementInfo>.Empty
}).ToImmutableList()
: ImmutableList<IndividualVolunteerAssignment>.Empty,
: ImmutableList<Resources.ExemptedRequirementInfo>.Empty
})).ToImmutableList()
: ImmutableList<Resources.Referrals.IndividualVolunteerAssignment>.Empty,
FamilyVolunteerAssignments = contextPermissions.Contains(Permission.ViewAssignments)
? arrangement.FamilyVolunteerAssignments
.Select(fva => fva with
.Select(fva => (fva with
{
CompletedRequirements = contextPermissions.Contains(Permission.ViewArrangementProgress)
? fva.CompletedRequirements
: contextPermissions.Contains(Permission.ViewAssignedArrangementProgress)
&& fva.FamilyId == userFamily?.Id
? fva.CompletedRequirements
: ImmutableList<CompletedRequirementInfo>.Empty,
: ImmutableList<Resources.CompletedRequirementInfo>.Empty,
ExemptedRequirements = contextPermissions.Contains(Permission.ViewArrangementProgress)
? fva.ExemptedRequirements
: contextPermissions.Contains(Permission.ViewAssignedArrangementProgress)
&& fva.FamilyId == userFamily?.Id
? fva.ExemptedRequirements
: ImmutableList<ExemptedRequirementInfo>.Empty
}).ToImmutableList()
: ImmutableList<FamilyVolunteerAssignment>.Empty
})
: ImmutableList<Resources.ExemptedRequirementInfo>.Empty
})).ToImmutableList()
: ImmutableList<Resources.Referrals.FamilyVolunteerAssignment>.Empty
}))
.ToImmutableList()
};
}
Expand All @@ -616,7 +616,7 @@ internal static VolunteerFamilyInfo DiscloseVolunteerFamilyInfo(
: ImmutableList<RoleRemoval>.Empty,
IndividualVolunteers = volunteerFamilyInfo.IndividualVolunteers.ToImmutableDictionary(
keySelector: kvp => kvp.Key,
elementSelector: kvp => kvp.Value with
elementSelector: kvp => (kvp.Value with
{
RoleRemovals = contextPermissions.Contains(Permission.ViewApprovalStatus)
? kvp.Value.RoleRemovals
Expand All @@ -626,17 +626,17 @@ internal static VolunteerFamilyInfo DiscloseVolunteerFamilyInfo(
: ImmutableDictionary<string, IndividualRoleApprovalStatus>.Empty,
CompletedRequirements = contextPermissions.Contains(Permission.ViewApprovalProgress)
? kvp.Value.CompletedRequirements
: ImmutableList<CompletedRequirementInfo>.Empty,
: ImmutableList<Resources.CompletedRequirementInfo>.Empty,
ExemptedRequirements = contextPermissions.Contains(Permission.ViewApprovalProgress)
? kvp.Value.ExemptedRequirements
: ImmutableList<ExemptedRequirementInfo>.Empty
}),
: ImmutableList<Resources.ExemptedRequirementInfo>.Empty
})),
CompletedRequirements = contextPermissions.Contains(Permission.ViewApprovalProgress)
? volunteerFamilyInfo.CompletedRequirements
: ImmutableList<CompletedRequirementInfo>.Empty,
: ImmutableList<Resources.CompletedRequirementInfo>.Empty,
ExemptedRequirements = contextPermissions.Contains(Permission.ViewApprovalProgress)
? volunteerFamilyInfo.ExemptedRequirements
: ImmutableList<ExemptedRequirementInfo>.Empty,
: ImmutableList<Resources.ExemptedRequirementInfo>.Empty,
History = contextPermissions.Contains(Permission.ViewApprovalHistory)
? volunteerFamilyInfo.History
: ImmutableList<Activity>.Empty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ internal static class ApprovalCalculations
{
public static FamilyApprovalStatus CalculateCombinedFamilyApprovals(
VolunteerPolicy volunteerPolicy, Family family,
ImmutableList<CompletedRequirementInfo> completedFamilyRequirements,
ImmutableList<ExemptedRequirementInfo> exemptedFamilyRequirements,
ImmutableList<Resources.CompletedRequirementInfo> completedFamilyRequirements,
ImmutableList<Resources.ExemptedRequirementInfo> exemptedFamilyRequirements,
ImmutableList<RoleRemoval> familyRoleRemovals,
ImmutableDictionary<Guid, ImmutableList<CompletedRequirementInfo>> completedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<ExemptedRequirementInfo>> exemptedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<Resources.CompletedRequirementInfo>> completedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<Resources.ExemptedRequirementInfo>> exemptedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<RoleRemoval>> individualRoleRemovals)
{
var allAdultsIndividualApprovalStatus = family.Adults
Expand Down
21 changes: 21 additions & 0 deletions src/CareTogether.Core/Engines/PolicyEvaluation/ChildLocation.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System;

namespace CareTogether.Engines.PolicyEvaluation;

public sealed record ChildLocation(
Guid ChildLocationFamilyId,
DateOnly Date,
bool Paused // means "from now on, we stop checking for completion until resuming"
)
: IComparable<ChildLocation>
{
public int CompareTo(ChildLocation? other)
{
return other == null
? 1
: DateTime.Compare(
new DateTime(Date, new TimeOnly()),
new DateTime(other.Date, new TimeOnly())
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
using System;

//NOTE: If there are ever more than two options, IsMissing should become an enum.
public sealed record DateOfInterest(DateOnly Date, bool IsMissing);
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ internal static ImmutableDictionary<string, FamilyRoleApprovalStatus>
CalculateAllFamilyRoleApprovalStatuses(
ImmutableDictionary<string, VolunteerFamilyRolePolicy> volunteerFamilyRoles,
Family family,
ImmutableList<CompletedRequirementInfo> completedFamilyRequirements,
ImmutableList<ExemptedRequirementInfo> exemptedFamilyRequirements,
ImmutableList<Resources.CompletedRequirementInfo> completedFamilyRequirements,
ImmutableList<Resources.ExemptedRequirementInfo> exemptedFamilyRequirements,
ImmutableList<RoleRemoval> familyRoleRemovals,
ImmutableDictionary<Guid, ImmutableList<CompletedRequirementInfo>> completedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<ExemptedRequirementInfo>> exemptedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<Resources.CompletedRequirementInfo>> completedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<Resources.ExemptedRequirementInfo>> exemptedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<RoleRemoval>> individualRoleRemovals)
{
var allFamilyRoleApprovals = volunteerFamilyRoles
Expand All @@ -39,11 +39,11 @@ internal static ImmutableDictionary<string, FamilyRoleApprovalStatus>
internal static FamilyRoleApprovalStatus
CalculateFamilyRoleApprovalStatus(
string roleName, VolunteerFamilyRolePolicy rolePolicy, Family family,
ImmutableList<CompletedRequirementInfo> completedFamilyRequirements,
ImmutableList<ExemptedRequirementInfo> exemptedFamilyRequirements,
ImmutableList<Resources.CompletedRequirementInfo> completedFamilyRequirements,
ImmutableList<Resources.ExemptedRequirementInfo> exemptedFamilyRequirements,
ImmutableList<RoleRemoval> removalsOfThisRole,
ImmutableDictionary<Guid, ImmutableList<CompletedRequirementInfo>> completedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<ExemptedRequirementInfo>> exemptedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<Resources.CompletedRequirementInfo>> completedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<Resources.ExemptedRequirementInfo>> exemptedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<RoleRemoval>> individualRoleRemovals)
{
var roleVersionApprovals = rolePolicy.PolicyVersions
Expand All @@ -69,11 +69,11 @@ internal static FamilyRoleVersionApprovalStatus
CalculateFamilyRoleVersionApprovalStatus(
string roleName, VolunteerFamilyRolePolicyVersion policyVersion,
Family family,
ImmutableList<CompletedRequirementInfo> completedFamilyRequirements,
ImmutableList<ExemptedRequirementInfo> exemptedFamilyRequirements,
ImmutableList<Resources.CompletedRequirementInfo> completedFamilyRequirements,
ImmutableList<Resources.ExemptedRequirementInfo> exemptedFamilyRequirements,
ImmutableList<RoleRemoval> removalsOfThisRole,
ImmutableDictionary<Guid, ImmutableList<CompletedRequirementInfo>> completedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<ExemptedRequirementInfo>> exemptedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<Resources.CompletedRequirementInfo>> completedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<Resources.ExemptedRequirementInfo>> exemptedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<RoleRemoval>> individualRoleRemovals)
{
// Ignore any inactive (i.e., soft-deleted) adults.
Expand Down Expand Up @@ -122,11 +122,11 @@ internal static FamilyRoleRequirementCompletionStatus
string roleName, string requirementActionName,
RequirementStage requirementStage, VolunteerFamilyRequirementScope requirementScope,
DateTime? policyVersionSupersededAtUtc,
ImmutableList<CompletedRequirementInfo> completedFamilyRequirements,
ImmutableList<ExemptedRequirementInfo> exemptedFamilyRequirements,
ImmutableList<Resources.CompletedRequirementInfo> completedFamilyRequirements,
ImmutableList<Resources.ExemptedRequirementInfo> exemptedFamilyRequirements,
ImmutableDictionary<Guid, ImmutableList<RoleRemoval>> individualRoleRemovals,
ImmutableList<(Guid Id, ImmutableList<CompletedRequirementInfo> CompletedRequirements,
ImmutableList<ExemptedRequirementInfo> ExemptedRequirements)> activeAdults)
ImmutableList<(Guid Id, ImmutableList<Resources.CompletedRequirementInfo> CompletedRequirements,
ImmutableList<Resources.ExemptedRequirementInfo> ExemptedRequirements)> activeAdults)
{
// If there are no active adults in the family, then the requirement cannot be met.
if (activeAdults.Count == 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ public sealed record ArrangementStatus(
public sealed record MissingArrangementRequirement(
string? ArrangementFunction, string? ArrangementFunctionVariant,
Guid? VolunteerFamilyId, Guid? PersonId,
string ActionName, DateTime? DueBy, DateTime? PastDueSince);
string ActionName, DateOnly? DueBy, DateOnly? PastDueSince);

public enum ArrangementPhase { SettingUp, ReadyToStart, Started, Ended, Cancelled };

Expand All @@ -283,15 +283,15 @@ public interface IPolicyEvaluationEngine
//TODO: Merge this with the CombinedFamilyInfoFormatter logic
Task<FamilyApprovalStatus> CalculateCombinedFamilyApprovalsAsync(
Guid organizationId, Guid locationId, Family family,
ImmutableList<CompletedRequirementInfo> completedFamilyRequirements,
ImmutableList<ExemptedRequirementInfo> exemptedFamilyRequirements,
ImmutableList<Resources.CompletedRequirementInfo> completedFamilyRequirements,
ImmutableList<Resources.ExemptedRequirementInfo> exemptedFamilyRequirements,
ImmutableList<RoleRemoval> familyRoleRemovals,
ImmutableDictionary<Guid, ImmutableList<CompletedRequirementInfo>> completedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<ExemptedRequirementInfo>> exemptedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<Resources.CompletedRequirementInfo>> completedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<Resources.ExemptedRequirementInfo>> exemptedIndividualRequirements,
ImmutableDictionary<Guid, ImmutableList<RoleRemoval>> individualRoleRemovals);

Task<ReferralStatus> CalculateReferralStatusAsync(
Guid organizationId, Guid locationId, Family family,
ReferralEntry referralEntry);
Resources.Referrals.ReferralEntry referralEntry);
}
}
Loading
Loading