Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 30 additions & 32 deletions backend/prisma/schema.prisma
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
generator client {
provider = "prisma-client-js"
output = "../generated/prisma"
}

datasource db {
Expand Down Expand Up @@ -50,36 +49,35 @@ model Medication {
patientId String @map("patient_id") @db.Uuid
name String @db.VarChar(255)
quantity String @db.VarChar(100)
instructions String? @db.Text
instructions String?
createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(6)
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamp(6)

visit Visit @relation(fields: [visitId], references: [id], onDelete: Cascade)
patient Patient @relation(fields: [patientId], references: [id], onDelete: Cascade)
patient Patient @relation(fields: [patientId], references: [id], onDelete: Cascade)
visit Visit @relation(fields: [visitId], references: [id], onDelete: Cascade)

@@index([visitId])
@@index([patientId])
@@map("medications")
}

model Patient {
id String @id @default(uuid()) @db.Uuid
patientNumber String @unique @map("patient_number") @db.VarChar(50)
fullName String @map("full_name") @db.VarChar(255)
dateOfBirth DateTime @map("date_of_birth") @db.Date
id String @id @default(uuid()) @db.Uuid
patientNumber String @unique @map("patient_number") @db.VarChar(50)
fullName String @map("full_name") @db.VarChar(255)
dateOfBirth DateTime @map("date_of_birth") @db.Date
gender Gender
phone String @db.VarChar(20)
email String? @db.VarChar(255)
phone String @db.VarChar(20)
email String? @db.VarChar(255)
address String?
bloodType String? @map("blood_type") @db.VarChar(5)
bloodType String? @map("blood_type") @db.VarChar(5)
allergies String?
medicalHistory String? @map("medical_history")
createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(6)
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamp(6)
medicalRecordNumber String? @unique @map("medical_record_number") @db.VarChar(50)
medicalHistory String? @map("medical_history")
createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(6)
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamp(6)
medicalRecordNumber String? @unique @map("medical_record_number") @db.VarChar(50)
medications Medication[]
treatments Treatment[]
visits Visit[]
medications Medication[]

@@index([patientNumber])
@@index([fullName])
Expand Down Expand Up @@ -172,24 +170,24 @@ model Package {
}

model Visit {
id String @id @default(uuid()) @db.Uuid
patientId String @map("patient_id") @db.Uuid
nurseId String @map("nurse_id") @db.Uuid
visitNumber String @unique @map("visit_number") @db.VarChar(50)
visitDate DateTime @map("visit_date") @db.Timestamp(6)
queueNumber Int @map("queue_number")
status VisitStatus @default(WAITING)
chiefComplaint String? @map("chief_complaint")
bloodPressure String? @map("blood_pressure") @db.VarChar(20)
id String @id @default(uuid()) @db.Uuid
patientId String @map("patient_id") @db.Uuid
nurseId String @map("nurse_id") @db.Uuid
visitNumber String @unique @map("visit_number") @db.VarChar(50)
visitDate DateTime @map("visit_date") @db.Timestamp(6)
queueNumber Int @map("queue_number")
status VisitStatus @default(WAITING)
chiefComplaint String? @map("chief_complaint")
bloodPressure String? @map("blood_pressure") @db.VarChar(20)
notes String?
totalCost Decimal @default(0) @map("total_cost") @db.Decimal(12, 2)
createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(6)
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamp(6)
totalCost Decimal @default(0) @map("total_cost") @db.Decimal(12, 2)
createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(6)
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamp(6)
medications Medication[]
payments Payment[]
treatments Treatment[]
medications Medication[]
nurse User @relation("NurseVisits", fields: [nurseId], references: [id])
patient Patient @relation(fields: [patientId], references: [id], onDelete: Cascade)
nurse User @relation("NurseVisits", fields: [nurseId], references: [id], onUpdate: NoAction)
patient Patient @relation(fields: [patientId], references: [id], onDelete: Cascade)

@@index([patientId])
@@index([nurseId])
Expand Down
2 changes: 1 addition & 1 deletion backend/src/config/database.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { PrismaClient } from '../../generated/prisma';
import { PrismaClient } from '@prisma/client';

const globalForPrisma = global as unknown as {
prisma: PrismaClient | undefined;
Expand Down
2 changes: 1 addition & 1 deletion backend/src/controllers/calendar.controller.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Response } from 'express';
import { PrismaClient, Prisma, UserRole } from '../../generated/prisma';
import { PrismaClient, Prisma, UserRole } from '@prisma/client';

const prisma = new PrismaClient();

Expand Down
2 changes: 1 addition & 1 deletion backend/src/controllers/commission.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Response, NextFunction } from 'express';
import { AuthRequest } from '../types/express.types';
import { CommissionService } from '../services/commission.service';
import { successResponse } from '../utils/response.util';
import { ServiceCategory } from '../../generated/prisma';
import { ServiceCategory } from '@prisma/client';

const commissionService = new CommissionService();

Expand Down
2 changes: 1 addition & 1 deletion backend/src/middlewares/auth.middleware.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Request, Response, NextFunction } from 'express';
import jwt from 'jsonwebtoken';
import { PrismaClient, UserRole } from '../../generated/prisma';
import { PrismaClient, UserRole } from '@prisma/client';

const prisma = new PrismaClient();

Expand Down
2 changes: 1 addition & 1 deletion backend/src/middlewares/role.middleware.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Response, NextFunction } from 'express';
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';
import { AuthRequest } from '../types/express.types';
import { errorResponse } from '../utils/response.util';

