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
!pragma layout smetana
entity "timbang"{
entity "beli"{
* id : number <<generated>>
* admin_id : number <<FK>>
"harga_beli" : number <<FK>>
petani_id : number <<FK>>
kendaraan : text
waktu : timestamp
}
entity "berat"{
entity timbang{
* id : number <<generated>>
* penimbang_id : number <<FK>>
* pemilah_id : number <<FK>>
timbang_id : number <<FK>>
beli_id : number <<FK>>
waktu : timestamp
kualitas : enum (1,2,sortiran, kendaraan)
berat : number
@@ -24,8 +25,8 @@ entity harga_beli {
tanggal : date
created_by : number <<FK>>
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

View File

@@ -24,9 +24,10 @@ model Petani {
updatedAt DateTime @updatedAt
Timbang Timbang[]
Pembelian Pembelian[]
}
model Timbang {
model Pembelian {
id Int @id @default(autoincrement())
petani_id Int
admin_id Int
@@ -36,24 +37,26 @@ model Timbang {
updatedAt DateTime @updatedAt
petani Petani @relation(fields: [petani_id], references: [id])
admin User @relation(fields: [admin_id], references: [id], name: "admin")
Berat Berat[]
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])
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")
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])
}

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