service layer WIP

This commit is contained in:
2025-05-03 23:23:29 +08:00
parent fe89ec9a2b
commit be0eef39c2
8 changed files with 221 additions and 24 deletions

View File

@@ -1,19 +1,20 @@
@startuml @startuml
!pragma layout smetana
entity "beli"{
entity "timbang"{
* id : number <<generated>> * id : number <<generated>>
* admin_id : number <<FK>> * admin_id : number <<FK>>
"harga_beli" : number <<FK>>
petani_id : number <<FK>> petani_id : number <<FK>>
kendaraan : text kendaraan : text
waktu : timestamp waktu : timestamp
} }
entity "berat"{ entity timbang{
* id : number <<generated>> * id : number <<generated>>
* penimbang_id : number <<FK>> * penimbang_id : number <<FK>>
* pemilah_id : number <<FK>> * pemilah_id : number <<FK>>
timbang_id : number <<FK>> beli_id : number <<FK>>
waktu : timestamp waktu : timestamp
kualitas : enum (1,2,sortiran, kendaraan) kualitas : enum (1,2,sortiran, kendaraan)
berat : number berat : number
@@ -24,8 +25,8 @@ entity harga_beli {
tanggal : date tanggal : date
created_by : number <<FK>> created_by : number <<FK>>
harga_kw1 : number harga_kw1 : number
harga_kaw2 : number harga_kw2 : number
harga_kaw3 : number harga_kw3 : number
} }
entity "harga_jual"{ entity "harga_jual"{
@@ -76,9 +77,10 @@ user_role::role_id }o..|| role::id
role::id ||..o{ role_authority::role_id role::id ||..o{ role_authority::role_id
role_authority::authority }o..|| authority::authority role_authority::authority }o..|| authority::authority
user::id ||..|{ timbang::admin_id user::id ||..|{ beli::admin_id
timbang::petani_id }o..|| petani::id beli::petani_id }o..|| petani::id
timbang::id ||..o{ berat::timbang_id beli::id ||..o{ berat::timbang_id
beli::harga_beli }o..|| harga_beli::id
berat::penimbang_id }o..|| user::id berat::penimbang_id }o..|| user::id
berat::pemilah_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 harga_beli::created_by }o..|| user::id
@enduml @enduml

View File

@@ -23,10 +23,11 @@ model Petani {
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
Timbang Timbang[] Timbang Timbang[]
Pembelian Pembelian[]
} }
model Timbang { model Pembelian {
id Int @id @default(autoincrement()) id Int @id @default(autoincrement())
petani_id Int petani_id Int
admin_id Int admin_id Int
@@ -35,25 +36,27 @@ model Timbang {
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
petani Petani @relation(fields: [petani_id], references: [id]) petani Petani @relation(fields: [petani_id], references: [id])
admin User @relation(fields: [admin_id], references: [id], name: "admin") admin User @relation(fields: [admin_id], references: [id], name: "admin_beli")
Berat Berat[] Timbang Timbang[]
} }
model Berat { model Timbang {
id Int @id @default(autoincrement()) id Int @id @default(autoincrement())
timbang_id Int pembelian_id Int
berat Int berat Int
kualitas String kualitas String
waktu DateTime @default(now()) waktu DateTime @default(now())
penimbang_id Int penimbang_id Int
pemilah_id Int pemilah_id Int
petani_id Int?
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
timbang Timbang @relation(fields: [timbang_id], references: [id]) pembelian Pembelian @relation(fields: [pembelian_id], references: [id])
penimbang User @relation(fields: [penimbang_id], references: [id], name: "penimbang") penimbang User @relation(fields: [penimbang_id], references: [id], name: "penimbang")
pemilah User @relation(fields: [pemilah_id], references: [id], name: "pemilah") pemilah User @relation(fields: [pemilah_id], references: [id], name: "pemilah")
Petani Petani? @relation(fields: [petani_id], references: [id])
} }
model User { model User {
@@ -64,10 +67,11 @@ model User {
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
AdminTimbang Timbang[] @relation(name: "admin") AdminBeli Pembelian[] @relation(name: "admin_beli")
PenimbangBerat Berat[] @relation(name: "penimbang") PenimbangTimbang Timbang[] @relation(name: "penimbang")
PemilahBerat Berat[] @relation(name: "pemilah") PemilahTimbang Timbang[] @relation(name: "pemilah")
UserRole UserRole[] UserRole UserRole[]
HargaBeli HargaBeli[]
} }
model Role { model Role {
@@ -106,3 +110,16 @@ model RoleAuthority {
role Role @relation(fields: [role_id], references: [id]) role Role @relation(fields: [role_id], references: [id])
auth Authority @relation(fields: [authority], references: [authority]) 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])
}

13
src/lib/prisma/client.ts Normal file
View File

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

View File

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

View File

@@ -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(),
},
})
}
}

View File

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

View File

@@ -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);
},
}

View File

@@ -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",
},
})
},
}