feat(ekonomi): implement UMKM module with CRUD API and Dashboard analytics
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "Umkm" (
|
||||
"id" TEXT NOT NULL,
|
||||
"nama" TEXT NOT NULL,
|
||||
"pemilik" TEXT NOT NULL,
|
||||
"deskripsi" TEXT,
|
||||
"alamat" TEXT,
|
||||
"kontak" TEXT,
|
||||
"imageId" TEXT,
|
||||
"kategoriId" TEXT NOT NULL,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
"deletedAt" TIMESTAMP(3),
|
||||
|
||||
CONSTRAINT "Umkm_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "ProdukUmkm" (
|
||||
"id" TEXT NOT NULL,
|
||||
"nama" TEXT NOT NULL,
|
||||
"harga" INTEGER NOT NULL,
|
||||
"stok" INTEGER NOT NULL DEFAULT 0,
|
||||
"deskripsi" TEXT,
|
||||
"imageId" TEXT,
|
||||
"umkmId" TEXT NOT NULL,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
"deletedAt" TIMESTAMP(3),
|
||||
|
||||
CONSTRAINT "ProdukUmkm_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "PenjualanProduk" (
|
||||
"id" TEXT NOT NULL,
|
||||
"produkId" TEXT NOT NULL,
|
||||
"jumlah" INTEGER NOT NULL,
|
||||
"hargaSatuan" INTEGER NOT NULL,
|
||||
"totalNilai" INTEGER NOT NULL,
|
||||
"tanggal" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"periode" TEXT NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
"deletedAt" TIMESTAMP(3),
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
|
||||
CONSTRAINT "PenjualanProduk_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "PenjualanProduk_periode_idx" ON "PenjualanProduk"("periode");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "PenjualanProduk_produkId_idx" ON "PenjualanProduk"("produkId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "PenjualanProduk_tanggal_idx" ON "PenjualanProduk"("tanggal");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Umkm" ADD CONSTRAINT "Umkm_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Umkm" ADD CONSTRAINT "Umkm_kategoriId_fkey" FOREIGN KEY ("kategoriId") REFERENCES "KategoriProduk"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "ProdukUmkm" ADD CONSTRAINT "ProdukUmkm_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "ProdukUmkm" ADD CONSTRAINT "ProdukUmkm_umkmId_fkey" FOREIGN KEY ("umkmId") REFERENCES "Umkm"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "PenjualanProduk" ADD CONSTRAINT "PenjualanProduk_produkId_fkey" FOREIGN KEY ("produkId") REFERENCES "ProdukUmkm"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
@@ -106,6 +106,8 @@ model FileStorage {
|
||||
|
||||
MusikDesaAudio MusikDesa[] @relation("MusikAudioFile")
|
||||
MusikDesaCover MusikDesa[] @relation("MusikCoverImage")
|
||||
UmkmImage Umkm[] @relation("UmkmImage")
|
||||
ProdukUmkmImage ProdukUmkm[] @relation("ProdukUmkmImage")
|
||||
}
|
||||
|
||||
//========================================= MENU LANDING PAGE ========================================= //
|
||||
@@ -1448,6 +1450,7 @@ model KategoriProduk {
|
||||
isActive Boolean @default(true)
|
||||
KategoriToPasar KategoriToPasar[]
|
||||
PasarDesa PasarDesa[]
|
||||
Umkm Umkm[]
|
||||
}
|
||||
|
||||
model KategoriToPasar {
|
||||
@@ -2410,3 +2413,58 @@ model MusikDesa {
|
||||
@@index([judul])
|
||||
@@index([artis])
|
||||
}
|
||||
|
||||
model Umkm {
|
||||
id String @id @default(cuid())
|
||||
nama String
|
||||
pemilik String
|
||||
deskripsi String?
|
||||
alamat String?
|
||||
kontak String?
|
||||
image FileStorage? @relation("UmkmImage", fields: [imageId], references: [id])
|
||||
imageId String?
|
||||
kategori KategoriProduk @relation(fields: [kategoriId], references: [id])
|
||||
kategoriId String
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime?
|
||||
produk ProdukUmkm[]
|
||||
}
|
||||
|
||||
model ProdukUmkm {
|
||||
id String @id @default(cuid())
|
||||
nama String
|
||||
harga Int
|
||||
stok Int @default(0)
|
||||
deskripsi String?
|
||||
image FileStorage? @relation("ProdukUmkmImage", fields: [imageId], references: [id])
|
||||
imageId String?
|
||||
umkm Umkm @relation(fields: [umkmId], references: [id])
|
||||
umkmId String
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime?
|
||||
penjualan PenjualanProduk[]
|
||||
}
|
||||
|
||||
model PenjualanProduk {
|
||||
id String @id @default(cuid())
|
||||
produk ProdukUmkm @relation(fields: [produkId], references: [id])
|
||||
produkId String
|
||||
jumlah Int
|
||||
hargaSatuan Int // snapshot harga saat transaksi, agar histori tetap akurat
|
||||
totalNilai Int // hargaSatuan * jumlah
|
||||
tanggal DateTime @default(now())
|
||||
periode String // format "YYYY-MM" untuk grouping bulanan
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime?
|
||||
isActive Boolean @default(true)
|
||||
|
||||
@@index([periode])
|
||||
@@index([produkId])
|
||||
@@index([tanggal])
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user