From be0eef39c24e946c1044c9be097c9c034952629c Mon Sep 17 00:00:00 2001 From: Ramadhan Sjamsani Date: Sat, 3 May 2025 23:23:29 +0800 Subject: [PATCH] service layer WIP --- ERD.puml | 22 ++++++------ prisma/schema.prisma | 45 +++++++++++++++++-------- src/lib/prisma/client.ts | 13 +++++++ src/lib/services/beliSawitService.ts | 32 ++++++++++++++++++ src/lib/services/hargaService.ts | 27 +++++++++++++++ src/lib/services/petaniService.ts | 33 ++++++++++++++++++ src/lib/services/timbangSawitService.ts | 31 +++++++++++++++++ src/lib/services/timbanganService.ts | 42 +++++++++++++++++++++++ 8 files changed, 221 insertions(+), 24 deletions(-) create mode 100644 src/lib/prisma/client.ts create mode 100644 src/lib/services/beliSawitService.ts create mode 100644 src/lib/services/hargaService.ts create mode 100644 src/lib/services/petaniService.ts create mode 100644 src/lib/services/timbangSawitService.ts create mode 100644 src/lib/services/timbanganService.ts diff --git a/ERD.puml b/ERD.puml index 5276a9c..d86da4d 100644 --- a/ERD.puml +++ b/ERD.puml @@ -1,19 +1,20 @@ @startuml +!pragma layout smetana - -entity "timbang"{ +entity "beli"{ * id : number <> * admin_id : number <> + "harga_beli" : number <> petani_id : number <> kendaraan : text waktu : timestamp } -entity "berat"{ +entity timbang{ * id : number <> * penimbang_id : number <> * pemilah_id : number <> - timbang_id : number <> + beli_id : number <> waktu : timestamp kualitas : enum (1,2,sortiran, kendaraan) berat : number @@ -24,8 +25,8 @@ entity harga_beli { tanggal : date created_by : number <> harga_kw1 : number - harga_kaw2 : number - harga_kaw3 : number + harga_kw2 : number + harga_kw3 : number } entity "harga_jual"{ @@ -76,9 +77,10 @@ user_role::role_id }o..|| role::id role::id ||..o{ role_authority::role_id role_authority::authority }o..|| authority::authority -user::id ||..|{ timbang::admin_id -timbang::petani_id }o..|| petani::id -timbang::id ||..o{ berat::timbang_id +user::id ||..|{ beli::admin_id +beli::petani_id }o..|| petani::id +beli::id ||..o{ berat::timbang_id +beli::harga_beli }o..|| harga_beli::id berat::penimbang_id }o..|| user::id berat::pemilah_id }o..|| user::id @@ -86,4 +88,4 @@ berat::pemilah_id }o..|| user::id harga_beli::created_by }o..|| user::id -@enduml \ No newline at end of file +@enduml diff --git a/prisma/schema.prisma b/prisma/schema.prisma index b408458..cdff775 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -23,10 +23,11 @@ model Petani { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - Timbang Timbang[] + Timbang Timbang[] + Pembelian Pembelian[] } -model Timbang { +model Pembelian { id Int @id @default(autoincrement()) petani_id Int admin_id Int @@ -35,25 +36,27 @@ model Timbang { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - petani Petani @relation(fields: [petani_id], references: [id]) - admin User @relation(fields: [admin_id], references: [id], name: "admin") - Berat Berat[] + petani Petani @relation(fields: [petani_id], references: [id]) + admin User @relation(fields: [admin_id], references: [id], name: "admin_beli") + Timbang Timbang[] } -model Berat { +model Timbang { id Int @id @default(autoincrement()) - timbang_id Int + pembelian_id Int berat Int kualitas String waktu DateTime @default(now()) penimbang_id Int pemilah_id Int + petani_id Int? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - timbang Timbang @relation(fields: [timbang_id], references: [id]) - penimbang User @relation(fields: [penimbang_id], references: [id], name: "penimbang") - pemilah User @relation(fields: [pemilah_id], references: [id], name: "pemilah") + pembelian Pembelian @relation(fields: [pembelian_id], references: [id]) + penimbang User @relation(fields: [penimbang_id], references: [id], name: "penimbang") + pemilah User @relation(fields: [pemilah_id], references: [id], name: "pemilah") + Petani Petani? @relation(fields: [petani_id], references: [id]) } model User { @@ -64,10 +67,11 @@ model User { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - AdminTimbang Timbang[] @relation(name: "admin") - PenimbangBerat Berat[] @relation(name: "penimbang") - PemilahBerat Berat[] @relation(name: "pemilah") - UserRole UserRole[] + AdminBeli Pembelian[] @relation(name: "admin_beli") + PenimbangTimbang Timbang[] @relation(name: "penimbang") + PemilahTimbang Timbang[] @relation(name: "pemilah") + UserRole UserRole[] + HargaBeli HargaBeli[] } model Role { @@ -106,3 +110,16 @@ model RoleAuthority { role Role @relation(fields: [role_id], references: [id]) auth Authority @relation(fields: [authority], references: [authority]) } + +model HargaBeli { + id Int @id @default(autoincrement()) + tanggal DateTime @db.Date + harga_kw1 Int + harga_kw2 Int + harga_kw3 Int + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + createdBy Int + + creator User @relation(fields: [createdBy], references: [id]) +} diff --git a/src/lib/prisma/client.ts b/src/lib/prisma/client.ts new file mode 100644 index 0000000..8cabd0c --- /dev/null +++ b/src/lib/prisma/client.ts @@ -0,0 +1,13 @@ +import {PrismaClient} from "@prisma/client"; + +const globalForPrisma = global as unknown as { prisma: PrismaClient | undefined }; + +export const prisma = + globalForPrisma.prisma || + new PrismaClient({ + log: ["query", "info", "warn", "error"], + }); + +if (process.env.NODE_ENV !== "production") { + globalForPrisma.prisma = prisma; +} diff --git a/src/lib/services/beliSawitService.ts b/src/lib/services/beliSawitService.ts new file mode 100644 index 0000000..68f0480 --- /dev/null +++ b/src/lib/services/beliSawitService.ts @@ -0,0 +1,32 @@ +import {prisma} from '@/lib/prisma/client'; +import {Pembelian} from "@prisma/client"; + +export const BeliSawitService = { + createPembelian: (beli: Pembelian) => { + return prisma.pembelian.create({ + data: { + ...beli, + createdAt: new Date(), + }, + }) + }, + + getPembelianById: (id: number) => { + return prisma.pembelian.findUnique({ + where: { + id: id, + }, + }) + }, + + pembelianExist : (id: number) : boolean => { + const pembelian = prisma.pembelian.findFirst({ + where: { + id: id, + }, + }) + + return pembelian !== null + } + +} diff --git a/src/lib/services/hargaService.ts b/src/lib/services/hargaService.ts new file mode 100644 index 0000000..5da4efb --- /dev/null +++ b/src/lib/services/hargaService.ts @@ -0,0 +1,27 @@ +import {prisma} from '@/lib/prisma/client'; +import {HargaBeli} from "@prisma/client"; + +export const HargaBeliService = { + + // get harga beli. Pass null buat dapatein harga hari ini + getHargaBeli: (tanggal: Date) => { + return prisma.hargaBeli.findFirst({ + where: { + tanggal: { + equals: new Date(tanggal.setHours(0,0,0)) + || new Date().setHours(0, 0, 0, 0), + }, + }, + }) + }, + + create : (harga: HargaBeli)=>{ + return prisma.hargaBeli.create({ + data: { + ...harga, + createdAt: new Date(), + }, + }) + } + +} diff --git a/src/lib/services/petaniService.ts b/src/lib/services/petaniService.ts new file mode 100644 index 0000000..9af3077 --- /dev/null +++ b/src/lib/services/petaniService.ts @@ -0,0 +1,33 @@ +import {prisma} from '@/lib/prisma/client'; +import {Petani} from "@prisma/client"; + +export const PetaniService = { + create: (petani: Petani) => { + return prisma.petani.create({ + data: { + ...petani, + createdAt: new Date(), + }, + }) + }, + + edit: (petani: Petani) => { + return prisma.petani.update({ + where: { + id: petani.id, + }, + data: { + ...petani, + updatedAt: new Date(), + }, + }) + }, + + getPetaniById: (id: number) => { + return prisma.petani.findUnique({ + where: { + id: id, + }, + }) + }, +} diff --git a/src/lib/services/timbangSawitService.ts b/src/lib/services/timbangSawitService.ts new file mode 100644 index 0000000..fe5852f --- /dev/null +++ b/src/lib/services/timbangSawitService.ts @@ -0,0 +1,31 @@ +import {BeliSawitService} from '@/lib/services/beliSawitService'; +import {TimbangService} from '@/lib/services/timbanganService'; +import {Timbang} from "@prisma/client"; + + +export const TimbangSawitService = { + + timbangSawit : async (timbangan: Timbang) => { + // check if pembelian exist + if (!BeliSawitService.getPembelianById(timbangan.id)) { + throw new Error('Pembelian tidak ditemukan') + } + + const listOfTimbang = await TimbangService.listTimbangByPembelianId(timbangan.pembelian_id); + listOfTimbang.push(timbangan); + + // check untuk negative selisih timbangan + listOfTimbang.map((row : Timbang, i: number) =>{ + const beratSekarang = row.berat; + const beratSelanjutnya = i+1 < listOfTimbang.length ? listOfTimbang[i+1].berat : 0; + const selisih = beratSekarang - beratSelanjutnya; + + if (selisih<0){ + throw new Error('Timbangan melebihi berat timbangan sebelumnya') + } + }) + + // all good, create new timbang + return TimbangService.create(timbangan); + }, +} diff --git a/src/lib/services/timbanganService.ts b/src/lib/services/timbanganService.ts new file mode 100644 index 0000000..10c93f5 --- /dev/null +++ b/src/lib/services/timbanganService.ts @@ -0,0 +1,42 @@ +import {BeliSawitService} from '@/lib/services/beliSawitService'; +import {prisma} from '@/lib/prisma/client'; +import {Timbang} from "@prisma/client"; + +export const TimbangService = { + create: (timbang: Timbang) => { + if (!BeliSawitService.pembelianExist(timbang.pembelian_id)){ + throw new Error('Pembelian tidak ditemukan') + } + + return prisma.timbang.create({ + data: { + ...timbang, + createdAt: new Date(), + }, + }) + }, + + edit: (timbang: Timbang) => { + return prisma.timbang.update({ + where: { + id: timbang.id, + }, + data: { + ...timbang, + updatedAt: new Date(), + }, + }) + }, + + // get list timbang by pembelian id + listTimbangByPembelianId: (id: number) => { + return prisma.timbang.findMany({ + where: { + pembelian_id: id, + }, + orderBy: { + waktu: "asc", + }, + }) + }, +}