236 lines
6.9 KiB
TypeScript
236 lines
6.9 KiB
TypeScript
'use server'
|
|
import { createAdminClient } from '@/lib/supabase/admin'
|
|
import { revalidatePath } from 'next/cache'
|
|
|
|
export async function getCompanies() {
|
|
const admin = createAdminClient()
|
|
const { data, error } = await admin.from('companies').select('*')
|
|
if (error) throw error
|
|
return data
|
|
}
|
|
|
|
export async function createCompany(data: { name: string; street?: string; zip?: string; city?: string; email?: string }) {
|
|
const admin = createAdminClient()
|
|
const { data: dbData, error } = await admin.from('companies').insert({
|
|
name: data.name,
|
|
street: data.street || null,
|
|
zip: data.zip || null,
|
|
city: data.city || null,
|
|
email: data.email || null,
|
|
}).select().single()
|
|
if (error) throw error
|
|
revalidatePath('/admin/companies')
|
|
return dbData
|
|
}
|
|
|
|
export async function updateCompany(id: string, data: { name: string; street?: string; zip?: string; city?: string; email?: string }) {
|
|
const admin = createAdminClient()
|
|
const { data: dbData, error } = await admin.from('companies').update({
|
|
name: data.name,
|
|
street: data.street || null,
|
|
zip: data.zip || null,
|
|
city: data.city || null,
|
|
email: data.email || null,
|
|
}).eq('id', id).select().single()
|
|
if (error) throw error
|
|
revalidatePath('/admin/companies')
|
|
return dbData
|
|
}
|
|
|
|
export async function deleteCompany(id: string) {
|
|
const admin = createAdminClient()
|
|
const { error } = await admin.from('companies').delete().eq('id', id)
|
|
if (error) throw error
|
|
revalidatePath('/admin/companies')
|
|
return true
|
|
}
|
|
|
|
export async function assignCompanyToUser(userId: string, companyId: string | null) {
|
|
const admin = createAdminClient()
|
|
const { error } = await admin.from('users').update({ company_id: companyId }).eq('id', userId)
|
|
if (error) throw error
|
|
revalidatePath('/admin/users')
|
|
return true
|
|
}
|
|
|
|
export async function getEndCustomersByCompany(companyId: string) {
|
|
const admin = createAdminClient()
|
|
|
|
// 1. Get all partners of this company
|
|
const { data: partners, error: partnersError } = await admin
|
|
.from('users')
|
|
.select('id')
|
|
.eq('company_id', companyId)
|
|
if (partnersError) throw partnersError
|
|
|
|
if (!partners || partners.length === 0) return []
|
|
|
|
const partnerIds = partners.map((p) => p.id)
|
|
|
|
// 2. Get all end customers belonging to these partners
|
|
const { data: customers, error: customersError } = await admin
|
|
.from('end_customers')
|
|
.select('*')
|
|
.in('partner_id', partnerIds)
|
|
if (customersError) throw customersError
|
|
|
|
return customers || []
|
|
}
|
|
|
|
export async function getCompanyDetails(companyId: string) {
|
|
const admin = createAdminClient()
|
|
const { data, error } = await admin.from('companies').select('*').eq('id', companyId).single()
|
|
if (error) throw error
|
|
return data
|
|
}
|
|
|
|
export async function getEndCustomersByCompanyWithPartners(companyId: string) {
|
|
const admin = createAdminClient()
|
|
|
|
// 1. Get all partners of this company
|
|
const { data: partners, error: partnersError } = await admin
|
|
.from('users')
|
|
.select('id')
|
|
.eq('company_id', companyId)
|
|
if (partnersError) throw partnersError
|
|
|
|
if (!partners || partners.length === 0) return []
|
|
|
|
const partnerIds = partners.map((p) => p.id)
|
|
|
|
// 2. Get all end customers belonging to these partners
|
|
const { data: customers, error: customersError } = await admin
|
|
.from('end_customers')
|
|
.select('*')
|
|
.in('partner_id', partnerIds)
|
|
if (customersError) throw customersError
|
|
|
|
// 3. Get profiles of all these partners to resolve their names
|
|
const { data: profiles, error: profilesError } = await admin
|
|
.from('profiles')
|
|
.select('id, first_name, last_name')
|
|
.in('id', partnerIds)
|
|
if (profilesError) throw profilesError
|
|
|
|
// Get user emails
|
|
const { data: { users }, error: authError } = await admin.auth.admin.listUsers()
|
|
const emailMap = new Map((users || []).map(u => [u.id, u.email || '']))
|
|
|
|
const profileMap = new Map((profiles || []).map((p) => [p.id, p]))
|
|
|
|
return customers.map((c) => {
|
|
const prof = profileMap.get(c.partner_id)
|
|
return {
|
|
...c,
|
|
partner_name: prof ? `${prof.first_name || ''} ${prof.last_name || ''}`.trim() || emailMap.get(c.partner_id) || 'Unbekannt' : emailMap.get(c.partner_id) || 'Unbekannt',
|
|
}
|
|
})
|
|
}
|
|
|
|
export async function getCompanyPartners(companyId: string) {
|
|
const admin = createAdminClient()
|
|
const { data: usersData, error: usersError } = await admin
|
|
.from('users')
|
|
.select('id, role')
|
|
.eq('company_id', companyId)
|
|
if (usersError) throw usersError
|
|
|
|
if (!usersData || usersData.length === 0) return []
|
|
|
|
const userIds = usersData.map(u => u.id)
|
|
|
|
const { data: profiles, error: profilesError } = await admin
|
|
.from('profiles')
|
|
.select('id, first_name, last_name')
|
|
.in('id', userIds)
|
|
if (profilesError) throw profilesError
|
|
|
|
const { data: { users }, error: authError } = await admin.auth.admin.listUsers()
|
|
const emailMap = new Map((users || []).map(u => [u.id, u.email || '']))
|
|
|
|
const profileMap = new Map((profiles || []).map(p => [p.id, p]))
|
|
|
|
return usersData.map(u => {
|
|
const prof = profileMap.get(u.id)
|
|
return {
|
|
id: u.id,
|
|
email: emailMap.get(u.id) || '',
|
|
name: prof ? `${prof.first_name || ''} ${prof.last_name || ''}`.trim() || emailMap.get(u.id) || 'Unbekannt' : emailMap.get(u.id) || 'Unbekannt',
|
|
}
|
|
})
|
|
}
|
|
|
|
export async function adminCreateEndCustomer(data: {
|
|
partner_id: string
|
|
company_name: string
|
|
vat_id?: string
|
|
first_name?: string
|
|
last_name?: string
|
|
street?: string
|
|
zip?: string
|
|
city?: string
|
|
email?: string
|
|
}) {
|
|
const admin = createAdminClient()
|
|
const { data: dbData, error } = await admin
|
|
.from('end_customers')
|
|
.insert([{
|
|
partner_id: data.partner_id,
|
|
company_name: data.company_name,
|
|
vat_id: data.vat_id || null,
|
|
first_name: data.first_name || null,
|
|
last_name: data.last_name || null,
|
|
street: data.street || null,
|
|
zip: data.zip || null,
|
|
city: data.city || null,
|
|
email: data.email || null,
|
|
}])
|
|
.select()
|
|
.single()
|
|
if (error) throw error
|
|
return dbData
|
|
}
|
|
|
|
export async function adminUpdateEndCustomer(id: string, data: {
|
|
partner_id: string
|
|
company_name: string
|
|
vat_id?: string
|
|
first_name?: string
|
|
last_name?: string
|
|
street?: string
|
|
zip?: string
|
|
city?: string
|
|
email?: string
|
|
}) {
|
|
const admin = createAdminClient()
|
|
const { data: dbData, error } = await admin
|
|
.from('end_customers')
|
|
.update({
|
|
partner_id: data.partner_id,
|
|
company_name: data.company_name,
|
|
vat_id: data.vat_id || null,
|
|
first_name: data.first_name || null,
|
|
last_name: data.last_name || null,
|
|
street: data.street || null,
|
|
zip: data.zip || null,
|
|
city: data.city || null,
|
|
email: data.email || null,
|
|
})
|
|
.eq('id', id)
|
|
.select()
|
|
.single()
|
|
if (error) throw error
|
|
return dbData
|
|
}
|
|
|
|
export async function adminDeleteEndCustomer(id: string) {
|
|
const admin = createAdminClient()
|
|
const { error } = await admin
|
|
.from('end_customers')
|
|
.delete()
|
|
.eq('id', id)
|
|
if (error) throw error
|
|
return true
|
|
}
|
|
|