diff --git a/src/app/dashboard/layout.tsx b/src/app/dashboard/layout.tsx index e3ebb4f..ae371cd 100644 --- a/src/app/dashboard/layout.tsx +++ b/src/app/dashboard/layout.tsx @@ -2,17 +2,26 @@ import { MainNav } from "@/components/main-nav" import { UserNav } from "@/components/user-nav" import { Building } from "lucide-react" import { MobileSidebar } from "@/components/mobile-sidebar" +import { createClient } from "@/lib/supabase/server" -export default function DashboardLayout({ +export default async function DashboardLayout({ children, }: { children: React.ReactNode }) { + const supabase = await createClient() + const { data: { user } } = await supabase.auth.getUser() + + const userData = user ? { + name: user.user_metadata?.full_name || user.email?.split('@')[0], + email: user.email || null + } : undefined + return (
{/* Desktop Sidebar */} {/* Main Content */} @@ -20,7 +29,7 @@ export default function DashboardLayout({ {/* Header */}
- +
WeddingOS diff --git a/src/app/dashboard/reservations/[id]/page.tsx b/src/app/dashboard/reservations/[id]/page.tsx index f0d3b68..8bcda98 100644 --- a/src/app/dashboard/reservations/[id]/page.tsx +++ b/src/app/dashboard/reservations/[id]/page.tsx @@ -101,6 +101,20 @@ export default async function ReservationDetailsPage({
+
+ {reservation.groom_region && ( +
+

Damat Yöre

+

{reservation.groom_region}

+
+ )} + {reservation.bride_region && ( +
+

Gelin Yöre

+

{reservation.bride_region}

+
+ )} +

Notlar

diff --git a/src/app/dashboard/reservations/new/actions.ts b/src/app/dashboard/reservations/new/actions.ts index e320ef8..e8cc860 100644 --- a/src/app/dashboard/reservations/new/actions.ts +++ b/src/app/dashboard/reservations/new/actions.ts @@ -8,10 +8,13 @@ import { logAction } from "@/lib/logger" export async function createReservation(data: { hall_id: string customer_id: string - package_id?: string + package_id: string // Made required based on user request start_time: string end_time: string notes?: string + groom_region?: string + bride_region?: string + price: number }) { const supabase = await createClient() @@ -36,11 +39,14 @@ export async function createReservation(data: { const { data: newReservation, error } = await supabase.from('reservations').insert({ hall_id: data.hall_id, customer_id: data.customer_id, - package_id: data.package_id || null, + package_id: data.package_id, start_time: data.start_time, end_time: data.end_time, status: 'pending', // Default to pending, admin must confirm notes: data.notes, + groom_region: data.groom_region, + bride_region: data.bride_region, + price: data.price, }).select().single() if (error) { diff --git a/src/app/dashboard/reservations/new/reservation-form.tsx b/src/app/dashboard/reservations/new/reservation-form.tsx index 00f4714..a94cb80 100644 --- a/src/app/dashboard/reservations/new/reservation-form.tsx +++ b/src/app/dashboard/reservations/new/reservation-form.tsx @@ -16,8 +16,7 @@ import { Input } from "@/components/ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Textarea } from "@/components/ui/textarea" import { createReservation } from "./actions" -import { useState } from "react" -import { toast } from "sonner" +import { useState, useEffect } from "react" import { Check, ChevronsUpDown } from "lucide-react" import { cn } from "@/lib/utils" import { @@ -37,11 +36,15 @@ import { const formSchema = z.object({ hall_id: z.string().min(1, "Salon seçmelisiniz."), customer_id: z.string().min(1, "Müşteri seçmelisiniz."), - package_id: z.string().optional(), + package_id: z.string().min(1, "Paket seçmelisiniz."), date: z.string().min(1, "Tarih seçmelisiniz."), start_time: z.string().min(1, "Başlangıç saati seçmelisiniz."), end_time: z.string().min(1, "Bitiş saati seçmelisiniz."), notes: z.string().optional(), + groom_region: z.string().optional(), + bride_region: z.string().optional(), + price: z.coerce.number().min(0, "Fiyat 0'dan küçük olamaz."), + discount_rate: z.coerce.number().min(0).max(100).optional(), }) interface ReservationFormProps { @@ -56,7 +59,7 @@ export function ReservationForm({ halls, customers, packages }: ReservationFormP const [openCustomer, setOpenCustomer] = useState(false) const form = useForm>({ - resolver: zodResolver(formSchema), + resolver: zodResolver(formSchema) as any, defaultValues: { hall_id: "", customer_id: "", @@ -65,14 +68,40 @@ export function ReservationForm({ halls, customers, packages }: ReservationFormP start_time: "", end_time: "", notes: "", + groom_region: "", + bride_region: "", + price: 0, + discount_rate: 0, }, }) + // Watch for changes + const selectedPackageId = form.watch("package_id") + const discountRate = form.watch("discount_rate") + + // Auto-calculate price logic + useEffect(() => { + if (selectedPackageId) { + const pkg = packages.find(p => p.id === selectedPackageId) + if (pkg) { + const basePrice = Number(pkg.price) + const discount = Number(discountRate) || 0 + // Calculate new price + const discountedPrice = basePrice * (1 - discount / 100) + + // Update price field if it differs significantly (avoid loops/floating point issues) + const currentPrice = form.getValues("price") + if (Math.abs(currentPrice - discountedPrice) > 0.1) { + form.setValue('price', Number(discountedPrice.toFixed(2))) + } + } + } + }, [selectedPackageId, discountRate, packages, form]) + async function onSubmit(values: z.infer) { setLoading(true) setError(null) - // Combine date and time const startDateTime = new Date(`${values.date}T${values.start_time}`) const endDateTime = new Date(`${values.date}T${values.end_time}`) @@ -86,10 +115,13 @@ export function ReservationForm({ halls, customers, packages }: ReservationFormP const result = await createReservation({ hall_id: values.hall_id, customer_id: values.customer_id, - package_id: values.package_id === "none" ? undefined : values.package_id, + package_id: values.package_id, start_time: startDateTime.toISOString(), end_time: endDateTime.toISOString(), notes: values.notes, + groom_region: values.groom_region, + bride_region: values.bride_region, + price: values.price, }) if (result && result.error) { @@ -249,7 +281,7 @@ export function ReservationForm({ halls, customers, packages }: ReservationFormP name="package_id" render={({ field }) => ( - Paket (Opsiyonel) + Paket (Zorunlu) field.onChange(e.target.valueAsNumber)} + /> + + + + )} + /> + ( + + Toplam Tutar (TL) + + field.onChange(e.target.valueAsNumber)} + /> + + + + )} + /> +
+ +
+ ( + + Damat Yöre + + + + + + )} + /> + ( + + Gelin Yöre + + + + + + )} + /> +
+ { onNavClick?: () => void + user?: { + name: string | null + email: string | null + } } export function MainNav({ className, onNavClick, + user, ...props }: MainNavProps) { const pathname = usePathname() @@ -62,6 +67,10 @@ export function MainNav({ }, ] + const displayName = user?.name || user?.email?.split('@')[0] || 'Kullanıcı' + const displayEmail = user?.email || '' + const initial = displayName.charAt(0).toUpperCase() + return (
diff --git a/src/components/mobile-sidebar.tsx b/src/components/mobile-sidebar.tsx index e6440c0..f9c35fe 100644 --- a/src/components/mobile-sidebar.tsx +++ b/src/components/mobile-sidebar.tsx @@ -6,7 +6,7 @@ import { Menu } from "lucide-react" import { MainNav } from "@/components/main-nav" import { useState, useEffect } from "react" -export function MobileSidebar() { +export function MobileSidebar({ user }: { user?: { name: string | null; email: string | null } }) { const [open, setOpen] = useState(false) const [isMounted, setIsMounted] = useState(false) @@ -28,7 +28,7 @@ export function MobileSidebar() { Navigasyon Menüsü - setOpen(false)} /> + setOpen(false)} /> ) diff --git a/supabase_schema_add_regions.sql b/supabase_schema_add_regions.sql new file mode 100644 index 0000000..c673a1e --- /dev/null +++ b/supabase_schema_add_regions.sql @@ -0,0 +1,4 @@ +-- Add groom_region and bride_region to reservations table +ALTER TABLE reservations +ADD COLUMN IF NOT EXISTS groom_region text, +ADD COLUMN IF NOT EXISTS bride_region text;