style: apply consistent code formatting across project files
This commit is contained in:
+243
-191
@@ -21,21 +21,21 @@ export async function loginUser(username: string, password: string) {
|
||||
username: user.username,
|
||||
name: user.name,
|
||||
role: user.role,
|
||||
photo: user.photo
|
||||
photo: user.photo,
|
||||
}
|
||||
|
||||
const sessionToken = await encrypt(sessionData);
|
||||
|
||||
(await cookies()).set('session', sessionToken, {
|
||||
const sessionToken = await encrypt(sessionData)
|
||||
|
||||
;(await cookies()).set('session', sessionToken, {
|
||||
httpOnly: true,
|
||||
secure: process.env.NODE_ENV === 'production',
|
||||
sameSite: 'lax',
|
||||
path: '/'
|
||||
path: '/',
|
||||
})
|
||||
|
||||
return { success: true, user: sessionData }
|
||||
} catch (e) {
|
||||
console.error("Login Error:", e)
|
||||
console.error('Login Error:', e)
|
||||
return { success: false, error: 'Terjadi kesalahan saat login.' }
|
||||
}
|
||||
}
|
||||
@@ -44,7 +44,7 @@ export async function registerUser(name: string, username: string, password: str
|
||||
try {
|
||||
const hashedPassword = await hashPassword(password)
|
||||
const user = await prisma.user.create({
|
||||
data: { name, username, password: hashedPassword }
|
||||
data: { name, username, password: hashedPassword },
|
||||
})
|
||||
|
||||
const sessionData = {
|
||||
@@ -52,28 +52,28 @@ export async function registerUser(name: string, username: string, password: str
|
||||
username: user.username,
|
||||
name: user.name,
|
||||
role: user.role,
|
||||
photo: user.photo
|
||||
photo: user.photo,
|
||||
}
|
||||
|
||||
const sessionToken = await encrypt(sessionData);
|
||||
|
||||
(await cookies()).set('session', sessionToken, {
|
||||
const sessionToken = await encrypt(sessionData)
|
||||
|
||||
;(await cookies()).set('session', sessionToken, {
|
||||
httpOnly: true,
|
||||
secure: process.env.NODE_ENV === 'production',
|
||||
sameSite: 'lax',
|
||||
path: '/'
|
||||
path: '/',
|
||||
})
|
||||
|
||||
return { success: true, user: sessionData }
|
||||
} catch (error: any) {
|
||||
console.error("Register Error:", error)
|
||||
console.error('Register Error:', error)
|
||||
if (error.code === 'P2002') return { success: false, error: 'Username sudah digunakan.' }
|
||||
return { success: false, error: 'Terjadi kesalahan.' }
|
||||
}
|
||||
}
|
||||
|
||||
export async function logoutUser() {
|
||||
(await cookies()).delete('session')
|
||||
;(await cookies()).delete('session')
|
||||
return { success: true }
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ export async function updateProfile(id: string, name: string, photo?: string | n
|
||||
try {
|
||||
const user = await prisma.user.update({
|
||||
where: { id },
|
||||
data: { name, photo: photo === undefined ? undefined : (photo || null) }
|
||||
data: { name, photo: photo === undefined ? undefined : photo || null },
|
||||
})
|
||||
|
||||
// Update session cookie with new data
|
||||
@@ -96,14 +96,14 @@ export async function updateProfile(id: string, name: string, photo?: string | n
|
||||
username: user.username,
|
||||
name: user.name,
|
||||
role: user.role,
|
||||
photo: user.photo
|
||||
photo: user.photo,
|
||||
}
|
||||
const sessionToken = await encrypt(sessionData);
|
||||
(await cookies()).set('session', sessionToken, {
|
||||
const sessionToken = await encrypt(sessionData)
|
||||
;(await cookies()).set('session', sessionToken, {
|
||||
httpOnly: true,
|
||||
secure: process.env.NODE_ENV === 'production',
|
||||
sameSite: 'lax',
|
||||
path: '/'
|
||||
path: '/',
|
||||
})
|
||||
|
||||
revalidatePath('/')
|
||||
@@ -118,16 +118,16 @@ export async function changePassword(id: string, oldPass: string, newPass: strin
|
||||
try {
|
||||
const user = await prisma.user.findUnique({ where: { id } })
|
||||
if (!user) return { success: false, error: 'User tidak ditemukan.' }
|
||||
|
||||
|
||||
const isMatch = await verifyPassword(oldPass, user.password)
|
||||
if (!isMatch) return { success: false, error: 'Password lama salah.' }
|
||||
|
||||
const hashed = await hashPassword(newPass)
|
||||
await prisma.user.update({
|
||||
where: { id },
|
||||
data: { password: hashed }
|
||||
data: { password: hashed },
|
||||
})
|
||||
|
||||
|
||||
return { success: true }
|
||||
} catch (e) {
|
||||
return { success: false, error: 'Gagal mengganti password.' }
|
||||
@@ -139,16 +139,21 @@ export async function getUsers(page = 1, limit = 10) {
|
||||
const skip = (page - 1) * limit
|
||||
const [users, total] = await Promise.all([
|
||||
prisma.user.findMany({ skip, take: limit, orderBy: { created_at: 'desc' } }),
|
||||
prisma.user.count()
|
||||
prisma.user.count(),
|
||||
])
|
||||
return { users, total, totalPages: Math.ceil(total / limit) }
|
||||
}
|
||||
|
||||
export async function createUserByAdmin(name: string, username: string, password: string, role: string) {
|
||||
export async function createUserByAdmin(
|
||||
name: string,
|
||||
username: string,
|
||||
password: string,
|
||||
role: string
|
||||
) {
|
||||
try {
|
||||
const hashedPassword = await hashPassword(password)
|
||||
await prisma.user.create({
|
||||
data: { name, username, password: hashedPassword, role }
|
||||
data: { name, username, password: hashedPassword, role },
|
||||
})
|
||||
revalidatePath('/users')
|
||||
return { success: true }
|
||||
@@ -161,11 +166,12 @@ export async function createUserByAdmin(name: string, username: string, password
|
||||
export async function toggleUserActive(id: string, is_active: boolean) {
|
||||
try {
|
||||
const user = await prisma.user.findUnique({ where: { id } })
|
||||
if (user?.role === 'superadmin') return { success: false, error: 'Data Superadmin tidak bisa dinonaktifkan.' }
|
||||
|
||||
if (user?.role === 'superadmin')
|
||||
return { success: false, error: 'Data Superadmin tidak bisa dinonaktifkan.' }
|
||||
|
||||
await prisma.user.update({
|
||||
where: { id },
|
||||
data: { is_active }
|
||||
data: { is_active },
|
||||
})
|
||||
revalidatePath('/users')
|
||||
return { success: true }
|
||||
@@ -177,7 +183,8 @@ export async function toggleUserActive(id: string, is_active: boolean) {
|
||||
export async function deleteUser(id: string) {
|
||||
try {
|
||||
const user = await prisma.user.findUnique({ where: { id } })
|
||||
if (user?.role === 'superadmin') return { success: false, error: 'Data Superadmin tidak bisa dihapus.' }
|
||||
if (user?.role === 'superadmin')
|
||||
return { success: false, error: 'Data Superadmin tidak bisa dihapus.' }
|
||||
|
||||
await prisma.user.delete({ where: { id } })
|
||||
revalidatePath('/users')
|
||||
@@ -192,7 +199,7 @@ export async function resetUserPassword(id: string, newPass: string) {
|
||||
const hashed = await hashPassword(newPass)
|
||||
await prisma.user.update({
|
||||
where: { id },
|
||||
data: { password: hashed }
|
||||
data: { password: hashed },
|
||||
})
|
||||
revalidatePath('/users')
|
||||
return { success: true }
|
||||
@@ -205,21 +212,21 @@ export async function resetUserPassword(id: string, newPass: string) {
|
||||
export async function getAvailableOrders() {
|
||||
const startOfDay = new Date()
|
||||
startOfDay.setHours(0, 0, 0, 0)
|
||||
|
||||
|
||||
const endOfDay = new Date()
|
||||
endOfDay.setHours(23, 59, 59, 999)
|
||||
|
||||
return await prisma.order.findMany({
|
||||
where: {
|
||||
status: 'OPEN',
|
||||
date: { gte: startOfDay, lte: endOfDay }
|
||||
date: { gte: startOfDay, lte: endOfDay },
|
||||
},
|
||||
include: {
|
||||
creator: true,
|
||||
available_items: true,
|
||||
submissions: { select: { user_id: true } }
|
||||
submissions: { select: { user_id: true } },
|
||||
},
|
||||
orderBy: { date: 'desc' }
|
||||
orderBy: { date: 'desc' },
|
||||
})
|
||||
}
|
||||
|
||||
@@ -228,19 +235,19 @@ export async function getMyOrders(creator_id: string) {
|
||||
where: { creator_id },
|
||||
include: {
|
||||
available_items: true,
|
||||
submissions: { select: { id: true, payment_status: true } }
|
||||
submissions: { select: { id: true, payment_status: true } },
|
||||
},
|
||||
orderBy: { date: 'desc' }
|
||||
orderBy: { date: 'desc' },
|
||||
})
|
||||
}
|
||||
|
||||
export async function createOrder(data: {
|
||||
creator_id: string;
|
||||
title: string;
|
||||
description?: string;
|
||||
date: Date;
|
||||
allow_custom: boolean;
|
||||
available_items: string[];
|
||||
creator_id: string
|
||||
title: string
|
||||
description?: string
|
||||
date: Date
|
||||
allow_custom: boolean
|
||||
available_items: string[]
|
||||
}) {
|
||||
try {
|
||||
const order = await prisma.order.create({
|
||||
@@ -252,14 +259,14 @@ export async function createOrder(data: {
|
||||
creator_id: data.creator_id,
|
||||
status: 'DRAFT',
|
||||
available_items: {
|
||||
create: data.available_items.map(name => ({ name }))
|
||||
}
|
||||
}
|
||||
create: data.available_items.map((name) => ({ name })),
|
||||
},
|
||||
},
|
||||
})
|
||||
revalidatePath('/my-orders')
|
||||
return { success: true, order }
|
||||
} catch (error) {
|
||||
console.error("Create Order Error:", error)
|
||||
console.error('Create Order Error:', error)
|
||||
return { success: false, error: 'Gagal membuat order.' }
|
||||
}
|
||||
}
|
||||
@@ -268,10 +275,10 @@ export async function duplicateOrder(order_id: string) {
|
||||
try {
|
||||
const oldOrder = await prisma.order.findUnique({
|
||||
where: { id: order_id },
|
||||
include: { available_items: true }
|
||||
include: { available_items: true },
|
||||
})
|
||||
if (!oldOrder) return { success: false, error: 'Order tidak ditemukan' }
|
||||
|
||||
|
||||
const newOrder = await prisma.order.create({
|
||||
data: {
|
||||
title: oldOrder.title + ' (Copy)',
|
||||
@@ -281,9 +288,12 @@ export async function duplicateOrder(order_id: string) {
|
||||
creator_id: oldOrder.creator_id,
|
||||
status: 'DRAFT',
|
||||
available_items: {
|
||||
create: oldOrder.available_items.map(ai => ({ name: ai.name, is_sold_out: ai.is_sold_out }))
|
||||
}
|
||||
}
|
||||
create: oldOrder.available_items.map((ai) => ({
|
||||
name: ai.name,
|
||||
is_sold_out: ai.is_sold_out,
|
||||
})),
|
||||
},
|
||||
},
|
||||
})
|
||||
revalidatePath('/my-orders')
|
||||
return { success: true, order: newOrder }
|
||||
@@ -292,33 +302,38 @@ export async function duplicateOrder(order_id: string) {
|
||||
}
|
||||
}
|
||||
|
||||
export async function updateOrder(order_id: string, data: {
|
||||
title: string;
|
||||
description?: string;
|
||||
allow_custom: boolean;
|
||||
available_items: { name: string; is_sold_out: boolean }[];
|
||||
}) {
|
||||
export async function updateOrder(
|
||||
order_id: string,
|
||||
data: {
|
||||
title: string
|
||||
description?: string
|
||||
allow_custom: boolean
|
||||
available_items: { name: string; is_sold_out: boolean }[]
|
||||
}
|
||||
) {
|
||||
try {
|
||||
const order = await prisma.order.findUnique({
|
||||
where: { id: order_id }
|
||||
where: { id: order_id },
|
||||
})
|
||||
if (!order) return { success: false, error: 'Order tidak ditemukan' }
|
||||
if (order.status === 'CLOSE') {
|
||||
return { success: false, error: 'Order dengan status CLOSE tidak dapat diedit.' }
|
||||
}
|
||||
|
||||
|
||||
// Check if order date is today
|
||||
const orderDate = new Date(order.date)
|
||||
const today = new Date()
|
||||
if (orderDate.getDate() !== today.getDate() ||
|
||||
orderDate.getMonth() !== today.getMonth() ||
|
||||
orderDate.getFullYear() !== today.getFullYear()) {
|
||||
if (
|
||||
orderDate.getDate() !== today.getDate() ||
|
||||
orderDate.getMonth() !== today.getMonth() ||
|
||||
orderDate.getFullYear() !== today.getFullYear()
|
||||
) {
|
||||
return { success: false, error: 'Hanya pesanan hari ini yang dapat diedit.' }
|
||||
}
|
||||
|
||||
// Delete existing available items and insert updated ones
|
||||
await prisma.availableItem.deleteMany({
|
||||
where: { order_id }
|
||||
where: { order_id },
|
||||
})
|
||||
|
||||
const updatedOrder = await prisma.order.update({
|
||||
@@ -328,9 +343,12 @@ export async function updateOrder(order_id: string, data: {
|
||||
description: data.description || null,
|
||||
allow_custom: data.allow_custom,
|
||||
available_items: {
|
||||
create: data.available_items.map(item => ({ name: item.name, is_sold_out: item.is_sold_out }))
|
||||
}
|
||||
}
|
||||
create: data.available_items.map((item) => ({
|
||||
name: item.name,
|
||||
is_sold_out: item.is_sold_out,
|
||||
})),
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
revalidatePath('/my-orders')
|
||||
@@ -338,7 +356,7 @@ export async function updateOrder(order_id: string, data: {
|
||||
revalidatePath('/')
|
||||
return { success: true, order: updatedOrder }
|
||||
} catch (error: any) {
|
||||
console.error("Update Order Error:", error)
|
||||
console.error('Update Order Error:', error)
|
||||
return { success: false, error: 'Gagal memperbarui order: ' + error?.message }
|
||||
}
|
||||
}
|
||||
@@ -347,7 +365,7 @@ export async function updateOrderStatus(order_id: string, status: string) {
|
||||
try {
|
||||
await prisma.order.update({
|
||||
where: { id: order_id },
|
||||
data: { status }
|
||||
data: { status },
|
||||
})
|
||||
revalidatePath('/my-orders')
|
||||
revalidatePath('/')
|
||||
@@ -360,15 +378,18 @@ export async function updateOrderStatus(order_id: string, status: string) {
|
||||
export async function deleteOrder(order_id: string) {
|
||||
try {
|
||||
const order = await prisma.order.findUnique({
|
||||
where: { id: order_id }
|
||||
where: { id: order_id },
|
||||
})
|
||||
if (!order) return { success: false, error: 'Order tidak ditemukan.' }
|
||||
if (order.status === 'OPEN') {
|
||||
return { success: false, error: 'Order berstatus OPEN tidak dapat dihapus. Silakan tutup (CLOSE) terlebih dahulu.' }
|
||||
return {
|
||||
success: false,
|
||||
error: 'Order berstatus OPEN tidak dapat dihapus. Silakan tutup (CLOSE) terlebih dahulu.',
|
||||
}
|
||||
}
|
||||
|
||||
await prisma.order.delete({
|
||||
where: { id: order_id }
|
||||
where: { id: order_id },
|
||||
})
|
||||
|
||||
revalidatePath('/my-orders')
|
||||
@@ -389,18 +410,24 @@ export async function getOrderDetail(order_id: string) {
|
||||
submissions: {
|
||||
include: {
|
||||
user: true,
|
||||
items: true
|
||||
}
|
||||
}
|
||||
}
|
||||
items: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export async function updateSubmissionPayment(submission_id: string, bill: number | null, payment_status: string, paid_amount: number | null = null, saldo_used: number = 0) {
|
||||
export async function updateSubmissionPayment(
|
||||
submission_id: string,
|
||||
bill: number | null,
|
||||
payment_status: string,
|
||||
paid_amount: number | null = null,
|
||||
saldo_used: number = 0
|
||||
) {
|
||||
try {
|
||||
await prisma.submission.update({
|
||||
where: { id: submission_id },
|
||||
data: { bill, payment_status, paid_amount, saldo_used }
|
||||
data: { bill, payment_status, paid_amount, saldo_used },
|
||||
})
|
||||
revalidatePath(`/my-orders`)
|
||||
revalidatePath(`/my-purchases`)
|
||||
@@ -408,27 +435,40 @@ export async function updateSubmissionPayment(submission_id: string, bill: numbe
|
||||
revalidatePath(`/balances`)
|
||||
return { success: true }
|
||||
} catch (e) {
|
||||
console.error(e); return { success: false, error: 'Gagal menyimpan tagihan.' }
|
||||
console.error(e)
|
||||
return { success: false, error: 'Gagal menyimpan tagihan.' }
|
||||
}
|
||||
}
|
||||
|
||||
export async function updateBulkSubmissionPayment(submission_ids: string[], payment_status: string, use_balance: boolean = false) {
|
||||
export async function updateBulkSubmissionPayment(
|
||||
submission_ids: string[],
|
||||
payment_status: string,
|
||||
use_balance: boolean = false
|
||||
) {
|
||||
try {
|
||||
if (payment_status === 'LUNAS') {
|
||||
const submissions = await prisma.submission.findMany({ where: { id: { in: submission_ids } } })
|
||||
const ops = submissions.map(sub => prisma.submission.update({
|
||||
where: { id: sub.id },
|
||||
data: {
|
||||
payment_status,
|
||||
paid_amount: use_balance ? (sub.paid_amount || 0) : (sub.paid_amount != null ? sub.paid_amount : sub.bill),
|
||||
saldo_used: use_balance ? Math.max(0, (sub.bill || 0) - (sub.paid_amount || 0)) : 0
|
||||
}
|
||||
}))
|
||||
const submissions = await prisma.submission.findMany({
|
||||
where: { id: { in: submission_ids } },
|
||||
})
|
||||
const ops = submissions.map((sub) =>
|
||||
prisma.submission.update({
|
||||
where: { id: sub.id },
|
||||
data: {
|
||||
payment_status,
|
||||
paid_amount: use_balance
|
||||
? sub.paid_amount || 0
|
||||
: sub.paid_amount != null
|
||||
? sub.paid_amount
|
||||
: sub.bill,
|
||||
saldo_used: use_balance ? Math.max(0, (sub.bill || 0) - (sub.paid_amount || 0)) : 0,
|
||||
},
|
||||
})
|
||||
)
|
||||
await prisma.$transaction(ops)
|
||||
} else {
|
||||
await prisma.submission.updateMany({
|
||||
where: { id: { in: submission_ids } },
|
||||
data: { payment_status }
|
||||
data: { payment_status },
|
||||
})
|
||||
}
|
||||
revalidatePath(`/my-orders`)
|
||||
@@ -443,25 +483,25 @@ export async function updateBulkSubmissionPayment(submission_ids: string[], paym
|
||||
}
|
||||
|
||||
export async function processBulkPayment(data: {
|
||||
submission_ids: string[];
|
||||
cash_amount: number;
|
||||
use_balance: boolean;
|
||||
creator_id: string;
|
||||
user_id: string;
|
||||
submission_ids: string[]
|
||||
cash_amount: number
|
||||
use_balance: boolean
|
||||
creator_id: string
|
||||
user_id: string
|
||||
}) {
|
||||
try {
|
||||
let currentBalance = 0
|
||||
if (data.use_balance) {
|
||||
const balanceData = await getBalancesAsCreator(data.creator_id)
|
||||
const userBalance = balanceData.find(b => b.user.id === data.user_id)
|
||||
const userBalance = balanceData.find((b) => b.user.id === data.user_id)
|
||||
if (userBalance) currentBalance = userBalance.amount
|
||||
}
|
||||
|
||||
const submissions = await prisma.submission.findMany({
|
||||
where: { id: { in: data.submission_ids } },
|
||||
include: { order: { select: { date: true } } }
|
||||
include: { order: { select: { date: true } } },
|
||||
})
|
||||
|
||||
|
||||
// Sort by order date ascending (oldest first)
|
||||
submissions.sort((a, b) => new Date(a.order.date).getTime() - new Date(b.order.date).getTime())
|
||||
|
||||
@@ -474,16 +514,16 @@ export async function processBulkPayment(data: {
|
||||
for (let i = 0; i < submissions.length; i++) {
|
||||
const sub = submissions[i]
|
||||
const isLast = i === submissions.length - 1
|
||||
|
||||
|
||||
const subBill = sub.bill || 0
|
||||
const prevPaid = sub.paid_amount || 0
|
||||
const amountToCover = Math.max(0, subBill - prevPaid)
|
||||
|
||||
|
||||
if (totalAvailable >= amountToCover && amountToCover > 0) {
|
||||
// Fully covered -> LUNAS
|
||||
let balanceToUse = Math.min(remainingBalance, amountToCover)
|
||||
remainingBalance -= balanceToUse
|
||||
|
||||
|
||||
let cashToUse = amountToCover - balanceToUse
|
||||
remainingCash -= cashToUse
|
||||
totalAvailable -= amountToCover
|
||||
@@ -494,47 +534,55 @@ export async function processBulkPayment(data: {
|
||||
remainingCash = 0
|
||||
}
|
||||
|
||||
ops.push(prisma.submission.update({
|
||||
where: { id: sub.id },
|
||||
data: { payment_status: 'LUNAS', paid_amount: finalPaid }
|
||||
}))
|
||||
ops.push(
|
||||
prisma.submission.update({
|
||||
where: { id: sub.id },
|
||||
data: { payment_status: 'LUNAS', paid_amount: finalPaid },
|
||||
})
|
||||
)
|
||||
} else if (totalAvailable >= amountToCover && amountToCover === 0) {
|
||||
// It's already fully paid somehow, just mark LUNAS. Give excess cash if last.
|
||||
let finalPaid = prevPaid
|
||||
if (isLast && remainingCash > 0) {
|
||||
finalPaid += remainingCash
|
||||
remainingCash = 0
|
||||
finalPaid += remainingCash
|
||||
remainingCash = 0
|
||||
}
|
||||
ops.push(prisma.submission.update({
|
||||
where: { id: sub.id },
|
||||
data: { payment_status: 'LUNAS', paid_amount: finalPaid }
|
||||
}))
|
||||
ops.push(
|
||||
prisma.submission.update({
|
||||
where: { id: sub.id },
|
||||
data: { payment_status: 'LUNAS', paid_amount: finalPaid },
|
||||
})
|
||||
)
|
||||
} else if (totalAvailable > 0) {
|
||||
// Partially covered -> BELUM_BAYAR. Only use cash.
|
||||
let finalPaid = prevPaid + remainingCash
|
||||
remainingCash = 0
|
||||
totalAvailable = remainingBalance // only balance left, which can't be used
|
||||
|
||||
ops.push(prisma.submission.update({
|
||||
where: { id: sub.id },
|
||||
data: { payment_status: 'BELUM_BAYAR', paid_amount: finalPaid }
|
||||
}))
|
||||
ops.push(
|
||||
prisma.submission.update({
|
||||
where: { id: sub.id },
|
||||
data: { payment_status: 'BELUM_BAYAR', paid_amount: finalPaid },
|
||||
})
|
||||
)
|
||||
} else {
|
||||
// totalAvailable == 0. No more money. Just leave it as is, or update to BELUM_BAYAR.
|
||||
ops.push(prisma.submission.update({
|
||||
where: { id: sub.id },
|
||||
data: { payment_status: 'BELUM_BAYAR' }
|
||||
}))
|
||||
ops.push(
|
||||
prisma.submission.update({
|
||||
where: { id: sub.id },
|
||||
data: { payment_status: 'BELUM_BAYAR' },
|
||||
})
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
await prisma.$transaction(ops)
|
||||
|
||||
|
||||
revalidatePath(`/my-orders`)
|
||||
revalidatePath(`/my-purchases`)
|
||||
revalidatePath(`/reports`)
|
||||
revalidatePath(`/balances`)
|
||||
|
||||
|
||||
return { success: true }
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
@@ -546,7 +594,7 @@ export async function processBulkPayment(data: {
|
||||
export async function getUserSubmission(order_id: string, user_id: string) {
|
||||
return await prisma.submission.findFirst({
|
||||
where: { order_id, user_id },
|
||||
include: { items: true }
|
||||
include: { items: true },
|
||||
})
|
||||
}
|
||||
|
||||
@@ -557,21 +605,21 @@ export async function getMyPurchases(user_id: string) {
|
||||
order: {
|
||||
include: {
|
||||
creator: true,
|
||||
available_items: true
|
||||
}
|
||||
available_items: true,
|
||||
},
|
||||
},
|
||||
items: true
|
||||
items: true,
|
||||
},
|
||||
orderBy: {
|
||||
order: { date: 'desc' }
|
||||
}
|
||||
order: { date: 'desc' },
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export async function submitOrder(data: {
|
||||
order_id: string;
|
||||
user_id: string;
|
||||
items: Array<{ name: string; qty: number; is_custom: boolean; note?: string }>;
|
||||
order_id: string
|
||||
user_id: string
|
||||
items: Array<{ name: string; qty: number; is_custom: boolean; note?: string }>
|
||||
}) {
|
||||
try {
|
||||
if (data.items.length === 0) {
|
||||
@@ -580,17 +628,18 @@ export async function submitOrder(data: {
|
||||
|
||||
const order = await prisma.order.findUnique({ where: { id: data.order_id } })
|
||||
if (!order) return { success: false, error: 'Pesanan tidak ditemukan.' }
|
||||
if (order.status !== 'OPEN') return { success: false, error: 'Pesanan sudah ditutup atau masih draft.' }
|
||||
if (order.status !== 'OPEN')
|
||||
return { success: false, error: 'Pesanan sudah ditutup atau masih draft.' }
|
||||
|
||||
const itemsToCreate = data.items.map(item => ({
|
||||
const itemsToCreate = data.items.map((item) => ({
|
||||
name: item.name,
|
||||
qty: item.qty,
|
||||
is_custom: item.is_custom,
|
||||
note: item.note || null
|
||||
note: item.note || null,
|
||||
}))
|
||||
|
||||
const existing = await prisma.submission.findFirst({
|
||||
where: { order_id: data.order_id, user_id: data.user_id }
|
||||
where: { order_id: data.order_id, user_id: data.user_id },
|
||||
})
|
||||
|
||||
if (existing) {
|
||||
@@ -599,9 +648,9 @@ export async function submitOrder(data: {
|
||||
where: { id: existing.id },
|
||||
data: {
|
||||
items: {
|
||||
create: itemsToCreate
|
||||
}
|
||||
}
|
||||
create: itemsToCreate,
|
||||
},
|
||||
},
|
||||
})
|
||||
} else {
|
||||
await prisma.submission.create({
|
||||
@@ -609,16 +658,16 @@ export async function submitOrder(data: {
|
||||
order_id: data.order_id,
|
||||
user_id: data.user_id,
|
||||
items: {
|
||||
create: itemsToCreate
|
||||
}
|
||||
}
|
||||
create: itemsToCreate,
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
revalidatePath('/')
|
||||
revalidatePath('/my-purchases')
|
||||
revalidatePath(`/my-orders/${data.order_id}`)
|
||||
|
||||
|
||||
return { success: true }
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
@@ -633,18 +682,18 @@ export async function getSubmittorReport(user_id: string, startDate?: Date, endD
|
||||
user_id,
|
||||
order: {
|
||||
status: 'CLOSE',
|
||||
...(startDate && endDate ? { date: { gte: startDate, lte: endDate } } : {})
|
||||
}
|
||||
...(startDate && endDate ? { date: { gte: startDate, lte: endDate } } : {}),
|
||||
},
|
||||
},
|
||||
include: {
|
||||
order: {
|
||||
include: { creator: true }
|
||||
include: { creator: true },
|
||||
},
|
||||
items: true
|
||||
items: true,
|
||||
},
|
||||
orderBy: {
|
||||
order: { date: 'desc' }
|
||||
}
|
||||
order: { date: 'desc' },
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
@@ -653,17 +702,17 @@ export async function getCreatorReport(creator_id: string, startDate?: Date, end
|
||||
where: {
|
||||
creator_id,
|
||||
status: 'CLOSE',
|
||||
...(startDate && endDate ? { date: { gte: startDate, lte: endDate } } : {})
|
||||
...(startDate && endDate ? { date: { gte: startDate, lte: endDate } } : {}),
|
||||
},
|
||||
include: {
|
||||
submissions: {
|
||||
include: {
|
||||
user: true,
|
||||
items: true
|
||||
}
|
||||
}
|
||||
items: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
orderBy: { date: 'desc' }
|
||||
orderBy: { date: 'desc' },
|
||||
})
|
||||
}
|
||||
|
||||
@@ -671,25 +720,25 @@ export async function getCreatorReport(creator_id: string, startDate?: Date, end
|
||||
export async function getBalancesAsCreator(creator_id: string) {
|
||||
const submissions = await prisma.submission.findMany({
|
||||
where: {
|
||||
order: { creator_id }
|
||||
order: { creator_id },
|
||||
},
|
||||
include: {
|
||||
user: { select: { id: true, name: true, photo: true } }
|
||||
}
|
||||
user: { select: { id: true, name: true, photo: true } },
|
||||
},
|
||||
})
|
||||
|
||||
const balanceMap = new Map<string, { user: any, amount: number }>()
|
||||
|
||||
submissions.forEach(sub => {
|
||||
let diff = 0;
|
||||
const balanceMap = new Map<string, { user: any; amount: number }>()
|
||||
|
||||
submissions.forEach((sub) => {
|
||||
let diff = 0
|
||||
if (sub.payment_status === 'LUNAS') {
|
||||
if (sub.bill != null) {
|
||||
diff = (sub.paid_amount || 0) - sub.bill;
|
||||
diff = (sub.paid_amount || 0) - sub.bill
|
||||
}
|
||||
} else {
|
||||
diff = -(sub.saldo_used || 0);
|
||||
diff = -(sub.saldo_used || 0)
|
||||
}
|
||||
|
||||
|
||||
if (diff !== 0) {
|
||||
if (!balanceMap.has(sub.user.id)) {
|
||||
balanceMap.set(sub.user.id, { user: sub.user, amount: diff })
|
||||
@@ -699,33 +748,33 @@ export async function getBalancesAsCreator(creator_id: string) {
|
||||
}
|
||||
})
|
||||
|
||||
return Array.from(balanceMap.values()).filter(b => b.amount !== 0)
|
||||
return Array.from(balanceMap.values()).filter((b) => b.amount !== 0)
|
||||
}
|
||||
|
||||
export async function getBalancesAsSubmittor(user_id: string) {
|
||||
const submissions = await prisma.submission.findMany({
|
||||
where: {
|
||||
user_id
|
||||
user_id,
|
||||
},
|
||||
include: {
|
||||
order: {
|
||||
include: {
|
||||
creator: { select: { id: true, name: true, photo: true } }
|
||||
}
|
||||
}
|
||||
}
|
||||
creator: { select: { id: true, name: true, photo: true } },
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
const balanceMap = new Map<string, { creator: any, amount: number }>()
|
||||
|
||||
submissions.forEach(sub => {
|
||||
let diff = 0;
|
||||
const balanceMap = new Map<string, { creator: any; amount: number }>()
|
||||
|
||||
submissions.forEach((sub) => {
|
||||
let diff = 0
|
||||
if (sub.payment_status === 'LUNAS') {
|
||||
if (sub.bill != null) {
|
||||
diff = (sub.paid_amount || 0) - sub.bill;
|
||||
diff = (sub.paid_amount || 0) - sub.bill
|
||||
}
|
||||
} else {
|
||||
diff = -(sub.saldo_used || 0);
|
||||
diff = -(sub.saldo_used || 0)
|
||||
}
|
||||
|
||||
if (diff !== 0) {
|
||||
@@ -738,26 +787,27 @@ export async function getBalancesAsSubmittor(user_id: string) {
|
||||
}
|
||||
})
|
||||
|
||||
return Array.from(balanceMap.values()).filter(b => b.amount !== 0)
|
||||
return Array.from(balanceMap.values()).filter((b) => b.amount !== 0)
|
||||
}
|
||||
|
||||
export async function deleteSubmission(submission_id: string, user_id: string) {
|
||||
try {
|
||||
const submission = await prisma.submission.findUnique({
|
||||
where: { id: submission_id },
|
||||
include: { order: true }
|
||||
});
|
||||
include: { order: true },
|
||||
})
|
||||
|
||||
if (!submission) return { success: false, error: 'Pesanan tidak ditemukan' };
|
||||
if (submission.user_id !== user_id) return { success: false, error: 'Tidak ada akses' };
|
||||
if (submission.order.status !== 'OPEN') return { success: false, error: 'Hanya bisa membatalkan PO yang OPEN' };
|
||||
if (!submission) return { success: false, error: 'Pesanan tidak ditemukan' }
|
||||
if (submission.user_id !== user_id) return { success: false, error: 'Tidak ada akses' }
|
||||
if (submission.order.status !== 'OPEN')
|
||||
return { success: false, error: 'Hanya bisa membatalkan PO yang OPEN' }
|
||||
|
||||
await prisma.submission.delete({
|
||||
where: { id: submission_id }
|
||||
});
|
||||
return { success: true };
|
||||
where: { id: submission_id },
|
||||
})
|
||||
return { success: true }
|
||||
} catch (error) {
|
||||
return { success: false, error: 'Gagal membatalkan pesanan' };
|
||||
return { success: false, error: 'Gagal membatalkan pesanan' }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -766,7 +816,7 @@ export async function deleteSubmission(submission_id: string, user_id: string) {
|
||||
export async function getSettings() {
|
||||
const settings = await prisma.setting.findMany()
|
||||
const obj: Record<string, string> = {}
|
||||
settings.forEach(s => {
|
||||
settings.forEach((s) => {
|
||||
obj[s.key] = s.value
|
||||
})
|
||||
return obj
|
||||
@@ -778,7 +828,7 @@ export async function updateSettings(settings: Record<string, string>) {
|
||||
await prisma.setting.upsert({
|
||||
where: { key },
|
||||
update: { value: settings[key] },
|
||||
create: { key, value: settings[key] }
|
||||
create: { key, value: settings[key] },
|
||||
})
|
||||
}
|
||||
return { success: true }
|
||||
@@ -793,22 +843,24 @@ export async function updateSettings(settings: Record<string, string>) {
|
||||
export async function broadcastToMattermost(orderId: string, orderUrl: string) {
|
||||
try {
|
||||
const order = await prisma.order.findUnique({
|
||||
where: { id: orderId }
|
||||
where: { id: orderId },
|
||||
})
|
||||
if (!order) return { success: false, error: 'Order not found' }
|
||||
|
||||
const settings = await getSettings()
|
||||
const webhookUrl = settings.MATTERMOST_WEBHOOK_URL
|
||||
let template = settings.MATTERMOST_TEMPLATE || 'Halo tim! Lagi ada orderan open nih untuk {title}. Mumpung belum di-checkout, yang mau ikutan nitip bisa langsung cek ke sini ya: {url}'
|
||||
|
||||
let template =
|
||||
settings.MATTERMOST_TEMPLATE ||
|
||||
'Halo tim! Lagi ada orderan open nih untuk {title}. Mumpung belum di-checkout, yang mau ikutan nitip bisa langsung cek ke sini ya: {url}'
|
||||
|
||||
if (!webhookUrl) return { success: false, error: 'Webhook URL belum di-setting' }
|
||||
|
||||
const message = template.replace('{title}', order.title).replace('{url}', orderUrl)
|
||||
|
||||
|
||||
const res = await fetch(webhookUrl, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ text: message })
|
||||
body: JSON.stringify({ text: message }),
|
||||
})
|
||||
|
||||
if (!res.ok) {
|
||||
|
||||
Reference in New Issue
Block a user