feat: migrate clients module to patients + add docs

This commit is contained in:
colinislit
2025-11-23 10:13:00 +01:00
parent 8e3925ea09
commit 6fcb9a0e7b
277 changed files with 9131 additions and 458 deletions

View File

@@ -0,0 +1,165 @@
/**
* ============================================================================
* 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();