diff --git a/migrate/parse api/data.json b/migrate/parse api/data.json
new file mode 100644
index 0000000000000000000000000000000000000000..811b2d0f4d01a0f1325cfe5796b2e39742c3a726
Binary files /dev/null and b/migrate/parse api/data.json differ
diff --git a/migrate/parse api/data_short.json b/migrate/parse api/data_short.json
new file mode 100644
index 0000000000000000000000000000000000000000..a5218a9760f08577b9774cac30e66197cc616bb1
--- /dev/null
+++ b/migrate/parse api/data_short.json	
@@ -0,0 +1,77 @@
+{"jumlah_data": 179633, "data": [
+    {
+        "tahun": 2019,
+        "idskpd": 1,
+        "kodeskpd": "1.01.01",
+        "namaskpd": "Dinas Pendidikan",
+        "kodeurusan": "1",
+        "namaurusan": "URUSAN PEMERINTAHAN WAJIB",
+        "idbidang": 1,
+        "kodebidang": "1.01",
+        "namabidang": "Pendidikan",
+        "idskpdsub": 2,
+        "kodeskpdsub": "1.01.01.01",
+        "namaskpdsub": "Sekretariat",
+        "idprogram": 56,
+        "kodeprogram": "1.01.001",
+        "namaprogram": "Program Pendidikan Menengah",
+        "idgiat": 1050,
+        "kodegiat": "1.01.1.01.01.01.1.001",
+        "namagiat": "KEGIATAN PENGEMBANGAN LAYANAN ASRAMA BINA SISWA CISARUA LEMBANG",
+        "idjenisgiat": 0,
+        "namajenisgiat": null,
+        "iddana": 1,
+        "namadana": "PAD",
+        "idbl": 4766,
+        "pagu": "3000000000",
+        "idakun": 610,
+        "kodeakun": "5.2.1.03.02",
+        "namaakun": "Uang Saku",
+        "idblrinci": 207886,
+        "kodekomponen": "10.1.1.01.01.01.001.00091",
+        "namakomponen": "Uang saku",
+        "spek": "",
+        "volume": "1386",
+        "koefisien": "1386 Orang",
+        "pajak": 0,
+        "hargasatuan": "75000",
+        "rincian": "103950000"
+      }, {
+        "tahun": 2009,
+        "idskpd": 1,
+        "kodeskpd": "1.01.01",
+        "namaskpd": "Dinas Pariwisata",
+        "kodeurusan": "1",
+        "namaurusan": "URUSAN PEMERINTAHAN WAJIB",
+        "idbidang": 1,
+        "kodebidang": "1.01",
+        "namabidang": "Pendidikan",
+        "idskpdsub": 2,
+        "kodeskpdsub": "1.01.01.01",
+        "namaskpdsub": "Sekretariat",
+        "idprogram": 56,
+        "kodeprogram": "1.01.001",
+        "namaprogram": "Program Pendidikan Menengah",
+        "idgiat": 1050,
+        "kodegiat": "1.01.1.01.01.01.1.001",
+        "namagiat": "KEGIATAN PENGEMBANGAN LAYANAN ASRAMA BINA SISWA CISARUA LEMBANG",
+        "idjenisgiat": 0,
+        "namajenisgiat": null,
+        "iddana": 1,
+        "namadana": "PAD",
+        "idbl": 4766,
+        "pagu": "3000000000",
+        "idakun": 610,
+        "kodeakun": "5.2.1.03.02",
+        "namaakun": "Uang Saku",
+        "idblrinci": 207886,
+        "kodekomponen": "10.1.1.01.01.01.001.00091",
+        "namakomponen": "Uang saku",
+        "spek": "",
+        "volume": "1386",
+        "koefisien": "1386 Orang",
+        "pajak": 0,
+        "hargasatuan": "75000",
+        "rincian": "103950000"
+      }]
+    }
\ No newline at end of file
diff --git a/migrate/parse api/dumpFromAPI.py b/migrate/parse api/dumpFromAPI.py
new file mode 100644
index 0000000000000000000000000000000000000000..6ba6118e7cc416ae4f8da5d9296ce391e8512961
--- /dev/null
+++ b/migrate/parse api/dumpFromAPI.py	
@@ -0,0 +1,6 @@
+import requests
+import json
+solditems = requests.get('http://apbd.jabarprov.go.id/api/bl-all?tahun=2019') # (your url)
+data = solditems.json()
+with open('data.json', 'w') as f:
+    json.dump(data, f)
\ No newline at end of file
diff --git a/migrate/parse api/parseData.py b/migrate/parse api/parseData.py
new file mode 100644
index 0000000000000000000000000000000000000000..3cf233e4b4f4a39022fc14edc49701b4b1e2c2e3
--- /dev/null
+++ b/migrate/parse api/parseData.py	
@@ -0,0 +1,157 @@
+import json
+import mongoengine
+
+mongo = mongoengine
+
+mongo.connect('viz-masy', host='localhost', port=27017)
+
+class Rekening(mongo.Document):
+    id_kegiatan = mongo.IntField(required=True)
+    kode_rekening = mongo.StringField(required=True)
+    nama_rekening = mongo.StringField(required=True)
+    jumlah_rincian = mongo.StringField(required=True)
+
+class Kegiatan(mongo.Document):
+    id_program = mongo.IntField(required=True)
+    id_kegiatan = mongo.IntField(required=True)
+    nama_kegiatan = mongo.StringField(required=True)
+    rekening = mongo.ListField(mongo.StringField(), default=[], required=True)
+    jumlah_rincian = mongo.StringField(default = '0')
+
+class Program(mongo.Document):
+    id_skpd = mongo.IntField(required=True)
+    id_program = mongo.IntField(required=True)
+    nama_program = mongo.StringField(required=True)
+    kegiatan = mongo.ListField(mongo.IntField(), default=[], required=True)
+    jumlah_rincian = mongo.StringField(default = '0')
+
+class SKPD(mongo.Document):
+    id_urusan = mongo.IntField(required=True)
+    id_skpd = mongo.IntField(required=True)
+    nama_skpd = mongo.StringField(required=True)
+    program = mongo.ListField(mongo.IntField(), default=[], required=True)
+    jumlah_rincian = mongo.StringField(default = '0')
+
+class Urusan(mongo.Document):
+    tahun = mongo.IntField(required=True)
+    id_urusan = mongo.IntField(required=True)
+    nama_urusan = mongo.StringField(required=True)
+    skpd = mongo.ListField(mongo.IntField(), default=[], required=True)
+    jumlah_rincian = mongo.StringField(default = '0')
+
+# Memuat data json dari file
+with open('data.json') as f:
+  data = json.load(f)
+# Data yang dipakai adalah sebuah list of dict
+# data['data']
+
+# Memasukkan data urusan
+print("Memroses data urusan...")
+urusan = { }
+for row in data['data']:
+        id_urusan = int(row['idbidang'])
+        nama_urusan = row['namabidang']
+        id_skpd = int(row['idskpd'])
+        if not(id_urusan in urusan):
+            newUrusan = {'id_urusan': id_urusan, 'nama_urusan': nama_urusan, 'skpd': [id_skpd]}
+            urusan[id_urusan] = newUrusan
+        else:
+            if not id_skpd in urusan[id_urusan]['skpd']:
+                urusan[id_urusan]['skpd'].append(id_skpd)
+for key in urusan.keys():
+    id_urusan = urusan[key]["id_urusan"]
+    nama_urusan = urusan[key]["nama_urusan"]
+    skpd = urusan[key]["skpd"]
+    new_urusan = Urusan(id_urusan=id_urusan, nama_urusan=nama_urusan, skpd=skpd, tahun=2019)
+    new_urusan.save()
+
+# memasukkan data skpd
+print("Memroses data skpd...")
+skpd = { }
+for row in data['data']:
+    id_urusan = int(row['idbidang'])
+    id_skpd = int(row['idskpd'])
+    nama_skpd = row['namaskpd']
+    id_program = int(row['idprogram'])
+    if not(id_skpd in skpd):
+        newSKPD = {'id_urusan': id_urusan, 'id_skpd': id_skpd, 'nama_skpd': nama_skpd, 'program': [id_program]}
+        skpd[id_skpd] = newSKPD
+    else:
+        if not id_program in skpd[id_skpd]['program']:
+            skpd[id_skpd]['program'].append(id_program)
+
+for key in skpd.keys():
+    new_skpd = SKPD(id_urusan=skpd[key]['id_urusan'], id_skpd=skpd[key]['id_skpd'], nama_skpd=skpd[key]['nama_skpd'], program=skpd[key]['program'])
+    new_skpd.save()
+
+# memasukkan data program
+print("Memroses data program...")
+program = { }
+for row in data['data']:
+    id_skpd = int(row['idskpd'])
+    id_program = int(row['idprogram'])
+    nama_program = row['namaprogram']
+    id_kegiatan = int(row['idgiat'])
+    if not(id_program in program):
+        newProgram = {'id_skpd': id_skpd, 'id_program': id_program, 'nama_program': nama_program, 'kegiatan': [id_kegiatan]}
+        program[id_program] = newProgram
+    else:
+        if not id_kegiatan in program[id_program]['kegiatan']:
+            program[id_program]['kegiatan'].append(id_kegiatan)
+for key in program.keys():
+    new_program = Program(id_skpd=program[key]['id_skpd'], id_program=program[key]['id_program'], nama_program=program[key]['nama_program'], kegiatan=program[key]['kegiatan'])
+    new_program.save()
+
+# memasukkan data kegiatan
+print("Memroses data kegiatan...")
+kegiatan = { }
+for row in data['data']:
+    id_program = int(row['idprogram'])
+    id_kegiatan = int(row['idgiat'])
+    nama_kegiatan = row['namagiat']
+    kode_rekening = row['kodeakun']
+    if not(id_kegiatan in kegiatan):
+        newKegiatan = {'id_program': id_program, 'id_kegiatan': id_kegiatan, 'nama_kegiatan': nama_kegiatan, 'rekening': [kode_rekening]}
+        kegiatan[id_kegiatan] = newKegiatan
+    else:
+        if not kode_rekening in kegiatan[id_kegiatan]['rekening']:
+            kegiatan[id_kegiatan]['rekening'].append(kode_rekening)
+for key in kegiatan.keys(): 
+    new_kegiatan = Kegiatan(id_program=kegiatan[key]['id_program'], id_kegiatan=kegiatan[key]['id_kegiatan'], nama_kegiatan=kegiatan[key]['nama_kegiatan'], rekening=kegiatan[key]['rekening'])
+    new_kegiatan.save()
+
+# memasukkan data rekening
+print("Memroses data rekening...")
+rekening = []
+for row in data['data']:
+    id_kegiatan = int(row['idgiat'])
+    kode_rekening = row['kodeakun']
+    nama_rekening = row['namaakun']
+    jumlah_rincian = str(row['rincian'])
+    newRekening = {'id_kegiatan': id_kegiatan, 'kode_rekening': kode_rekening, 'nama_rekening': nama_rekening, 'jumlah_rincian': jumlah_rincian}
+    rekening.append(newRekening)
+
+#menyimpan rekening dan mengupdate jumlah rincian
+for key in rekening: 
+    nominal = int(key['jumlah_rincian'])
+    new_rekening = Rekening(id_kegiatan=key['id_kegiatan'], kode_rekening=key['kode_rekening'], nama_rekening=key['nama_rekening'], jumlah_rincian=key['jumlah_rincian'])
+    new_rekening.save()
+    # Tambahkan jumlah rincian kegiatan
+    parent_kegiatan = Kegiatan.objects(id_kegiatan=key['id_kegiatan'])
+    id_program = parent_kegiatan[0]['id_program']
+    jumlah_rincian_kegiatan = int(parent_kegiatan[0]['jumlah_rincian']) + nominal
+    parent_kegiatan.update_one(set__jumlah_rincian=str(jumlah_rincian_kegiatan))
+    # Tambahkan jumlah rincian program
+    parent_program = Program.objects(id_program=id_program)
+    id_skpd = parent_program[0]['id_skpd']
+    jumlah_rincian_program = int(parent_program[0]['jumlah_rincian']) + nominal
+    parent_program.update_one(set__jumlah_rincian=str(jumlah_rincian_program))
+    # Tambahkan jumlah rincian skpd
+    parent_skpd = SKPD.objects(id_skpd=id_skpd)
+    id_urusan = parent_skpd[0]['id_urusan']
+    jumlah_rincian_skpd = int(parent_skpd[0]['jumlah_rincian']) + nominal
+    parent_skpd.update_one(set__jumlah_rincian=str(jumlah_rincian_skpd))
+    # Tambahkan jumlah rincian urusan
+    parent_urusan = Urusan.objects(id_urusan=id_urusan)
+    jumlah_rincian_urusan = int(parent_urusan[0]['jumlah_rincian']) + nominal
+    parent_urusan.update_one(set__jumlah_rincian=str(jumlah_rincian_urusan))
\ No newline at end of file
diff --git a/tests/unit_test.py b/tests/unit_test.py
new file mode 100644
index 0000000000000000000000000000000000000000..96ab85cd6e7020e2f2f1f1533e96ec606897124b
--- /dev/null
+++ b/tests/unit_test.py
@@ -0,0 +1,20 @@
+import unittest
+
+class TestStringMethods(unittest.TestCase):
+
+    def test_upper(self):
+        self.assertEqual('foo'.upper(), 'FOO')
+
+    def test_isupper(self):
+        self.assertTrue('FOO'.isupper())
+        self.assertFalse('Foo'.isupper())
+
+    def test_split(self):
+        s = 'hello world'
+        self.assertEqual(s.split(), ['hello', 'world'])
+        # check that s.split fails when the separator is not a string
+        with self.assertRaises(TypeError):
+            s.split(2)
+
+if __name__ == '__main__':
+    # unittest.main()
\ No newline at end of file