feat(checkout): implement wizard and admin actions
All checks were successful
Staging Build / build (push) Successful in 3m11s
All checks were successful
Staging Build / build (push) Successful in 3m11s
This commit is contained in:
@@ -332,9 +332,9 @@ export async function updateOrderStatus(
|
||||
throw new Error(`Fehler beim Aktualisieren des Status: ${updateError?.message || 'Unbekannt'}`)
|
||||
}
|
||||
|
||||
// 3. Wenn Status auf 'active' wechselt, generiere PDF und lade es hoch (pdf-invoice-generator)
|
||||
// 3. Wenn Status auf 'active' oder 'approved' wechselt, generiere PDF und lade es hoch (pdf-invoice-generator)
|
||||
let attachmentBuffer: Buffer | null = null
|
||||
if (newStatus === 'active') {
|
||||
if (newStatus === 'active' || newStatus === 'approved') {
|
||||
try {
|
||||
const customerSnapshot = updatedOrder.customer_data
|
||||
const orderSnapshot = updatedOrder.order_data
|
||||
@@ -362,7 +362,7 @@ export async function updateOrderStatus(
|
||||
updatedOrder.pdf_url = fileName
|
||||
}
|
||||
} catch (pdfError) {
|
||||
console.error('PDF Generation Error on active status transition:', pdfError)
|
||||
console.error('PDF Generation Error on status transition:', pdfError)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -395,8 +395,8 @@ export async function updateOrderStatus(
|
||||
html: statusEmail.html,
|
||||
}
|
||||
|
||||
// Bei Aktivierung hänge die PDF an
|
||||
if (newStatus === 'active' && attachmentBuffer) {
|
||||
// Bei Aktivierung oder Freigabe hänge die PDF an
|
||||
if ((newStatus === 'active' || newStatus === 'approved') && attachmentBuffer) {
|
||||
mailOptions.attachments = [
|
||||
{
|
||||
filename: `Anfragebestaetigung_${orderNumber}.pdf`,
|
||||
@@ -418,6 +418,143 @@ export async function updateOrderStatus(
|
||||
return updatedOrder as Order
|
||||
}
|
||||
|
||||
export async function updateOrderPayload(
|
||||
orderId: string,
|
||||
params: {
|
||||
orderSnapshot: Partial<any>;
|
||||
}
|
||||
) {
|
||||
const admin = createAdminClient()
|
||||
const supabase = await createClient()
|
||||
|
||||
// Authentifizierung und Admin-Prüfung
|
||||
const { data: { user } } = await supabase.auth.getUser()
|
||||
if (!user) throw new Error('Not authenticated')
|
||||
|
||||
const { data: dbUser } = await admin
|
||||
.from('users')
|
||||
.select('role')
|
||||
.eq('id', user.id)
|
||||
.single()
|
||||
|
||||
if (dbUser?.role !== 'admin') {
|
||||
throw new Error('Nur Administratoren können Bestellanfragen anpassen.')
|
||||
}
|
||||
|
||||
// Aktuelle Bestellung abrufen
|
||||
const { data: order, error: fetchError } = await admin
|
||||
.from('orders')
|
||||
.select('*')
|
||||
.eq('id', orderId)
|
||||
.single()
|
||||
|
||||
if (fetchError || !order) {
|
||||
throw new Error(`Bestellung nicht gefunden: ${fetchError?.message || 'Unbekannt'}`)
|
||||
}
|
||||
|
||||
if (order.status !== 'in_review') {
|
||||
throw new Error('Bestellungen können nur im Status "in_review" angepasst werden.')
|
||||
}
|
||||
|
||||
// Neue Snapshot-Daten mergen
|
||||
const updatedSnapshot = {
|
||||
...order.order_data,
|
||||
...params.orderSnapshot
|
||||
}
|
||||
|
||||
const { data: updatedOrder, error: updateError } = await admin
|
||||
.from('orders')
|
||||
.update({
|
||||
order_data: updatedSnapshot,
|
||||
total_price: updatedSnapshot.total || order.total_price
|
||||
})
|
||||
.eq('id', orderId)
|
||||
.select()
|
||||
.single()
|
||||
|
||||
if (updateError || !updatedOrder) {
|
||||
throw new Error(`Fehler beim Aktualisieren der Bestelldaten: ${updateError?.message || 'Unbekannt'}`)
|
||||
}
|
||||
|
||||
revalidatePath('/admin/orders')
|
||||
revalidatePath('/my-orders')
|
||||
return updatedOrder as Order
|
||||
}
|
||||
|
||||
export async function rejectOrder(
|
||||
orderId: string,
|
||||
reason: string
|
||||
) {
|
||||
const admin = createAdminClient()
|
||||
const supabase = await createClient()
|
||||
|
||||
// Authentifizierung und Admin-Prüfung
|
||||
const { data: { user } } = await supabase.auth.getUser()
|
||||
if (!user) throw new Error('Not authenticated')
|
||||
|
||||
const { data: dbUser } = await admin
|
||||
.from('users')
|
||||
.select('role')
|
||||
.eq('id', user.id)
|
||||
.single()
|
||||
|
||||
if (dbUser?.role !== 'admin') {
|
||||
throw new Error('Nur Administratoren können Bestellungen ablehnen.')
|
||||
}
|
||||
|
||||
const { data: order, error: fetchError } = await admin
|
||||
.from('orders')
|
||||
.select('*')
|
||||
.eq('id', orderId)
|
||||
.single()
|
||||
|
||||
if (fetchError || !order) {
|
||||
throw new Error(`Bestellung nicht gefunden: ${fetchError?.message || 'Unbekannt'}`)
|
||||
}
|
||||
|
||||
const updatedSnapshot = {
|
||||
...order.order_data,
|
||||
rejection_reason: reason
|
||||
}
|
||||
|
||||
const { data: updatedOrder, error: updateError } = await admin
|
||||
.from('orders')
|
||||
.update({
|
||||
status: 'rejected',
|
||||
order_data: updatedSnapshot
|
||||
})
|
||||
.eq('id', orderId)
|
||||
.select()
|
||||
.single()
|
||||
|
||||
if (updateError || !updatedOrder) {
|
||||
throw new Error(`Fehler beim Ablehnen der Bestellung: ${updateError?.message || 'Unbekannt'}`)
|
||||
}
|
||||
|
||||
// Ablehnungs-Mail senden
|
||||
if (order.user_id) {
|
||||
try {
|
||||
const { data: { user: orderUser }, error: userError } = await admin.auth.admin.getUserById(order.user_id)
|
||||
if (!userError && orderUser && orderUser.email) {
|
||||
const orderNumber = order.order_number || order.id.slice(0, 8)
|
||||
const statusEmail = getStatusEmailTemplate(orderNumber, 'Wartet auf Freigabe', `Abgelehnt (Grund: ${reason})`)
|
||||
|
||||
await sendMail({
|
||||
to: orderUser.email,
|
||||
subject: `Anfrage abgelehnt: ${orderNumber}`,
|
||||
text: statusEmail.text,
|
||||
html: statusEmail.html
|
||||
})
|
||||
}
|
||||
} catch (mailError) {
|
||||
console.error('Failed to send rejection email:', mailError)
|
||||
}
|
||||
}
|
||||
|
||||
revalidatePath('/admin/orders')
|
||||
revalidatePath('/my-orders')
|
||||
return updatedOrder as Order
|
||||
}
|
||||
|
||||
export async function updateOrder(
|
||||
orderId: string,
|
||||
|
||||
Reference in New Issue
Block a user