unipo-ui 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/cli/index.mjs +53 -4
  2. package/dist/admisi-YCOE3DMH.cjs +20 -0
  3. package/dist/admisi-YXCTBECZ.js +11 -0
  4. package/dist/akademik-PJGL6MSP.cjs +20 -0
  5. package/dist/akademik-TPDFEZGF.js +11 -0
  6. package/dist/akses-AUPQD6YN.cjs +20 -0
  7. package/dist/akses-V5XIMBWT.js +11 -0
  8. package/dist/arsip-2T7IEION.cjs +20 -0
  9. package/dist/arsip-LDRV7FYX.js +11 -0
  10. package/dist/cbt-4N6COVIN.js +11 -0
  11. package/dist/cbt-GMQSR7TP.cjs +20 -0
  12. package/dist/chunk-34OKV63Q.js +122 -0
  13. package/dist/chunk-34OKV63Q.js.map +1 -0
  14. package/dist/chunk-3O5ELKBH.cjs +18 -0
  15. package/dist/chunk-3O5ELKBH.cjs.map +1 -0
  16. package/dist/chunk-4BQOABRV.js +462 -0
  17. package/dist/chunk-4BQOABRV.js.map +1 -0
  18. package/dist/{chunk-DEF5CA7C.cjs → chunk-5VNCBW4R.cjs} +282 -1165
  19. package/dist/chunk-5VNCBW4R.cjs.map +1 -0
  20. package/dist/{chunk-SJ4DJOMZ.js → chunk-7AJ4LW5H.js} +163 -1019
  21. package/dist/chunk-7AJ4LW5H.js.map +1 -0
  22. package/dist/chunk-JASW45YF.cjs +510 -0
  23. package/dist/chunk-JASW45YF.cjs.map +1 -0
  24. package/dist/chunk-JSUHAYQ4.js +15 -0
  25. package/dist/chunk-JSUHAYQ4.js.map +1 -0
  26. package/dist/chunk-LN6HZMPI.js +1006 -0
  27. package/dist/chunk-LN6HZMPI.js.map +1 -0
  28. package/dist/chunk-LNJTDEQR.cjs +1937 -0
  29. package/dist/chunk-LNJTDEQR.cjs.map +1 -0
  30. package/dist/chunk-MKQEH7QS.cjs +1058 -0
  31. package/dist/chunk-MKQEH7QS.cjs.map +1 -0
  32. package/dist/chunk-TAKLMRU7.cjs +150 -0
  33. package/dist/chunk-TAKLMRU7.cjs.map +1 -0
  34. package/dist/chunk-TYCRRYCQ.js +1843 -0
  35. package/dist/chunk-TYCRRYCQ.js.map +1 -0
  36. package/dist/crm-C4XGSG6O.js +11 -0
  37. package/dist/crm-LTVCDNMK.cjs +20 -0
  38. package/dist/dasbor-OJLMSFTF.cjs +20 -0
  39. package/dist/dasbor-Y3UPFYFE.js +11 -0
  40. package/dist/edom-3GZUUB7H.cjs +20 -0
  41. package/dist/edom-K4Y2NV4K.js +11 -0
  42. package/dist/fakultas-DJRUVJBV.js +11 -0
  43. package/dist/fakultas-VVAQOPUX.cjs +20 -0
  44. package/dist/filter-D54KALbB.d.cts +436 -0
  45. package/dist/filter-D54KALbB.d.ts +436 -0
  46. package/dist/helpdesk-AWVC7BPE.cjs +20 -0
  47. package/dist/helpdesk-BAOXAU6G.js +11 -0
  48. package/dist/humas-7BMMJ3WF.js +11 -0
  49. package/dist/humas-H56JFUW6.cjs +20 -0
  50. package/dist/ikon.cjs +125 -0
  51. package/dist/ikon.cjs.map +1 -0
  52. package/dist/ikon.d.cts +140 -0
  53. package/dist/ikon.d.ts +140 -0
  54. package/dist/ikon.js +6 -0
  55. package/dist/ikon.js.map +1 -0
  56. package/dist/iku-7JLF2NIH.js +11 -0
  57. package/dist/iku-F47ZLMYJ.cjs +20 -0
  58. package/dist/index.cjs +544 -257
  59. package/dist/index.cjs.map +1 -1
  60. package/dist/index.d.cts +192 -2
  61. package/dist/index.d.ts +192 -2
  62. package/dist/index.js +126 -4
  63. package/dist/index.js.map +1 -1
  64. package/dist/induk-BGTGKRLL.js +11 -0
  65. package/dist/induk-DLYDMZAM.cjs +20 -0
  66. package/dist/integrasi-4VXNGA3V.cjs +20 -0
  67. package/dist/integrasi-IP3WWDO7.js +11 -0
  68. package/dist/kalender-DGQDGJCL.cjs +20 -0
  69. package/dist/kalender-FGGUBYKZ.js +11 -0
  70. package/dist/karier-H3HBFCQQ.js +11 -0
  71. package/dist/karier-QTU2P5YD.cjs +20 -0
  72. package/dist/katalog.cjs +1709 -0
  73. package/dist/katalog.cjs.map +1 -0
  74. package/dist/katalog.d.cts +645 -0
  75. package/dist/katalog.d.ts +645 -0
  76. package/dist/katalog.js +1626 -0
  77. package/dist/katalog.js.map +1 -0
  78. package/dist/kelulusan-BHFQM5N4.cjs +20 -0
  79. package/dist/kelulusan-ZR7CM6I5.js +11 -0
  80. package/dist/kemahasiswaan-EINWXAY7.cjs +20 -0
  81. package/dist/kemahasiswaan-NH2LEDH7.js +11 -0
  82. package/dist/kerjasama-FAOHZCML.js +11 -0
  83. package/dist/kerjasama-TXWJOU4Y.cjs +20 -0
  84. package/dist/keu-4TXF4FEP.cjs +20 -0
  85. package/dist/keu-SD7UOCDB.js +11 -0
  86. package/dist/kurikulum-SRO7TJYI.cjs +20 -0
  87. package/dist/kurikulum-XT7PZJOK.js +11 -0
  88. package/dist/layanan-RQ2AWCQ5.cjs +20 -0
  89. package/dist/layanan-Y6WUCSD2.js +11 -0
  90. package/dist/lms-5JYOSLBI.cjs +20 -0
  91. package/dist/lms-NTXMSHG2.js +11 -0
  92. package/dist/lppm-7DH7PRF3.cjs +20 -0
  93. package/dist/lppm-UXYGIOIF.js +11 -0
  94. package/dist/master-GKTTAKLF.cjs +20 -0
  95. package/dist/master-ZG4SPPDU.js +11 -0
  96. package/dist/mbkm-OGR72BTB.js +11 -0
  97. package/dist/mbkm-URKJHUIQ.cjs +20 -0
  98. package/dist/notifikasi-FMA26M4I.js +11 -0
  99. package/dist/notifikasi-QDCYIX7G.cjs +20 -0
  100. package/dist/pddikti-RJVYY2J4.cjs +20 -0
  101. package/dist/pddikti-VF2PXDKA.js +11 -0
  102. package/dist/{content-DaJPx5LX.d.cts → pemeliharaan-D5S-1lqW.d.ts} +38 -434
  103. package/dist/{content-DaJPx5LX.d.ts → pemeliharaan-Dr0HSxvZ.d.cts} +38 -434
  104. package/dist/perpustakaan-5RL33XG2.js +11 -0
  105. package/dist/perpustakaan-JXZW43MJ.cjs +20 -0
  106. package/dist/pilih-BEes_D3n.d.cts +205 -0
  107. package/dist/pilih-CEKqXMUS.d.ts +205 -0
  108. package/dist/pmb-EGTWW2ZH.cjs +20 -0
  109. package/dist/pmb-G7EAFJ3R.js +11 -0
  110. package/dist/portal-EI7TXN7H.cjs +20 -0
  111. package/dist/portal-MMUYX3RA.js +11 -0
  112. package/dist/portal-api-BJLO6AGI.js +11 -0
  113. package/dist/portal-api-Q6B3X6ZV.cjs +20 -0
  114. package/dist/profil-46FV46VH.cjs +20 -0
  115. package/dist/profil-4BIXIM6D.js +11 -0
  116. package/dist/referensi-HNYOJGNX.js +11 -0
  117. package/dist/referensi-VOT5BRCL.cjs +20 -0
  118. package/dist/registry.json +606 -4
  119. package/dist/repositori-2MJ43NXM.js +11 -0
  120. package/dist/repositori-KFXVJB7B.cjs +20 -0
  121. package/dist/rpl-2ZXHNSPF.js +11 -0
  122. package/dist/rpl-YF5MV2YA.cjs +20 -0
  123. package/dist/sarpras-CQ7QKVUN.js +11 -0
  124. package/dist/sarpras-XGPHHFCG.cjs +20 -0
  125. package/dist/scss/components/_animasi.scss +280 -0
  126. package/dist/scss/components/_ikon.scss +249 -0
  127. package/dist/scss/components/_katalog.scss +662 -0
  128. package/dist/scss/components/_platform.scss +364 -0
  129. package/dist/scss/index.scss +4 -0
  130. package/dist/sdm-N6LE66PP.cjs +20 -0
  131. package/dist/sdm-QKBXH3JF.js +11 -0
  132. package/dist/siakad.cjs +1389 -2915
  133. package/dist/siakad.cjs.map +1 -1
  134. package/dist/siakad.d.cts +31 -196
  135. package/dist/siakad.d.ts +31 -196
  136. package/dist/siakad.js +446 -2194
  137. package/dist/siakad.js.map +1 -1
  138. package/dist/spmi-J37NEYIU.js +11 -0
  139. package/dist/spmi-N6EU7KNC.cjs +20 -0
  140. package/dist/tracer-G6DDXVXC.cjs +20 -0
  141. package/dist/tracer-M3FTNWBG.js +11 -0
  142. package/dist/ui-unipo.css +1650 -0
  143. package/dist/ui-unipo.min.css +1 -1
  144. package/package.json +25 -3
  145. package/src/components/animasi.tsx +186 -0
  146. package/src/components/modal.tsx +113 -0
  147. package/src/components/overlays.tsx +6 -1
  148. package/src/components/pemeliharaan.tsx +152 -0
  149. package/src/components/platform.tsx +94 -0
  150. package/src/ikon/ilustrasi.tsx +283 -0
  151. package/src/ikon/index.ts +7 -0
  152. package/src/ikon/kotak.tsx +30 -0
  153. package/src/ikon/unipo.tsx +326 -0
  154. package/src/index.ts +8 -0
  155. package/src/katalog/aturan.ts +488 -0
  156. package/src/katalog/data/id.ts +749 -0
  157. package/src/katalog/data/indeks.json +1 -0
  158. package/src/katalog/data/muat.ts +47 -0
  159. package/src/katalog/ikon.tsx +11 -0
  160. package/src/katalog/index.ts +13 -0
  161. package/src/katalog/isian.tsx +372 -0
  162. package/src/katalog/katalog.tsx +138 -0
  163. package/src/katalog/kelola.tsx +620 -0
  164. package/src/katalog/modul.tsx +336 -0
  165. package/src/katalog/tampil.tsx +147 -0
  166. package/src/katalog/tipe.ts +141 -0
  167. package/src/katalog/wizard.tsx +155 -0
  168. package/src/lib/platform.ts +91 -0
  169. package/src/siakad/index.ts +1 -0
  170. package/src/siakad/pemeliharaan.tsx +118 -0
  171. package/src/siakad/provider.tsx +2 -0
  172. package/dist/chunk-DEF5CA7C.cjs.map +0 -1
  173. package/dist/chunk-SJ4DJOMZ.js.map +0 -1
