MED-102: clean order page for tto orders

This commit is contained in:
Danel Kungla
2025-09-25 15:30:07 +03:00
parent 5dc625c903
commit 6c3ae1eda6
12 changed files with 82 additions and 48 deletions

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,15 @@ 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, timeSlot.UserID,
timeSlot.SyncUserID, timeSlot.SyncUserID,
booking.selectedLocationId ? booking.selectedLocationId : null, 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,7 +2,7 @@ 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: AnalysisOrder }) {
return ( return (

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,15 @@ export default function OrderBlock({
items={itemsTtoService} items={itemsTtoService}
title="orders:table.ttoService" title="orders:table.ttoService"
type="ttoService" type="ttoService"
order={{ status: medusaOrderStatus.toUpperCase() }}
/> />
)} )}
<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();
@@ -43,9 +43,9 @@ export default function OrderItemsTable({
const isAnalysisOrder = type === 'analysisOrder'; const isAnalysisOrder = type === 'analysisOrder';
const openAnalysisResults = async () => { const openAnalysisResults = 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}`);
} }
}; };
@@ -84,7 +84,7 @@ 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>

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

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