ifqueryErr:=tx.QueryRow(operationContext,`SELECT COALESCE(MAX(version_no),0)+1 FROM billing_price_book WHERE tenant_id=$1::uuid AND provider=$2`,currentActor.tenantID,input.Provider).Scan(&versionNo);queryErr!=nil{
returnidempotency.Result{},queryErr
}
publicID:=uuid.NewString()
varinternalIDstring
ifqueryErr:=tx.QueryRow(operationContext,`INSERT INTO billing_price_book(public_id,tenant_id,provider,currency,version_no,source_ref,change_summary,effective_from,created_by) VALUES($1::uuid,$2::uuid,$3,$4,$5,$6,$7,$8,$9::uuid) RETURNING id::text`,publicID,currentActor.tenantID,input.Provider,input.Currency,versionNo,input.SourceRef,input.ChangeSummary,input.EffectiveFrom.UTC(),currentActor.userID).Scan(&internalID);queryErr!=nil{
returnidempotency.Result{},queryErr
}
for_,rate:=rangeinput.Rates{
if_,queryErr:=tx.Exec(operationContext,`INSERT INTO billing_price_rate(price_book_id,usage_category,metric_code,unit,unit_price_micros) VALUES($1::uuid,$2,$3,$4,$5)`,internalID,rate.UsageCategory,rate.MetricCode,rate.Unit,rate.UnitPriceMicros);queryErr!=nil{
err=tx.QueryRow(ctx,`SELECT id::text,status,created_by::text,provider,currency,row_version,effective_from FROM billing_price_book WHERE tenant_id=$1::uuid AND public_id=$2::uuid FOR UPDATE`,currentActor.tenantID,publicID).Scan(&internalID,&status,&creatorID,&provider,¤cy,&rowVersion,&effectiveFrom)
iferr=tx.QueryRow(ctx,`SELECT EXISTS(SELECT 1 FROM billing_price_book WHERE tenant_id=$1::uuid AND provider<>$2 AND status='PUBLISHED' AND currency<>$3) OR EXISTS(SELECT 1 FROM usage_quota_policy WHERE tenant_id=$1::uuid AND status='ACTIVE' AND currency<>$3)`,currentActor.tenantID,provider,currency).Scan(&incompatibleCurrency);err!=nil{
if_,err=tx.Exec(ctx,`UPDATE billing_price_book SET status='RETIRED',retired_at=now(),row_version=row_version+1,updated_at=now() WHERE tenant_id=$1::uuid AND provider=$2 AND status='PUBLISHED'`,currentActor.tenantID,provider);err!=nil{
returnPriceBook{},err
}
if_,err=tx.Exec(ctx,`UPDATE billing_price_book SET status='PUBLISHED',published_by=$2::uuid,published_at=now(),row_version=row_version+1,updated_at=now() WHERE id=$1::uuid`,internalID,currentActor.userID);err!=nil{
rows,err:=s.pool.Query(ctx,`SELECT public_id::text FROM billing_price_book WHERE tenant_id=$1::uuid ORDER BY provider,currency,version_no DESC LIMIT 500`,currentActor.tenantID)
ifqueryErr:=tx.QueryRow(operationContext,`SELECT EXISTS(SELECT 1 FROM billing_price_book WHERE tenant_id=$1::uuid AND status='PUBLISHED' AND currency<>$2)`,currentActor.tenantID,input.Currency).Scan(&incompatiblePriceCurrency);queryErr!=nil{
returnidempotency.Result{},queryErr
}
ifincompatiblePriceCurrency{
returnidempotency.Result{},ErrInvalid
}
vardeviceID*string
ifinput.ScopeType=="DEVICE"{
varidstring
queryErr:=tx.QueryRow(operationContext,`SELECT id::text FROM device WHERE tenant_id=$1::uuid AND public_id=$2::uuid AND status='registered'`,currentActor.tenantID,input.ScopeID).Scan(&id)
iferrors.Is(queryErr,pgx.ErrNoRows){
returnidempotency.Result{},ErrAccessDenied
}
ifqueryErr!=nil{
returnidempotency.Result{},queryErr
}
deviceID=&id
vartenantTimezone,tenantCurrencystring
queryErr=tx.QueryRow(operationContext,`SELECT billing_timezone,currency FROM usage_quota_policy WHERE tenant_id=$1::uuid AND scope_type='TENANT' AND status='ACTIVE'`,currentActor.tenantID).Scan(&tenantTimezone,&tenantCurrency)
queryErr:=tx.QueryRow(operationContext,`SELECT EXISTS(SELECT 1 FROM usage_quota_policy WHERE tenant_id=$1::uuid AND scope_type='DEVICE' AND status='ACTIVE' AND (billing_timezone<>$2 OR currency<>$3))`,currentActor.tenantID,input.BillingTimezone,input.Currency).Scan(&incompatibleDevicePolicy)
ifqueryErr:=tx.QueryRow(operationContext,`SELECT COALESCE(MAX(version_no),0)+1 FROM usage_quota_policy WHERE tenant_id=$1::uuid AND scope_type=$2 AND (($2='TENANT') OR device_id=$3::uuid)`,currentActor.tenantID,input.ScopeType,deviceID).Scan(&versionNo);queryErr!=nil{
returnidempotency.Result{},queryErr
}
if_,queryErr:=tx.Exec(operationContext,`UPDATE usage_quota_policy SET status='RETIRED',retired_at=now(),row_version=row_version+1,updated_at=now() WHERE tenant_id=$1::uuid AND scope_type=$2 AND status='ACTIVE' AND (($2='TENANT') OR device_id=$3::uuid)`,currentActor.tenantID,input.ScopeType,deviceID);queryErr!=nil{
returnidempotency.Result{},queryErr
}
publicID:=uuid.NewString()
varinternalIDstring
ifqueryErr:=tx.QueryRow(operationContext,`INSERT INTO usage_quota_policy(public_id,tenant_id,scope_type,device_id,version_no,billing_timezone,currency,daily_limit_micros,monthly_limit_micros,max_concurrent_calls,max_call_duration_sec,in_progress_action,change_summary,created_by) VALUES($1::uuid,$2::uuid,$3,$4::uuid,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14::uuid) RETURNING id::text`,publicID,currentActor.tenantID,input.ScopeType,deviceID,versionNo,input.BillingTimezone,input.Currency,input.DailyLimitMicros,input.MonthlyLimitMicros,input.MaxConcurrentCalls,input.MaxCallDurationSec,input.InProgressAction,input.ChangeSummary,currentActor.userID).Scan(&internalID);queryErr!=nil{
rows,err:=s.pool.Query(ctx,quotaSelect+` WHERE qp.tenant_id=$1::uuid ORDER BY CASE qp.status WHEN 'ACTIVE' THEN 1 ELSE 2 END,qp.scope_type,qp.version_no DESC LIMIT 1000`,currentActor.tenantID)
err:=s.pool.QueryRow(ctx,`SELECT t.id::text,t.public_id::text,ua.id::text,ua.public_id::text,ua.platform_role FROM user_account ua JOIN tenant t ON t.id=ua.tenant_id AND t.status='active' WHERE t.public_id=$1::uuid AND ua.oidc_issuer=$2 AND ua.oidc_subject=$3 AND ua.status='active' AND ua.account_kind='operator'`,tenantPublicID,principal.Issuer,principal.Subject).Scan(&result.tenantID,&result.tenantPublicID,&result.userID,&result.userPublicID,&result.role)
constpriceBookSelect=`SELECT pb.public_id::text,t.public_id::text,pb.provider,pb.currency,pb.version_no,pb.status,pb.source_ref,pb.change_summary,pb.effective_from,creator.public_id::text,publisher.public_id::text,pb.published_at,pb.retired_at,pb.row_version,pb.created_at,pb.updated_at FROM billing_price_book pb JOIN tenant t ON t.id=pb.tenant_id JOIN user_account creator ON creator.id=pb.created_by LEFT JOIN user_account publisher ON publisher.id=pb.published_by`
item,err:=scanPriceBook(tx.QueryRow(ctx,priceBookSelect+` WHERE pb.tenant_id=$1::uuid AND pb.public_id=$2::uuid`,tenantID,publicID))
iferr!=nil{
returnPriceBook{},err
}
rows,err:=tx.Query(ctx,`SELECT id::text,usage_category,metric_code,unit,unit_price_micros FROM billing_price_rate WHERE price_book_id=(SELECT id FROM billing_price_book WHERE tenant_id=$1::uuid AND public_id=$2::uuid) ORDER BY usage_category,metric_code,unit`,tenantID,publicID)
item,err:=scanPriceBook(pool.QueryRow(ctx,priceBookSelect+` WHERE pb.tenant_id=$1::uuid AND pb.public_id=$2::uuid`,tenantID,publicID))
iferr!=nil{
returnPriceBook{},err
}
rows,err:=pool.Query(ctx,`SELECT id::text,usage_category,metric_code,unit,unit_price_micros FROM billing_price_rate WHERE price_book_id=(SELECT id FROM billing_price_book WHERE tenant_id=$1::uuid AND public_id=$2::uuid) ORDER BY usage_category,metric_code,unit`,tenantID,publicID)
constquotaSelect=`SELECT qp.public_id::text,t.public_id::text,qp.scope_type,d.public_id::text,qp.version_no,qp.status,qp.billing_timezone,qp.currency,qp.daily_limit_micros,qp.monthly_limit_micros,qp.max_concurrent_calls,qp.max_call_duration_sec,qp.in_progress_action,qp.change_summary,ua.public_id::text,qp.retired_at,qp.row_version,qp.created_at,qp.updated_at FROM usage_quota_policy qp JOIN tenant t ON t.id=qp.tenant_id JOIN user_account ua ON ua.id=qp.created_by LEFT JOIN device d ON d.id=qp.device_id`