Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions JobFlow.API/Controllers/OrganizationController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,10 @@ await FirebaseAuth.DefaultInstance.UpdateUserAsync(new UserRecordArgs
// Auto-create an Employee record linked to the new user
await CreateOwnerEmployeeAsync(model, userResult.Value);

// Apply org size from registration payload
if (!string.IsNullOrWhiteSpace(model.OrgSize))
await _organizationService.SetOrgSizeAsync(model.Id.Value, model.OrgSize);

var orgResults = await _organizationService.GetOrganizationDtoById(model.Id.Value);
return orgResults.IsSuccess ? Results.Ok(orgResults.Value) : orgResults.ToProblemDetails();
}
Expand Down
1 change: 1 addition & 0 deletions JobFlow.Business/Models/DTOs/OrganizationDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,5 @@ public class OrganizationDto
public string? SquareMerchantId { get; set; }
public bool IsSquareConnected { get; set; }
public bool PaymentSetupDeferred { get; set; }
public OrgSize OrgSize { get; set; }
}
1 change: 1 addition & 0 deletions JobFlow.Business/Models/DTOs/OrganizationRegisterDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@ public class OrganizationRegisterDto
public string? City { get; set; }
public string? State { get; set; }
public string? PhoneNumber { get; set; }
public string? OrgSize { get; set; }
}
7 changes: 5 additions & 2 deletions JobFlow.Business/Onboarding/OnboardingCatalog.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using JobFlow.Domain.Models;
using JobFlow.Domain.Enums;
using JobFlow.Domain.Models;

namespace JobFlow.Business.Onboarding;

Expand Down Expand Up @@ -49,7 +50,9 @@ public static class OnboardingCatalog
"Get paid",
70,
org => org.IsStripeConnected
)
),
new(OnboardingStepKeys.InviteTeam, "Invite your team", 75, org => org.OrgSize == OrgSize.SmallTeam),
new(OnboardingStepKeys.AssignRoles, "Assign roles", 80, org => org.OrgSize == OrgSize.SmallTeam)
];

public static bool IsKnown(string key)
Expand Down
2 changes: 2 additions & 0 deletions JobFlow.Business/Onboarding/OnboardingStepKeys.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ public static class OnboardingStepKeys
public const string SendInvoice = "send_invoice";
public const string ReceivePayment = "receive_payment";
public const string ConnectStripe = "connect_stripe";
public const string InviteTeam = "invite_team";
public const string AssignRoles = "assign_roles";
}
18 changes: 18 additions & 0 deletions JobFlow.Business/Services/OrganizationService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using JobFlow.Business.Onboarding;
using JobFlow.Business.Services.ServiceInterfaces;
using JobFlow.Domain;
using JobFlow.Domain.Enums;
using JobFlow.Domain.Models;
using Mapster;
using Microsoft.EntityFrameworkCore;
Expand Down Expand Up @@ -230,4 +231,21 @@ public async Task<Result<Organization>> UpdateIndustryAsync(Guid organizationId,

return Result.Success(organization);
}

public async Task<Result> SetOrgSizeAsync(Guid organizationId, string? orgSizeValue)
{
var org = await _unitOfWork.RepositoryOf<Organization>().GetByIdAsync(organizationId);
if (org == null)
return Result.Failure(OrganizationErrors.OrganizationNotFound);

var size = (orgSizeValue ?? string.Empty).Trim().ToLowerInvariant() switch
{
"small_team" or "team" => OrgSize.SmallTeam,
_ => OrgSize.Solo
};

org.OrgSize = size;
await _unitOfWork.SaveChangesAsync();
return Result.Success();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@ public interface IOrganizationService
Task MarkSquareDisconnectedAsync(string squareMerchantId);
Task<Result> UpdateSubscriptionStateAsync(Guid organizationId, string? subscriptionStatus, string? subscriptionPlanName = null, DateTime? subscriptionExpiresAt = null);
Task<Result> DeleteOrganization(Guid organizationId);
Task<Result> SetOrgSizeAsync(Guid organizationId, string? orgSizeValue);
}
7 changes: 7 additions & 0 deletions JobFlow.Domain/Enums/OrgSize.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace JobFlow.Domain.Enums;

public enum OrgSize
{
Solo = 0,
SmallTeam = 1
}
1 change: 1 addition & 0 deletions JobFlow.Domain/Models/Organization.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public class Organization : Entity
public DateTime? SubscriptionExpiresAt { get; set; }

public DateTimeOffset? PaymentSetupSkippedAt { get; set; }
public OrgSize OrgSize { get; set; } = OrgSize.Solo;

public bool CanAcceptPayments =>
(PaymentProvider == PaymentProvider.Stripe &&
Expand Down
Loading
Loading