60 lines
1.6 KiB
PL/PgSQL
60 lines
1.6 KiB
PL/PgSQL
alter table medreport.account_balance_entries add column "is_analysis_order" boolean;
|
|
alter table medreport.account_balance_entries add column "is_analysis_package_order" boolean;
|
|
|
|
drop function if exists medreport.consume_account_balance(uuid, numeric, text, text);
|
|
|
|
-- Create function to consume balance (for purchases)
|
|
create or replace function medreport.consume_account_balance(
|
|
p_account_id uuid,
|
|
p_amount numeric,
|
|
p_description text,
|
|
p_reference_id text default null,
|
|
p_is_analysis_order boolean default false,
|
|
p_is_analysis_package_order boolean default false
|
|
)
|
|
returns boolean
|
|
language plpgsql
|
|
security definer
|
|
as $$
|
|
declare
|
|
current_balance numeric;
|
|
remaining_amount numeric := p_amount;
|
|
entry_record record;
|
|
consumed_amount numeric;
|
|
begin
|
|
-- Get current balance
|
|
current_balance := medreport.get_account_balance(p_account_id);
|
|
|
|
-- Check if sufficient balance
|
|
if current_balance < p_amount then
|
|
return false;
|
|
end if;
|
|
|
|
-- Record the consumption
|
|
insert into medreport.account_balance_entries (
|
|
account_id,
|
|
amount,
|
|
entry_type,
|
|
description,
|
|
reference_id,
|
|
created_by,
|
|
is_analysis_order,
|
|
is_analysis_package_order
|
|
) values (
|
|
p_account_id,
|
|
-p_amount,
|
|
'purchase',
|
|
p_description,
|
|
p_reference_id,
|
|
auth.uid(),
|
|
p_is_analysis_order,
|
|
p_is_analysis_package_order
|
|
);
|
|
|
|
return true;
|
|
end;
|
|
$$;
|
|
|
|
-- Grant execute permission
|
|
grant execute on function medreport.consume_account_balance(uuid, numeric, text, text, boolean, boolean) to authenticated, service_role;
|