@@ -0,0 +1,20 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ // src/katalog/data/modul/keu.json
7
+ var key = "keu";
8
+ var resources = [{ id: "/v1/keu/akun", tag: "Keuangan: Master", title: "Akun", base: "/v1/keu/akun", item: "/v1/keu/akun/{id}", key: "id", list: "getKeuAkun", create: "postKeuAkun", get: "getKeuAkunById", update: "putKeuAkunById", del: "deleteKeuAkunById", actions: [], children: [] }, { id: "/v1/keu/pembayaran-mahasiswa", tag: "Keuangan: Laporan", title: "Rekap pembayaran mahasiswa", base: "/v1/keu/pembayaran-mahasiswa", list: "getKeuPembayaranMahasiswa", actions: [], children: [] }, { id: "/v1/keu/penerimaan", tag: "Keuangan: Penerimaan", title: "Penerimaan lain", base: "/v1/keu/penerimaan", item: "/v1/keu/penerimaan/{id}", key: "id", list: "getKeuPenerimaan", create: "postKeuPenerimaan", get: "getKeuPenerimaanById", update: "putKeuPenerimaanById", del: "deleteKeuPenerimaanById", actions: [], children: ["/v1/keu/penerimaan/{id}/berkas"] }, { id: "/v1/keu/penerimaan/{id}/berkas", tag: "Keuangan: Penerimaan", title: "Penerimaan lain", base: "/v1/keu/penerimaan/{id}/berkas", item: "/v1/keu/penerimaan/{id}/berkas/{uuid}", key: "uuid", list: "getKeuPenerimaanByIdBerkas", create: "postKeuPenerimaanByIdBerkas", get: "getKeuPenerimaanByIdBerkasByUuid", del: "deleteKeuPenerimaanByIdBerkasByUuid", actions: [], children: [], parent: "/v1/keu/penerimaan" }, { id: "/v1/keu/periode", tag: "Keuangan: Master", title: "Periode anggaran", base: "/v1/keu/periode", item: "/v1/keu/periode/{id}", key: "id", list: "getKeuPeriode", create: "postKeuPeriode", get: "getKeuPeriodeById", update: "putKeuPeriodeById", del: "deleteKeuPeriodeById", actions: [], children: [] }, { id: "/v1/keu/realisasi", tag: "Keuangan: Realisasi", title: "Pengajuan dana/realisasi", base: "/v1/keu/realisasi", item: "/v1/keu/realisasi/{id}", key: "id", list: "getKeuRealisasi", create: "postKeuRealisasi", get: "getKeuRealisasiById", update: "putKeuRealisasiById", del: "deleteKeuRealisasiById", actions: ["postKeuRealisasiByIdVerifikasi", "postKeuRealisasiByIdSetujui", "postKeuRealisasiByIdBayar", "postKeuRealisasiByIdSpj", "postKeuRealisasiByIdTolak", "postKeuRealisasiByIdBatalkan"], children: ["/v1/keu/realisasi/{id}/berkas"] }, { id: "/v1/keu/realisasi/{id}/berkas", tag: "Keuangan: Realisasi", title: "Pengajuan dana/realisasi", base: "/v1/keu/realisasi/{id}/berkas", item: "/v1/keu/realisasi/{id}/berkas/{uuid}", key: "uuid", list: "getKeuRealisasiByIdBerkas", create: "postKeuRealisasiByIdBerkas", get: "getKeuRealisasiByIdBerkasByUuid", del: "deleteKeuRealisasiByIdBerkasByUuid", actions: [], children: [], parent: "/v1/keu/realisasi" }, { id: "/v1/keu/rka", tag: "Keuangan: Anggaran", title: "RKA unit", base: "/v1/keu/rka", item: "/v1/keu/rka/{id}", key: "id", list: "getKeuRka", create: "postKeuRka", get: "getKeuRkaById", update: "putKeuRkaById", del: "deleteKeuRkaById", actions: ["postKeuRkaByIdAjukan", "postKeuRkaByIdSetujui", "postKeuRkaByIdMintaRevisi", "postKeuRkaByIdTolak"], children: ["/v1/keu/rka/{id}/berkas"] }, { id: "/v1/keu/rka-item", tag: "Keuangan: Anggaran", title: "Rincian RKA", base: "/v1/keu/rka-item", item: "/v1/keu/rka-item/{id}", key: "id", list: "getKeuRkaItem", create: "postKeuRkaItem", get: "getKeuRkaItemById", update: "putKeuRkaItemById", del: "deleteKeuRkaItemById", actions: [], children: [] }, { id: "/v1/keu/rka/{id}/berkas", tag: "Keuangan: Anggaran", title: "RKA unit", base: "/v1/keu/rka/{id}/berkas", item: "/v1/keu/rka/{id}/berkas/{uuid}", key: "uuid", list: "getKeuRkaByIdBerkas", create: "postKeuRkaByIdBerkas", get: "getKeuRkaByIdBerkasByUuid", del: "deleteKeuRkaByIdBerkasByUuid", actions: [], children: [], parent: "/v1/keu/rka" }, { id: "/v1/keu/va", tag: "Keuangan: Virtual account", title: "Virtual account", base: "/v1/keu/va", item: "/v1/keu/va/{id}", key: "id", list: "getKeuVa", create: "postKeuVa", get: "getKeuVaById", update: "putKeuVaById", actions: ["postKeuVaByIdBatalkan", "postKeuVaByIdTandaiDibukukan"], children: [] }, { id: "/v1/keuangan/cicilan", tag: "Keuangan: Cicilan", title: "Cicilan pembayaran", base: "/v1/keuangan/cicilan", item: "/v1/keuangan/cicilan/{id}", key: "id", list: "getKeuanganCicilan", create: "postKeuanganCicilan", get: "getKeuanganCicilanById", update: "putKeuanganCicilanById", del: "deleteKeuanganCicilanById", actions: ["postKeuanganCicilanByIdSetujui", "postKeuanganCicilanByIdTolak", "postKeuanganCicilanByIdBatalkan"], children: ["/v1/keuangan/cicilan/{id}/berkas"] }, { id: "/v1/keuangan/cicilan/{id}/berkas", tag: "Keuangan: Cicilan", title: "Cicilan pembayaran", base: "/v1/keuangan/cicilan/{id}/berkas", item: "/v1/keuangan/cicilan/{id}/berkas/{uuid}", key: "uuid", list: "getKeuanganCicilanByIdBerkas", create: "postKeuanganCicilanByIdBerkas", get: "getKeuanganCicilanByIdBerkasByUuid", del: "deleteKeuanganCicilanByIdBerkasByUuid", actions: [], children: [], parent: "/v1/keuangan/cicilan" }, { id: "/v1/keuangan/denda", tag: "Keuangan: Denda", title: "Denda keterlambatan", base: "/v1/keuangan/denda", item: "/v1/keuangan/denda/{id}", key: "id", list: "getKeuanganDenda", get: "getKeuanganDendaById", actions: ["postKeuanganDendaByIdHapuskan"], children: [] }, { id: "/v1/keuangan/deposit", tag: "Keuangan: Refund dan deposit", title: "Refund dan deposit", base: "/v1/keuangan/deposit", item: "/v1/keuangan/deposit/{nim}", key: "nim", create: "postKeuanganDeposit", get: "getKeuanganDepositByNim", actions: [], children: [] }, { id: "/v1/keuangan/dispensasi", tag: "Keuangan: Dispensasi", title: "Dispensasi pembayaran", base: "/v1/keuangan/dispensasi", item: "/v1/keuangan/dispensasi/{id}", key: "id", list: "getKeuanganDispensasi", create: "postKeuanganDispensasi", get: "getKeuanganDispensasiById", update: "putKeuanganDispensasiById", del: "deleteKeuanganDispensasiById", actions: ["postKeuanganDispensasiByIdSetujui", "postKeuanganDispensasiByIdTolak", "postKeuanganDispensasiByIdBatalkan"], children: ["/v1/keuangan/dispensasi/{id}/berkas"] }, { id: "/v1/keuangan/dispensasi/{id}/berkas", tag: "Keuangan: Dispensasi", title: "Dispensasi pembayaran", base: "/v1/keuangan/dispensasi/{id}/berkas", item: "/v1/keuangan/dispensasi/{id}/berkas/{uuid}", key: "uuid", list: "getKeuanganDispensasiByIdBerkas", create: "postKeuanganDispensasiByIdBerkas", get: "getKeuanganDispensasiByIdBerkasByUuid", del: "deleteKeuanganDispensasiByIdBerkasByUuid", actions: [], children: [], parent: "/v1/keuangan/dispensasi" }, { id: "/v1/keuangan/invoice", tag: "Keuangan: Pembayaran dan kwitansi", title: "Invoice pembayaran online", base: "/v1/keuangan/invoice", list: "getKeuanganInvoice", create: "postKeuanganInvoice", actions: [], children: [] }, { id: "/v1/keuangan/kasir", tag: "Keuangan: Kasir", title: "Sesi kasir", base: "/v1/keuangan/kasir", item: "/v1/keuangan/kasir/{id}", key: "id", list: "getKeuanganKasir", get: "getKeuanganKasirById", actions: ["postKeuanganKasirByIdTutup"], children: [] }, { id: "/v1/keuangan/kwitansi/verifikasi", tag: "Keuangan: Pembayaran dan kwitansi", title: "Pembayaran dan kwitansi", base: "/v1/keuangan/kwitansi/verifikasi", item: "/v1/keuangan/kwitansi/verifikasi/{kode}", key: "kode", get: "getKeuanganKwitansiVerifikasiByKode", actions: [], children: [] }, { id: "/v1/keuangan/mahasiswa", tag: "Keuangan: Mahasiswa", title: "Mahasiswa", base: "/v1/keuangan/mahasiswa", item: "/v1/keuangan/mahasiswa/{nim}", key: "nim", get: "getKeuanganMahasiswaByNim", actions: ["getKeuanganMahasiswaByNimSyarat"], children: [] }, { id: "/v1/keuangan/periode", tag: "Keuangan: Pengaturan", title: "Periode pembayaran", base: "/v1/keuangan/periode", item: "/v1/keuangan/periode/{id}", key: "id", list: "getKeuanganPeriode", create: "postKeuanganPeriode", get: "getKeuanganPeriodeById", update: "putKeuanganPeriodeById", del: "deleteKeuanganPeriodeById", actions: [], children: [] }, { id: "/v1/keuangan/potongan", tag: "Keuangan: Potongan", title: "Potongan tagihan", base: "/v1/keuangan/potongan", item: "/v1/keuangan/potongan/{id}", key: "id", list: "getKeuanganPotongan", create: "postKeuanganPotongan", get: "getKeuanganPotonganById", update: "putKeuanganPotonganById", del: "deleteKeuanganPotonganById", actions: ["postKeuanganPotonganByIdTerapkan", "postKeuanganPotonganByIdTolak", "postKeuanganPotonganByIdBatalkan"], children: [] }, { id: "/v1/keuangan/refund", tag: "Keuangan: Refund dan deposit", title: "Refund", base: "/v1/keuangan/refund", item: "/v1/keuangan/refund/{id}", key: "id", list: "getKeuanganRefund", create: "postKeuanganRefund", get: "getKeuanganRefundById", update: "putKeuanganRefundById", del: "deleteKeuanganRefundById", actions: ["postKeuanganRefundByIdSetujui", "postKeuanganRefundByIdBayar", "postKeuanganRefundByIdTolak", "postKeuanganRefundByIdBatalkan"], children: ["/v1/keuangan/refund/{id}/berkas"] }, { id: "/v1/keuangan/refund/{id}/berkas", tag: "Keuangan: Refund dan deposit", title: "Refund", base: "/v1/keuangan/refund/{id}/berkas", item: "/v1/keuangan/refund/{id}/berkas/{uuid}", key: "uuid", list: "getKeuanganRefundByIdBerkas", create: "postKeuanganRefundByIdBerkas", get: "getKeuanganRefundByIdBerkasByUuid", del: "deleteKeuanganRefundByIdBerkasByUuid", actions: [], children: [], parent: "/v1/keuangan/refund" }, { id: "/v1/keuangan/rekonsiliasi/online", tag: "Keuangan: Rekonsiliasi dan laporan", title: "Rekonsiliasi dan laporan", base: "/v1/keuangan/rekonsiliasi/online", item: "/v1/keuangan/rekonsiliasi/online/{id}", key: "id", actions: ["postKeuanganRekonsiliasiOnlineById"], children: [] }, { id: "/v1/keuangan/rekonsiliasi/va", tag: "Keuangan: Rekonsiliasi dan laporan", title: "Rekonsiliasi dan laporan", base: "/v1/keuangan/rekonsiliasi/va", item: "/v1/keuangan/rekonsiliasi/va/{id}", key: "id", actions: ["postKeuanganRekonsiliasiVaById"], children: [] }, { id: "/v1/keuangan/tagihan", tag: "Keuangan: Tagihan", title: "Tagihan", base: "/v1/keuangan/tagihan", item: "/v1/keuangan/tagihan/{idmb}", key: "idmb", list: "getKeuanganTagihan", create: "postKeuanganTagihan", get: "getKeuanganTagihanByIdmb", actions: ["postKeuanganTagihanByIdmb", "postKeuanganTagihanByIdmbHapus"], children: [] }, { id: "/v1/keuangan/tarif-mk", tag: "Keuangan: Tarif", title: "Tarif per mata kuliah", base: "/v1/keuangan/tarif-mk", item: "/v1/keuangan/tarif-mk/{id}", key: "id", list: "getKeuanganTarifMk", create: "postKeuanganTarifMk", get: "getKeuanganTarifMkById", update: "putKeuanganTarifMkById", del: "deleteKeuanganTarifMkById", actions: [], children: [] }, { id: "/v1/keuangan/tarif/item", tag: "Keuangan: Tarif", title: "Jenis biaya", base: "/v1/keuangan/tarif/item", list: "getKeuanganTarifItem", create: "postKeuanganTarifItem", actions: [], children: [] }, { id: "/v1/keuangan/transaksi", tag: "Keuangan: Pembayaran dan kwitansi", title: "Pembayaran lewat API", base: "/v1/keuangan/transaksi", item: "/v1/keuangan/transaksi/{id}", key: "id", list: "getKeuanganTransaksi", create: "postKeuanganTransaksi", get: "getKeuanganTransaksiById", actions: ["postKeuanganTransaksiByIdBatal", "getKeuanganTransaksiByIdKwitansi"], children: [] }, { id: "/v1/keuangan/ukt/kelompok", tag: "Keuangan: UKT", title: "Kelompok UKT", base: "/v1/keuangan/ukt/kelompok", item: "/v1/keuangan/ukt/kelompok/{id}", key: "id", list: "getKeuanganUktKelompok", create: "postKeuanganUktKelompok", get: "getKeuanganUktKelompokById", update: "putKeuanganUktKelompokById", del: "deleteKeuanganUktKelompokById", actions: [], children: [] }, { id: "/v1/keuangan/ukt/mahasiswa", tag: "Keuangan: UKT", title: "Penetapan UKT mahasiswa", base: "/v1/keuangan/ukt/mahasiswa", item: "/v1/keuangan/ukt/mahasiswa/{id}", key: "id", list: "getKeuanganUktMahasiswa", create: "postKeuanganUktMahasiswa", get: "getKeuanganUktMahasiswaById", update: "putKeuanganUktMahasiswaById", del: "deleteKeuanganUktMahasiswaById", actions: [], children: [] }, { id: "/v1/keuangan/voucher", tag: "Keuangan: Potongan", title: "Voucher", base: "/v1/keuangan/voucher", item: "/v1/keuangan/voucher/{id}", key: "id", list: "getKeuanganVoucher", create: "postKeuanganVoucher", get: "getKeuanganVoucherById", update: "putKeuanganVoucherById", del: "deleteKeuanganVoucherById", actions: [], children: [] }];
9
+ var ops = { getKeuSerapan: { id: "getKeuSerapan", m: "GET", path: "/v1/keu/serapan", tag: "Keuangan: Laporan", sum: "Serapan anggaran", ds: "Anggaran RKA yang disetujui dibandingkan realisasi (disetujui, dibayar, selesai/SPJ), per unit dan per akun, plus yang masih diproses dan penerimaan lain. Bawaan periode berjalan. Pengelola, dibatasi unitnya.", sc: ["keu:read"], pa: [{ nm: "periode_id", in: "query", s: { t: "integer", rf: { l: "/v1/keu/periode", k: "id", d: "/v1/keu/periode/{id}" } }, ds: "Periode anggaran" }, { nm: "unit_id", in: "query", s: { t: "integer" }, ds: "Unit" }], r: "object", it: "Objek" }, getKeuPembayaranMahasiswa: { id: "getKeuPembayaranMahasiswa", m: "GET", path: "/v1/keu/pembayaran-mahasiswa", tag: "Keuangan: Laporan", sum: "Rekap pembayaran mahasiswa", ds: "Tagihan dan pembayaran per prodi dari tabel lama (t_mahasiswa_bayar_tagihan, t_mahasiswa_bayar), hanya dibaca. Pengelola.", sc: ["keu:read"], pa: [{ nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Tahun akademik (wajib)" }, { nm: "kode_prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Prodi" }], r: "list", it: "Objek" }, postKeuVaNotifikasi: { id: "postKeuVaNotifikasi", m: "POST", path: "/v1/keu/va/notifikasi", tag: "Keuangan: Virtual account", sum: "Notifikasi pembayaran bank", ds: "Dipanggil aplikasi penghubung bank/payment gateway (token aplikasi dengan keu:write). Body: bank, nomor_va, referensi_bank, jumlah, dibayar_pada (opsional), data (opsional, disimpan apa adanya). Idempoten per bank + referensi_bank. VA aktif ditandai dibayar dan mahasiswa mendapat notifikasi. Tidak menulis ke tabel pembayaran lama.", sc: ["keu:write"], r: "object", it: "Objek" }, getKeuAkun: { id: "getKeuAkun", m: "GET", path: "/v1/keu/akun", tag: "Keuangan: Master", sum: "Akun: daftar", ds: "Bagan akun (pendapatan, belanja, aset, kewajiban, ekuitas), bertingkat lewat induk_id. Hanya pengelola modul.", sc: ["keu:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "induk_id", in: "query", s: { t: "string", rf: { l: "/v1/keu/akun", k: "id", d: "/v1/keu/akun/{id}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "jenis", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "aktif", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di kode, nama" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuAkun" }, postKeuAkun: { id: "postKeuAkun", m: "POST", path: "/v1/keu/akun", tag: "Keuangan: Master", sum: "Akun: tambah", ds: "Hanya admin modul.", sc: ["keu:write"], b: { ct: "application/json", ref: "KeuAkunInput", s: { t: "object", pr: { induk_id: { t: "integer", ds: "ID di keu_akun", rf: { l: "/v1/keu/akun", k: "id", d: "/v1/keu/akun/{id}" } }, kode: { t: "string", max: 30, p: "^[A-Za-z0-9._\\-/]+$", ds: "(unik)" }, nama: { t: "string", max: 200 }, jenis: { t: "string", e: ["pendapatan", "belanja", "aset", "kewajiban", "ekuitas"] }, aktif: { t: "boolean", d: "1" } }, rq: ["kode", "nama", "jenis"] }, rq: 1 }, r: "object", it: "KeuAkun" }, getKeuAkunById: { id: "getKeuAkunById", m: "GET", path: "/v1/keu/akun/{id}", tag: "Keuangan: Master", sum: "Akun: detail", ds: "Bagan akun (pendapatan, belanja, aset, kewajiban, ekuitas), bertingkat lewat induk_id. Hanya pengelola modul.", sc: ["keu:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/akun", k: "id", d: "/v1/keu/akun/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuAkun" }, putKeuAkunById: { id: "putKeuAkunById", m: "PUT", path: "/v1/keu/akun/{id}", tag: "Keuangan: Master", sum: "Akun: ubah", ds: "Hanya admin modul. Kolom yang tidak dikirim tidak berubah.", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/akun", k: "id", d: "/v1/keu/akun/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuAkunInput", s: { t: "object", pr: { induk_id: { t: "integer", ds: "ID di keu_akun", rf: { l: "/v1/keu/akun", k: "id", d: "/v1/keu/akun/{id}" } }, kode: { t: "string", max: 30, p: "^[A-Za-z0-9._\\-/]+$", ds: "(unik)" }, nama: { t: "string", max: 200 }, jenis: { t: "string", e: ["pendapatan", "belanja", "aset", "kewajiban", "ekuitas"] }, aktif: { t: "boolean", d: "1" } }, rq: ["kode", "nama", "jenis"] }, rq: 1 }, r: "object", it: "KeuAkun" }, deleteKeuAkunById: { id: "deleteKeuAkunById", m: "DELETE", path: "/v1/keu/akun/{id}", tag: "Keuangan: Master", sum: "Akun: hapus", ds: "Hanya admin modul.", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/akun", k: "id", d: "/v1/keu/akun/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuPeriode: { id: "getKeuPeriode", m: "GET", path: "/v1/keu/periode", tag: "Keuangan: Master", sum: "Periode anggaran: daftar", ds: "Hanya pengelola modul.", sc: ["keu:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "status", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuPeriode" }, postKeuPeriode: { id: "postKeuPeriode", m: "POST", path: "/v1/keu/periode", tag: "Keuangan: Master", sum: "Periode anggaran: tambah", ds: "Hanya admin modul.", sc: ["keu:write"], b: { ct: "application/json", ref: "KeuPeriodeInput", s: { t: "object", pr: { kode: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$", ds: "(unik)" }, nama: { t: "string", max: 100 }, mulai: { t: "string", f: "date" }, selesai: { t: "string", f: "date" }, status: { t: "string", e: ["perencanaan", "berjalan", "tutup"], d: "perencanaan" } }, rq: ["kode", "nama", "mulai", "selesai"] }, rq: 1 }, r: "object", it: "KeuPeriode" }, getKeuPeriodeById: { id: "getKeuPeriodeById", m: "GET", path: "/v1/keu/periode/{id}", tag: "Keuangan: Master", sum: "Periode anggaran: detail", ds: "Hanya pengelola modul.", sc: ["keu:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/periode", k: "id", d: "/v1/keu/periode/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuPeriode" }, putKeuPeriodeById: { id: "putKeuPeriodeById", m: "PUT", path: "/v1/keu/periode/{id}", tag: "Keuangan: Master", sum: "Periode anggaran: ubah", ds: "Hanya admin modul. Kolom yang tidak dikirim tidak berubah.", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/periode", k: "id", d: "/v1/keu/periode/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuPeriodeInput", s: { t: "object", pr: { kode: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$", ds: "(unik)" }, nama: { t: "string", max: 100 }, mulai: { t: "string", f: "date" }, selesai: { t: "string", f: "date" }, status: { t: "string", e: ["perencanaan", "berjalan", "tutup"], d: "perencanaan" } }, rq: ["kode", "nama", "mulai", "selesai"] }, rq: 1 }, r: "object", it: "KeuPeriode" }, deleteKeuPeriodeById: { id: "deleteKeuPeriodeById", m: "DELETE", path: "/v1/keu/periode/{id}", tag: "Keuangan: Master", sum: "Periode anggaran: hapus", ds: "Hanya admin modul.", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/periode", k: "id", d: "/v1/keu/periode/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuRka: { id: "getKeuRka", m: "GET", path: "/v1/keu/rka", tag: "Keuangan: Anggaran", sum: "RKA unit: daftar", ds: "Rencana kegiatan dan anggaran per unit per periode. Disusun pengelola unit (rincian di /keu/rka-item), diajukan, lalu disetujui/diminta revisi/ditolak admin keuangan. `total` dihitung dari rincian. Hanya pengelola modul.", sc: ["keu:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "periode_id", in: "query", s: { t: "string", rf: { l: "/v1/keu/periode", k: "id", d: "/v1/keu/periode/{id}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "unit_id", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "kode_prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "status", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "disetujui_oleh", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di judul" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuRka" }, postKeuRka: { id: "postKeuRka", m: "POST", path: "/v1/keu/rka", tag: "Keuangan: Anggaran", sum: "RKA unit: tambah", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya).", sc: ["keu:write"], b: { ct: "application/json", ref: "KeuRkaInput", s: { t: "object", pr: { periode_id: { t: "integer", ds: "ID di keu_periode", rf: { l: "/v1/keu/periode", k: "id", d: "/v1/keu/periode/{id}" } }, unit_id: { t: "integer", ds: "ID di induk_unit", rf: { l: "/v1/induk/unit", k: "id", d: "/v1/induk/unit/{id}" } }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, judul: { t: "string", max: 200 } }, rq: ["periode_id", "unit_id", "judul"] }, rq: 1 }, r: "object", it: "KeuRka" }, getKeuRkaById: { id: "getKeuRkaById", m: "GET", path: "/v1/keu/rka/{id}", tag: "Keuangan: Anggaran", sum: "RKA unit: detail", ds: "Rencana kegiatan dan anggaran per unit per periode. Disusun pengelola unit (rincian di /keu/rka-item), diajukan, lalu disetujui/diminta revisi/ditolak admin keuangan. `total` dihitung dari rincian. Hanya pengelola modul.", sc: ["keu:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuRka" }, putKeuRkaById: { id: "putKeuRkaById", m: "PUT", path: "/v1/keu/rka/{id}", tag: "Keuangan: Anggaran", sum: "RKA unit: ubah", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya). Kolom yang tidak dikirim tidak berubah.", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuRkaInput", s: { t: "object", pr: { periode_id: { t: "integer", ds: "ID di keu_periode", rf: { l: "/v1/keu/periode", k: "id", d: "/v1/keu/periode/{id}" } }, unit_id: { t: "integer", ds: "ID di induk_unit", rf: { l: "/v1/induk/unit", k: "id", d: "/v1/induk/unit/{id}" } }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, judul: { t: "string", max: 200 } }, rq: ["periode_id", "unit_id", "judul"] }, rq: 1 }, r: "object", it: "KeuRka" }, deleteKeuRkaById: { id: "deleteKeuRkaById", m: "DELETE", path: "/v1/keu/rka/{id}", tag: "Keuangan: Anggaran", sum: "RKA unit: hapus", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya).", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuRkaByIdBerkas: { id: "getKeuRkaByIdBerkas", m: "GET", path: "/v1/keu/rka/{id}/berkas", tag: "Keuangan: Anggaran", sum: "RKA unit: daftar lampiran", ds: "Siapa pun yang boleh melihat barisnya.", sc: ["keu:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "list", it: "PusatBerkas" }, postKeuRkaByIdBerkas: { id: "postKeuRkaByIdBerkas", m: "POST", path: "/v1/keu/rka/{id}/berkas", tag: "Keuangan: Anggaran", sum: "RKA unit: unggah lampiran", ds: 'Multipart field "berkas" (atau JSON berkas_base64 + nama_file), opsional jenis dan keterangan. PDF, gambar, dokumen Office/ODF, CSV, TXT, ZIP; maksimal PUSAT_DATA_MAKS_MB (bawaan 20 MB). Pengelola modul (peran ber-unit hanya untuk unitnya).', sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "multipart/form-data", ref: "PusatBerkasInput", s: { t: "object", pr: { berkas: { t: "string", f: "binary" }, jenis: { t: "string", ds: "Mis. lampiran, bukti, laporan" }, keterangan: { t: "string" }, berkas_base64: { t: "string", ds: "Alternatif JSON" }, nama_file: { t: "string" } } }, rq: 1 }, r: "object", it: "PusatBerkas" }, getKeuRkaByIdBerkasByUuid: { id: "getKeuRkaByIdBerkasByUuid", m: "GET", path: "/v1/keu/rka/{id}/berkas/{uuid}", tag: "Keuangan: Anggaran", sum: "RKA unit: unduh lampiran", sc: ["keu:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, rq: 1, ds: "ID angka atau UUID" }, { nm: "uuid", in: "path", s: { t: "string" }, rq: 1, ds: "UUID berkas" }], r: "object" }, deleteKeuRkaByIdBerkasByUuid: { id: "deleteKeuRkaByIdBerkasByUuid", m: "DELETE", path: "/v1/keu/rka/{id}/berkas/{uuid}", tag: "Keuangan: Anggaran", sum: "RKA unit: hapus lampiran", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya).", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, rq: 1, ds: "ID angka atau UUID" }, { nm: "uuid", in: "path", s: { t: "string" }, rq: 1, ds: "UUID berkas" }], r: "none" }, postKeuRkaByIdAjukan: { id: "postKeuRkaByIdAjukan", m: "POST", path: "/v1/keu/rka/{id}/ajukan", tag: "Keuangan: Anggaran", sum: "RKA unit: Ajukan", ds: "Pengelola modul. Status harus draf/revisi, menjadi diajukan.", sc: ["keu:write"], tr: { dari: ["draf", "revisi"], ke: "diajukan" }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuRka" }, postKeuRkaByIdSetujui: { id: "postKeuRkaByIdSetujui", m: "POST", path: "/v1/keu/rka/{id}/setujui", tag: "Keuangan: Anggaran", sum: "RKA unit: Setujui", ds: "Admin modul. Status harus diajukan, menjadi disetujui.", sc: ["keu:write"], tr: { dari: ["diajukan"], ke: "disetujui" }, oleh: "admin", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuRkaSetujuiInput", s: { t: "object", pr: { catatan: { t: "string" } } }, rq: 1 }, r: "object", it: "KeuRka" }, postKeuRkaByIdMintaRevisi: { id: "postKeuRkaByIdMintaRevisi", m: "POST", path: "/v1/keu/rka/{id}/minta-revisi", tag: "Keuangan: Anggaran", sum: "RKA unit: Minta revisi", ds: "Bisa juga untuk revisi anggaran yang sudah disetujui; revisi_ke bertambah. Admin modul. Status harus diajukan/disetujui, menjadi revisi.", sc: ["keu:write"], tr: { dari: ["diajukan", "disetujui"], ke: "revisi" }, oleh: "admin", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuRkaMintaRevisiInput", s: { t: "object", pr: { catatan: { t: "string" } }, rq: ["catatan"] }, rq: 1 }, r: "object", it: "KeuRka" }, postKeuRkaByIdTolak: { id: "postKeuRkaByIdTolak", m: "POST", path: "/v1/keu/rka/{id}/tolak", tag: "Keuangan: Anggaran", sum: "RKA unit: Tolak", ds: "Admin modul. Status harus diajukan, menjadi ditolak.", sc: ["keu:write"], tr: { dari: ["diajukan"], ke: "ditolak" }, oleh: "admin", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuRkaTolakInput", s: { t: "object", pr: { alasan: { t: "string" } }, rq: ["alasan"] }, rq: 1 }, r: "object", it: "KeuRka" }, getKeuRkaItem: { id: "getKeuRkaItem", m: "GET", path: "/v1/keu/rka-item", tag: "Keuangan: Anggaran", sum: "Rincian RKA: daftar", ds: "Rincian anggaran. `jumlah` = volume x harga_satuan. Hanya bisa diubah saat RKA draf/revisi. Hanya pengelola modul.", sc: ["keu:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "rka_id", in: "query", s: { t: "string", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "unit_id", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "akun_id", in: "query", s: { t: "string", rf: { l: "/v1/keu/akun", k: "id", d: "/v1/keu/akun/{id}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di kegiatan, kode, uraian" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuRkaItem" }, postKeuRkaItem: { id: "postKeuRkaItem", m: "POST", path: "/v1/keu/rka-item", tag: "Keuangan: Anggaran", sum: "Rincian RKA: tambah", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya).", sc: ["keu:write"], b: { ct: "application/json", ref: "KeuRkaItemInput", s: { t: "object", pr: { rka_id: { t: "integer", ds: "ID di keu_rka", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, akun_id: { t: "integer", ds: "ID di keu_akun", rf: { l: "/v1/keu/akun", k: "id", d: "/v1/keu/akun/{id}" } }, kode: { t: "string", max: 40, p: "^[A-Za-z0-9._\\-/]+$" }, kegiatan: { t: "string", max: 200 }, uraian: { t: "string", max: 255 }, volume: { t: "number", d: "1" }, satuan: { t: "string", max: 30, d: "paket" }, harga_satuan: { t: "number" }, sumber_dana: { t: "string", max: 100 }, bulan: { t: "integer", min: 1, mx: 12 }, indikator: { t: "string", max: 255 } }, rq: ["rka_id", "kegiatan", "harga_satuan"] }, rq: 1 }, r: "object", it: "KeuRkaItem" }, getKeuRkaItemById: { id: "getKeuRkaItemById", m: "GET", path: "/v1/keu/rka-item/{id}", tag: "Keuangan: Anggaran", sum: "Rincian RKA: detail", ds: "Rincian anggaran. `jumlah` = volume x harga_satuan. Hanya bisa diubah saat RKA draf/revisi. Hanya pengelola modul.", sc: ["keu:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka-item", k: "id", d: "/v1/keu/rka-item/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuRkaItem" }, putKeuRkaItemById: { id: "putKeuRkaItemById", m: "PUT", path: "/v1/keu/rka-item/{id}", tag: "Keuangan: Anggaran", sum: "Rincian RKA: ubah", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya). Kolom yang tidak dikirim tidak berubah.", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka-item", k: "id", d: "/v1/keu/rka-item/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuRkaItemInput", s: { t: "object", pr: { rka_id: { t: "integer", ds: "ID di keu_rka", rf: { l: "/v1/keu/rka", k: "id", d: "/v1/keu/rka/{id}" } }, akun_id: { t: "integer", ds: "ID di keu_akun", rf: { l: "/v1/keu/akun", k: "id", d: "/v1/keu/akun/{id}" } }, kode: { t: "string", max: 40, p: "^[A-Za-z0-9._\\-/]+$" }, kegiatan: { t: "string", max: 200 }, uraian: { t: "string", max: 255 }, volume: { t: "number", d: "1" }, satuan: { t: "string", max: 30, d: "paket" }, harga_satuan: { t: "number" }, sumber_dana: { t: "string", max: 100 }, bulan: { t: "integer", min: 1, mx: 12 }, indikator: { t: "string", max: 255 } }, rq: ["rka_id", "kegiatan", "harga_satuan"] }, rq: 1 }, r: "object", it: "KeuRkaItem" }, deleteKeuRkaItemById: { id: "deleteKeuRkaItemById", m: "DELETE", path: "/v1/keu/rka-item/{id}", tag: "Keuangan: Anggaran", sum: "Rincian RKA: hapus", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya).", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/rka-item", k: "id", d: "/v1/keu/rka-item/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuRealisasi: { id: "getKeuRealisasi", m: "GET", path: "/v1/keu/realisasi", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: daftar", ds: "Pengajuan dana atas rincian RKA yang disetujui (dicek sisa anggaran). Alur: diajukan \u2192 verifikasi \u2192 setujui \u2192 bayar \u2192 spj (selesai); atau tolak/batalkan. Bukti/SPJ dilampirkan lewat /berkas. Pengaju mendapat notifikasi dan bisa melihat pengajuannya. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (pengaju).", sc: ["keu:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "rka_item_id", in: "query", s: { t: "string", rf: { l: "/v1/keu/rka-item", k: "id", d: "/v1/keu/rka-item/{id}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "unit_id", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "pengaju", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "jenis", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "status", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "diverifikasi_oleh", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "disetujui_oleh", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di nomor, uraian, penerima" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuRealisasi" }, postKeuRealisasi: { id: "postKeuRealisasi", m: "POST", path: "/v1/keu/realisasi", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: tambah", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya).", sc: ["keu:write"], b: { ct: "application/json", ref: "KeuRealisasiInput", s: { t: "object", pr: { rka_item_id: { t: "integer", ds: "ID di keu_rka_item", rf: { l: "/v1/keu/rka-item", k: "id", d: "/v1/keu/rka-item/{id}" } }, pengaju: { t: "string", ds: "user.username", rf: { l: "pengguna", k: "username" } }, jenis: { t: "string", e: ["uang_muka", "pembayaran_langsung", "penggantian"], d: "pembayaran_langsung" }, tanggal: { t: "string", f: "date" }, uraian: { t: "string", max: 255 }, jumlah: { t: "number" }, penerima: { t: "string", max: 150 }, rekening_penerima: { t: "string", max: 100 } }, rq: ["rka_item_id", "tanggal", "uraian", "jumlah"] }, rq: 1 }, r: "object", it: "KeuRealisasi" }, getKeuRealisasiById: { id: "getKeuRealisasiById", m: "GET", path: "/v1/keu/realisasi/{id}", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: detail", ds: "Pengajuan dana atas rincian RKA yang disetujui (dicek sisa anggaran). Alur: diajukan \u2192 verifikasi \u2192 setujui \u2192 bayar \u2192 spj (selesai); atau tolak/batalkan. Bukti/SPJ dilampirkan lewat /berkas. Pengaju mendapat notifikasi dan bisa melihat pengajuannya. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (pengaju).", sc: ["keu:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/realisasi", k: "id", d: "/v1/keu/realisasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuRealisasi" }, putKeuRealisasiById: { id: "putKeuRealisasiById", m: "PUT", path: "/v1/keu/realisasi/{id}", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: ubah", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya). Kolom yang tidak dikirim tidak berubah.", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/realisasi", k: "id", d: "/v1/keu/realisasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuRealisasiInput", s: { t: "object", pr: { rka_item_id: { t: "integer", ds: "ID di keu_rka_item", rf: { l: "/v1/keu/rka-item", k: "id", d: "/v1/keu/rka-item/{id}" } }, pengaju: { t: "string", ds: "user.username", rf: { l: "pengguna", k: "username" } }, jenis: { t: "string", e: ["uang_muka", "pembayaran_langsung", "penggantian"], d: "pembayaran_langsung" }, tanggal: { t: "string", f: "date" }, uraian: { t: "string", max: 255 }, jumlah: { t: "number" }, penerima: { t: "string", max: 150 }, rekening_penerima: { t: "string", max: 100 } }, rq: ["rka_item_id", "tanggal", "uraian", "jumlah"] }, rq: 1 }, r: "object", it: "KeuRealisasi" }, deleteKeuRealisasiById: { id: "deleteKeuRealisasiById", m: "DELETE", path: "/v1/keu/realisasi/{id}", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: hapus", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya).", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/realisasi", k: "id", d: "/v1/keu/realisasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuRealisasiByIdBerkas: { id: "getKeuRealisasiByIdBerkas", m: "GET", path: "/v1/keu/realisasi/{id}/berkas", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: daftar lampiran", ds: "Siapa pun yang boleh melihat barisnya.", sc: ["keu:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/realisasi", k: "id", d: "/v1/keu/realisasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "list", it: "PusatBerkas" }, postKeuRealisasiByIdBerkas: { id: "postKeuRealisasiByIdBerkas", m: "POST", path: "/v1/keu/realisasi/{id}/berkas", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: unggah lampiran", ds: 'Multipart field "berkas" (atau JSON berkas_base64 + nama_file), opsional jenis dan keterangan. PDF, gambar, dokumen Office/ODF, CSV, TXT, ZIP; maksimal PUSAT_DATA_MAKS_MB (bawaan 20 MB). Pengelola modul (peran ber-unit hanya untuk unitnya).', sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/realisasi", k: "id", d: "/v1/keu/realisasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "multipart/form-data", ref: "PusatBerkasInput", s: { t: "object", pr: { berkas: { t: "string", f: "binary" }, jenis: { t: "string", ds: "Mis. lampiran, bukti, laporan" }, keterangan: { t: "string" }, berkas_base64: { t: "string", ds: "Alternatif JSON" }, nama_file: { t: "string" } } }, rq: 1 }, r: "object", it: "PusatBerkas" }, getKeuRealisasiByIdBerkasByUuid: { id: "getKeuRealisasiByIdBerkasByUuid", m: "GET", path: "/v1/keu/realisasi/{id}/berkas/{uuid}", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: unduh lampiran", sc: ["keu:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/realisasi", k: "id", d: "/v1/keu/realisasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }, { nm: "uuid", in: "path", s: { t: "string" }, rq: 1, ds: "UUID berkas" }], r: "object" }, deleteKeuRealisasiByIdBerkasByUuid: { id: "deleteKeuRealisasiByIdBerkasByUuid", m: "DELETE", path: "/v1/keu/realisasi/{id}/berkas/{uuid}", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: hapus lampiran", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya).", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/realisasi", k: "id", d: "/v1/keu/realisasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }, { nm: "uuid", in: "path", s: { t: "string" }, rq: 1, ds: "UUID berkas" }], r: "none" }, postKeuRealisasiByIdVerifikasi: { id: "postKeuRealisasiByIdVerifikasi", m: "POST", path: "/v1/keu/realisasi/{id}/verifikasi", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: Verifikasi", ds: "Admin modul. Status harus diajukan, menjadi diverifikasi.", sc: ["keu:write"], tr: { dari: ["diajukan"], ke: "diverifikasi" }, oleh: "admin", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/realisasi", k: "id", d: "/v1/keu/realisasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuRealisasiVerifikasiInput", s: { t: "object", pr: { catatan: { t: "string" } } }, rq: 1 }, r: "object", it: "KeuRealisasi" }, postKeuRealisasiByIdSetujui: { id: "postKeuRealisasiByIdSetujui", m: "POST", path: "/v1/keu/realisasi/{id}/setujui", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: Setujui", ds: "Admin modul. Status harus diverifikasi, menjadi disetujui.", sc: ["keu:write"], tr: { dari: ["diverifikasi"], ke: "disetujui" }, oleh: "admin", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/realisasi", k: "id", d: "/v1/keu/realisasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuRealisasiSetujuiInput", s: { t: "object", pr: { catatan: { t: "string" } } }, rq: 1 }, r: "object", it: "KeuRealisasi" }, postKeuRealisasiByIdBayar: { id: "postKeuRealisasiByIdBayar", m: "POST", path: "/v1/keu/realisasi/{id}/bayar", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: Catat pembayaran", ds: "Admin modul. Status harus disetujui, menjadi dibayar.", sc: ["keu:write"], tr: { dari: ["disetujui"], ke: "dibayar" }, oleh: "admin", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/realisasi", k: "id", d: "/v1/keu/realisasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuRealisasiBayarInput", s: { t: "object", pr: { tanggal_bayar: { t: "string", f: "date" }, nomor_bukti: { t: "string", max: 100 } }, rq: ["tanggal_bayar"] }, rq: 1 }, r: "object", it: "KeuRealisasi" }, postKeuRealisasiByIdSpj: { id: "postKeuRealisasiByIdSpj", m: "POST", path: "/v1/keu/realisasi/{id}/spj", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: Pertanggungjawaban (SPJ)", ds: "Lampirkan bukti SPJ lewat /berkas sebelum atau sesudahnya. Selisih uang muka (jumlah - jumlah_spj) kembali menjadi sisa anggaran. Pemilik data atau pengelola. Status harus dibayar, menjadi selesai.", sc: ["keu:write"], tr: { dari: ["dibayar"], ke: "selesai" }, oleh: "pemilik_atau_pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/realisasi", k: "id", d: "/v1/keu/realisasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuRealisasiSpjInput", s: { t: "object", pr: { jumlah_spj: { t: "number" }, catatan: { t: "string" } }, rq: ["jumlah_spj"] }, rq: 1 }, r: "object", it: "KeuRealisasi" }, postKeuRealisasiByIdTolak: { id: "postKeuRealisasiByIdTolak", m: "POST", path: "/v1/keu/realisasi/{id}/tolak", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: Tolak", ds: "Admin modul. Status harus diajukan/diverifikasi, menjadi ditolak.", sc: ["keu:write"], tr: { dari: ["diajukan", "diverifikasi"], ke: "ditolak" }, oleh: "admin", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/realisasi", k: "id", d: "/v1/keu/realisasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuRealisasiTolakInput", s: { t: "object", pr: { alasan: { t: "string" } }, rq: ["alasan"] }, rq: 1 }, r: "object", it: "KeuRealisasi" }, postKeuRealisasiByIdBatalkan: { id: "postKeuRealisasiByIdBatalkan", m: "POST", path: "/v1/keu/realisasi/{id}/batalkan", tag: "Keuangan: Realisasi", sum: "Pengajuan dana/realisasi: Batalkan", ds: "Pemilik data atau pengelola. Status harus diajukan, menjadi dibatalkan.", sc: ["keu:write"], tr: { dari: ["diajukan"], ke: "dibatalkan" }, oleh: "pemilik_atau_pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/realisasi", k: "id", d: "/v1/keu/realisasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuRealisasi" }, getKeuPenerimaan: { id: "getKeuPenerimaan", m: "GET", path: "/v1/keu/penerimaan", tag: "Keuangan: Penerimaan", sum: "Penerimaan lain: daftar", ds: "Penerimaan selain pembayaran mahasiswa (hibah, kerja sama, sewa, donasi, jasa layanan, bunga bank). Bukti lewat /berkas. Hanya pengelola modul.", sc: ["keu:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "periode_id", in: "query", s: { t: "string", rf: { l: "/v1/keu/periode", k: "id", d: "/v1/keu/periode/{id}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "akun_id", in: "query", s: { t: "string", rf: { l: "/v1/keu/akun", k: "id", d: "/v1/keu/akun/{id}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "unit_id", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "mitra_id", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "sumber", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di uraian, nomor_bukti" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuPenerimaan" }, postKeuPenerimaan: { id: "postKeuPenerimaan", m: "POST", path: "/v1/keu/penerimaan", tag: "Keuangan: Penerimaan", sum: "Penerimaan lain: tambah", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya).", sc: ["keu:write"], b: { ct: "application/json", ref: "KeuPenerimaanInput", s: { t: "object", pr: { periode_id: { t: "integer", ds: "ID di keu_periode", rf: { l: "/v1/keu/periode", k: "id", d: "/v1/keu/periode/{id}" } }, akun_id: { t: "integer", ds: "ID di keu_akun", rf: { l: "/v1/keu/akun", k: "id", d: "/v1/keu/akun/{id}" } }, unit_id: { t: "integer", ds: "ID di induk_unit", rf: { l: "/v1/induk/unit", k: "id", d: "/v1/induk/unit/{id}" } }, mitra_id: { t: "integer", ds: "ID di kerjasama_mitra", rf: { l: "/v1/kerjasama/mitra", k: "id", d: "/v1/kerjasama/mitra/{id}" } }, tanggal: { t: "string", f: "date" }, sumber: { t: "string", e: ["hibah_pemerintah", "hibah_swasta", "kerja_sama", "sewa", "donasi", "jasa_layanan", "bunga_bank", "lainnya"], d: "lainnya" }, uraian: { t: "string", max: 255 }, jumlah: { t: "number" }, nomor_bukti: { t: "string", max: 100 } }, rq: ["tanggal", "uraian", "jumlah"] }, rq: 1 }, r: "object", it: "KeuPenerimaan" }, getKeuPenerimaanById: { id: "getKeuPenerimaanById", m: "GET", path: "/v1/keu/penerimaan/{id}", tag: "Keuangan: Penerimaan", sum: "Penerimaan lain: detail", ds: "Penerimaan selain pembayaran mahasiswa (hibah, kerja sama, sewa, donasi, jasa layanan, bunga bank). Bukti lewat /berkas. Hanya pengelola modul.", sc: ["keu:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/penerimaan", k: "id", d: "/v1/keu/penerimaan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuPenerimaan" }, putKeuPenerimaanById: { id: "putKeuPenerimaanById", m: "PUT", path: "/v1/keu/penerimaan/{id}", tag: "Keuangan: Penerimaan", sum: "Penerimaan lain: ubah", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya). Kolom yang tidak dikirim tidak berubah.", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/penerimaan", k: "id", d: "/v1/keu/penerimaan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuPenerimaanInput", s: { t: "object", pr: { periode_id: { t: "integer", ds: "ID di keu_periode", rf: { l: "/v1/keu/periode", k: "id", d: "/v1/keu/periode/{id}" } }, akun_id: { t: "integer", ds: "ID di keu_akun", rf: { l: "/v1/keu/akun", k: "id", d: "/v1/keu/akun/{id}" } }, unit_id: { t: "integer", ds: "ID di induk_unit", rf: { l: "/v1/induk/unit", k: "id", d: "/v1/induk/unit/{id}" } }, mitra_id: { t: "integer", ds: "ID di kerjasama_mitra", rf: { l: "/v1/kerjasama/mitra", k: "id", d: "/v1/kerjasama/mitra/{id}" } }, tanggal: { t: "string", f: "date" }, sumber: { t: "string", e: ["hibah_pemerintah", "hibah_swasta", "kerja_sama", "sewa", "donasi", "jasa_layanan", "bunga_bank", "lainnya"], d: "lainnya" }, uraian: { t: "string", max: 255 }, jumlah: { t: "number" }, nomor_bukti: { t: "string", max: 100 } }, rq: ["tanggal", "uraian", "jumlah"] }, rq: 1 }, r: "object", it: "KeuPenerimaan" }, deleteKeuPenerimaanById: { id: "deleteKeuPenerimaanById", m: "DELETE", path: "/v1/keu/penerimaan/{id}", tag: "Keuangan: Penerimaan", sum: "Penerimaan lain: hapus", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya).", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/penerimaan", k: "id", d: "/v1/keu/penerimaan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuPenerimaanByIdBerkas: { id: "getKeuPenerimaanByIdBerkas", m: "GET", path: "/v1/keu/penerimaan/{id}/berkas", tag: "Keuangan: Penerimaan", sum: "Penerimaan lain: daftar lampiran", ds: "Siapa pun yang boleh melihat barisnya.", sc: ["keu:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/penerimaan", k: "id", d: "/v1/keu/penerimaan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "list", it: "PusatBerkas" }, postKeuPenerimaanByIdBerkas: { id: "postKeuPenerimaanByIdBerkas", m: "POST", path: "/v1/keu/penerimaan/{id}/berkas", tag: "Keuangan: Penerimaan", sum: "Penerimaan lain: unggah lampiran", ds: 'Multipart field "berkas" (atau JSON berkas_base64 + nama_file), opsional jenis dan keterangan. PDF, gambar, dokumen Office/ODF, CSV, TXT, ZIP; maksimal PUSAT_DATA_MAKS_MB (bawaan 20 MB). Pengelola modul (peran ber-unit hanya untuk unitnya).', sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/penerimaan", k: "id", d: "/v1/keu/penerimaan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "multipart/form-data", ref: "PusatBerkasInput", s: { t: "object", pr: { berkas: { t: "string", f: "binary" }, jenis: { t: "string", ds: "Mis. lampiran, bukti, laporan" }, keterangan: { t: "string" }, berkas_base64: { t: "string", ds: "Alternatif JSON" }, nama_file: { t: "string" } } }, rq: 1 }, r: "object", it: "PusatBerkas" }, getKeuPenerimaanByIdBerkasByUuid: { id: "getKeuPenerimaanByIdBerkasByUuid", m: "GET", path: "/v1/keu/penerimaan/{id}/berkas/{uuid}", tag: "Keuangan: Penerimaan", sum: "Penerimaan lain: unduh lampiran", sc: ["keu:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/penerimaan", k: "id", d: "/v1/keu/penerimaan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }, { nm: "uuid", in: "path", s: { t: "string" }, rq: 1, ds: "UUID berkas" }], r: "object" }, deleteKeuPenerimaanByIdBerkasByUuid: { id: "deleteKeuPenerimaanByIdBerkasByUuid", m: "DELETE", path: "/v1/keu/penerimaan/{id}/berkas/{uuid}", tag: "Keuangan: Penerimaan", sum: "Penerimaan lain: hapus lampiran", ds: "Pengelola modul (peran ber-unit hanya untuk unitnya).", sc: ["keu:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/penerimaan", k: "id", d: "/v1/keu/penerimaan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }, { nm: "uuid", in: "path", s: { t: "string" }, rq: 1, ds: "UUID berkas" }], r: "none" }, getKeuVa: { id: "getKeuVa", m: "GET", path: "/v1/keu/va", tag: "Keuangan: Virtual account", sum: "Virtual account: daftar", ds: "Virtual account tagihan mahasiswa dan status pembayarannya dari bank. Notifikasi bank masuk lewat POST /keu/va/notifikasi. Modul ini tidak menulis ke tabel pembayaran lama; petugas membukukan lewat menu lama lalu menandai `tandai-dibukukan`. Mahasiswa melihat VA miliknya. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keu:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "nim", in: "query", s: { t: "string", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "status", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "sudah_dibukukan", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "bank", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di nomor_va, nim, referensi_bank" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuVa" }, postKeuVa: { id: "postKeuVa", m: "POST", path: "/v1/keu/va", tag: "Keuangan: Virtual account", sum: "Virtual account: tambah", ds: "Pengelola modul.", sc: ["keu:write"], oleh: "pengelola", b: { ct: "application/json", ref: "KeuVaInput", s: { t: "object", pr: { bank: { t: "string", max: 30, p: "^[A-Za-z0-9._\\-/]+$" }, nomor_va: { t: "string", max: 40, p: "^[A-Za-z0-9._\\-/]+$" }, nim: { t: "string", ds: "m_mahasiswa.NIM", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, tahun_id: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, keterangan: { t: "string", max: 255 }, jumlah: { t: "number" }, berlaku_sampai: { t: "string", f: "date-time" } }, rq: ["bank", "nomor_va", "nim", "jumlah"] }, rq: 1 }, r: "object", it: "KeuVa" }, getKeuVaById: { id: "getKeuVaById", m: "GET", path: "/v1/keu/va/{id}", tag: "Keuangan: Virtual account", sum: "Virtual account: detail", ds: "Virtual account tagihan mahasiswa dan status pembayarannya dari bank. Notifikasi bank masuk lewat POST /keu/va/notifikasi. Modul ini tidak menulis ke tabel pembayaran lama; petugas membukukan lewat menu lama lalu menandai `tandai-dibukukan`. Mahasiswa melihat VA miliknya. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keu:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/va", k: "id", d: "/v1/keu/va/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuVa" }, putKeuVaById: { id: "putKeuVaById", m: "PUT", path: "/v1/keu/va/{id}", tag: "Keuangan: Virtual account", sum: "Virtual account: ubah", ds: "Pengelola modul. Kolom yang tidak dikirim tidak berubah.", sc: ["keu:write"], oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/va", k: "id", d: "/v1/keu/va/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuVaInput", s: { t: "object", pr: { bank: { t: "string", max: 30, p: "^[A-Za-z0-9._\\-/]+$" }, nomor_va: { t: "string", max: 40, p: "^[A-Za-z0-9._\\-/]+$" }, nim: { t: "string", ds: "m_mahasiswa.NIM", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, tahun_id: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, keterangan: { t: "string", max: 255 }, jumlah: { t: "number" }, berlaku_sampai: { t: "string", f: "date-time" } }, rq: ["bank", "nomor_va", "nim", "jumlah"] }, rq: 1 }, r: "object", it: "KeuVa" }, postKeuVaByIdBatalkan: { id: "postKeuVaByIdBatalkan", m: "POST", path: "/v1/keu/va/{id}/batalkan", tag: "Keuangan: Virtual account", sum: "Virtual account: Batalkan", ds: "Pengelola modul. Status harus aktif, menjadi batal.", sc: ["keu:write"], tr: { dari: ["aktif"], ke: "batal" }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/va", k: "id", d: "/v1/keu/va/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuVa" }, postKeuVaByIdTandaiDibukukan: { id: "postKeuVaByIdTandaiDibukukan", m: "POST", path: "/v1/keu/va/{id}/tandai-dibukukan", tag: "Keuangan: Virtual account", sum: "Virtual account: Tandai sudah dibukukan", ds: "Pengelola modul. Status harus dibayar.", sc: ["keu:write"], tr: { dari: ["dibayar"] }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keu/va", k: "id", d: "/v1/keu/va/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuVa" }, getKeuanganSaya: { id: "getKeuanganSaya", m: "GET", path: "/v1/keuangan/saya", tag: "Keuangan: Tagihan", sum: "Hak akses keuangan saya", ds: "Pengelola keuangan (ADMIN, BAK, KEUANGAN, peran keuangan:kelola) atau mahasiswa, prodi yang boleh, tahun aktif, mode tagihan SIAKAD, dan sesi kasir terbuka.", sc: ["keuangan:read"], r: "object", it: "Objek" }, getKeuanganTarif: { id: "getKeuanganTarif", m: "GET", path: "/v1/keuangan/tarif", tag: "Keuangan: Tarif", sum: "Tarif biaya prodi per periode", ds: "Baris m_biaya (Setup Biaya): kode biaya, shift, angkatan (semester_masuk), kampus, nominal, persen syarat KRS/ujian/her. Tarif per prodi dan per angkatan ada di sini.", sc: ["keuangan:read"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "object", it: "Objek" }, postKeuanganTarif: { id: "postKeuanganTarif", m: "POST", path: "/v1/keuangan/tarif", tag: "Keuangan: Tarif", sum: "Tambah/ubah tarif", ds: 'Body: {"kode_biaya", "kode_shift", "kampus", "semester_masuk", "rupiah", "persen_krs", "persen_ujian", "persen_her", "jenis", "idb" (untuk ubah)}. Aturan dan query sama dengan form Setup Biaya (syarat_krs = N bila persen_krs 0).', sc: ["keuangan:write"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "object", it: "Objek" }, getKeuanganTarifItem: { id: "getKeuanganTarifItem", m: "GET", path: "/v1/keuangan/tarif/item", tag: "Keuangan: Tarif", sum: "Jenis biaya (item biaya)", ds: "m_item_biaya.", sc: ["keuangan:read"], r: "list", it: "Objek" }, postKeuanganTarifItem: { id: "postKeuanganTarifItem", m: "POST", path: "/v1/keuangan/tarif/item", tag: "Keuangan: Tarif", sum: "Tambah/ubah jenis biaya", ds: 'Body: {"kode_biaya", "item_biaya"}. Query menu Master Jenis Biaya.', sc: ["keuangan:write"], r: "object", it: "Objek" }, postKeuanganTarifSalin: { id: "postKeuanganTarifSalin", m: "POST", path: "/v1/keuangan/tarif/salin", tag: "Keuangan: Tarif", sum: "Salin tarif dari periode lain", ds: 'Body: {"sumber": "20242"}. Sama dengan tombol Copy Setup Biaya.', sc: ["keuangan:write"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "object", it: "Objek" }, postKeuanganTarifByIdbHapus: { id: "postKeuanganTarifByIdbHapus", m: "POST", path: "/v1/keuangan/tarif/{idb}/hapus", tag: "Keuangan: Tarif", sum: "Hapus tarif", ds: 'Menu lama ikut menghapus tagihan biaya itu. Ditolak 409 bila sudah ada tagihan, kecuali body {"paksa": true}.', sc: ["keuangan:write"], pa: [{ nm: "idb", in: "path", s: { t: "string" }, rq: 1, ds: "m_biaya.idb" }], r: "object", it: "Objek" }, getKeuanganTagihan: { id: "getKeuanganTagihan", m: "GET", path: "/v1/keuangan/tagihan", tag: "Keuangan: Tagihan", sum: "Daftar tagihan", ds: "Tagihan per periode dengan dibayar dan sisa (monitoring tagihan). Mahasiswa melihat miliknya. meta.jumlah = total tagihan/dibayar/sisa.", sc: ["keuangan:read"], pa: [{ nm: "nim", in: "query", s: { t: "string", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, ds: "NIM" }, { nm: "kode_biaya", in: "query", s: { t: "string" }, ds: "Kode biaya" }, { nm: "status", in: "query", s: { t: "string" }, ds: "lunas atau belum" }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari NIM/nama" }, { nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "list", it: "Objek" }, postKeuanganTagihan: { id: "postKeuanganTagihan", m: "POST", path: "/v1/keuangan/tagihan", tag: "Keuangan: Tagihan", sum: "Tambah/ubah tagihan (satu atau massal)", ds: 'Body: {"nim": "..." atau [...], "kode_biaya", "rupiah", "tahun_id"} atau {"data": [{"nim","kode_biaya","rupiah"}], "tahun_id"} (maks. 2000). Aturan impor tagihan menu Input Tagihan: biaya harus terdaftar di m_biaya untuk prodi/periode/shift/angkatan; mahasiswa tanpa status periode itu diberi status N (perilaku lama). Dipakai juga untuk tagihan wisuda, registrasi, dan tagihan lain per jenis biaya.', sc: ["keuangan:write"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "object", it: "Objek" }, getKeuanganTagihanRekap: { id: "getKeuanganTagihanRekap", m: "GET", path: "/v1/keuangan/tagihan/rekap", tag: "Keuangan: Tagihan", sum: "Rekap tagihan per prodi", ds: "Jumlah mahasiswa aktif/tertagih, total tagihan, dibayar, sisa, lunas, dan per jenis biaya.", sc: ["keuangan:read"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "object", it: "Objek" }, postKeuanganTagihanGenerate: { id: "postKeuanganTagihanGenerate", m: "POST", path: "/v1/keuangan/tagihan/generate", tag: "Keuangan: Tagihan", sum: "Generate tagihan otomatis", ds: 'Body: {"kode_biaya": [...], "nim": [...], "timpa": false, "pratinjau": true}. Untuk mahasiswa berstatus A pada periode: setiap tarif m_biaya yang cocok (shift, angkatan, kampus). Nominal dari kelompok UKT mahasiswa bila ditetapkan. Tagihan yang sudah ada dilewati kecuali timpa.', sc: ["keuangan:write"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "object", it: "Objek" }, postKeuanganTagihanGenerateMk: { id: "postKeuanganTagihanGenerateMk", m: "POST", path: "/v1/keuangan/tagihan/generate-mk", tag: "Keuangan: Tagihan", sum: "Generate tagihan dari KRS (tarif per mata kuliah)", ds: 'Body: {"kode_biaya", "pratinjau"}. Jumlah tarif per SKS/per MK (/keuangan/tarif-mk) atas KRS periode, ditulis sebagai satu tagihan per mahasiswa.', sc: ["keuangan:write"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "object", it: "Objek" }, postKeuanganTagihanKirim: { id: "postKeuanganTagihanKirim", m: "POST", path: "/v1/keuangan/tagihan/kirim", tag: "Keuangan: Tagihan", sum: "Kirim notifikasi tagihan", ds: 'Body: {"hanya_belum_lunas": true, "nim": [...], "pesan"}. Ringkasan tagihan dikirim ke kotak masuk mahasiswa (/v1/notif/kotak).', sc: ["keuangan:write"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "object", it: "Objek" }, getKeuanganTagihanByIdmb: { id: "getKeuanganTagihanByIdmb", m: "GET", path: "/v1/keuangan/tagihan/{idmb}", tag: "Keuangan: Tagihan", sum: "Detail tagihan", ds: "Tagihan + baris pembayaran t_mahasiswa_bayar + transaksi API + jatuh tempo.", sc: ["keuangan:read"], pa: [{ nm: "idmb", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/tagihan", k: "idmb", d: "/v1/keuangan/tagihan/{idmb}" } }, rq: 1, ds: "t_mahasiswa_bayar_tagihan.idmb" }], r: "object", it: "Objek" }, postKeuanganTagihanByIdmb: { id: "postKeuanganTagihanByIdmb", m: "POST", path: "/v1/keuangan/tagihan/{idmb}", tag: "Keuangan: Tagihan", sum: "Ubah nominal tagihan", ds: 'Body: {"rupiah", "sebab"}. Query popup ubah tagihan; tidak boleh di bawah yang sudah dibayar.', sc: ["keuangan:write"], pa: [{ nm: "idmb", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/tagihan", k: "idmb", d: "/v1/keuangan/tagihan/{idmb}" } }, rq: 1, ds: "t_mahasiswa_bayar_tagihan.idmb" }], r: "object", it: "Objek" }, postKeuanganTagihanByIdmbHapus: { id: "postKeuanganTagihanByIdmbHapus", m: "POST", path: "/v1/keuangan/tagihan/{idmb}/hapus", tag: "Keuangan: Tagihan", sum: "Hapus tagihan", ds: 'Menu lama ikut menghapus pembayarannya. Ditolak 409 bila sudah dibayar, kecuali body {"paksa": true}.', sc: ["keuangan:write"], pa: [{ nm: "idmb", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/tagihan", k: "idmb", d: "/v1/keuangan/tagihan/{idmb}" } }, rq: 1, ds: "t_mahasiswa_bayar_tagihan.idmb" }], r: "object", it: "Objek" }, postKeuanganDendaHitung: { id: "postKeuanganDendaHitung", m: "POST", path: "/v1/keuangan/denda/hitung", tag: "Keuangan: Denda", sum: "Hitung dan tagihkan denda", ds: 'Body: {"pratinjau": true}. Dari periode pembayaran yang lewat jatuh tempo (tetap, per hari, atau persen sisa, dibatasi denda_maks); mahasiswa dengan dispensasi/cicilan disetujui dilewati. Bisa diulang: denda diperbarui, bukan dobel.', sc: ["keuangan:write"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "object", it: "Objek" }, getKeuanganTransaksi: { id: "getKeuanganTransaksi", m: "GET", path: "/v1/keuangan/transaksi", tag: "Keuangan: Pembayaran dan kwitansi", sum: "Daftar pembayaran lewat API", ds: "Filter prodi, nim, tahun_id, metode, status, kasir_id, dari, sampai. Mahasiswa melihat miliknya.", sc: ["keuangan:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }], r: "list", it: "Objek" }, postKeuanganTransaksi: { id: "postKeuanganTransaksi", m: "POST", path: "/v1/keuangan/transaksi", tag: "Keuangan: Pembayaran dan kwitansi", sum: "Catat pembayaran (kasir/offline)", ds: 'Body: {"nim", "tahun_id", "kode_biaya", "jumlah", "potongan", "tanggal", "metode": "tunai|transfer|va|online|lainnya", "keterangan", "referensi"}. Ditulis ke t_mahasiswa_bayar dengan langkah popup input pembayaran (validasi nominal, cek_her_persen, m_log). Tidak boleh melebihi sisa tagihan. referensi sama = tidak dicatat dua kali. Pembayaran kasir masuk ke sesi kasir yang terbuka. Menghasilkan kwitansi digital.', sc: ["keuangan:write"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "object", it: "Objek" }, getKeuanganTransaksiById: { id: "getKeuanganTransaksiById", m: "GET", path: "/v1/keuangan/transaksi/{id}", tag: "Keuangan: Pembayaran dan kwitansi", sum: "Detail pembayaran", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/transaksi", k: "id", d: "/v1/keuangan/transaksi/{id}" } }, rq: 1, ds: "ID" }], r: "object", it: "Objek" }, postKeuanganTransaksiByIdBatal: { id: "postKeuanganTransaksiByIdBatal", m: "POST", path: "/v1/keuangan/transaksi/{id}/batal", tag: "Keuangan: Pembayaran dan kwitansi", sum: "Batalkan pembayaran", ds: 'Body: {"alasan"}. Baris t_mahasiswa_bayar yang dibuat transaksi ini dihapus (langkah hapus pembayaran menu Cek Pembayaran, tercatat di m_log); angsuran dan deposit dikembalikan.', sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/transaksi", k: "id", d: "/v1/keuangan/transaksi/{id}" } }, rq: 1, ds: "ID" }], r: "object", it: "Objek" }, getKeuanganTransaksiByIdKwitansi: { id: "getKeuanganTransaksiByIdKwitansi", m: "GET", path: "/v1/keuangan/transaksi/{id}/kwitansi", tag: "Keuangan: Pembayaran dan kwitansi", sum: "Kwitansi digital", ds: "Data cetak kwitansi: kop PT, mahasiswa, jenis biaya, jumlah + terbilang, petugas, kode verifikasi (untuk QR).", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/transaksi", k: "id", d: "/v1/keuangan/transaksi/{id}" } }, rq: 1, ds: "ID" }], r: "object", it: "Objek" }, getKeuanganKwitansiVerifikasiByKode: { id: "getKeuanganKwitansiVerifikasiByKode", m: "GET", path: "/v1/keuangan/kwitansi/verifikasi/{kode}", tag: "Keuangan: Pembayaran dan kwitansi", sum: "Verifikasi kwitansi (publik)", ds: "Tanpa token, untuk QR di kwitansi. NIM dan nama disamarkan.", pub: 1, pa: [{ nm: "kode", in: "path", s: { t: "string" }, rq: 1, ds: "Kode verifikasi" }], r: "object", it: "Objek" }, postKeuanganKasirBuka: { id: "postKeuanganKasirBuka", m: "POST", path: "/v1/keuangan/kasir/buka", tag: "Keuangan: Kasir", sum: "Buka sesi kasir", ds: 'Body: {"saldo_awal", "loket"}. Satu sesi terbuka per kasir.', sc: ["keuangan:write"], r: "object", it: "Objek" }, postKeuanganKasirByIdTutup: { id: "postKeuanganKasirByIdTutup", m: "POST", path: "/v1/keuangan/kasir/{id}/tutup", tag: "Keuangan: Kasir", sum: "Tutup sesi kasir", ds: 'Body: {"setoran", "catatan"}. Selisih = setoran - (saldo awal + total tunai). Rekap per metode.', sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/kasir", k: "id", d: "/v1/keuangan/kasir/{id}" } }, rq: 1, ds: "ID" }], r: "object", it: "Objek" }, getKeuanganDepositByNim: { id: "getKeuanganDepositByNim", m: "GET", path: "/v1/keuangan/deposit/{nim}", tag: "Keuangan: Refund dan deposit", sum: "Saldo dan mutasi deposit", ds: "Mahasiswa melihat miliknya.", sc: ["keuangan:read"], pa: [{ nm: "nim", in: "path", s: { t: "string", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, rq: 1, ds: "NIM" }], r: "object", it: "Objek" }, postKeuanganDeposit: { id: "postKeuanganDeposit", m: "POST", path: "/v1/keuangan/deposit", tag: "Keuangan: Refund dan deposit", sum: "Tambah saldo deposit", ds: 'Pengelola. Body: {"nim", "jumlah", "keterangan", "referensi"}.', sc: ["keuangan:write"], r: "object", it: "Objek" }, postKeuanganDepositPakai: { id: "postKeuanganDepositPakai", m: "POST", path: "/v1/keuangan/deposit/pakai", tag: "Keuangan: Refund dan deposit", sum: "Bayar tagihan dari deposit", ds: 'Body: {"nim" (pengelola), "tahun_id", "kode_biaya", "jumlah" (bawaan sisa, dibatasi saldo)}. Mahasiswa boleh untuk miliknya. Dicatat sebagai pembayaran metode deposit.', sc: ["keuangan:write"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "object", it: "Objek" }, postKeuanganVoucherPakai: { id: "postKeuanganVoucherPakai", m: "POST", path: "/v1/keuangan/voucher/pakai", tag: "Keuangan: Potongan", sum: "Pakai voucher", ds: 'Body: {"kode", "nim" (pengelola), "tahun_id", "kode_biaya"}. Potongan langsung diterapkan ke tagihan (nominal tagihan dikurangi).', sc: ["keuangan:write"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "object", it: "Objek" }, getKeuanganInvoice: { id: "getKeuanganInvoice", m: "GET", path: "/v1/keuangan/invoice", tag: "Keuangan: Pembayaran dan kwitansi", sum: "Invoice pembayaran online", ds: "Mahasiswa melihat miliknya.", sc: ["keuangan:read"], pa: [{ nm: "status", in: "query", s: { t: "string" }, ds: "belum_bayar, dibayar, kedaluwarsa, batal" }, { nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }], r: "list", it: "Objek" }, postKeuanganInvoice: { id: "postKeuanganInvoice", m: "POST", path: "/v1/keuangan/invoice", tag: "Keuangan: Pembayaran dan kwitansi", sum: "Buat invoice pembayaran online", ds: 'Body: {"nim" (pengelola), "tahun_id", "kode_biaya", "jumlah" (bawaan sisa)}. Lalu POST /v1/integrasi/pembayaran {"sumber": {"modul": "keuangan", "referensi": nomor}, "metode": "va|qris|checkout"}; saat lunas pembayaran otomatis tercatat ke SIAKAD + kwitansi.', sc: ["keuangan:write"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi (wajib bila berwenang di lebih dari satu prodi; boleh juga di body)" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif (boleh juga di body)" }], r: "object", it: "Objek" }, getKeuanganRekonsiliasi: { id: "getKeuanganRekonsiliasi", m: "GET", path: "/v1/keuangan/rekonsiliasi", tag: "Keuangan: Rekonsiliasi dan laporan", sum: "Rekonsiliasi pembayaran", ds: "VA dibayar (keu_va) dan pembayaran online lunas yang belum tercatat di t_mahasiswa_bayar, plus perbandingan harian SIAKAD vs transaksi API.", sc: ["keuangan:read"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "YYYY-MM-DD" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "YYYY-MM-DD" }], r: "object", it: "Objek" }, postKeuanganRekonsiliasiVaById: { id: "postKeuanganRekonsiliasiVaById", m: "POST", path: "/v1/keuangan/rekonsiliasi/va/{id}", tag: "Keuangan: Rekonsiliasi dan laporan", sum: "Catat VA ke SIAKAD", ds: "VA yang sudah dibayar (keu_va) dicatat sebagai pembayaran. Idempoten.", sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string" }, rq: 1, ds: "keu_va.id" }], r: "object", it: "Objek" }, postKeuanganRekonsiliasiOnlineById: { id: "postKeuanganRekonsiliasiOnlineById", m: "POST", path: "/v1/keuangan/rekonsiliasi/online/{id}", tag: "Keuangan: Rekonsiliasi dan laporan", sum: "Teruskan ulang pembayaran online", ds: "Invoice yang lunas di payment gateway tetapi belum tercatat. Idempoten per order_id.", sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string" }, rq: 1, ds: "keu_mhs_invoice.id" }], r: "object", it: "Objek" }, getKeuanganLaporan: { id: "getKeuanganLaporan", m: "GET", path: "/v1/keuangan/laporan", tag: "Keuangan: Rekonsiliasi dan laporan", sum: "Laporan keuangan mahasiswa", ds: "Sama dengan /tagihan/rekap.", sc: ["keuangan:read"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif" }], r: "object", it: "Objek" }, getKeuanganLaporanHarian: { id: "getKeuanganLaporanHarian", m: "GET", path: "/v1/keuangan/laporan/harian", tag: "Keuangan: Rekonsiliasi dan laporan", sum: "Penerimaan harian", ds: "Total t_mahasiswa_bayar per tanggal + rincian metode dari transaksi API.", sc: ["keuangan:read"], pa: [{ nm: "prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: "Kode prodi" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "YYYY-MM-DD" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "YYYY-MM-DD" }], r: "object", it: "Objek" }, getKeuanganMahasiswaByNim: { id: "getKeuanganMahasiswaByNim", m: "GET", path: "/v1/keuangan/mahasiswa/{nim}", tag: "Keuangan: Mahasiswa", sum: "Ringkasan keuangan mahasiswa", ds: "Tagihan per periode (sama dengan Riwayat Keuangan), deposit, cicilan, potongan, dispensasi, invoice aktif, denda.", sc: ["keuangan:read"], pa: [{ nm: "nim", in: "path", s: { t: "string", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, rq: 1, ds: "NIM" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Batasi satu periode" }], r: "object", it: "Objek" }, getKeuanganMahasiswaByNimSyarat: { id: "getKeuanganMahasiswaByNimSyarat", m: "GET", path: "/v1/keuangan/mahasiswa/{nim}/syarat", tag: "Keuangan: Mahasiswa", sum: "Syarat keuangan KRS dan ujian", ds: "Hasil aturan bayar SIAKAD (cek_spp_persen untuk KRS, cek_spp_persen_ujian untuk ujian) + dispensasi disetujui. Untuk aplikasi KRS/ujian.", sc: ["keuangan:read"], pa: [{ nm: "nim", in: "path", s: { t: "string", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, rq: 1, ds: "NIM" }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: "Bawaan tahun aktif" }], r: "object", it: "Objek" }, getKeuanganPeriode: { id: "getKeuanganPeriode", m: "GET", path: "/v1/keuangan/periode", tag: "Keuangan: Pengaturan", sum: "Periode pembayaran: daftar", ds: "Jatuh tempo pembayaran per periode akademik (opsional per prodi dan jenis biaya) beserta aturan denda keterlambatan. Dipakai /keuangan/denda/hitung dan status jatuh tempo tagihan. Semua pemilik token ber-scope keuangan:read.", sc: ["keuangan:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "kode_prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "denda_jenis", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "aktif", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di nama" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuanganPeriode" }, postKeuanganPeriode: { id: "postKeuanganPeriode", m: "POST", path: "/v1/keuangan/periode", tag: "Keuangan: Pengaturan", sum: "Periode pembayaran: tambah", ds: "Pengelola modul.", sc: ["keuangan:write"], oleh: "pengelola", b: { ct: "application/json", ref: "KeuanganPeriodeInput", s: { t: "object", pr: { tahun_id: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, nama: { t: "string", max: 150 }, mulai: { t: "string", f: "date" }, jatuh_tempo: { t: "string", f: "date" }, denda_jenis: { t: "string", e: ["tidak_ada", "tetap", "per_hari", "persen"], d: "tidak_ada" }, denda_nilai: { t: "number", d: "0" }, denda_maks: { t: "number" }, kode_biaya_denda: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, keterangan: { t: "string" }, aktif: { t: "boolean", d: "1" } }, rq: ["tahun_id", "nama", "mulai", "jatuh_tempo"] }, rq: 1 }, r: "object", it: "KeuanganPeriode" }, getKeuanganPeriodeById: { id: "getKeuanganPeriodeById", m: "GET", path: "/v1/keuangan/periode/{id}", tag: "Keuangan: Pengaturan", sum: "Periode pembayaran: detail", ds: "Jatuh tempo pembayaran per periode akademik (opsional per prodi dan jenis biaya) beserta aturan denda keterlambatan. Dipakai /keuangan/denda/hitung dan status jatuh tempo tagihan. Semua pemilik token ber-scope keuangan:read.", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/periode", k: "id", d: "/v1/keuangan/periode/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganPeriode" }, putKeuanganPeriodeById: { id: "putKeuanganPeriodeById", m: "PUT", path: "/v1/keuangan/periode/{id}", tag: "Keuangan: Pengaturan", sum: "Periode pembayaran: ubah", ds: "Pengelola modul. Kolom yang tidak dikirim tidak berubah.", sc: ["keuangan:write"], oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/periode", k: "id", d: "/v1/keuangan/periode/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganPeriodeInput", s: { t: "object", pr: { tahun_id: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, nama: { t: "string", max: 150 }, mulai: { t: "string", f: "date" }, jatuh_tempo: { t: "string", f: "date" }, denda_jenis: { t: "string", e: ["tidak_ada", "tetap", "per_hari", "persen"], d: "tidak_ada" }, denda_nilai: { t: "number", d: "0" }, denda_maks: { t: "number" }, kode_biaya_denda: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, keterangan: { t: "string" }, aktif: { t: "boolean", d: "1" } }, rq: ["tahun_id", "nama", "mulai", "jatuh_tempo"] }, rq: 1 }, r: "object", it: "KeuanganPeriode" }, deleteKeuanganPeriodeById: { id: "deleteKeuanganPeriodeById", m: "DELETE", path: "/v1/keuangan/periode/{id}", tag: "Keuangan: Pengaturan", sum: "Periode pembayaran: hapus", ds: "Pengelola modul.", sc: ["keuangan:write"], oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/periode", k: "id", d: "/v1/keuangan/periode/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuanganUktKelompok: { id: "getKeuanganUktKelompok", m: "GET", path: "/v1/keuangan/ukt/kelompok", tag: "Keuangan: UKT", sum: "Kelompok UKT: daftar", ds: "Kelompok UKT per prodi (opsional per angkatan) dengan nominal untuk satu jenis biaya (m_item_biaya). Mahasiswa yang ditetapkan ke kelompok ditagih dengan nominal ini saat generate tagihan. Semua pemilik token ber-scope keuangan:read.", sc: ["keuangan:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "kode_prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "aktif", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuanganUktKelompok" }, postKeuanganUktKelompok: { id: "postKeuanganUktKelompok", m: "POST", path: "/v1/keuangan/ukt/kelompok", tag: "Keuangan: UKT", sum: "Kelompok UKT: tambah", ds: "Pengelola modul.", sc: ["keuangan:write"], oleh: "pengelola", b: { ct: "application/json", ref: "KeuanganUktKelompokInput", s: { t: "object", pr: { kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, semester_masuk: { t: "string", max: 5, p: "^[A-Za-z0-9._\\-/]+$" }, kelompok: { t: "string", max: 10, p: "^[A-Za-z0-9._\\-/]+$" }, nama: { t: "string", max: 100 }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, rupiah: { t: "number" }, keterangan: { t: "string" }, aktif: { t: "boolean", d: "1" } }, rq: ["kode_prodi", "kelompok", "kode_biaya", "rupiah"] }, rq: 1 }, r: "object", it: "KeuanganUktKelompok" }, getKeuanganUktKelompokById: { id: "getKeuanganUktKelompokById", m: "GET", path: "/v1/keuangan/ukt/kelompok/{id}", tag: "Keuangan: UKT", sum: "Kelompok UKT: detail", ds: "Kelompok UKT per prodi (opsional per angkatan) dengan nominal untuk satu jenis biaya (m_item_biaya). Mahasiswa yang ditetapkan ke kelompok ditagih dengan nominal ini saat generate tagihan. Semua pemilik token ber-scope keuangan:read.", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/ukt/kelompok", k: "id", d: "/v1/keuangan/ukt/kelompok/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganUktKelompok" }, putKeuanganUktKelompokById: { id: "putKeuanganUktKelompokById", m: "PUT", path: "/v1/keuangan/ukt/kelompok/{id}", tag: "Keuangan: UKT", sum: "Kelompok UKT: ubah", ds: "Pengelola modul. Kolom yang tidak dikirim tidak berubah.", sc: ["keuangan:write"], oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/ukt/kelompok", k: "id", d: "/v1/keuangan/ukt/kelompok/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganUktKelompokInput", s: { t: "object", pr: { kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, semester_masuk: { t: "string", max: 5, p: "^[A-Za-z0-9._\\-/]+$" }, kelompok: { t: "string", max: 10, p: "^[A-Za-z0-9._\\-/]+$" }, nama: { t: "string", max: 100 }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, rupiah: { t: "number" }, keterangan: { t: "string" }, aktif: { t: "boolean", d: "1" } }, rq: ["kode_prodi", "kelompok", "kode_biaya", "rupiah"] }, rq: 1 }, r: "object", it: "KeuanganUktKelompok" }, deleteKeuanganUktKelompokById: { id: "deleteKeuanganUktKelompokById", m: "DELETE", path: "/v1/keuangan/ukt/kelompok/{id}", tag: "Keuangan: UKT", sum: "Kelompok UKT: hapus", ds: "Pengelola modul.", sc: ["keuangan:write"], oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/ukt/kelompok", k: "id", d: "/v1/keuangan/ukt/kelompok/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuanganUktMahasiswa: { id: "getKeuanganUktMahasiswa", m: "GET", path: "/v1/keuangan/ukt/mahasiswa", tag: "Keuangan: UKT", sum: "Penetapan UKT mahasiswa: daftar", ds: "Kelompok UKT tiap mahasiswa. Satu penetapan aktif (ditetapkan) per mahasiswa per jenis biaya; penetapan baru otomatis membatalkan yang lama. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keuangan:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "nim", in: "query", s: { t: "string", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "kode_prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "kelompok_id", in: "query", s: { t: "string", rf: { l: "/v1/keuangan/ukt/kelompok", k: "id", d: "/v1/keuangan/ukt/kelompok/{id}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "berlaku_mulai", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "status", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di nim" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuanganUktMahasiswa" }, postKeuanganUktMahasiswa: { id: "postKeuanganUktMahasiswa", m: "POST", path: "/v1/keuangan/ukt/mahasiswa", tag: "Keuangan: UKT", sum: "Penetapan UKT mahasiswa: tambah", ds: "Pengelola modul.", sc: ["keuangan:write"], oleh: "pengelola", b: { ct: "application/json", ref: "KeuanganUktMahasiswaInput", s: { t: "object", pr: { nim: { t: "string", ds: "m_mahasiswa.NIM", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, kelompok_id: { t: "integer", ds: "ID di keu_mhs_ukt_kelompok" }, berlaku_mulai: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, dasar: { t: "string" }, status: { t: "string", e: ["usulan", "ditetapkan", "dibatalkan"], d: "ditetapkan" } }, rq: ["nim", "kelompok_id"] }, rq: 1 }, r: "object", it: "KeuanganUktMahasiswa" }, getKeuanganUktMahasiswaById: { id: "getKeuanganUktMahasiswaById", m: "GET", path: "/v1/keuangan/ukt/mahasiswa/{id}", tag: "Keuangan: UKT", sum: "Penetapan UKT mahasiswa: detail", ds: "Kelompok UKT tiap mahasiswa. Satu penetapan aktif (ditetapkan) per mahasiswa per jenis biaya; penetapan baru otomatis membatalkan yang lama. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/ukt/mahasiswa", k: "id", d: "/v1/keuangan/ukt/mahasiswa/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganUktMahasiswa" }, putKeuanganUktMahasiswaById: { id: "putKeuanganUktMahasiswaById", m: "PUT", path: "/v1/keuangan/ukt/mahasiswa/{id}", tag: "Keuangan: UKT", sum: "Penetapan UKT mahasiswa: ubah", ds: "Pengelola modul. Kolom yang tidak dikirim tidak berubah.", sc: ["keuangan:write"], oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/ukt/mahasiswa", k: "id", d: "/v1/keuangan/ukt/mahasiswa/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganUktMahasiswaInput", s: { t: "object", pr: { nim: { t: "string", ds: "m_mahasiswa.NIM", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, kelompok_id: { t: "integer", ds: "ID di keu_mhs_ukt_kelompok" }, berlaku_mulai: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, dasar: { t: "string" }, status: { t: "string", e: ["usulan", "ditetapkan", "dibatalkan"], d: "ditetapkan" } }, rq: ["nim", "kelompok_id"] }, rq: 1 }, r: "object", it: "KeuanganUktMahasiswa" }, deleteKeuanganUktMahasiswaById: { id: "deleteKeuanganUktMahasiswaById", m: "DELETE", path: "/v1/keuangan/ukt/mahasiswa/{id}", tag: "Keuangan: UKT", sum: "Penetapan UKT mahasiswa: hapus", ds: "Pengelola modul.", sc: ["keuangan:write"], oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/ukt/mahasiswa", k: "id", d: "/v1/keuangan/ukt/mahasiswa/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuanganTarifMk: { id: "getKeuanganTarifMk", m: "GET", path: "/v1/keuangan/tarif-mk", tag: "Keuangan: Tarif", sum: "Tarif per mata kuliah: daftar", ds: "Tarif per SKS atau per mata kuliah (kode_mk kosong = berlaku untuk semua mata kuliah yang tidak punya tarif khusus). Dipakai POST /keuangan/tagihan/generate-mk untuk menagih dari KRS. Semua pemilik token ber-scope keuangan:read.", sc: ["keuangan:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "kode_prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "dasar", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuanganTarifMk" }, postKeuanganTarifMk: { id: "postKeuanganTarifMk", m: "POST", path: "/v1/keuangan/tarif-mk", tag: "Keuangan: Tarif", sum: "Tarif per mata kuliah: tambah", ds: "Pengelola modul.", sc: ["keuangan:write"], oleh: "pengelola", b: { ct: "application/json", ref: "KeuanganTarifMkInput", s: { t: "object", pr: { kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, tahun_id: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, kode_mk: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, dasar: { t: "string", e: ["per_sks", "per_mk"], d: "per_sks" }, rupiah: { t: "number" }, keterangan: { t: "string" } }, rq: ["kode_prodi", "tahun_id", "kode_biaya", "rupiah"] }, rq: 1 }, r: "object", it: "KeuanganTarifMk" }, getKeuanganTarifMkById: { id: "getKeuanganTarifMkById", m: "GET", path: "/v1/keuangan/tarif-mk/{id}", tag: "Keuangan: Tarif", sum: "Tarif per mata kuliah: detail", ds: "Tarif per SKS atau per mata kuliah (kode_mk kosong = berlaku untuk semua mata kuliah yang tidak punya tarif khusus). Dipakai POST /keuangan/tagihan/generate-mk untuk menagih dari KRS. Semua pemilik token ber-scope keuangan:read.", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/tarif-mk", k: "id", d: "/v1/keuangan/tarif-mk/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganTarifMk" }, putKeuanganTarifMkById: { id: "putKeuanganTarifMkById", m: "PUT", path: "/v1/keuangan/tarif-mk/{id}", tag: "Keuangan: Tarif", sum: "Tarif per mata kuliah: ubah", ds: "Pengelola modul. Kolom yang tidak dikirim tidak berubah.", sc: ["keuangan:write"], oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/tarif-mk", k: "id", d: "/v1/keuangan/tarif-mk/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganTarifMkInput", s: { t: "object", pr: { kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, tahun_id: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, kode_mk: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, dasar: { t: "string", e: ["per_sks", "per_mk"], d: "per_sks" }, rupiah: { t: "number" }, keterangan: { t: "string" } }, rq: ["kode_prodi", "tahun_id", "kode_biaya", "rupiah"] }, rq: 1 }, r: "object", it: "KeuanganTarifMk" }, deleteKeuanganTarifMkById: { id: "deleteKeuanganTarifMkById", m: "DELETE", path: "/v1/keuangan/tarif-mk/{id}", tag: "Keuangan: Tarif", sum: "Tarif per mata kuliah: hapus", ds: "Pengelola modul.", sc: ["keuangan:write"], oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/tarif-mk", k: "id", d: "/v1/keuangan/tarif-mk/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuanganVoucher: { id: "getKeuanganVoucher", m: "GET", path: "/v1/keuangan/voucher", tag: "Keuangan: Potongan", sum: "Voucher: daftar", ds: "Kode voucher potongan. Mahasiswa memakainya lewat POST /keuangan/voucher/pakai; potongan langsung mengurangi tagihan. Hanya pengelola modul.", sc: ["keuangan:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "jenis", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "kode_prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "aktif", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di kode, nama" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuanganVoucher" }, postKeuanganVoucher: { id: "postKeuanganVoucher", m: "POST", path: "/v1/keuangan/voucher", tag: "Keuangan: Potongan", sum: "Voucher: tambah", ds: "Pengelola modul.", sc: ["keuangan:write"], oleh: "pengelola", b: { ct: "application/json", ref: "KeuanganVoucherInput", s: { t: "object", pr: { kode: { t: "string", max: 40, p: "^[A-Za-z0-9._\\-/]+$", ds: "(unik)" }, nama: { t: "string", max: 150 }, jenis: { t: "string", e: ["nominal", "persen"], d: "nominal" }, nilai: { t: "number" }, maks_potongan: { t: "number" }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, kuota: { t: "integer", min: 0, mx: 1e6 }, berlaku_mulai: { t: "string", f: "date" }, berlaku_sampai: { t: "string", f: "date" }, aktif: { t: "boolean", d: "1" } }, rq: ["kode", "nama", "nilai"] }, rq: 1 }, r: "object", it: "KeuanganVoucher" }, getKeuanganVoucherById: { id: "getKeuanganVoucherById", m: "GET", path: "/v1/keuangan/voucher/{id}", tag: "Keuangan: Potongan", sum: "Voucher: detail", ds: "Kode voucher potongan. Mahasiswa memakainya lewat POST /keuangan/voucher/pakai; potongan langsung mengurangi tagihan. Hanya pengelola modul.", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/voucher", k: "id", d: "/v1/keuangan/voucher/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganVoucher" }, putKeuanganVoucherById: { id: "putKeuanganVoucherById", m: "PUT", path: "/v1/keuangan/voucher/{id}", tag: "Keuangan: Potongan", sum: "Voucher: ubah", ds: "Pengelola modul. Kolom yang tidak dikirim tidak berubah.", sc: ["keuangan:write"], oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/voucher", k: "id", d: "/v1/keuangan/voucher/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganVoucherInput", s: { t: "object", pr: { kode: { t: "string", max: 40, p: "^[A-Za-z0-9._\\-/]+$", ds: "(unik)" }, nama: { t: "string", max: 150 }, jenis: { t: "string", e: ["nominal", "persen"], d: "nominal" }, nilai: { t: "number" }, maks_potongan: { t: "number" }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, kuota: { t: "integer", min: 0, mx: 1e6 }, berlaku_mulai: { t: "string", f: "date" }, berlaku_sampai: { t: "string", f: "date" }, aktif: { t: "boolean", d: "1" } }, rq: ["kode", "nama", "nilai"] }, rq: 1 }, r: "object", it: "KeuanganVoucher" }, deleteKeuanganVoucherById: { id: "deleteKeuanganVoucherById", m: "DELETE", path: "/v1/keuangan/voucher/{id}", tag: "Keuangan: Potongan", sum: "Voucher: hapus", ds: "Pengelola modul.", sc: ["keuangan:write"], oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/voucher", k: "id", d: "/v1/keuangan/voucher/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuanganPotongan: { id: "getKeuanganPotongan", m: "GET", path: "/v1/keuangan/potongan", tag: "Keuangan: Potongan", sum: "Potongan tagihan: daftar", ds: "Potongan, beasiswa, atau keringanan atas satu tagihan. Saat diterapkan, nominal tagihan di t_mahasiswa_bayar_tagihan dikurangi (query ubah tagihan menu Keuangan, tercatat di m_log); dibatalkan = dikembalikan. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keuangan:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "nim", in: "query", s: { t: "string", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "kode_prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "jenis", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "voucher_id", in: "query", s: { t: "string", rf: { l: "/v1/keuangan/voucher", k: "id", d: "/v1/keuangan/voucher/{id}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "status", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di nim, alasan" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuanganPotongan" }, postKeuanganPotongan: { id: "postKeuanganPotongan", m: "POST", path: "/v1/keuangan/potongan", tag: "Keuangan: Potongan", sum: "Potongan tagihan: tambah", ds: "Pengelola modul.", sc: ["keuangan:write"], oleh: "pengelola", b: { ct: "application/json", ref: "KeuanganPotonganInput", s: { t: "object", pr: { nim: { t: "string", ds: "m_mahasiswa.NIM", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, tahun_id: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, jenis: { t: "string", e: ["potongan", "beasiswa", "voucher", "lainnya"], d: "potongan" }, nominal: { t: "number" }, persen: { t: "number" }, alasan: { t: "string" }, catatan: { t: "string", ds: "(hanya pengelola)" } }, rq: ["nim", "kode_biaya"] }, rq: 1 }, r: "object", it: "KeuanganPotongan" }, getKeuanganPotonganById: { id: "getKeuanganPotonganById", m: "GET", path: "/v1/keuangan/potongan/{id}", tag: "Keuangan: Potongan", sum: "Potongan tagihan: detail", ds: "Potongan, beasiswa, atau keringanan atas satu tagihan. Saat diterapkan, nominal tagihan di t_mahasiswa_bayar_tagihan dikurangi (query ubah tagihan menu Keuangan, tercatat di m_log); dibatalkan = dikembalikan. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/potongan", k: "id", d: "/v1/keuangan/potongan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganPotongan" }, putKeuanganPotonganById: { id: "putKeuanganPotonganById", m: "PUT", path: "/v1/keuangan/potongan/{id}", tag: "Keuangan: Potongan", sum: "Potongan tagihan: ubah", ds: "Pengelola modul. Kolom yang tidak dikirim tidak berubah.", sc: ["keuangan:write"], oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/potongan", k: "id", d: "/v1/keuangan/potongan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganPotonganInput", s: { t: "object", pr: { nim: { t: "string", ds: "m_mahasiswa.NIM", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, tahun_id: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, jenis: { t: "string", e: ["potongan", "beasiswa", "voucher", "lainnya"], d: "potongan" }, nominal: { t: "number" }, persen: { t: "number" }, alasan: { t: "string" }, catatan: { t: "string", ds: "(hanya pengelola)" } }, rq: ["nim", "kode_biaya"] }, rq: 1 }, r: "object", it: "KeuanganPotongan" }, deleteKeuanganPotonganById: { id: "deleteKeuanganPotonganById", m: "DELETE", path: "/v1/keuangan/potongan/{id}", tag: "Keuangan: Potongan", sum: "Potongan tagihan: hapus", ds: "Pengelola modul.", sc: ["keuangan:write"], oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/potongan", k: "id", d: "/v1/keuangan/potongan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, postKeuanganPotonganByIdTerapkan: { id: "postKeuanganPotonganByIdTerapkan", m: "POST", path: "/v1/keuangan/potongan/{id}/terapkan", tag: "Keuangan: Potongan", sum: "Potongan tagihan: Terapkan potongan ke tagihan SIAKAD", ds: "Pengelola modul. Status harus diajukan, menjadi diterapkan.", sc: ["keuangan:write"], tr: { dari: ["diajukan"], ke: "diterapkan" }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/potongan", k: "id", d: "/v1/keuangan/potongan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganPotonganTerapkanInput", s: { t: "object", pr: { catatan: { t: "string", max: 1e3 } } }, rq: 1 }, r: "object", it: "KeuanganPotongan" }, postKeuanganPotonganByIdTolak: { id: "postKeuanganPotonganByIdTolak", m: "POST", path: "/v1/keuangan/potongan/{id}/tolak", tag: "Keuangan: Potongan", sum: "Potongan tagihan: Tolak", ds: "Pengelola modul. Status harus diajukan, menjadi ditolak.", sc: ["keuangan:write"], tr: { dari: ["diajukan"], ke: "ditolak" }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/potongan", k: "id", d: "/v1/keuangan/potongan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganPotonganTolakInput", s: { t: "object", pr: { catatan: { t: "string", max: 1e3 } }, rq: ["catatan"] }, rq: 1 }, r: "object", it: "KeuanganPotongan" }, postKeuanganPotonganByIdBatalkan: { id: "postKeuanganPotonganByIdBatalkan", m: "POST", path: "/v1/keuangan/potongan/{id}/batalkan", tag: "Keuangan: Potongan", sum: "Potongan tagihan: Batalkan (potongan yang sudah diterapkan dikembalikan ke tagihan)", ds: "Pengelola modul. Status harus diajukan/diterapkan, menjadi dibatalkan.", sc: ["keuangan:write"], tr: { dari: ["diajukan", "diterapkan"], ke: "dibatalkan" }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/potongan", k: "id", d: "/v1/keuangan/potongan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganPotonganBatalkanInput", s: { t: "object", pr: { catatan: { t: "string", max: 1e3 } } }, rq: 1 }, r: "object", it: "KeuanganPotongan" }, getKeuanganDispensasi: { id: "getKeuanganDispensasi", m: "GET", path: "/v1/keuangan/dispensasi", tag: "Keuangan: Dispensasi", sum: "Dispensasi pembayaran: daftar", ds: "Mahasiswa mengajukan dispensasi (tetap boleh KRS/ujian dengan janji bayar); pengelola keuangan memutuskan. Dispensasi yang disetujui tampil di GET /keuangan/mahasiswa/{nim}/syarat untuk aplikasi KRS/ujian. Aturan syarat bayar di halaman SIAKAD lama tidak diubah. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keuangan:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "nim", in: "query", s: { t: "string", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "kode_prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "untuk", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "status", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di nim, alasan" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuanganDispensasi" }, postKeuanganDispensasi: { id: "postKeuanganDispensasi", m: "POST", path: "/v1/keuangan/dispensasi", tag: "Keuangan: Dispensasi", sum: "Dispensasi pembayaran: tambah", ds: "Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan.", sc: ["keuangan:write"], b: { ct: "application/json", ref: "KeuanganDispensasiInput", s: { t: "object", pr: { nim: { t: "string", ds: "m_mahasiswa.NIM", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, tahun_id: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, untuk: { t: "string", e: ["krs", "ujian", "semua"], d: "semua" }, janji_bayar: { t: "string", f: "date" }, jumlah_janji: { t: "number" }, alasan: { t: "string" }, catatan: { t: "string", ds: "(hanya pengelola)" } }, rq: ["nim", "alasan"] }, rq: 1 }, r: "object", it: "KeuanganDispensasi" }, getKeuanganDispensasiById: { id: "getKeuanganDispensasiById", m: "GET", path: "/v1/keuangan/dispensasi/{id}", tag: "Keuangan: Dispensasi", sum: "Dispensasi pembayaran: detail", ds: "Mahasiswa mengajukan dispensasi (tetap boleh KRS/ujian dengan janji bayar); pengelola keuangan memutuskan. Dispensasi yang disetujui tampil di GET /keuangan/mahasiswa/{nim}/syarat untuk aplikasi KRS/ujian. Aturan syarat bayar di halaman SIAKAD lama tidak diubah. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/dispensasi", k: "id", d: "/v1/keuangan/dispensasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganDispensasi" }, putKeuanganDispensasiById: { id: "putKeuanganDispensasiById", m: "PUT", path: "/v1/keuangan/dispensasi/{id}", tag: "Keuangan: Dispensasi", sum: "Dispensasi pembayaran: ubah", ds: "Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan. Kolom yang tidak dikirim tidak berubah.", sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/dispensasi", k: "id", d: "/v1/keuangan/dispensasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganDispensasiInput", s: { t: "object", pr: { nim: { t: "string", ds: "m_mahasiswa.NIM", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, tahun_id: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, untuk: { t: "string", e: ["krs", "ujian", "semua"], d: "semua" }, janji_bayar: { t: "string", f: "date" }, jumlah_janji: { t: "number" }, alasan: { t: "string" }, catatan: { t: "string", ds: "(hanya pengelola)" } }, rq: ["nim", "alasan"] }, rq: 1 }, r: "object", it: "KeuanganDispensasi" }, deleteKeuanganDispensasiById: { id: "deleteKeuanganDispensasiById", m: "DELETE", path: "/v1/keuangan/dispensasi/{id}", tag: "Keuangan: Dispensasi", sum: "Dispensasi pembayaran: hapus", ds: "Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan.", sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/dispensasi", k: "id", d: "/v1/keuangan/dispensasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuanganDispensasiByIdBerkas: { id: "getKeuanganDispensasiByIdBerkas", m: "GET", path: "/v1/keuangan/dispensasi/{id}/berkas", tag: "Keuangan: Dispensasi", sum: "Dispensasi pembayaran: daftar lampiran", ds: "Siapa pun yang boleh melihat barisnya.", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/dispensasi", k: "id", d: "/v1/keuangan/dispensasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "list", it: "PusatBerkas" }, postKeuanganDispensasiByIdBerkas: { id: "postKeuanganDispensasiByIdBerkas", m: "POST", path: "/v1/keuangan/dispensasi/{id}/berkas", tag: "Keuangan: Dispensasi", sum: "Dispensasi pembayaran: unggah lampiran", ds: 'Multipart field "berkas" (atau JSON berkas_base64 + nama_file), opsional jenis dan keterangan. PDF, gambar, dokumen Office/ODF, CSV, TXT, ZIP; maksimal PUSAT_DATA_MAKS_MB (bawaan 20 MB). Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan.', sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/dispensasi", k: "id", d: "/v1/keuangan/dispensasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "multipart/form-data", ref: "PusatBerkasInput", s: { t: "object", pr: { berkas: { t: "string", f: "binary" }, jenis: { t: "string", ds: "Mis. lampiran, bukti, laporan" }, keterangan: { t: "string" }, berkas_base64: { t: "string", ds: "Alternatif JSON" }, nama_file: { t: "string" } } }, rq: 1 }, r: "object", it: "PusatBerkas" }, getKeuanganDispensasiByIdBerkasByUuid: { id: "getKeuanganDispensasiByIdBerkasByUuid", m: "GET", path: "/v1/keuangan/dispensasi/{id}/berkas/{uuid}", tag: "Keuangan: Dispensasi", sum: "Dispensasi pembayaran: unduh lampiran", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/dispensasi", k: "id", d: "/v1/keuangan/dispensasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }, { nm: "uuid", in: "path", s: { t: "string" }, rq: 1, ds: "UUID berkas" }], r: "object" }, deleteKeuanganDispensasiByIdBerkasByUuid: { id: "deleteKeuanganDispensasiByIdBerkasByUuid", m: "DELETE", path: "/v1/keuangan/dispensasi/{id}/berkas/{uuid}", tag: "Keuangan: Dispensasi", sum: "Dispensasi pembayaran: hapus lampiran", ds: "Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan.", sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/dispensasi", k: "id", d: "/v1/keuangan/dispensasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }, { nm: "uuid", in: "path", s: { t: "string" }, rq: 1, ds: "UUID berkas" }], r: "none" }, postKeuanganDispensasiByIdSetujui: { id: "postKeuanganDispensasiByIdSetujui", m: "POST", path: "/v1/keuangan/dispensasi/{id}/setujui", tag: "Keuangan: Dispensasi", sum: "Dispensasi pembayaran: Setujui", ds: "Pengelola modul. Status harus diajukan, menjadi disetujui.", sc: ["keuangan:write"], tr: { dari: ["diajukan"], ke: "disetujui" }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/dispensasi", k: "id", d: "/v1/keuangan/dispensasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganDispensasiSetujuiInput", s: { t: "object", pr: { catatan: { t: "string", max: 1e3 } } }, rq: 1 }, r: "object", it: "KeuanganDispensasi" }, postKeuanganDispensasiByIdTolak: { id: "postKeuanganDispensasiByIdTolak", m: "POST", path: "/v1/keuangan/dispensasi/{id}/tolak", tag: "Keuangan: Dispensasi", sum: "Dispensasi pembayaran: Tolak", ds: "Pengelola modul. Status harus diajukan, menjadi ditolak.", sc: ["keuangan:write"], tr: { dari: ["diajukan"], ke: "ditolak" }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/dispensasi", k: "id", d: "/v1/keuangan/dispensasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganDispensasiTolakInput", s: { t: "object", pr: { catatan: { t: "string", max: 1e3 } }, rq: ["catatan"] }, rq: 1 }, r: "object", it: "KeuanganDispensasi" }, postKeuanganDispensasiByIdBatalkan: { id: "postKeuanganDispensasiByIdBatalkan", m: "POST", path: "/v1/keuangan/dispensasi/{id}/batalkan", tag: "Keuangan: Dispensasi", sum: "Dispensasi pembayaran: Batalkan", ds: "Pemilik data atau pengelola. Status harus diajukan/disetujui, menjadi dibatalkan.", sc: ["keuangan:write"], tr: { dari: ["diajukan", "disetujui"], ke: "dibatalkan" }, oleh: "pemilik_atau_pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/dispensasi", k: "id", d: "/v1/keuangan/dispensasi/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganDispensasi" }, getKeuanganCicilan: { id: "getKeuanganCicilan", m: "GET", path: "/v1/keuangan/cicilan", tag: "Keuangan: Cicilan", sum: "Cicilan pembayaran: daftar", ds: "Mahasiswa mengajukan cicilan untuk satu tagihan; saat disetujui angsuran bulanan dibuat dari sisa tagihan. Pembayaran tagihan yang sama (lewat API) otomatis mengisi angsuran berurutan; semua lunas = status lunas. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keuangan:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "nim", in: "query", s: { t: "string", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "kode_prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "status", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di nim" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuanganCicilan" }, postKeuanganCicilan: { id: "postKeuanganCicilan", m: "POST", path: "/v1/keuangan/cicilan", tag: "Keuangan: Cicilan", sum: "Cicilan pembayaran: tambah", ds: "Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan.", sc: ["keuangan:write"], b: { ct: "application/json", ref: "KeuanganCicilanInput", s: { t: "object", pr: { nim: { t: "string", ds: "m_mahasiswa.NIM", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, tahun_id: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, jumlah_angsuran: { t: "integer", min: 2, mx: 24 }, mulai: { t: "string", f: "date" }, alasan: { t: "string" }, catatan: { t: "string", ds: "(hanya pengelola)" } }, rq: ["nim", "kode_biaya", "jumlah_angsuran"] }, rq: 1 }, r: "object", it: "KeuanganCicilan" }, getKeuanganCicilanById: { id: "getKeuanganCicilanById", m: "GET", path: "/v1/keuangan/cicilan/{id}", tag: "Keuangan: Cicilan", sum: "Cicilan pembayaran: detail", ds: "Mahasiswa mengajukan cicilan untuk satu tagihan; saat disetujui angsuran bulanan dibuat dari sisa tagihan. Pembayaran tagihan yang sama (lewat API) otomatis mengisi angsuran berurutan; semua lunas = status lunas. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/cicilan", k: "id", d: "/v1/keuangan/cicilan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganCicilan" }, putKeuanganCicilanById: { id: "putKeuanganCicilanById", m: "PUT", path: "/v1/keuangan/cicilan/{id}", tag: "Keuangan: Cicilan", sum: "Cicilan pembayaran: ubah", ds: "Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan. Kolom yang tidak dikirim tidak berubah.", sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/cicilan", k: "id", d: "/v1/keuangan/cicilan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganCicilanInput", s: { t: "object", pr: { nim: { t: "string", ds: "m_mahasiswa.NIM", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, tahun_id: { t: "string", ds: "m_tahun.tahun_id", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, jumlah_angsuran: { t: "integer", min: 2, mx: 24 }, mulai: { t: "string", f: "date" }, alasan: { t: "string" }, catatan: { t: "string", ds: "(hanya pengelola)" } }, rq: ["nim", "kode_biaya", "jumlah_angsuran"] }, rq: 1 }, r: "object", it: "KeuanganCicilan" }, deleteKeuanganCicilanById: { id: "deleteKeuanganCicilanById", m: "DELETE", path: "/v1/keuangan/cicilan/{id}", tag: "Keuangan: Cicilan", sum: "Cicilan pembayaran: hapus", ds: "Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan.", sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/cicilan", k: "id", d: "/v1/keuangan/cicilan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuanganCicilanByIdBerkas: { id: "getKeuanganCicilanByIdBerkas", m: "GET", path: "/v1/keuangan/cicilan/{id}/berkas", tag: "Keuangan: Cicilan", sum: "Cicilan pembayaran: daftar lampiran", ds: "Siapa pun yang boleh melihat barisnya.", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/cicilan", k: "id", d: "/v1/keuangan/cicilan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "list", it: "PusatBerkas" }, postKeuanganCicilanByIdBerkas: { id: "postKeuanganCicilanByIdBerkas", m: "POST", path: "/v1/keuangan/cicilan/{id}/berkas", tag: "Keuangan: Cicilan", sum: "Cicilan pembayaran: unggah lampiran", ds: 'Multipart field "berkas" (atau JSON berkas_base64 + nama_file), opsional jenis dan keterangan. PDF, gambar, dokumen Office/ODF, CSV, TXT, ZIP; maksimal PUSAT_DATA_MAKS_MB (bawaan 20 MB). Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan.', sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/cicilan", k: "id", d: "/v1/keuangan/cicilan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "multipart/form-data", ref: "PusatBerkasInput", s: { t: "object", pr: { berkas: { t: "string", f: "binary" }, jenis: { t: "string", ds: "Mis. lampiran, bukti, laporan" }, keterangan: { t: "string" }, berkas_base64: { t: "string", ds: "Alternatif JSON" }, nama_file: { t: "string" } } }, rq: 1 }, r: "object", it: "PusatBerkas" }, getKeuanganCicilanByIdBerkasByUuid: { id: "getKeuanganCicilanByIdBerkasByUuid", m: "GET", path: "/v1/keuangan/cicilan/{id}/berkas/{uuid}", tag: "Keuangan: Cicilan", sum: "Cicilan pembayaran: unduh lampiran", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/cicilan", k: "id", d: "/v1/keuangan/cicilan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }, { nm: "uuid", in: "path", s: { t: "string" }, rq: 1, ds: "UUID berkas" }], r: "object" }, deleteKeuanganCicilanByIdBerkasByUuid: { id: "deleteKeuanganCicilanByIdBerkasByUuid", m: "DELETE", path: "/v1/keuangan/cicilan/{id}/berkas/{uuid}", tag: "Keuangan: Cicilan", sum: "Cicilan pembayaran: hapus lampiran", ds: "Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan.", sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/cicilan", k: "id", d: "/v1/keuangan/cicilan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }, { nm: "uuid", in: "path", s: { t: "string" }, rq: 1, ds: "UUID berkas" }], r: "none" }, postKeuanganCicilanByIdSetujui: { id: "postKeuanganCicilanByIdSetujui", m: "POST", path: "/v1/keuangan/cicilan/{id}/setujui", tag: "Keuangan: Cicilan", sum: "Cicilan pembayaran: Setujui dan buat jadwal angsuran", ds: "Pengelola modul. Status harus diajukan, menjadi disetujui.", sc: ["keuangan:write"], tr: { dari: ["diajukan"], ke: "disetujui" }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/cicilan", k: "id", d: "/v1/keuangan/cicilan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganCicilanSetujuiInput", s: { t: "object", pr: { catatan: { t: "string", max: 1e3 }, mulai: { t: "string", f: "date" }, jumlah_angsuran: { t: "integer", min: 2, mx: 24 } } }, rq: 1 }, r: "object", it: "KeuanganCicilan" }, postKeuanganCicilanByIdTolak: { id: "postKeuanganCicilanByIdTolak", m: "POST", path: "/v1/keuangan/cicilan/{id}/tolak", tag: "Keuangan: Cicilan", sum: "Cicilan pembayaran: Tolak", ds: "Pengelola modul. Status harus diajukan, menjadi ditolak.", sc: ["keuangan:write"], tr: { dari: ["diajukan"], ke: "ditolak" }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/cicilan", k: "id", d: "/v1/keuangan/cicilan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganCicilanTolakInput", s: { t: "object", pr: { catatan: { t: "string", max: 1e3 } }, rq: ["catatan"] }, rq: 1 }, r: "object", it: "KeuanganCicilan" }, postKeuanganCicilanByIdBatalkan: { id: "postKeuanganCicilanByIdBatalkan", m: "POST", path: "/v1/keuangan/cicilan/{id}/batalkan", tag: "Keuangan: Cicilan", sum: "Cicilan pembayaran: Batalkan", ds: "Pemilik data atau pengelola. Status harus diajukan/disetujui, menjadi dibatalkan.", sc: ["keuangan:write"], tr: { dari: ["diajukan", "disetujui"], ke: "dibatalkan" }, oleh: "pemilik_atau_pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/cicilan", k: "id", d: "/v1/keuangan/cicilan/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganCicilan" }, getKeuanganRefund: { id: "getKeuanganRefund", m: "GET", path: "/v1/keuangan/refund", tag: "Keuangan: Refund dan deposit", sum: "Refund: daftar", ds: "Pengembalian dana (kelebihan bayar, batal studi). Tujuan deposit: saat disetujui saldo deposit langsung bertambah (status dibayar). Tujuan rekening: disetujui lalu ditandai dibayar setelah transfer. Pembayaran di t_mahasiswa_bayar tidak dihapus; untuk membatalkan pembayaran yang salah pakai POST /keuangan/transaksi/{id}/batal. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keuangan:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "nim", in: "query", s: { t: "string", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "kode_prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "transaksi_id", in: "query", s: { t: "string", rf: { l: "/v1/keuangan/transaksi", k: "id", d: "/v1/keuangan/transaksi/{id}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "tujuan", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "status", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di nim" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuanganRefund" }, postKeuanganRefund: { id: "postKeuanganRefund", m: "POST", path: "/v1/keuangan/refund", tag: "Keuangan: Refund dan deposit", sum: "Refund: tambah", ds: "Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan.", sc: ["keuangan:write"], b: { ct: "application/json", ref: "KeuanganRefundInput", s: { t: "object", pr: { nim: { t: "string", ds: "m_mahasiswa.NIM", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, transaksi_id: { t: "integer", ds: "ID di keu_mhs_transaksi" }, jumlah: { t: "number" }, alasan: { t: "string" }, tujuan: { t: "string", e: ["deposit", "rekening"], d: "rekening" }, bank: { t: "string", max: 50 }, no_rekening: { t: "string", max: 40, p: "^[A-Za-z0-9._\\-/]+$" }, atas_nama: { t: "string", max: 100 }, catatan: { t: "string", ds: "(hanya pengelola)" } }, rq: ["nim", "jumlah", "alasan"] }, rq: 1 }, r: "object", it: "KeuanganRefund" }, getKeuanganRefundById: { id: "getKeuanganRefundById", m: "GET", path: "/v1/keuangan/refund/{id}", tag: "Keuangan: Refund dan deposit", sum: "Refund: detail", ds: "Pengembalian dana (kelebihan bayar, batal studi). Tujuan deposit: saat disetujui saldo deposit langsung bertambah (status dibayar). Tujuan rekening: disetujui lalu ditandai dibayar setelah transfer. Pembayaran di t_mahasiswa_bayar tidak dihapus; untuk membatalkan pembayaran yang salah pakai POST /keuangan/transaksi/{id}/batal. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/refund", k: "id", d: "/v1/keuangan/refund/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganRefund" }, putKeuanganRefundById: { id: "putKeuanganRefundById", m: "PUT", path: "/v1/keuangan/refund/{id}", tag: "Keuangan: Refund dan deposit", sum: "Refund: ubah", ds: "Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan. Kolom yang tidak dikirim tidak berubah.", sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/refund", k: "id", d: "/v1/keuangan/refund/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganRefundInput", s: { t: "object", pr: { nim: { t: "string", ds: "m_mahasiswa.NIM", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, transaksi_id: { t: "integer", ds: "ID di keu_mhs_transaksi" }, jumlah: { t: "number" }, alasan: { t: "string" }, tujuan: { t: "string", e: ["deposit", "rekening"], d: "rekening" }, bank: { t: "string", max: 50 }, no_rekening: { t: "string", max: 40, p: "^[A-Za-z0-9._\\-/]+$" }, atas_nama: { t: "string", max: 100 }, catatan: { t: "string", ds: "(hanya pengelola)" } }, rq: ["nim", "jumlah", "alasan"] }, rq: 1 }, r: "object", it: "KeuanganRefund" }, deleteKeuanganRefundById: { id: "deleteKeuanganRefundById", m: "DELETE", path: "/v1/keuangan/refund/{id}", tag: "Keuangan: Refund dan deposit", sum: "Refund: hapus", ds: "Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan.", sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/refund", k: "id", d: "/v1/keuangan/refund/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "none" }, getKeuanganRefundByIdBerkas: { id: "getKeuanganRefundByIdBerkas", m: "GET", path: "/v1/keuangan/refund/{id}/berkas", tag: "Keuangan: Refund dan deposit", sum: "Refund: daftar lampiran", ds: "Siapa pun yang boleh melihat barisnya.", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/refund", k: "id", d: "/v1/keuangan/refund/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "list", it: "PusatBerkas" }, postKeuanganRefundByIdBerkas: { id: "postKeuanganRefundByIdBerkas", m: "POST", path: "/v1/keuangan/refund/{id}/berkas", tag: "Keuangan: Refund dan deposit", sum: "Refund: unggah lampiran", ds: 'Multipart field "berkas" (atau JSON berkas_base64 + nama_file), opsional jenis dan keterangan. PDF, gambar, dokumen Office/ODF, CSV, TXT, ZIP; maksimal PUSAT_DATA_MAKS_MB (bawaan 20 MB). Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan.', sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/refund", k: "id", d: "/v1/keuangan/refund/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "multipart/form-data", ref: "PusatBerkasInput", s: { t: "object", pr: { berkas: { t: "string", f: "binary" }, jenis: { t: "string", ds: "Mis. lampiran, bukti, laporan" }, keterangan: { t: "string" }, berkas_base64: { t: "string", ds: "Alternatif JSON" }, nama_file: { t: "string" } } }, rq: 1 }, r: "object", it: "PusatBerkas" }, getKeuanganRefundByIdBerkasByUuid: { id: "getKeuanganRefundByIdBerkasByUuid", m: "GET", path: "/v1/keuangan/refund/{id}/berkas/{uuid}", tag: "Keuangan: Refund dan deposit", sum: "Refund: unduh lampiran", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/refund", k: "id", d: "/v1/keuangan/refund/{id}" } }, rq: 1, ds: "ID angka atau UUID" }, { nm: "uuid", in: "path", s: { t: "string" }, rq: 1, ds: "UUID berkas" }], r: "object" }, deleteKeuanganRefundByIdBerkasByUuid: { id: "deleteKeuanganRefundByIdBerkasByUuid", m: "DELETE", path: "/v1/keuangan/refund/{id}/berkas/{uuid}", tag: "Keuangan: Refund dan deposit", sum: "Refund: hapus lampiran", ds: "Pengelola, atau pengguna untuk datanya sendiri (nim diisi otomatis); pemilik hanya bisa mengubah/menghapus bila status diajukan.", sc: ["keuangan:write"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/refund", k: "id", d: "/v1/keuangan/refund/{id}" } }, rq: 1, ds: "ID angka atau UUID" }, { nm: "uuid", in: "path", s: { t: "string" }, rq: 1, ds: "UUID berkas" }], r: "none" }, postKeuanganRefundByIdSetujui: { id: "postKeuanganRefundByIdSetujui", m: "POST", path: "/v1/keuangan/refund/{id}/setujui", tag: "Keuangan: Refund dan deposit", sum: "Refund: Setujui (tujuan deposit langsung masuk saldo)", ds: "Pengelola modul. Status harus diajukan, menjadi disetujui.", sc: ["keuangan:write"], tr: { dari: ["diajukan"], ke: "disetujui" }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/refund", k: "id", d: "/v1/keuangan/refund/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganRefundSetujuiInput", s: { t: "object", pr: { catatan: { t: "string", max: 1e3 } } }, rq: 1 }, r: "object", it: "KeuanganRefund" }, postKeuanganRefundByIdBayar: { id: "postKeuanganRefundByIdBayar", m: "POST", path: "/v1/keuangan/refund/{id}/bayar", tag: "Keuangan: Refund dan deposit", sum: "Refund: Tandai sudah ditransfer", ds: "Pengelola modul. Status harus disetujui, menjadi dibayar.", sc: ["keuangan:write"], tr: { dari: ["disetujui"], ke: "dibayar" }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/refund", k: "id", d: "/v1/keuangan/refund/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganRefundBayarInput", s: { t: "object", pr: { bukti_bayar: { t: "string", max: 100 }, catatan: { t: "string", max: 1e3 } } }, rq: 1 }, r: "object", it: "KeuanganRefund" }, postKeuanganRefundByIdTolak: { id: "postKeuanganRefundByIdTolak", m: "POST", path: "/v1/keuangan/refund/{id}/tolak", tag: "Keuangan: Refund dan deposit", sum: "Refund: Tolak", ds: "Pengelola modul. Status harus diajukan, menjadi ditolak.", sc: ["keuangan:write"], tr: { dari: ["diajukan"], ke: "ditolak" }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/refund", k: "id", d: "/v1/keuangan/refund/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganRefundTolakInput", s: { t: "object", pr: { catatan: { t: "string", max: 1e3 } }, rq: ["catatan"] }, rq: 1 }, r: "object", it: "KeuanganRefund" }, postKeuanganRefundByIdBatalkan: { id: "postKeuanganRefundByIdBatalkan", m: "POST", path: "/v1/keuangan/refund/{id}/batalkan", tag: "Keuangan: Refund dan deposit", sum: "Refund: Batalkan", ds: "Pemilik data atau pengelola. Status harus diajukan, menjadi dibatalkan.", sc: ["keuangan:write"], tr: { dari: ["diajukan"], ke: "dibatalkan" }, oleh: "pemilik_atau_pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/refund", k: "id", d: "/v1/keuangan/refund/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganRefund" }, getKeuanganDenda: { id: "getKeuanganDenda", m: "GET", path: "/v1/keuangan/denda", tag: "Keuangan: Denda", sum: "Denda keterlambatan: daftar", ds: "Denda yang dihitung POST /keuangan/denda/hitung dari periode pembayaran. Nominal ditagihkan sebagai tagihan kode_biaya_denda di tabel lama. Dihapuskan = tagihan denda dinolkan. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keuangan:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "nim", in: "query", s: { t: "string", rf: { l: "/v1/mahasiswa", k: "nim", d: "/v1/mahasiswa/{nim}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "kode_prodi", in: "query", s: { t: "string", rf: { l: "/v1/referensi/prodi", k: "kode_prodi", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "tahun_id", in: "query", s: { t: "string", rf: { l: "/v1/referensi/tahun-akademik", k: "tahun_id", q: 0 } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "periode_id", in: "query", s: { t: "string", rf: { l: "/v1/keuangan/periode", k: "id", d: "/v1/keuangan/periode/{id}" } }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "status", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "q", in: "query", s: { t: "string" }, ds: "Cari di nim" }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuanganDenda" }, getKeuanganDendaById: { id: "getKeuanganDendaById", m: "GET", path: "/v1/keuangan/denda/{id}", tag: "Keuangan: Denda", sum: "Denda keterlambatan: detail", ds: "Denda yang dihitung POST /keuangan/denda/hitung dari periode pembayaran. Nominal ditagihkan sebagai tagihan kode_biaya_denda di tabel lama. Dihapuskan = tagihan denda dinolkan. Pengelola melihat semua; pengguna lain hanya miliknya sendiri (nim).", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/denda", k: "id", d: "/v1/keuangan/denda/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganDenda" }, postKeuanganDendaByIdHapuskan: { id: "postKeuanganDendaByIdHapuskan", m: "POST", path: "/v1/keuangan/denda/{id}/hapuskan", tag: "Keuangan: Denda", sum: "Denda keterlambatan: Hapuskan denda (tagihan denda dinolkan)", ds: "Pengelola modul. Status harus aktif, menjadi dihapuskan.", sc: ["keuangan:write"], tr: { dari: ["aktif"], ke: "dihapuskan" }, oleh: "pengelola", pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/denda", k: "id", d: "/v1/keuangan/denda/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], b: { ct: "application/json", ref: "KeuanganDendaHapuskanInput", s: { t: "object", pr: { catatan: { t: "string", max: 1e3 } }, rq: ["catatan"] }, rq: 1 }, r: "object", it: "KeuanganDenda" }, getKeuanganKasir: { id: "getKeuanganKasir", m: "GET", path: "/v1/keuangan/kasir", tag: "Keuangan: Kasir", sum: "Sesi kasir: daftar", ds: "Sesi loket kasir. Buka dengan POST /keuangan/kasir/buka, tutup dengan POST /keuangan/kasir/{id}/tutup. Pembayaran oleh kasir yang sesinya terbuka otomatis masuk ke sesi itu. Hanya pengelola modul.", sc: ["keuangan:read"], pa: [{ nm: "page", in: "query", s: { t: "integer", min: 1, d: 1 }, ds: "Nomor halaman, mulai 1." }, { nm: "per_page", in: "query", s: { t: "integer", min: 1, mx: 100, d: 25 }, ds: "Jumlah data per halaman (maksimal 100)." }, { nm: "status", in: "query", s: { t: "string" }, ds: 'Filter kesamaan (isi "null" untuk kosong)' }, { nm: "dari", in: "query", s: { t: "string" }, ds: "Tanggal awal (YYYY-MM-DD)" }, { nm: "sampai", in: "query", s: { t: "string" }, ds: "Tanggal akhir (YYYY-MM-DD)" }, { nm: "urut", in: "query", s: { t: "string" }, ds: 'Nama kolom, awali "-" untuk menurun' }], r: "list", it: "KeuanganKasir" }, getKeuanganKasirById: { id: "getKeuanganKasirById", m: "GET", path: "/v1/keuangan/kasir/{id}", tag: "Keuangan: Kasir", sum: "Sesi kasir: detail", ds: "Sesi loket kasir. Buka dengan POST /keuangan/kasir/buka, tutup dengan POST /keuangan/kasir/{id}/tutup. Pembayaran oleh kasir yang sesinya terbuka otomatis masuk ke sesi itu. Hanya pengelola modul.", sc: ["keuangan:read"], pa: [{ nm: "id", in: "path", s: { t: "string", rf: { l: "/v1/keuangan/kasir", k: "id", d: "/v1/keuangan/kasir/{id}" } }, rq: 1, ds: "ID angka atau UUID" }], r: "object", it: "KeuanganKasir" } };
10
+ var mandiri = ["getKeuSerapan", "postKeuVaNotifikasi", "getKeuanganSaya", "getKeuanganTarif", "postKeuanganTarif", "postKeuanganTarifSalin", "postKeuanganTarifByIdbHapus", "getKeuanganTagihanRekap", "postKeuanganTagihanGenerate", "postKeuanganTagihanGenerateMk", "postKeuanganTagihanKirim", "postKeuanganDendaHitung", "postKeuanganKasirBuka", "postKeuanganDepositPakai", "postKeuanganVoucherPakai", "getKeuanganRekonsiliasi", "getKeuanganLaporan", "getKeuanganLaporanHarian"];
11
+ var skema = { Objek: { t: "object", ds: "Baris data dengan nama kolom huruf kecil sesuai tabel SIAKAD." }, KeuAkun: { t: "object", ds: "Akun (tabel keu_akun)", pr: { id: { t: "integer" }, induk_id: { t: "integer", ds: "ID di keu_akun" }, kode: { t: "string", max: 30, p: "^[A-Za-z0-9._\\-/]+$", ds: "(unik)" }, nama: { t: "string", max: 200 }, jenis: { t: "string", e: ["pendapatan", "belanja", "aset", "kewajiban", "ekuitas"] }, aktif: { t: "boolean", d: "1" }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuPeriode: { t: "object", ds: "Periode anggaran (tabel keu_periode)", pr: { id: { t: "integer" }, kode: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$", ds: "(unik)" }, nama: { t: "string", max: 100 }, mulai: { t: "string", f: "date" }, selesai: { t: "string", f: "date" }, status: { t: "string", e: ["perencanaan", "berjalan", "tutup"], d: "perencanaan" }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuRka: { t: "object", ds: "RKA unit (tabel keu_rka)", pr: { id: { t: "integer" }, periode_id: { t: "integer", ds: "ID di keu_periode" }, unit_id: { t: "integer", ds: "ID di induk_unit" }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi" }, judul: { t: "string", max: 200 }, revisi_ke: { t: "integer", min: 0, mx: 65535, ds: "(hanya baca)", ro: 1 }, total: { t: "number", ds: "(hanya baca)", ro: 1 }, status: { t: "string", e: ["draf", "diajukan", "revisi", "disetujui", "ditolak"], ds: "(hanya baca)", ro: 1 }, catatan: { t: "string", ds: "(hanya baca)", ro: 1 }, disetujui_oleh: { t: "string", ds: "user.username (hanya baca)", ro: 1 }, disetujui_pada: { t: "string", f: "date-time", ds: "(hanya baca)", ro: 1 }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, PusatBerkas: { t: "object", pr: { uuid: { t: "string" }, jenis: { t: "string" }, nama: { t: "string" }, mime: { t: "string" }, ukuran: { t: "integer" }, sha256: { t: "string" }, keterangan: { t: "string", n: 1 }, diunggah_oleh: { t: "string" }, created_at: { t: "string", f: "date-time" } } }, KeuRkaItem: { t: "object", ds: "Rincian RKA (tabel keu_rka_item)", pr: { id: { t: "integer" }, rka_id: { t: "integer", ds: "ID di keu_rka" }, unit_id: { t: "integer", ds: "ID di induk_unit (hanya baca)", ro: 1 }, akun_id: { t: "integer", ds: "ID di keu_akun" }, kode: { t: "string", max: 40, p: "^[A-Za-z0-9._\\-/]+$" }, kegiatan: { t: "string", max: 200 }, uraian: { t: "string", max: 255 }, volume: { t: "number", d: "1" }, satuan: { t: "string", max: 30, d: "paket" }, harga_satuan: { t: "number" }, jumlah: { t: "number", ds: "(hanya baca)", ro: 1 }, sumber_dana: { t: "string", max: 100 }, bulan: { t: "integer", min: 1, mx: 12 }, indikator: { t: "string", max: 255 }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuRealisasi: { t: "object", ds: "Pengajuan dana/realisasi (tabel keu_realisasi)", pr: { id: { t: "integer" }, nomor: { t: "string", max: 30, p: "^[A-Za-z0-9._\\-/]+$", ds: "(hanya baca)", ro: 1 }, rka_item_id: { t: "integer", ds: "ID di keu_rka_item" }, unit_id: { t: "integer", ds: "ID di induk_unit (hanya baca)", ro: 1 }, pengaju: { t: "string", ds: "user.username" }, jenis: { t: "string", e: ["uang_muka", "pembayaran_langsung", "penggantian"], d: "pembayaran_langsung" }, tanggal: { t: "string", f: "date" }, uraian: { t: "string", max: 255 }, jumlah: { t: "number" }, penerima: { t: "string", max: 150 }, rekening_penerima: { t: "string", max: 100 }, status: { t: "string", e: ["diajukan", "diverifikasi", "disetujui", "dibayar", "selesai", "ditolak", "dibatalkan"], ds: "(hanya baca)", ro: 1 }, tanggal_bayar: { t: "string", f: "date", ds: "(hanya baca)", ro: 1 }, nomor_bukti: { t: "string", max: 100, ds: "(hanya baca)", ro: 1 }, jumlah_spj: { t: "number", ds: "(hanya baca)", ro: 1 }, catatan: { t: "string", ds: "(hanya baca)", ro: 1 }, diverifikasi_oleh: { t: "string", ds: "user.username (hanya baca)", ro: 1 }, disetujui_oleh: { t: "string", ds: "user.username (hanya baca)", ro: 1 }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuPenerimaan: { t: "object", ds: "Penerimaan lain (tabel keu_penerimaan)", pr: { id: { t: "integer" }, periode_id: { t: "integer", ds: "ID di keu_periode" }, akun_id: { t: "integer", ds: "ID di keu_akun" }, unit_id: { t: "integer", ds: "ID di induk_unit" }, mitra_id: { t: "integer", ds: "ID di kerjasama_mitra" }, tanggal: { t: "string", f: "date" }, sumber: { t: "string", e: ["hibah_pemerintah", "hibah_swasta", "kerja_sama", "sewa", "donasi", "jasa_layanan", "bunga_bank", "lainnya"], d: "lainnya" }, uraian: { t: "string", max: 255 }, jumlah: { t: "number" }, nomor_bukti: { t: "string", max: 100 }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuVa: { t: "object", ds: "Virtual account (tabel keu_va)", pr: { id: { t: "integer" }, bank: { t: "string", max: 30, p: "^[A-Za-z0-9._\\-/]+$" }, nomor_va: { t: "string", max: 40, p: "^[A-Za-z0-9._\\-/]+$" }, nim: { t: "string", ds: "m_mahasiswa.NIM" }, tahun_id: { t: "string", ds: "m_tahun.tahun_id" }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, keterangan: { t: "string", max: 255 }, jumlah: { t: "number" }, jumlah_dibayar: { t: "number", ds: "(hanya baca)", ro: 1 }, berlaku_sampai: { t: "string", f: "date-time" }, status: { t: "string", e: ["aktif", "dibayar", "kedaluwarsa", "batal"], ds: "(hanya baca)", ro: 1 }, referensi_bank: { t: "string", max: 100, ds: "(hanya baca)", ro: 1 }, dibayar_pada: { t: "string", f: "date-time", ds: "(hanya baca)", ro: 1 }, data_bank: { t: "object", ds: "(hanya baca)", ro: 1 }, sudah_dibukukan: { t: "boolean", ds: "(hanya baca)", ro: 1 }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuanganPeriode: { t: "object", ds: "Periode pembayaran (tabel keu_mhs_periode)", pr: { id: { t: "integer" }, tahun_id: { t: "string", ds: "m_tahun.tahun_id" }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi" }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, nama: { t: "string", max: 150 }, mulai: { t: "string", f: "date" }, jatuh_tempo: { t: "string", f: "date" }, denda_jenis: { t: "string", e: ["tidak_ada", "tetap", "per_hari", "persen"], d: "tidak_ada" }, denda_nilai: { t: "number", d: "0" }, denda_maks: { t: "number" }, kode_biaya_denda: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, keterangan: { t: "string" }, aktif: { t: "boolean", d: "1" }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuanganUktKelompok: { t: "object", ds: "Kelompok UKT (tabel keu_mhs_ukt_kelompok)", pr: { id: { t: "integer" }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi" }, semester_masuk: { t: "string", max: 5, p: "^[A-Za-z0-9._\\-/]+$" }, kelompok: { t: "string", max: 10, p: "^[A-Za-z0-9._\\-/]+$" }, nama: { t: "string", max: 100 }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, rupiah: { t: "number" }, keterangan: { t: "string" }, aktif: { t: "boolean", d: "1" }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuanganUktMahasiswa: { t: "object", ds: "Penetapan UKT mahasiswa (tabel keu_mhs_ukt_mahasiswa)", pr: { id: { t: "integer" }, nim: { t: "string", ds: "m_mahasiswa.NIM" }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi (hanya baca)", ro: 1 }, kelompok_id: { t: "integer", ds: "ID di keu_mhs_ukt_kelompok" }, berlaku_mulai: { t: "string", ds: "m_tahun.tahun_id" }, dasar: { t: "string" }, status: { t: "string", e: ["usulan", "ditetapkan", "dibatalkan"], d: "ditetapkan" }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuanganTarifMk: { t: "object", ds: "Tarif per mata kuliah (tabel keu_mhs_tarif_mk)", pr: { id: { t: "integer" }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi" }, tahun_id: { t: "string", ds: "m_tahun.tahun_id" }, kode_mk: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, dasar: { t: "string", e: ["per_sks", "per_mk"], d: "per_sks" }, rupiah: { t: "number" }, keterangan: { t: "string" }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuanganVoucher: { t: "object", ds: "Voucher (tabel keu_mhs_voucher)", pr: { id: { t: "integer" }, kode: { t: "string", max: 40, p: "^[A-Za-z0-9._\\-/]+$", ds: "(unik)" }, nama: { t: "string", max: 150 }, jenis: { t: "string", e: ["nominal", "persen"], d: "nominal" }, nilai: { t: "number" }, maks_potongan: { t: "number" }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi" }, kuota: { t: "integer", min: 0, mx: 1e6 }, terpakai: { t: "integer", min: 0, mx: 1e6, ds: "(hanya baca)", ro: 1 }, berlaku_mulai: { t: "string", f: "date" }, berlaku_sampai: { t: "string", f: "date" }, aktif: { t: "boolean", d: "1" }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuanganPotongan: { t: "object", ds: "Potongan tagihan (tabel keu_mhs_potongan)", pr: { id: { t: "integer" }, nim: { t: "string", ds: "m_mahasiswa.NIM" }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi (hanya baca)", ro: 1 }, tahun_id: { t: "string", ds: "m_tahun.tahun_id" }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, jenis: { t: "string", e: ["potongan", "beasiswa", "voucher", "lainnya"], d: "potongan" }, nominal: { t: "number" }, persen: { t: "number" }, voucher_id: { t: "integer", ds: "ID di keu_mhs_voucher (hanya baca)", ro: 1 }, alasan: { t: "string" }, status: { t: "string", e: ["diajukan", "diterapkan", "ditolak", "dibatalkan"], ds: "(hanya baca)", ro: 1 }, idmb_tagihan: { t: "integer", min: 0, mx: 2147483647, ds: "(hanya baca)", ro: 1 }, rupiah_sebelum: { t: "number", ds: "(hanya baca)", ro: 1 }, rupiah_sesudah: { t: "number", ds: "(hanya baca)", ro: 1 }, catatan: { t: "string", ds: "(hanya pengelola)" }, diputus_oleh: { t: "string", max: 60, ds: "(hanya baca)", ro: 1 }, diputus_at: { t: "string", max: 30, ds: "(hanya baca)", ro: 1 }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuanganDispensasi: { t: "object", ds: "Dispensasi pembayaran (tabel keu_mhs_dispensasi)", pr: { id: { t: "integer" }, nim: { t: "string", ds: "m_mahasiswa.NIM" }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi (hanya baca)", ro: 1 }, tahun_id: { t: "string", ds: "m_tahun.tahun_id" }, untuk: { t: "string", e: ["krs", "ujian", "semua"], d: "semua" }, janji_bayar: { t: "string", f: "date" }, jumlah_janji: { t: "number" }, alasan: { t: "string" }, status: { t: "string", e: ["diajukan", "disetujui", "ditolak", "dibatalkan"], ds: "(hanya baca)", ro: 1 }, catatan: { t: "string", ds: "(hanya pengelola)" }, diputus_oleh: { t: "string", max: 60, ds: "(hanya baca)", ro: 1 }, diputus_at: { t: "string", max: 30, ds: "(hanya baca)", ro: 1 }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuanganCicilan: { t: "object", ds: "Cicilan pembayaran (tabel keu_mhs_cicilan)", pr: { id: { t: "integer" }, nim: { t: "string", ds: "m_mahasiswa.NIM" }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi (hanya baca)", ro: 1 }, tahun_id: { t: "string", ds: "m_tahun.tahun_id" }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$" }, total: { t: "number", ds: "(hanya baca)", ro: 1 }, jumlah_angsuran: { t: "integer", min: 2, mx: 24 }, mulai: { t: "string", f: "date" }, alasan: { t: "string" }, status: { t: "string", e: ["diajukan", "disetujui", "ditolak", "lunas", "dibatalkan"], ds: "(hanya baca)", ro: 1 }, catatan: { t: "string", ds: "(hanya pengelola)" }, diputus_oleh: { t: "string", max: 60, ds: "(hanya baca)", ro: 1 }, diputus_at: { t: "string", max: 30, ds: "(hanya baca)", ro: 1 }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuanganRefund: { t: "object", ds: "Refund (tabel keu_mhs_refund)", pr: { id: { t: "integer" }, nim: { t: "string", ds: "m_mahasiswa.NIM" }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi (hanya baca)", ro: 1 }, transaksi_id: { t: "integer", ds: "ID di keu_mhs_transaksi" }, jumlah: { t: "number" }, alasan: { t: "string" }, tujuan: { t: "string", e: ["deposit", "rekening"], d: "rekening" }, bank: { t: "string", max: 50 }, no_rekening: { t: "string", max: 40, p: "^[A-Za-z0-9._\\-/]+$" }, atas_nama: { t: "string", max: 100 }, status: { t: "string", e: ["diajukan", "disetujui", "ditolak", "dibayar", "dibatalkan"], ds: "(hanya baca)", ro: 1 }, catatan: { t: "string", ds: "(hanya pengelola)" }, bukti_bayar: { t: "string", max: 100, ds: "(hanya baca)", ro: 1 }, diputus_oleh: { t: "string", max: 60, ds: "(hanya baca)", ro: 1 }, diputus_at: { t: "string", max: 30, ds: "(hanya baca)", ro: 1 }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuanganDenda: { t: "object", ds: "Denda keterlambatan (tabel keu_mhs_denda)", pr: { id: { t: "integer" }, nim: { t: "string", ds: "m_mahasiswa.NIM (hanya baca)", ro: 1 }, kode_prodi: { t: "string", ds: "m_program_studi.kode_prodi (hanya baca)", ro: 1 }, tahun_id: { t: "string", ds: "m_tahun.tahun_id (hanya baca)", ro: 1 }, kode_biaya: { t: "string", max: 20, p: "^[A-Za-z0-9._\\-/]+$", ds: "(hanya baca)", ro: 1 }, periode_id: { t: "integer", ds: "ID di keu_mhs_periode (hanya baca)", ro: 1 }, sisa: { t: "number", ds: "(hanya baca)", ro: 1 }, hari_telat: { t: "integer", min: 0, mx: 1e5, ds: "(hanya baca)", ro: 1 }, jumlah: { t: "number", ds: "(hanya baca)", ro: 1 }, status: { t: "string", e: ["aktif", "dihapuskan"], ds: "(hanya baca)", ro: 1 }, catatan: { t: "string", ds: "(hanya pengelola)" }, dihitung_at: { t: "string", max: 30, ds: "(hanya baca)", ro: 1 }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } }, KeuanganKasir: { t: "object", ds: "Sesi kasir (tabel keu_mhs_kasir)", pr: { id: { t: "integer" }, kasir: { t: "string", max: 60, ds: "(hanya baca)", ro: 1 }, loket: { t: "string", max: 50, ds: "(hanya baca)", ro: 1 }, dibuka_at: { t: "string", max: 30, ds: "(hanya baca)", ro: 1 }, ditutup_at: { t: "string", max: 30, ds: "(hanya baca)", ro: 1 }, saldo_awal: { t: "number", ds: "(hanya baca)", ro: 1 }, total_tunai: { t: "number", ds: "(hanya baca)", ro: 1 }, total_nontunai: { t: "number", ds: "(hanya baca)", ro: 1 }, jumlah_transaksi: { t: "integer", min: 0, mx: 1e7, ds: "(hanya baca)", ro: 1 }, setoran: { t: "number", ds: "(hanya baca)", ro: 1 }, selisih: { t: "number", ds: "(hanya baca)", ro: 1 }, catatan: { t: "string", ds: "(hanya baca)", ro: 1 }, status: { t: "string", e: ["buka", "tutup"], ds: "(hanya baca)", ro: 1 }, created_at: { t: "string", n: 1, f: "date-time" }, updated_at: { t: "string", n: 1, f: "date-time" } } } };
12
+ var keu_default = { key, resources, ops, mandiri, skema };
13
+
14
+ exports.default = keu_default;
15
+ exports.key = key;
16
+ exports.mandiri = mandiri;
17
+ exports.ops = ops;
18
+ exports.resources = resources;
19
+ exports.skema = skema;
20
+ //# sourceMappingURL=keu-4TXF4FEP.cjs.map