Compare commits
1 Commits
a6818607c8
...
013b81879c
| Author | SHA1 | Date | |
|---|---|---|---|
| 013b81879c |
@@ -82,6 +82,54 @@ export async function findBookingRoomConflict({
|
|||||||
return conflict ?? null;
|
return conflict ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function findBookingContractRoomConflict({
|
||||||
|
organizationId,
|
||||||
|
roomId,
|
||||||
|
startsAt,
|
||||||
|
endsAt,
|
||||||
|
status
|
||||||
|
}: {
|
||||||
|
organizationId: string;
|
||||||
|
roomId: string;
|
||||||
|
startsAt: string;
|
||||||
|
endsAt: string;
|
||||||
|
status: string;
|
||||||
|
}): Promise<ContractRoomConflict | null> {
|
||||||
|
if (status === 'cancelled') return null;
|
||||||
|
|
||||||
|
const startDate = startsAt.slice(0, 10);
|
||||||
|
const endDate = endsAt.slice(0, 10);
|
||||||
|
|
||||||
|
const [conflict] = await db
|
||||||
|
.select({
|
||||||
|
contractId: contracts.id,
|
||||||
|
roomId: contractRooms.roomId,
|
||||||
|
roomName: rooms.name,
|
||||||
|
startDate: contracts.startDate,
|
||||||
|
endDate: contracts.endDate
|
||||||
|
})
|
||||||
|
.from(contractRooms)
|
||||||
|
.innerJoin(contracts, eq(contractRooms.contractId, contracts.id))
|
||||||
|
.innerJoin(rooms, eq(contractRooms.roomId, rooms.id))
|
||||||
|
.where(
|
||||||
|
and(
|
||||||
|
eq(contracts.organizationId, organizationId),
|
||||||
|
eq(contracts.status, 'active'),
|
||||||
|
isNull(contracts.archivedAt),
|
||||||
|
eq(contractRooms.roomId, roomId),
|
||||||
|
eq(rooms.organizationId, organizationId),
|
||||||
|
inArray(rooms.type, rentableContractRoomTypes),
|
||||||
|
isNull(rooms.archivedAt),
|
||||||
|
lte(contracts.startDate, endDate),
|
||||||
|
gte(contracts.endDate, startDate)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.orderBy(asc(contracts.startDate), asc(rooms.name))
|
||||||
|
.limit(1);
|
||||||
|
|
||||||
|
return conflict ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
export async function findActiveContractRoomConflict({
|
export async function findActiveContractRoomConflict({
|
||||||
organizationId,
|
organizationId,
|
||||||
roomIds,
|
roomIds,
|
||||||
|
|||||||
@@ -4,7 +4,12 @@ import { zod4 } from 'sveltekit-superforms/adapters';
|
|||||||
import { db } from '$lib/server/db';
|
import { db } from '$lib/server/db';
|
||||||
import { bookings, clients, rooms, services } from '$lib/server/db/schema';
|
import { bookings, clients, rooms, services } from '$lib/server/db/schema';
|
||||||
import { loadOrganizationContext } from '$lib/server/organizations';
|
import { loadOrganizationContext } from '$lib/server/organizations';
|
||||||
import { bookingConflictMessage, findBookingRoomConflict } from '$lib/server/scheduling';
|
import {
|
||||||
|
bookingConflictMessage,
|
||||||
|
contractConflictMessage,
|
||||||
|
findBookingContractRoomConflict,
|
||||||
|
findBookingRoomConflict
|
||||||
|
} from '$lib/server/scheduling';
|
||||||
import { archiveSchema } from '$lib/schemas/shared.schema';
|
import { archiveSchema } from '$lib/schemas/shared.schema';
|
||||||
import { bookingCreateSchema, bookingEditSchema } from '$lib/schemas/bookings.schema';
|
import { bookingCreateSchema, bookingEditSchema } from '$lib/schemas/bookings.schema';
|
||||||
import type { Actions, PageServerLoad } from './$types';
|
import type { Actions, PageServerLoad } from './$types';
|
||||||
@@ -102,6 +107,17 @@ export const actions: Actions = {
|
|||||||
});
|
});
|
||||||
if (conflict) return setError(form, 'roomId', bookingConflictMessage(conflict));
|
if (conflict) return setError(form, 'roomId', bookingConflictMessage(conflict));
|
||||||
|
|
||||||
|
const contractConflict = await findBookingContractRoomConflict({
|
||||||
|
organizationId: activeOrganizationId,
|
||||||
|
roomId: form.data.roomId,
|
||||||
|
startsAt: form.data.startsAt,
|
||||||
|
endsAt: form.data.endsAt,
|
||||||
|
status: form.data.status
|
||||||
|
});
|
||||||
|
if (contractConflict) {
|
||||||
|
return setError(form, 'roomId', contractConflictMessage(contractConflict));
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await db.insert(bookings).values({
|
await db.insert(bookings).values({
|
||||||
id: crypto.randomUUID(),
|
id: crypto.randomUUID(),
|
||||||
@@ -143,6 +159,17 @@ export const actions: Actions = {
|
|||||||
});
|
});
|
||||||
if (conflict) return setError(form, 'roomId', bookingConflictMessage(conflict));
|
if (conflict) return setError(form, 'roomId', bookingConflictMessage(conflict));
|
||||||
|
|
||||||
|
const contractConflict = await findBookingContractRoomConflict({
|
||||||
|
organizationId: activeOrganizationId,
|
||||||
|
roomId: form.data.roomId,
|
||||||
|
startsAt: form.data.startsAt,
|
||||||
|
endsAt: form.data.endsAt,
|
||||||
|
status: form.data.status
|
||||||
|
});
|
||||||
|
if (contractConflict) {
|
||||||
|
return setError(form, 'roomId', contractConflictMessage(contractConflict));
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await db
|
await db
|
||||||
.update(bookings)
|
.update(bookings)
|
||||||
|
|||||||
@@ -215,7 +215,7 @@
|
|||||||
{#if data.invoice.notes}
|
{#if data.invoice.notes}
|
||||||
<section class="rounded-lg border border-border p-4">
|
<section class="rounded-lg border border-border p-4">
|
||||||
<h2 class="text-sm font-semibold">Notes</h2>
|
<h2 class="text-sm font-semibold">Notes</h2>
|
||||||
<p class="mt-2 whitespace-pre-wrap text-sm text-muted-foreground">{data.invoice.notes}</p>
|
<p class="mt-2 text-sm whitespace-pre-wrap text-muted-foreground">{data.invoice.notes}</p>
|
||||||
</section>
|
</section>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user