service layer WIP
This commit is contained in:
20
ERD.puml
20
ERD.puml
@@ -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
|
||||||
|
|||||||
@@ -24,9 +24,10 @@ model Petani {
|
|||||||
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
|
||||||
@@ -36,24 +37,26 @@ model Timbang {
|
|||||||
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
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