Files
triqura-ecd/scripts/seed-organization.ts
2025-11-23 10:13:00 +01:00

166 lines
5.7 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* ============================================================================
* Seed Default Organization
* ============================================================================
* Epic: E3.S1 - Organization seed
* Purpose: Create default GGZ organization for development
* Usage: npx tsx scripts/seed-organization.ts
* ============================================================================
*/
import { createClient } from '@supabase/supabase-js';
// Load environment variables
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!;
const supabaseServiceKey = process.env.SUPABASE_SERVICE_ROLE_KEY!;
if (!supabaseUrl || !supabaseServiceKey) {
console.error('❌ Missing Supabase environment variables');
console.error(' NEXT_PUBLIC_SUPABASE_URL:', supabaseUrl ? '✓' : '✗');
console.error(' SUPABASE_SERVICE_ROLE_KEY:', supabaseServiceKey ? '✓' : '✗');
process.exit(1);
}
// Create Supabase admin client (bypasses RLS)
const supabase = createClient(supabaseUrl, supabaseServiceKey, {
auth: {
autoRefreshToken: false,
persistSession: false
}
});
interface Organization {
id: string;
identifier_agb: string;
identifier_kvk: string;
name: string;
alias: string[];
type_code: string;
type_display: string;
telecom_phone: string;
telecom_email: string;
telecom_website: string;
address_line: string[];
address_city: string;
address_postal_code: string;
address_country: string;
active: boolean;
}
const defaultOrganization: Organization = {
id: '00000000-0000-0000-0000-000000000001',
identifier_agb: 'AGB-DEMO-001',
identifier_kvk: '12345678',
name: 'Demo GGZ Instelling',
alias: ['Demo GGZ', 'DGGZ'],
type_code: 'prov',
type_display: 'Healthcare Provider',
telecom_phone: '030-1234567',
telecom_email: 'info@demo-ggz.nl',
telecom_website: 'https://demo-ggz.nl',
address_line: ['Demonstratiestraat 1'],
address_city: 'Utrecht',
address_postal_code: '3511 AB',
address_country: 'NL',
active: true
};
async function seedOrganization() {
console.log('🚀 Seeding default organization...\n');
try {
// Check if organization already exists
const { data: existing, error: checkError } = await supabase
.from('organizations')
.select('id, name, identifier_agb')
.eq('identifier_agb', 'AGB-DEMO-001')
.maybeSingle();
if (checkError) {
throw new Error(`Error checking existing organization: ${checkError.message}`);
}
if (existing) {
console.log(' Organization already exists:');
console.log(` ID: ${existing.id}`);
console.log(` Name: ${existing.name}`);
console.log(` AGB: ${existing.identifier_agb}`);
console.log('\n🔄 Updating organization...\n');
// Update existing organization
const { error: updateError } = await supabase
.from('organizations')
.update({
identifier_kvk: defaultOrganization.identifier_kvk,
name: defaultOrganization.name,
alias: defaultOrganization.alias,
type_code: defaultOrganization.type_code,
type_display: defaultOrganization.type_display,
telecom_phone: defaultOrganization.telecom_phone,
telecom_email: defaultOrganization.telecom_email,
telecom_website: defaultOrganization.telecom_website,
address_line: defaultOrganization.address_line,
address_city: defaultOrganization.address_city,
address_postal_code: defaultOrganization.address_postal_code,
address_country: defaultOrganization.address_country,
active: defaultOrganization.active,
updated_at: new Date().toISOString()
})
.eq('id', existing.id);
if (updateError) {
throw new Error(`Error updating organization: ${updateError.message}`);
}
console.log('✅ Organization updated successfully');
} else {
console.log(' Creating new organization...\n');
// Insert new organization
const { error: insertError } = await supabase
.from('organizations')
.insert([defaultOrganization]);
if (insertError) {
throw new Error(`Error inserting organization: ${insertError.message}`);
}
console.log('✅ Organization created successfully');
}
// Verify the organization exists
const { data: verified, error: verifyError } = await supabase
.from('organizations')
.select('*')
.eq('identifier_agb', 'AGB-DEMO-001')
.single();
if (verifyError) {
throw new Error(`Error verifying organization: ${verifyError.message}`);
}
console.log('\n✅ Verification successful:');
console.log(' ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
console.log(` ID: ${verified.id}`);
console.log(` Name: ${verified.name}`);
console.log(` AGB: ${verified.identifier_agb}`);
console.log(` KVK: ${verified.identifier_kvk}`);
console.log(` Email: ${verified.telecom_email}`);
console.log(` Website: ${verified.telecom_website}`);
console.log(` Address: ${verified.address_line.join(', ')}`);
console.log(` City: ${verified.address_city} ${verified.address_postal_code}`);
console.log(` Active: ${verified.active ? 'Yes' : 'No'}`);
console.log(' ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
console.log('🎉 E3.S1 - Organization seed completed!\n');
} catch (error) {
console.error('\n❌ Error seeding organization:');
console.error(error instanceof Error ? error.message : error);
process.exit(1);
}
}
// Run the seed function
seedOrganization();