+
@@ -303,5 +263,5 @@ function InviteMembersForm({
}
function createEmptyInviteModel() {
- return { email: '', role: 'member' as Role, personal_code: '' };
+ return { email: '', personal_code: '' };
}
diff --git a/packages/features/team-accounts/src/schema/invite-members.schema.ts b/packages/features/team-accounts/src/schema/invite-members.schema.ts
index 5d41885..fb3161f 100644
--- a/packages/features/team-accounts/src/schema/invite-members.schema.ts
+++ b/packages/features/team-accounts/src/schema/invite-members.schema.ts
@@ -2,7 +2,6 @@ import { z } from 'zod';
const InviteSchema = z.object({
email: z.string().email(),
- role: z.string().min(1).max(100),
personal_code: z
.string()
.regex(/^[1-6]\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}\d$/, {
diff --git a/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts b/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts
index d08736b..4f11f93 100644
--- a/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts
+++ b/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts
@@ -5,7 +5,6 @@ import { redirect } from 'next/navigation';
import { z } from 'zod';
-import { AccountBalanceService } from '@kit/accounts/services/account-balance.service';
import { enhanceAction } from '@kit/next/actions';
import { createNotificationsApi } from '@kit/notifications/api';
import { getLogger } from '@kit/shared/logger';
diff --git a/packages/features/team-accounts/src/server/services/account-invitations.service.ts b/packages/features/team-accounts/src/server/services/account-invitations.service.ts
index c707f84..b9443d3 100644
--- a/packages/features/team-accounts/src/server/services/account-invitations.service.ts
+++ b/packages/features/team-accounts/src/server/services/account-invitations.service.ts
@@ -191,7 +191,10 @@ class AccountInvitationsService {
const response = await this.client
.schema('medreport')
.rpc('add_invitations_to_account', {
- invitations,
+ invitations: invitations.map((invitation) => ({
+ ...invitation,
+ role: 'member',
+ })),
account_slug: accountSlug,
});
diff --git a/supabase/migrations/20251009174500_remove_otp_from_doctor.sql b/supabase/migrations/20251009174500_remove_otp_from_doctor.sql
new file mode 100644
index 0000000..77bd8f6
--- /dev/null
+++ b/supabase/migrations/20251009174500_remove_otp_from_doctor.sql
@@ -0,0 +1,15 @@
+CREATE OR REPLACE FUNCTION medreport.is_doctor()
+RETURNS BOOLEAN
+LANGUAGE plpgsql
+SECURITY DEFINER
+AS $$
+BEGIN
+ RETURN EXISTS (
+ SELECT 1
+ FROM medreport.accounts
+ WHERE primary_owner_user_id = auth.uid()
+ AND application_role = 'doctor'
+ );
+END;
+$$;
+grant execute on function medreport.is_doctor() to authenticated;
\ No newline at end of file
diff --git a/supabase/migrations/20251009180300_fix_member_management.sql b/supabase/migrations/20251009180300_fix_member_management.sql
new file mode 100644
index 0000000..a87edc1
--- /dev/null
+++ b/supabase/migrations/20251009180300_fix_member_management.sql
@@ -0,0 +1,47 @@
+drop policy "Allow select and update if user is account's primary owner" on medreport.company_params;
+
+create policy "Allow select and update if user is account's HR"
+on medreport.company_params
+for all
+using (
+ EXISTS (
+ SELECT 1
+ FROM medreport.accounts_memberships am
+ WHERE am.account_id = company_params.account_id
+ AND am.user_id = auth.uid()
+ AND am.account_role = 'owner'
+ )
+)
+with check (
+ EXISTS (
+ SELECT 1
+ FROM medreport.accounts_memberships am
+ WHERE am.account_id = company_params.account_id
+ AND am.user_id = auth.uid()
+ AND am.account_role = 'owner'
+ )
+);
+
+create or replace function medreport.clear_benefit_amount_on_employee_deletion()
+returns trigger
+language plpgsql
+security definer
+set search_path = medreport, public
+as $$
+begin
+ update medreport.account_balance_entries abe
+ set amount = 0
+ where abe.account_id = old.user_id
+ AND abe.entry_type = 'benefit';
+
+ return null;
+end;
+$$;
+
+drop trigger if exists trigger_accounts_memberships_after_delete
+ on medreport.accounts_memberships;
+
+create trigger trigger_accounts_memberships_after_delete
+after delete on medreport.accounts_memberships
+for each row
+execute function medreport.clear_benefit_amount_on_employee_deletion();