MED-102: improve tto orders view
MED-102
This commit is contained in:
@@ -26,17 +26,7 @@ async function OrderConfirmedPage(props: {
|
|||||||
params: Promise<{ orderId: string }>;
|
params: Promise<{ orderId: string }>;
|
||||||
}) {
|
}) {
|
||||||
const params = await props.params;
|
const params = await props.params;
|
||||||
|
const medusaOrder = await retrieveOrder(params.orderId).catch(() => null);
|
||||||
const order = await getAnalysisOrder({
|
|
||||||
analysisOrderId: Number(params.orderId),
|
|
||||||
}).catch(() => null);
|
|
||||||
if (!order) {
|
|
||||||
redirect(pathsConfig.app.myOrders);
|
|
||||||
}
|
|
||||||
|
|
||||||
const medusaOrder = await retrieveOrder(order.medusa_order_id).catch(
|
|
||||||
() => null,
|
|
||||||
);
|
|
||||||
if (!medusaOrder) {
|
if (!medusaOrder) {
|
||||||
redirect(pathsConfig.app.myOrders);
|
redirect(pathsConfig.app.myOrders);
|
||||||
}
|
}
|
||||||
@@ -46,7 +36,12 @@ async function OrderConfirmedPage(props: {
|
|||||||
<PageHeader title={<Trans i18nKey="cart:order.title" />} />
|
<PageHeader title={<Trans i18nKey="cart:order.title" />} />
|
||||||
<Divider />
|
<Divider />
|
||||||
<div className="small:grid-cols-[1fr_360px] grid grid-cols-1 gap-x-40 gap-y-6 lg:px-4">
|
<div className="small:grid-cols-[1fr_360px] grid grid-cols-1 gap-x-40 gap-y-6 lg:px-4">
|
||||||
<OrderDetails order={order} />
|
<OrderDetails
|
||||||
|
order={{
|
||||||
|
id: medusaOrder.id,
|
||||||
|
created_at: medusaOrder.created_at,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
<Divider />
|
<Divider />
|
||||||
<OrderItems medusaOrder={medusaOrder} />
|
<OrderItems medusaOrder={medusaOrder} />
|
||||||
<CartTotals medusaOrder={medusaOrder} />
|
<CartTotals medusaOrder={medusaOrder} />
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ async function OrdersPage() {
|
|||||||
const analysisOrder = analysisOrders.find(
|
const analysisOrder = analysisOrders.find(
|
||||||
({ medusa_order_id }) => medusa_order_id === medusaOrder.id,
|
({ medusa_order_id }) => medusa_order_id === medusaOrder.id,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!medusaOrder) {
|
if (!medusaOrder) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -81,6 +82,7 @@ async function OrdersPage() {
|
|||||||
<OrderBlock
|
<OrderBlock
|
||||||
medusaOrderId={medusaOrder.id}
|
medusaOrderId={medusaOrder.id}
|
||||||
analysisOrder={analysisOrder}
|
analysisOrder={analysisOrder}
|
||||||
|
medusaOrderStatus={medusaOrder.status}
|
||||||
itemsAnalysisPackage={medusaOrderItemsAnalysisPackages}
|
itemsAnalysisPackage={medusaOrderItemsAnalysisPackages}
|
||||||
itemsTtoService={medusaOrderItemsTtoServices}
|
itemsTtoService={medusaOrderItemsTtoServices}
|
||||||
itemsOther={medusaOrderItemsOther}
|
itemsOther={medusaOrderItemsOther}
|
||||||
@@ -88,7 +90,7 @@ async function OrdersPage() {
|
|||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
{analysisOrders.length === 0 && (
|
{analysisOrders.length === 0 && ttoOrders.length === 0 && (
|
||||||
<h5 className="mt-6">
|
<h5 className="mt-6">
|
||||||
<Trans i18nKey="orders:noOrders" />
|
<Trans i18nKey="orders:noOrders" />
|
||||||
</h5>
|
</h5>
|
||||||
|
|||||||
@@ -167,15 +167,17 @@ const TimeSlots = ({
|
|||||||
return toast.error(t('booking:serviceNotFound'));
|
return toast.error(t('booking:serviceNotFound'));
|
||||||
}
|
}
|
||||||
|
|
||||||
const bookTimePromise = updateReservationTime(
|
const bookTimePromise = updateReservationTime({
|
||||||
reservationId,
|
reservationId,
|
||||||
timeSlot.StartTime,
|
newStartTime: timeSlot.StartTime,
|
||||||
Number(syncedService.id),
|
newServiceId: Number(syncedService.id),
|
||||||
timeSlot.UserID,
|
newAppointmentUserId: timeSlot.UserID,
|
||||||
timeSlot.SyncUserID,
|
newSyncUserId: timeSlot.SyncUserID,
|
||||||
booking.selectedLocationId ? booking.selectedLocationId : null,
|
newLocationId: booking.selectedLocationId
|
||||||
|
? booking.selectedLocationId
|
||||||
|
: null,
|
||||||
cartId,
|
cartId,
|
||||||
);
|
});
|
||||||
|
|
||||||
toast.promise(() => bookTimePromise, {
|
toast.promise(() => bookTimePromise, {
|
||||||
success: <Trans i18nKey={'booking:bookTimeSuccess'} />,
|
success: <Trans i18nKey={'booking:bookTimeSuccess'} />,
|
||||||
|
|||||||
@@ -2,16 +2,20 @@ import { formatDate } from 'date-fns';
|
|||||||
|
|
||||||
import { Trans } from '@kit/ui/trans';
|
import { Trans } from '@kit/ui/trans';
|
||||||
|
|
||||||
import type { AnalysisOrder } from '~/lib/types/analysis-order';
|
import type { AnalysisOrder } from '~/lib/types/order';
|
||||||
|
|
||||||
export default function OrderDetails({ order }: { order: AnalysisOrder }) {
|
export default function OrderDetails({
|
||||||
|
order,
|
||||||
|
}: {
|
||||||
|
order: { id: string; created_at: string | Date };
|
||||||
|
}) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-y-2">
|
<div className="flex flex-col gap-y-2">
|
||||||
<div>
|
<div>
|
||||||
<span className="font-bold">
|
<span className="font-bold">
|
||||||
<Trans i18nKey="cart:orderConfirmed.orderNumber" />:{' '}
|
<Trans i18nKey="cart:orderConfirmed.orderNumber" />:{' '}
|
||||||
</span>
|
</span>
|
||||||
<span>{order.medusa_order_id}</span>
|
<span>{order.id}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -5,18 +5,20 @@ import { Eye } from 'lucide-react';
|
|||||||
|
|
||||||
import { Trans } from '@kit/ui/makerkit/trans';
|
import { Trans } from '@kit/ui/makerkit/trans';
|
||||||
|
|
||||||
import type { AnalysisOrder } from '~/lib/types/analysis-order';
|
import type { AnalysisOrder } from '~/lib/types/order';
|
||||||
|
|
||||||
import OrderItemsTable from './order-items-table';
|
import OrderItemsTable from './order-items-table';
|
||||||
|
|
||||||
export default function OrderBlock({
|
export default function OrderBlock({
|
||||||
analysisOrder,
|
analysisOrder,
|
||||||
|
medusaOrderStatus,
|
||||||
itemsAnalysisPackage,
|
itemsAnalysisPackage,
|
||||||
itemsTtoService,
|
itemsTtoService,
|
||||||
itemsOther,
|
itemsOther,
|
||||||
medusaOrderId,
|
medusaOrderId,
|
||||||
}: {
|
}: {
|
||||||
analysisOrder?: AnalysisOrder;
|
analysisOrder?: AnalysisOrder;
|
||||||
|
medusaOrderStatus: string;
|
||||||
itemsAnalysisPackage: StoreOrderLineItem[];
|
itemsAnalysisPackage: StoreOrderLineItem[];
|
||||||
itemsTtoService: StoreOrderLineItem[];
|
itemsTtoService: StoreOrderLineItem[];
|
||||||
itemsOther: StoreOrderLineItem[];
|
itemsOther: StoreOrderLineItem[];
|
||||||
@@ -50,7 +52,11 @@ export default function OrderBlock({
|
|||||||
<OrderItemsTable
|
<OrderItemsTable
|
||||||
items={itemsAnalysisPackage}
|
items={itemsAnalysisPackage}
|
||||||
title="orders:table.analysisPackage"
|
title="orders:table.analysisPackage"
|
||||||
analysisOrder={analysisOrder}
|
order={{
|
||||||
|
medusaOrderId: analysisOrder.medusa_order_id,
|
||||||
|
id: analysisOrder.id,
|
||||||
|
status: analysisOrder.status,
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{itemsTtoService && (
|
{itemsTtoService && (
|
||||||
@@ -58,12 +64,18 @@ export default function OrderBlock({
|
|||||||
items={itemsTtoService}
|
items={itemsTtoService}
|
||||||
title="orders:table.ttoService"
|
title="orders:table.ttoService"
|
||||||
type="ttoService"
|
type="ttoService"
|
||||||
|
order={{
|
||||||
|
status: medusaOrderStatus.toUpperCase(),
|
||||||
|
medusaOrderId,
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<OrderItemsTable
|
<OrderItemsTable
|
||||||
items={itemsOther}
|
items={itemsOther}
|
||||||
title="orders:table.otherOrders"
|
title="orders:table.otherOrders"
|
||||||
analysisOrder={analysisOrder}
|
order={{
|
||||||
|
status: analysisOrder?.status,
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import {
|
|||||||
} from '@kit/ui/table';
|
} from '@kit/ui/table';
|
||||||
import { Trans } from '@kit/ui/trans';
|
import { Trans } from '@kit/ui/trans';
|
||||||
|
|
||||||
import type { AnalysisOrder } from '~/lib/types/analysis-order';
|
import type { Order } from '~/lib/types/order';
|
||||||
|
|
||||||
import { logAnalysisResultsNavigateAction } from './actions';
|
import { logAnalysisResultsNavigateAction } from './actions';
|
||||||
|
|
||||||
@@ -26,12 +26,12 @@ export type OrderItemType = 'analysisOrder' | 'ttoService';
|
|||||||
export default function OrderItemsTable({
|
export default function OrderItemsTable({
|
||||||
items,
|
items,
|
||||||
title,
|
title,
|
||||||
analysisOrder,
|
order,
|
||||||
type = 'analysisOrder',
|
type = 'analysisOrder',
|
||||||
}: {
|
}: {
|
||||||
items: StoreOrderLineItem[];
|
items: StoreOrderLineItem[];
|
||||||
title: string;
|
title: string;
|
||||||
analysisOrder?: AnalysisOrder;
|
order: Order;
|
||||||
type?: OrderItemType;
|
type?: OrderItemType;
|
||||||
}) {
|
}) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@@ -42,10 +42,12 @@ export default function OrderItemsTable({
|
|||||||
|
|
||||||
const isAnalysisOrder = type === 'analysisOrder';
|
const isAnalysisOrder = type === 'analysisOrder';
|
||||||
|
|
||||||
const openAnalysisResults = async () => {
|
const openDetailedView = async () => {
|
||||||
if (analysisOrder) {
|
if (isAnalysisOrder && order?.medusaOrderId && order?.id) {
|
||||||
await logAnalysisResultsNavigateAction(analysisOrder.medusa_order_id);
|
await logAnalysisResultsNavigateAction(order.medusaOrderId);
|
||||||
router.push(`${pathsConfig.app.analysisResults}/${analysisOrder.id}`);
|
router.push(`${pathsConfig.app.analysisResults}/${order.id}`);
|
||||||
|
} else {
|
||||||
|
router.push(`${pathsConfig.app.myOrders}/${order.medusaOrderId}`);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -84,17 +86,15 @@ export default function OrderItemsTable({
|
|||||||
|
|
||||||
<TableCell className="min-w-[180px] px-6">
|
<TableCell className="min-w-[180px] px-6">
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={`orders:status.${type}.${analysisOrder?.status ?? 'CONFIRMED'}`}
|
i18nKey={`orders:status.${type}.${order?.status ?? 'CONFIRMED'}`}
|
||||||
/>
|
/>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
|
|
||||||
{isAnalysisOrder && (
|
<TableCell className="px-6 text-right">
|
||||||
<TableCell className="px-6 text-right">
|
<Button size="sm" onClick={openDetailedView}>
|
||||||
<Button size="sm" onClick={openAnalysisResults}>
|
<Trans i18nKey="analysis-results:view" />
|
||||||
<Trans i18nKey="analysis-results:view" />
|
</Button>
|
||||||
</Button>
|
</TableCell>
|
||||||
</TableCell>
|
|
||||||
)}
|
|
||||||
</TableRow>
|
</TableRow>
|
||||||
))}
|
))}
|
||||||
</TableBody>
|
</TableBody>
|
||||||
|
|||||||
@@ -23,16 +23,16 @@ export async function createInitialReservationAction(
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (addedItem) {
|
if (addedItem) {
|
||||||
const reservation = await createInitialReservation(
|
const reservation = await createInitialReservation({
|
||||||
serviceId,
|
serviceId,
|
||||||
clinicId,
|
clinicId,
|
||||||
appointmentUserId,
|
appointmentUserId,
|
||||||
syncUserId,
|
syncUserID: syncUserId,
|
||||||
startTime,
|
startTime,
|
||||||
addedItem.id,
|
medusaLineItemId: addedItem.id,
|
||||||
locationId,
|
locationId,
|
||||||
comments,
|
comments,
|
||||||
);
|
});
|
||||||
|
|
||||||
await updateLineItem({
|
await updateLineItem({
|
||||||
lineId: addedItem.id,
|
lineId: addedItem.id,
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ import axios from 'axios';
|
|||||||
import { toArray } from '@kit/shared/utils';
|
import { toArray } from '@kit/shared/utils';
|
||||||
import { Tables } from '@kit/supabase/database';
|
import { Tables } from '@kit/supabase/database';
|
||||||
|
|
||||||
import type { AnalysisOrder } from '~/lib/types/analysis-order';
|
|
||||||
import type { AnalysisResponseElement } from '~/lib/types/analysis-response-element';
|
import type { AnalysisResponseElement } from '~/lib/types/analysis-response-element';
|
||||||
|
import type { AnalysisOrder } from '~/lib/types/order';
|
||||||
|
|
||||||
import { getAccountAdmin } from '../account.service';
|
import { getAccountAdmin } from '../account.service';
|
||||||
import { getAnalyses } from '../analyses.service';
|
import { getAnalyses } from '../analyses.service';
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import type { Tables } from '@kit/supabase/database';
|
|||||||
import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client';
|
import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client';
|
||||||
import { getSupabaseServerClient } from '@kit/supabase/server-client';
|
import { getSupabaseServerClient } from '@kit/supabase/server-client';
|
||||||
|
|
||||||
import type { AnalysisOrder } from '../types/analysis-order';
|
import type { AnalysisOrder, TTOOrder } from '../types/order';
|
||||||
|
|
||||||
export async function createAnalysisOrder({
|
export async function createAnalysisOrder({
|
||||||
medusaOrder,
|
medusaOrder,
|
||||||
@@ -176,10 +176,7 @@ export async function getTtoOrders({
|
|||||||
orderStatus,
|
orderStatus,
|
||||||
lineItemIds,
|
lineItemIds,
|
||||||
}: {
|
}: {
|
||||||
orderStatus?: Tables<
|
orderStatus?: TTOOrder['status'];
|
||||||
{ schema: 'medreport' },
|
|
||||||
'connected_online_reservation'
|
|
||||||
>['status'];
|
|
||||||
lineItemIds?: string[];
|
lineItemIds?: string[];
|
||||||
} = {}) {
|
} = {}) {
|
||||||
const client = getSupabaseServerClient();
|
const client = getSupabaseServerClient();
|
||||||
|
|||||||
@@ -150,16 +150,25 @@ export async function getCartReservations(
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function createInitialReservation(
|
export async function createInitialReservation({
|
||||||
serviceId: number,
|
serviceId,
|
||||||
clinicId: number,
|
clinicId,
|
||||||
appointmentUserId: number,
|
appointmentUserId,
|
||||||
syncUserID: number,
|
syncUserID,
|
||||||
startTime: Date,
|
startTime,
|
||||||
medusaLineItemId: string,
|
medusaLineItemId,
|
||||||
locationId?: number | null,
|
locationId,
|
||||||
comments = '',
|
comments = '',
|
||||||
) {
|
}: {
|
||||||
|
serviceId: number;
|
||||||
|
clinicId: number;
|
||||||
|
appointmentUserId: number;
|
||||||
|
syncUserID: number;
|
||||||
|
startTime: Date;
|
||||||
|
medusaLineItemId: string;
|
||||||
|
locationId?: number | null;
|
||||||
|
comments?: string;
|
||||||
|
}) {
|
||||||
const logger = await getLogger();
|
const logger = await getLogger();
|
||||||
const supabase = getSupabaseServerClient();
|
const supabase = getSupabaseServerClient();
|
||||||
|
|
||||||
@@ -255,15 +264,23 @@ export async function getOrderedTtoServices({
|
|||||||
return orderedTtoServices;
|
return orderedTtoServices;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function updateReservationTime(
|
export async function updateReservationTime({
|
||||||
reservationId: number,
|
reservationId,
|
||||||
newStartTime: Date,
|
newStartTime,
|
||||||
newServiceId: number,
|
newServiceId,
|
||||||
newAppointmentUserId: number,
|
newAppointmentUserId,
|
||||||
newSyncUserId: number,
|
newSyncUserId,
|
||||||
newLocationId: number | null, // TODO stop allowing null when Connected starts returning the correct ids instead of -1
|
newLocationId, // TODO stop allowing null when Connected starts returning the correct ids instead of -1
|
||||||
cartId: string,
|
cartId,
|
||||||
) {
|
}: {
|
||||||
|
reservationId: number;
|
||||||
|
newStartTime: Date;
|
||||||
|
newServiceId: number;
|
||||||
|
newAppointmentUserId: number;
|
||||||
|
newSyncUserId: number;
|
||||||
|
newLocationId: number | null;
|
||||||
|
cartId: string;
|
||||||
|
}) {
|
||||||
const logger = await getLogger();
|
const logger = await getLogger();
|
||||||
const supabase = getSupabaseServerClient();
|
const supabase = getSupabaseServerClient();
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
import type { Tables } from '@kit/supabase/database';
|
|
||||||
|
|
||||||
export type AnalysisOrder = Tables<{ schema: 'medreport' }, 'analysis_orders'>;
|
|
||||||
12
lib/types/order.ts
Normal file
12
lib/types/order.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import type { Tables } from '@kit/supabase/database';
|
||||||
|
|
||||||
|
export type AnalysisOrder = Tables<{ schema: 'medreport' }, 'analysis_orders'>;
|
||||||
|
export type TTOOrder = Tables<
|
||||||
|
{ schema: 'medreport' },
|
||||||
|
'connected_online_reservation'
|
||||||
|
>;
|
||||||
|
export type Order = {
|
||||||
|
medusaOrderId?: string;
|
||||||
|
id?: number;
|
||||||
|
status?: string;
|
||||||
|
};
|
||||||
@@ -61,11 +61,6 @@ export const listOrders = async (
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const createTransferRequest = async (
|
export const createTransferRequest = async (
|
||||||
state: {
|
|
||||||
success: boolean;
|
|
||||||
error: string | null;
|
|
||||||
order: HttpTypes.StoreOrder | null;
|
|
||||||
},
|
|
||||||
formData: FormData,
|
formData: FormData,
|
||||||
): Promise<{
|
): Promise<{
|
||||||
success: boolean;
|
success: boolean;
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
"CANCELLED": "Tühistatud"
|
"CANCELLED": "Tühistatud"
|
||||||
},
|
},
|
||||||
"ttoService": {
|
"ttoService": {
|
||||||
"PENDING": "Alustatud",
|
"PENDING": "Laekumise ootel",
|
||||||
"CONFIRMED": "Kinnitatud",
|
"CONFIRMED": "Kinnitatud",
|
||||||
"REJECTED": "Tagasi lükatud",
|
"REJECTED": "Tagasi lükatud",
|
||||||
"CANCELLED": "Tühistatud"
|
"CANCELLED": "Tühistatud"
|
||||||
|
|||||||
Reference in New Issue
Block a user