Expand Down
2 changes: 1 addition & 1 deletion backend/src/routes/commission.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Router } from 'express';
import { CommissionController } from '../controllers/commission.controller';
import { authMiddleware } from '../middlewares/auth.middleware';
import { roleMiddleware } from '../middlewares/role.middleware';
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';

const router = Router();
const commissionController = new CommissionController();
Expand Down
2 changes: 1 addition & 1 deletion backend/src/routes/dashboard-nurse.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Router } from 'express';
import { DashboardNurseController } from '../controllers/dashboard-nurse.controller';
import { authMiddleware } from '../middlewares/auth.middleware';
import { roleMiddleware } from '../middlewares/role.middleware';
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';

const router = Router();
const dashboardNurseController = new DashboardNurseController();
Expand Down
2 changes: 1 addition & 1 deletion backend/src/routes/dashboard.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Router } from 'express';
import { DashboardController } from '../controllers/dashboard.controller';
import { authMiddleware } from '../middlewares/auth.middleware';
import { roleMiddleware } from '../middlewares/role.middleware';
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';

const router = Router();
const dashboardController = new DashboardController();
Expand Down
2 changes: 1 addition & 1 deletion backend/src/routes/finance.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Router } from 'express';
import { FinanceController } from '../controllers/finance.controller';
import { authMiddleware } from '../middlewares/auth.middleware';
import { roleMiddleware } from '../middlewares/role.middleware';
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';

const router = Router();
const financeController = new FinanceController();
Expand Down
2 changes: 1 addition & 1 deletion backend/src/routes/nurse-profile.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { authMiddleware } from '../middlewares/auth.middleware';
import { roleMiddleware } from '../middlewares/role.middleware';
import { validate } from '../middlewares/validation.middleware';
import { updateProfileSchema } from '../validators/profile.validator';
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';

const router = Router();
const nurseProfileController = new NurseProfileController();
Expand Down
2 changes: 1 addition & 1 deletion backend/src/routes/service.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Router } from 'express';
import { ServiceController } from '../controllers/service.controller';
import { authMiddleware } from '../middlewares/auth.middleware';
import { roleMiddleware } from '../middlewares/role.middleware';
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';

const router = Router();
const serviceController = new ServiceController();
Expand Down
4 changes: 2 additions & 2 deletions backend/src/routes/treatment.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import { Router } from 'express';
import { TreatmentController } from '../controllers/treatment.controller';
import { authMiddleware } from '../middlewares/auth.middleware';
import { roleMiddleware } from '../middlewares/role.middleware';
import { uploadMiddleware } from '../middlewares/Upload.middleware';
import { uploadMiddleware } from '../middlewares/upload.middleware';
import { validate } from '../middlewares/validation.middleware';
import { updateTreatmentSchema } from '../validators/treatment.validator';
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';

const router = Router();
const treatmentController = new TreatmentController();
Expand Down
2 changes: 1 addition & 1 deletion backend/src/routes/user.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Router } from 'express';
import { UserController } from '../controllers/user.controller';
import { authMiddleware } from '../middlewares/auth.middleware';
import { roleMiddleware } from '../middlewares/role.middleware';
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';

const router = Router();
const userController = new UserController();
Expand Down
2 changes: 1 addition & 1 deletion backend/src/services/auth.service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { prisma } from '../config/database';
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';
import { hashPassword, comparePassword } from '../utils/bcrypt.util';
import { generateToken } from '../utils/jwt.util';
import { AppError } from '../middlewares/error.middleware';
Expand Down
2 changes: 1 addition & 1 deletion backend/src/services/commission.service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { prisma } from '../config/database';
import { ServiceCategory, Commission, Treatment, Service, Visit, Patient } from '../../generated/prisma';
import { ServiceCategory, Commission, Treatment, Service, Visit, Patient } from '@prisma/client';
import { getCurrentMonth, getCurrentYear } from '../utils/date.util';
import { Decimal } from '@prisma/client/runtime/library';

