MED-102: improve tto orders view

MED-102
This commit is contained in:
danelkungla
2025-09-26 16:39:29 +03:00
committed by GitHub
14 changed files with 111 additions and 78 deletions

View File

@@ -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} />

View File

@@ -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>

View File

@@ -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'} />,

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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,

View File

@@ -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';

View File

@@ -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();

View File

@@ -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();

View File

@@ -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
View 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;
};

View File

@@ -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;

View File

@@ -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"