feat: link end customers directly to companies
All checks were successful
Staging Build / build (push) Successful in 3m37s
All checks were successful
Staging Build / build (push) Successful in 3m37s
This commit is contained in:
@@ -59,25 +59,11 @@ export async function assignCompanyToUser(userId: string, companyId: string | nu
|
||||
|
||||
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)
|
||||
.eq('partner_id', companyId)
|
||||
if (customersError) throw customersError
|
||||
|
||||
return customers || []
|
||||
}
|
||||
|
||||
@@ -91,44 +77,24 @@ export async function getCompanyDetails(companyId: string) {
|
||||
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)
|
||||
.eq('partner_id', companyId)
|
||||
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
|
||||
const { data: company } = await admin
|
||||
.from('companies')
|
||||
.select('name')
|
||||
.eq('id', companyId)
|
||||
.single()
|
||||
|
||||
// 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 companyName = company?.name || 'Unbekannt'
|
||||
|
||||
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',
|
||||
}
|
||||
})
|
||||
return customers.map((c) => ({
|
||||
...c,
|
||||
partner_name: companyName,
|
||||
}))
|
||||
}
|
||||
|
||||
export async function getCompanyPartners(companyId: string) {
|
||||
|
||||
@@ -30,9 +30,23 @@ export type EndCustomerFormData = {
|
||||
*/
|
||||
export async function getEndCustomers(): Promise<EndCustomer[]> {
|
||||
const supabase = await createClient()
|
||||
const { data: { user } } = await supabase.auth.getUser()
|
||||
if (!user) throw new Error('Not authenticated')
|
||||
|
||||
const { data: dbUser, error: dbUserError } = await supabase
|
||||
.from('users')
|
||||
.select('company_id')
|
||||
.eq('id', user.id)
|
||||
.single()
|
||||
|
||||
if (dbUserError || !dbUser || !dbUser.company_id) {
|
||||
return []
|
||||
}
|
||||
|
||||
const { data, error } = await supabase
|
||||
.from('end_customers')
|
||||
.select('*')
|
||||
.eq('partner_id', dbUser.company_id)
|
||||
.order('company_name', { ascending: true })
|
||||
|
||||
if (error) throw error
|
||||
@@ -66,10 +80,20 @@ export async function createEndCustomer(formData: EndCustomerFormData): Promise<
|
||||
const { data: { user } } = await supabase.auth.getUser()
|
||||
if (!user) throw new Error('Not authenticated')
|
||||
|
||||
const { data: dbUser, error: dbUserError } = await supabase
|
||||
.from('users')
|
||||
.select('company_id')
|
||||
.eq('id', user.id)
|
||||
.single()
|
||||
|
||||
if (dbUserError || !dbUser || !dbUser.company_id) {
|
||||
throw new Error('Kein Unternehmen zugewiesen.')
|
||||
}
|
||||
|
||||
const { data, error } = await supabase
|
||||
.from('end_customers')
|
||||
.insert([{
|
||||
partner_id: user.id,
|
||||
partner_id: dbUser.company_id,
|
||||
company_name: formData.company_name,
|
||||
vat_id: formData.vat_id || null,
|
||||
first_name: formData.first_name || null,
|
||||
@@ -167,10 +191,18 @@ export async function anonymizeEndCustomer(id: string): Promise<void> {
|
||||
|
||||
export async function getPartnerEndCustomers(partnerId: string): Promise<EndCustomer[]> {
|
||||
const admin = createAdminClient()
|
||||
const { data: dbUser } = await admin
|
||||
.from('users')
|
||||
.select('company_id')
|
||||
.eq('id', partnerId)
|
||||
.single()
|
||||
|
||||
const targetId = dbUser?.company_id || partnerId
|
||||
|
||||
const { data, error } = await admin
|
||||
.from('end_customers')
|
||||
.select('*')
|
||||
.eq('partner_id', partnerId)
|
||||
.eq('partner_id', targetId)
|
||||
.order('company_name', { ascending: true })
|
||||
|
||||
if (error) throw error
|
||||
|
||||
Reference in New Issue
Block a user