Expand Down
2 changes: 1 addition & 1 deletion backend/src/services/payment.service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { prisma } from '../config/database';
import { PaymentMethod, PaymentStatus } from '../../generated/prisma';
import { PaymentMethod, PaymentStatus } from '@prisma/client';
import { AppError } from '../middlewares/error.middleware';

interface CreatePaymentData {
Expand Down
2 changes: 1 addition & 1 deletion backend/src/services/schedule.service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { prisma } from '../config/database';
import { ScheduleType } from '../../generated/prisma';
import { ScheduleType } from '@prisma/client';

interface CreateScheduleData {
title: string;
Expand Down
2 changes: 1 addition & 1 deletion backend/src/services/service.service.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { prisma } from '../config/database';
import { AppError } from '../middlewares/error.middleware';
import { ServiceCategory } from '../../generated/prisma';
import { ServiceCategory } from '@prisma/client';

interface CreateServiceData {
serviceName: string;
Expand Down
2 changes: 1 addition & 1 deletion backend/src/services/user.service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { prisma } from '../config/database';
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';
import { hashPassword } from '../utils/bcrypt.util';
import { AppError } from '../middlewares/error.middleware';

Expand Down
21 changes: 14 additions & 7 deletions backend/src/services/visit.service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { prisma } from "../config/database";
import { VisitStatus, Gender } from "../../generated/prisma";
import { VisitStatus, Gender } from "@prisma/client";
import { AppError } from "../middlewares/error.middleware";

interface CreatePatientData {
Expand Down Expand Up @@ -145,11 +145,9 @@ export class VisitService {
createdAt: "desc",
},
},
medications: {
orderBy: {
createdAt: "asc"
}
},
// `medications` relation is fetched separately because the generated Prisma
// client does not include it in `VisitInclude` for the current introspected schema.
// We'll load medications after retrieving the visit.
payments: true,
},
orderBy: {
Expand All @@ -161,7 +159,16 @@ export class VisitService {
throw new AppError("Kunjungan tidak ditemukan", 404);
}

return visit;
// Load medications separately and attach them to the returned object
const medications = await prisma.medication.findMany({
where: { visitId: visit.id },
orderBy: { createdAt: "asc" },
});

return {
...visit,
medications,
};
}

async getVisits(
Expand Down
2 changes: 1 addition & 1 deletion backend/src/types/express.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';

declare global {
namespace Express {
Expand Down
2 changes: 1 addition & 1 deletion backend/src/types/express.types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Request } from 'express';
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';

export interface AuthUser {
id: string;
Expand Down
2 changes: 1 addition & 1 deletion backend/src/types/express/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserRole } from '../../generated/prisma';
import { UserRole } from '@prisma/client';

declare global {
namespace Express {
Expand Down
File renamed without changes.
58 changes: 40 additions & 18 deletions frontend/src/app/dashboard/dokter/main/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,26 +83,48 @@ export default function DoctorDashboard() {
<span className="text-sm">{profile?.specialization || 'Dokter Gigi'}</span>
</p>

<div className="flex items-center gap-2 text-sm text-gray-500 mt-2">
<MapPin className="w-4 h-4" />
<span>Tempat Praktik</span>
</div>
<div className="flex items-center gap-2 mt-3 text-pink-500">
<MapPin className="w-4 h-4" />
<span className="text-sm font-medium">
Tempat Praktek
</span>
</div>

<Badge className="mt-3 bg-pink-100 text-pink-700 border-none w-fit">
{practiceStatus === 'ACTIVE' ? 'Aktif' : 'Tidak Aktif'}
</Badge>
{/* Badge Lokasi */}
<Badge
className="
mt-2
inline-flex items-center
max-w-fit
px-3 py-1
rounded-full
text-xs font-medium
bg-pink-100 text-pink-600
whitespace-nowrap
"
>
Rocydental
</Badge>

{/* Tombol Prediksi */}
<div className="mt-4">
<Button
onClick={() => setShowPredictionModal(true)}
className="flex items-center bg-pink-600 hover:bg-pink-700 text-white shadow-md px-4 py-2 rounded-md transition-colors"
>
<Activity className="w-4 h-4 mr-2" />
Prediksi
</Button>
</div>
</div>
{/* Tombol Prediksi */}
<div className="mt-3">
<Button
onClick={() => setShowPredictionModal(true)}
className="
inline-flex items-center
h-8 px-4
rounded-full
bg-pink-600 hover:bg-pink-700
text-sm font-semibold text-white
shadow-md
transition-colors
"
>
<Activity className="w-4 h-4 mr-2" />
Prediksi
</Button>
</div>
</div>

</div>
</CardContent>
Expand Down
Loading