service layer WIP
This commit is contained in:
22
ERD.puml
22
ERD.puml
@@ -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
|
||||
@@ -86,4 +88,4 @@ berat::pemilah_id }o..|| user::id
|
||||
harga_beli::created_by }o..|| user::id
|
||||
|
||||
|
||||
@enduml
|
||||
@enduml
|
||||
|
||||
@@ -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])
|
||||
}
|
||||
|
||||
13
src/lib/prisma/client.ts
Normal file
13
src/lib/prisma/client.ts
Normal 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;
|
||||
}
|
||||
32
src/lib/services/beliSawitService.ts
Normal file
32
src/lib/services/beliSawitService.ts
Normal 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
|
||||
}
|
||||
|
||||
}
|
||||
27
src/lib/services/hargaService.ts
Normal file
27
src/lib/services/hargaService.ts
Normal 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(),
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
33
src/lib/services/petaniService.ts
Normal file
33
src/lib/services/petaniService.ts
Normal 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,
|
||||
},
|
||||
})
|
||||
},
|
||||
}
|
||||
31
src/lib/services/timbangSawitService.ts
Normal file
31
src/lib/services/timbangSawitService.ts
Normal 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);
|
||||
},
|
||||
}
|
||||
42
src/lib/services/timbanganService.ts
Normal file
42
src/lib/services/timbanganService.ts
Normal 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",
|
||||
},
|
||||
})
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user