Advertisement
martinms

periodeservice.js

May 15th, 2024
520
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 13.26 KB | None | 0 0
  1. import {PrismaClient} from "@prisma/client";
  2. import {errorHandling} from '../middlewares/errorHandler.js'
  3. import dates from "date-and-time";
  4. import Joi from "joi";
  5.  
  6.  
  7. const prisma = new PrismaClient()
  8. process.env.TZ = 'Asia/Jakarta'
  9.  
  10. const cekIdPeriode = async (id) => {
  11.     const result = await prisma.periode.findFirst({
  12.         where: {
  13.             idPeriode: id
  14.         }
  15.     })
  16.  
  17.     return result
  18. }
  19.  
  20. const cekOpd = async (id) => {
  21.     return prisma.opdUser.findFirst({
  22.         where: {
  23.             opdId: parseInt(id)
  24.         }
  25.     });
  26. }
  27.  
  28. const addPeriode = async (req) => {
  29.     const bodyAllow = Object.keys(req.body)
  30.     bodyAllow.forEach(element => {
  31.         if (element === 'namaPeriode' || element === 'waktuMulai' || element === 'waktuAkhir' || element === 'opd' || element === 'tahunPeriode') {
  32.         } else {
  33.             throw new errorHandling(401, 'Parameter salah silahakn cek body request')
  34.         }
  35.     });
  36.  
  37.     const addPriod = await prisma.periode.create({
  38.         data: {
  39.             tahunPeriode: parseInt(req.body.tahunPeriode),
  40.             namaPeriode: req.body.namaPeriode.toString(),
  41.             waktuMulai: new Date(req.body.waktuMulai),
  42.             waktuAkhir: new Date(req.body.waktuAkhir),
  43.             status: 1
  44.         }
  45.     })
  46.  
  47.     req.body.opd.every(async el => {
  48.         const cek = await cekOpd(el.opdId)
  49.         if (!cek) {
  50.             return false
  51.         } else {
  52.             const cekExist = await prisma.akumulasiPeriode.findFirst({
  53.                 where: {
  54.                     opd: el.opdId,
  55.                     namaPeriode: req.body.namaPeriode.toString(),
  56.                     status: 1
  57.                 }
  58.             })
  59.             if (!cekExist) {
  60.                 await prisma.akumulasiPeriode.create({
  61.                     data: {
  62.                         periode: parseInt(addPriod.idPeriode),
  63.                         namaPeriode: addPriod.namaPeriode,
  64.                         opd: parseInt(cek.opdId),
  65.                         status: 1
  66.                     }
  67.                 })
  68.             }
  69.         }
  70.         return true
  71.     });
  72.  
  73.     delete req.body['opd']
  74.  
  75.     req.body.status = addPriod.status
  76.     req.body.idPeriode = addPriod.idPeriode
  77.  
  78.     return req.body
  79. }
  80.  
  81. const updatePeriode = async (req) => {
  82.     const validation = Joi.object({
  83.         idPeriode: Joi.number().required(),
  84.         dataUpdate: Joi.object({
  85.             waktuMulai: Joi.date().required(),
  86.             waktuAkhir: Joi.date().required(),
  87.             namaPeriode: Joi.string().required(),
  88.             tahunPeriode: Joi.number().required(),
  89.         }),
  90.         opd: Joi.required(),
  91.         status: Joi.required(),
  92.         semua: Joi.required(),
  93.     });
  94.  
  95.     // validasi input yang di terima
  96.     const {error} = validation.validate(req.body);
  97.  
  98.     if (error) {
  99.         throw new errorHandling(422, error);
  100.     }
  101.  
  102.     const {idPeriode, dataUpdate, opd, status, semua} = req.body;
  103.  
  104.     // Cek apakah ada periode dengan id tersebut
  105.     const cekPeriode = await prisma.periode.findFirst({
  106.         where: {
  107.             idPeriode: idPeriode,
  108.         }
  109.     });
  110.  
  111.     if (!cekPeriode) {
  112.         throw new errorHandling(404, 'Data Periode tidak di temukan');
  113.     }
  114.  
  115.     // ambil data periode
  116.     const dataPeriode = await prisma.periode.findFirst({
  117.         where: {
  118.             idPeriode: idPeriode,
  119.         }
  120.     });
  121.  
  122.     const {waktuMulai, waktuAkhir, namaPeriode, tahunPeriode} = dataUpdate;
  123.  
  124.     // Update data periode
  125.     await prisma.periode.update({
  126.         where: {
  127.             idPeriode: idPeriode,
  128.         },
  129.         data: {
  130.             waktuMulai: waktuMulai ? new Date(waktuMulai) : dataPeriode.waktuMulai,
  131.             waktuAkhir: waktuAkhir ? new Date(waktuAkhir) : dataPeriode.waktuAkhir,
  132.             namaPeriode: namaPeriode,
  133.             tahunPeriode: tahunPeriode,
  134.             status: status,
  135.         }
  136.     });
  137.  
  138.     let _opdBaru = [];
  139.  
  140.     if (semua) {
  141.         let allOpd = await prisma.opdUser.findMany();
  142.  
  143.         allOpd.forEach((item) => {
  144.             _opdBaru.push(item.opdId);
  145.         });
  146.     } else {
  147.         opd.forEach((item) => {
  148.             _opdBaru.push(item.opdId);
  149.         });
  150.     }
  151.  
  152.     // hapus duplikat dari opdBaru
  153.     _opdBaru = [...new Set(_opdBaru)];
  154.  
  155.     // jika suatu opd sudah ada di akumulasiPeriode, maka hapus opd tersebut dari opdBaru
  156.     let opdBaru = [];
  157.     let dataAkumulasi = await prisma.akumulasiPeriode.findMany({
  158.         where: {
  159.             periode: parseInt(idPeriode),
  160.         }
  161.     });
  162.  
  163.     for (const item of _opdBaru) {
  164.         for (const akumulasi of dataAkumulasi) {
  165.             const checkIsExist = await prisma.akumulasiPeriode.findFirst({
  166.                 where: {
  167.                     idAkumulasi: {
  168.                         not: akumulasi.idAkumulasi,
  169.                     },
  170.                     namaPeriode: dataPeriode.namaPeriode,
  171.                     opd: parseInt(item),
  172.                 },
  173.             });
  174.  
  175.             if (!checkIsExist) {
  176.                 opdBaru.push(item);
  177.             }
  178.         }
  179.     }
  180.  
  181.     // hapus semua data akumulasi periode yang ada sebelum memasukkan data yang baru
  182.     await prisma.akumulasiPeriode.deleteMany({
  183.         where: {
  184.             periode: parseInt(idPeriode),
  185.         }
  186.     });
  187.  
  188.     // hapus duplikat dari opdBaru jika mungkin ada
  189.     opdBaru = [...new Set(opdBaru)];
  190.  
  191.     // tambahkan data akumulasi periode yang baru
  192.     for (const item of opdBaru) {
  193.         await prisma.akumulasiPeriode.create({
  194.             data: {
  195.                 periode: parseInt(idPeriode),
  196.                 namaPeriode: dataPeriode.namaPeriode,
  197.                 opd: parseInt(item),
  198.                 status: status,
  199.             },
  200.         });
  201.     }
  202.  
  203.     return;
  204. }
  205.  
  206. async function getAlldata(id) {
  207.     return new Promise(async nilai => {
  208.         const result = await prisma.akumulasiPeriode.findMany({
  209.             where: {
  210.                 periode: parseInt(id)
  211.             },
  212.             select: {
  213.                 opd: true,
  214.                 idAkumulasi: false,
  215.                 periode: false
  216.             }
  217.         })
  218.         nilai(result)
  219.     })
  220. }
  221.  
  222. const listData = async () => {
  223.     const result = await prisma.periode.findMany()
  224.     const datas = []
  225.     await Promise.all(result.map(async (item) => {
  226.         const timeAwal = new Date(item.waktuMulai)
  227.         const dateAwal = dates.format(timeAwal, 'YYYY-MM-DD')
  228.         const timeAkhir = new Date(item.waktuAkhir)
  229.         const dateAkhir = dates.format(timeAkhir, 'YYYY-MM-DD')
  230.         const opdList = await getAlldata(item.idPeriode);
  231.         const dataList = {
  232.             idPeriode: item.idPeriode,
  233.             tahunPeriode: item.tahunPeriode,
  234.             namaPeriode: item.namaPeriode,
  235.             waktuMulai: dateAwal,
  236.             waktuAkhir: dateAkhir,
  237.             status: item.status,
  238.             opdList
  239.         }
  240.         return dataList
  241.     })).then((items) => {
  242.         // script dari chatgpt bangke bingung bagian ini haha
  243.         const groupedData = items.reduce((acc, item) => {
  244.             const tahunPeriode = item.tahunPeriode;
  245.             if (!acc[tahunPeriode]) {
  246.                 acc[tahunPeriode] = [];
  247.             }
  248.             acc[tahunPeriode].push(item);
  249.             return acc;
  250.         }, {});
  251.         datas.push(groupedData)
  252.     });
  253.     return datas
  254. }
  255.  
  256. const hapus = async (req) => {
  257.     const idPeriode = req.params.id;
  258.  
  259.     // periksa apakah ada periode dengan id tersebut
  260.     const cekData = await prisma.periode.findFirst({
  261.         where: {
  262.             idPeriode: parseInt(idPeriode)
  263.         }
  264.     });
  265.  
  266.     if (!cekData) {
  267.         throw new errorHandling(404, 'Data Periode tidak di temukan')
  268.     }
  269.  
  270.     // hapus dulu semua child periode, yaitu data akumulasi periode di tabel `akumulasiPeriode`
  271.     await prisma.akumulasiPeriode.deleteMany({
  272.         where: {
  273.             periode: parseInt(idPeriode),
  274.         }
  275.     });
  276.  
  277.     // kemudian hapus data periode
  278.     await prisma.periode.delete({
  279.         where: {
  280.             idPeriode: parseInt(idPeriode)
  281.         }
  282.     })
  283.  
  284.     // const cekData = await cekIdPeriode(parseInt(req.params.id))
  285.     //
  286.     // if(!cekData){
  287.     //     throw new errorHandling(404,'Data Periode tidak di temukan')
  288.     // }
  289.  
  290.     // const hapusPeriode = await prisma.periode.delete({
  291.     //     where : {
  292.     //         idPeriode : parseInt(req.params.id)
  293.     //     },
  294.     //     select : {
  295.     //         idPeriode : true
  296.     //     }
  297.     // })
  298.     //
  299.     // const cekIdakumulasi = await prisma.akumulasiPeriode.findFirst({
  300.     //     where : {
  301.     //         periode : parseInt(hapusPeriode.idPeriode)
  302.     //     },
  303.     //     select :{
  304.     //         idAkumulasi : true
  305.     //     }
  306.     // })
  307.     //
  308.     // await Promise.all([hapusPeriode,cekIdakumulasi]).then( async (item) => {
  309.     //     await prisma.akumulasiPeriode.delete({
  310.     //         where : {
  311.     //             idAkumulasi : parseInt(item[1].idAkumulasi)
  312.     //         }
  313.     //     })
  314.     // })
  315.  
  316.     return
  317. }
  318.  
  319. const getSingleData = async (req) => {
  320.     const cekData = await cekIdPeriode(parseInt(req.params.id))
  321.     if (!cekData) {
  322.         throw new errorHandling(404, 'Data Periode tidak di temukan')
  323.     }
  324.     const result = await prisma.periode.findMany({
  325.         where: {
  326.             idPeriode: parseInt(req.params.id)
  327.         }
  328.     })
  329.     const datas = []
  330.     await Promise.all(result.map(async (item) => {
  331.         const timeAwal = new Date(item.waktuMulai)
  332.         const dateAwal = dates.format(timeAwal, 'YYYY-MM-DD')
  333.         const timeAkhir = new Date(item.waktuAkhir)
  334.         const dateAkhir = dates.format(timeAkhir, 'YYYY-MM-DD')
  335.         const opdList = await getAlldata(item.idPeriode);
  336.         const dataList = {
  337.             idPeriode: item.idPeriode,
  338.             tahunPeriode: item.tahunPeriode,
  339.             namaPeriode: item.namaPeriode,
  340.             waktuMulai: dateAwal,
  341.             waktuAkhir: dateAkhir,
  342.             status: item.status,
  343.             opdList
  344.         }
  345.         datas.push(dataList)
  346.     }))
  347.     return datas
  348. }
  349.  
  350. const getSingleTahun = async (req) => {
  351.     const cekData = await prisma.periode.findMany({
  352.         where: {
  353.             tahunPeriode: parseInt(req.params.tahun)
  354.         }
  355.     })
  356.  
  357.     if (!cekData) {
  358.         throw new errorHandling(404, 'Data Periode tidak di temukan')
  359.     }
  360.     const datas = []
  361.     await Promise.all(cekData.map(async (item) => {
  362.         const timeAwal = new Date(item.waktuMulai)
  363.         const dateAwal = dates.format(timeAwal, 'YYYY-MM-DD')
  364.         const timeAkhir = new Date(item.waktuAkhir)
  365.         const dateAkhir = dates.format(timeAkhir, 'YYYY-MM-DD')
  366.         const opdList = await getAlldata(item.idPeriode);
  367.         const dataList = {
  368.             idPeriode: item.idPeriode,
  369.             tahunPeriode: item.tahunPeriode,
  370.             namaPeriode: item.namaPeriode,
  371.             waktuMulai: dateAwal,
  372.             waktuAkhir: dateAkhir,
  373.             status: item.status,
  374.             opdList
  375.         }
  376.         datas.push(dataList)
  377.     }))
  378.     return datas
  379. }
  380.  
  381. const priodGetUser = async (req) => {
  382.     const dataUser = req.user
  383.     if (dataUser.roleId === '2' || dataUser.roleId === '3' || dataUser.roleId === '4') {
  384.         const getAkumulasi = await prisma.akumulasiPeriode.findMany({
  385.             where: {
  386.                 opd: parseInt(dataUser.odpId)
  387.             }
  388.         })
  389.         const result = []
  390.         await Promise.all(getAkumulasi.map(async (item) => {
  391.             const getPriod = await prisma.periode.findFirst({
  392.                 where: {
  393.                     idPeriode: parseInt(item.periode)
  394.                 }
  395.             })
  396.             const timeAwal = new Date(getPriod.waktuMulai)
  397.             const dateAwal = dates.format(timeAwal, 'YYYY-MM-DD')
  398.             const timeAkhir = new Date(getPriod.waktuAkhir)
  399.             const dateAkhir = dates.format(timeAkhir, 'YYYY-MM-DD')
  400.             const parse = {
  401.                 idPeriode: getPriod.idPeriode,
  402.                 tahunPeriode: getPriod.tahunPeriode,
  403.                 namaPeriode: getPriod.tahunPeriode,
  404.                 waktuMulai: dateAwal,
  405.                 waktuAkhir: dateAkhir,
  406.                 status: item.status
  407.             }
  408.             return parse
  409.         })).then((periode) => {
  410.             const priode = {
  411.                 periode
  412.             }
  413.             const parser = {
  414.                 evaluasi: [
  415.                     {
  416.                         RPJMD: 1
  417.                     },
  418.                     {
  419.                         RPKD: 0
  420.                     },
  421.                     {
  422.                         RENJA: 0
  423.                     },
  424.                     {
  425.                         RENSTRA: 0
  426.                     }
  427.                 ]
  428.             }
  429.             result.push(priode)
  430.             result.push(parser)
  431.         })
  432.  
  433.         return result
  434.     } else {
  435.         const getAkumulasi = await prisma.periode.findMany({})
  436.         const uniqueTahunPeriode = [...new Set(getAkumulasi.map(item => item.tahunPeriode))];
  437.         const groupedData = uniqueTahunPeriode.map(tahunPeriode => {
  438.             return {
  439.                 tahunPeriode: tahunPeriode
  440.             };
  441.         })
  442.         return groupedData
  443.     }
  444. }
  445.  
  446. export {
  447.     addPeriode,
  448.     updatePeriode,
  449.     listData,
  450.     hapus,
  451.     getSingleData,
  452.     getSingleTahun,
  453.     priodGetUser
  454. }
  455.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement