Files
webshop/shop/lib/actions/companies.ts
DanielS 3fb80e6404
All checks were successful
Staging Build / build (push) Successful in 2m48s
feat(admin): add manual partner import from lic server
2026-07-15 00:07:31 +02:00

265 lines
7.4 KiB
TypeScript

'use server'
import { createAdminClient } from '@/lib/supabase/admin'
import { revalidatePath, unstable_noStore as noStore } from 'next/cache'
import { getLicServerConfig } from './licserver-config'
export async function getCompanies() {
noStore()
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')
revalidatePath('/admin/users')
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')
revalidatePath('/admin/users')
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')
revalidatePath('/admin/users')
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()
const { data: customers, error: customersError } = await admin
.from('end_customers')
.select('*')
.eq('partner_id', companyId)
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()
const { data: customers, error: customersError } = await admin
.from('end_customers')
.select('*')
.eq('partner_id', companyId)
if (customersError) throw customersError
const { data: company } = await admin
.from('companies')
.select('name')
.eq('id', companyId)
.single()
const companyName = company?.name || 'Unbekannt'
return customers.map((c) => ({
...c,
partner_name: companyName,
}))
}
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
bank_iban?: string
bank_bic?: string
bank_name?: string
bank_owner?: 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,
bank_iban: data.bank_iban || null,
bank_bic: data.bank_bic || null,
bank_name: data.bank_name || null,
bank_owner: data.bank_owner || 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
bank_iban?: string
bank_bic?: string
bank_name?: string
bank_owner?: 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,
bank_iban: data.bank_iban || null,
bank_bic: data.bank_bic || null,
bank_name: data.bank_name || null,
bank_owner: data.bank_owner || 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
}
export async function syncCompaniesFromLicServer() {
const admin = createAdminClient()
const cfg = await getLicServerConfig()
if (!cfg.base_url || !cfg.api_key) {
throw new Error('LicServer ist nicht konfiguriert.')
}
const res = await fetch(`${cfg.base_url}/api-v1/partners?pageSize=1000`, {
headers: { 'X-Api-Key': cfg.api_key, 'Accept': 'application/json' },
signal: AbortSignal.timeout(10_000),
})
if (!res.ok) {
throw new Error(`Lizenzserver antwortete mit Fehler: HTTP ${res.status}`)
}
const result = await res.json()
const partners = result.items || []
if (partners.length === 0) {
return { success: true, count: 0 }
}
const upsertRows = partners.map((p: any) => ({
id: p.id,
name: p.name || 'Unbenannt',
email: p.email || null,
}))
const { error } = await admin
.from('companies')
.upsert(upsertRows, { onConflict: 'id' })
if (error) throw error
revalidatePath('/admin/companies')
revalidatePath('/admin/users')
return { success: true, count: partners.length }
}