Oleh:
LUKMANNIL HAKIM
NIM: 1507115719
KATA PENGANTAR
Puji dan syukur penulis ucapkan kepada Allah Swt. karena dengan karunia
dan hidayah-Nya proposal skripsi dengan judul “Rancang Bangun Aplikasi
Tracking Bibit Kelapa Sawit dengan QR Code Berbasis Mobile Hybrid
Application” dapat diselesaikan. Salawat dan salam penulis ucapkan kepada Nabi
Muhammad saw. yang telah membawa umat manusia dari zaman kebodohan
menuju zaman yang penuh dengan ilmu pengetahuan. Penulis ucapkan terima
kasih kepada Bapak Dr. Feri Candra, S.T.,M.T. selaku dosen pembimbing yang
telah memberikan arahan dalam penyusunan proposal skripsi ini, sehingga dapat
selesai tepat waktu.
Penulis ucapkan terima kasih kepada semua pihak yang telah membantu
dalam penyusunan proposal skripsi ini. Proposal skripsi ini masih terdapat
kekurangan. Oleh karena itu, penulis mengharapkan pembaca dapat memberikan
kritik dan saran agar proposal skripsi ini menjadi sesuai dengan yang diharapkan.
Semoga proposal skripsi ini dapat memberikan manfaat bagi kemajuan ilmu
pengetahuan, pendidikan dan teknologi.
Lukmannil Hakim
ii
DAFTAR ISI
DAFTAR ISI..........................................................................................................ii
DAFTAR GAMBAR.............................................................................................iv
DAFTAR TABEL..................................................................................................v
BAB I PENDAHULUAN......................................................................................1
2.1.4 TypeScript..........................................................................................8
2.1.9 Node.js.............................................................................................10
3.5.2 Flowchart.........................................................................................24
3.6 Implementasi...........................................................................................40
3.7 Pengujian.................................................................................................40
3.9 Kesimpulan..............................................................................................41
DAFTAR PUSTAKA...........................................................................................42
iv
DAFTAR GAMBAR
Halama
DAFTAR TABEL
Halaman
Tabel 2.1 Penelitian terkait dengan aplikasi tracking bibit kelapa sawit.... 10
Tabel 3.1 Objek master.json yang memuat data primer bibit...................... 25
Tabel 3.2 Objek status.json yang memuat perubahan data status bibit....... 26
Tabel 3.3 Objek user.json yang memuat data pengguna............................. 26
Tabel 3.4 Objek asalbit.json yang memuat asal daerah bibit...................... 27
Tabel 3.5 Objek kirbit.json yang memuat data pengiriman bibit................ 27
Tabel 3.6 Objek klmpk.json yang menyimpan data kelompok bibit........... 27
Tabel 3.7 Objek lokasi.json yang memuat data lokasi pembibitan............. 28
Tabel 3.8 Objek varietas.json yang memuat data varietas bibit.................. 28
Tabel 3.9 Tabel ubah status untuk menyimpan data status bibit................. 29
Tabel 3.10 Tabel tambah bibit yang menyimpan data dan jumlah bibit....... 29
1
BAB I
PENDAHULUAN
sehingga banyak benih yang dibeli untuk pembibitan. Setelah benih dikelola di
pembibitan, bibit-bibit siap tanam dikirim ke kebun-kebun yang membutuhkan.
Permasalahan dalam distribusi bibit-bibit tersebut adalah pendataannya yang
kurang tepat dan rawan kesalahan. Sebagai contoh, permasalahan yang sering
terjadi adalah jumlah bibit yang dikirim dari lokasi pembibitan tidak sesuai
dengan bibit yang diterima di kebun. Jumlah bibit yang berkurang ketika
didistribusikan tentu menimbulkan kerugian terhadap PTPN V. Bibit-bibit yang
didistribusikan juga rentan dan memiliki kemungkinan untuk ditukar dengan bibit
lain di perjalanan. Permasalahan tersebut sulit untuk diselesaikan dengan cara
manual. Salah satu cara untuk memperkecil kemungkinan kerugian dari
permasalahan ini adalah dengan pemanfaatan teknologi.
Penelitian yang dilakukan oleh penulis diadaptasi dari sistem tracking
ekspedisi pengiriman barang. Tracking lokasi barang dapat dilakukan oleh
pengguna dengan memasukkan nomor resi pada sistem. Lalu, sistem akan
melakukan checking pada database untuk status lokasi terakhir barang dengan
nomor resi yang dimasukkan oleh pengguna. Status lokasi terakhir bibit akan
selalu berubah setiap barang berhenti di setiap checkpoint (Sitanggang, 2014).
Adaptasi dari sistem tersebut dilakukan pada sistem tracking bibit kelapa sawit.
Nomor ID pada bibit digunakan layaknya nomor resi. Namun, sistem ini dapat
menggunakan Quick Response (QR) code untuk mempermudah pengguna
melakukan input. Proses input perubahan status lokasi bibit diharapkan dapat
dilakukan dengan mudah, sehingga tidak mengganggu proses pengiriman.
Checkpoint untuk sistem ini adalah lokasi pembibitan dan lokasi penanaman bibit.
Kesimpulannya, diperlukan sebuah sistem untuk mengelola data
pembibitan dan dapat bekerja dengan data dalam jumlah besar. Sistem juga
diharapkan dapat merekam perubahan status lokasi bibit kelapa sawit dengan
efektif dan efisien. Sistem tersebut adalah sistem tracking bibit kelapa sawit
dengan QR code berbasis mobile hybrid application. QR code dapat digunakan
sebagai identitas bibit kelapa sawit dan digunakan sampai bibit sampai di
penanaman. Diharapkan pengguna dapat memantau lokasi bibit dan data lainnya
dengan aplikasi. Berdasarkan latar belakang diatas maka penulis tertarik untuk
3
3. Pengelolaan akun pengguna dan data bibit hanya dapat dilakukan oleh akun
administrator, sehingga dua hal tersebut tidak dapat dilakukan dalam aplikasi
mobile yang penulis kembangkan.
BAB I PENDAHULUAN
Bab ini berisi uraian tentang latar belakang, perumusan masalah, tujuan
penelitian, manfaat penelitian, batasan masalah dan sistematika penulisan.
Bab ini berisi tentang simpulan hasil penelitian yang diperoleh sesuai
dengan tujuan penelitian serta memuat saran mengenai problematika,
solusi, dan pengembangan kedepannya.
5
DAFTAR PUSTAKA
LAMPIRAN
6
BAB II
LANDASAN TEORI
tidak dapat menggunakan memori eksternal dan harga yang relatif tinggi. Dengan
beberapa kelemahan ini, iPhone tetap menjadi salah satu perangkat yang banyak
digunakan dalam masyarakat.
file teks biasa, tetapi dalam file HTML sebuah tulisan bisa memuat instruksi yang
ditandai dengan kode atau lebih dikenal dengan tag tertentu. HTML merupakan
bahasa dasar dalam pembuatan web, tetapi saat ini pemrograman web telah
menggunakan banyak kombinasi bahasa pemrograman.
2.1.4 TypeScript
TypeScript adalah sebuah superset dari JavaScript yang menambahkan
kesan lebih object oriented sehingga menyerupai pemrograman .NET yang
mampu melakukan compiling JavaScript dan dapat dijalankan di berbagai
browser (Maharry, 2013). JavaScript adalah bahasa pemrograman web yang
bersifat Client Side Programming Language. Client Side Programming Language
adalah tipe bahasa pemrograman yang pemrosesannya dilakukan oleh client.
Aplikasi client yang dimaksud merujuk kepada web browser. Bahasa
pemrograman client side berbeda dengan bahasa pemrograman server side seperti
PHP, dimana untuk server side seluruh kode program dijalankan di sisi server.
JavaScript memiliki fitur: high-level programming language, client-side, dan
berorientasi objek.
Karena TypeScript merupakan superset dari JavaScript, maka JavaScript
murni dapat dijalankan dalam TypeScript. Framework JavaScript seperti jQuery
dan AJAX dapat digunakan dalam TypeScript. TypeScript bertujuan agar
JavaScript cocok untuk pengembangan berskala aplikasi. TypeScript bersifat
open source sehingga dapat digunakan dengan gratis. Namun, penggunaan
TypeScript masih sedikit sehingga dokumentasi dari TypeScript tidak sebanyak
bahasa pemrograman popular saat ini.
di-compile akan menghasilkan beberapa rule CSS untuk berbagai selector seperti
spesifikasi pada file Sass. Sass dapat memantau file .sass atau .scss dan
menghasilkan keluaran file .css kapanpun file .sass atau .scss disimpan (Prabhu,
2015).
2.1.9 Node.js
Node.js merupakan sebuah perangkat lunak yang dirancang untuk
mengembangkan aplikasi berbasis web dengan menggunakan bahasa
pemrograman JavaScript (Nugroho, 2016). Node.js membuat JavaScript dapat
berjalan di sisi server seperi PHP. Node.js juga memiliki HTTP server library
sehingga memungkinkan untuk menjalankan server web tanpa menggunakan
aplikasi seperti Apache dan Nginx. Berbeda dengan PHP, Node.js bersifat non-
blocking sebagaimana JavaScript bekerja. Arti dari non-blocking adalah Node.js
hanya mengeksekusi thread yang terlibat (memiliki event). Sifat ini juga dapat
disebut sebagai single-threaded.
Tabel 2.1 Penelitian terkait dengan aplikasi tracking bibit kelapa sawit
No Penulis Judul Tahun Hasil
1. Alvianto Aplikasi sistem 2017 Sistem dapat memonitor
Romansyah, pelacakan kinerja setiap kendaraan yang
Heru pengiriman pada digunakan oleh sopir
Supriyono truk pengangkut sehingga dapat dilakukan
barang berbasis penilaian terhadap sopir
android tersebut, memberikan
informasi proses
pengiriman sehingga
admin dapat mengetahui
lokasi barang dan
meneruskan kepada
customer, memberikan
informasi lokasi serta
status kendaraan sehingga
admin dapat
memperkirakan waktu
pengiriman
2. Herdiana Aplikasi ekspedisi 2017 Sistem dapat melakukan
Sefriani, Elis barang berbasis pengecekan status
Hernawati, web (studi kasus pengiriman barang,
Ferra Arik pada PT Hasanah mengubah status
Tridalestari Multiguna pengiriman barang,
Ekspres) memasukkan data
pengiriman barang. Sistem
juga menyediakan fitur
untuk menyampaikan
keluhan terkait barang
15
dapat dikorelasikan
dengan database asli
perusahaan
7. Ichsan Indra Aplikasi 2016 Sistem ini telah berhasil
Wahyudi, Monitoring dibangun mengikuti
Aridhanyati Pengiriman pendekatan model proses
Arifin Barang dengan waterfall. Algoritma
Algoritma Dijsktra telah berhasil
Dijkstra diimplementasikan untuk
mendapatkan rute
pengiriman barang
terpendek
8. Ria Setiawanti Analisis dan 2012 Analisis dan perancangan
Perancangan sistem ini akan
Sistem Pelacakan mempermudah PT.
Pengiriman Prima Express untuk
Barang Berbasis mengembangkannya pada
WAP dan SMS tahap selanjutnya. Sistem
yang dihasilkan berbasis
WAP yang dapat diakses
secara online oleh
user
9. Noventa Perancangan 2016 Sistem ini meningkatkan
Pungki Aplikasi fasilitas untuk
Ristantyo Pemantauan kenyamanan konsumen
Lokasi Barang dalam menggunakan
Auto-Update layanan jasa pengiriman
Berbasis Android tersebut. Sistem ini dapat
untuk Jasa menampilkan informasi
Pengiriman paket, lokasi kurir yang
Barang pada sedang membawa paket,
Harkirana Cargo dan dapat melihat status
Yogyakarta pengirim
10. Setiawan Aplikasi Tracking 2017 Sistem ini menggunakan
Dimas Pengiriman desain responsive ini
Arimurti Barang memberikan informasi
Menggunakan detail dan progress barang
Responsive Web yang dikirim melalui jasa
Desain pengiriman barang kafila
Express. Sistem ini
membutuhkan koneksi
internet untuk
menjalankan aplikasi baik
untuk user maupun admin
17
18
BAB III
METODOLOGI PENELITIAN
sistem harus didefinisikan secara jelas diawal pengerjaan sistem. Metode ini
sering digunakan oleh penganalisa sistem pada umumnya. Berikut ini alur tahapan
pengerjaan sistem yang penulis gunakan.
1. Text editor. Aplikasi ini digunakan untuk membuat dan memodifikasi script
pada sistem.
2. Browser. Aplikasi ini digunakan sebagai live preview sistem pada komputer.
Browser dapat menggantikan Smartphone yang merupakan platform
sebenarnya dari sistem.
3. Smartphone. Walaupun sistem dapat dijalankan dengan Browser, penulis
perlu mengoperasikan di platform sebenarnya. Hal ini dilakukan untuk
memeriksa pengoperasian sistem dapat bekerja dengan baik dan benar.
4. Command Prompt. Aplikasi ini digunakan untuk mengeksekusi script yang
telah dibuat dengan text editor.
5. Node.js. Aplikasi ini digunakan agar JavaScript dapat berjalan di sisi server
lokal.
6. Ionic dan Cordova. Framework ini membantu penulis untuk membangun
sistem.
Kebutuhan perangkat lunak pada sisi pengguna tidak terlalu rumit. Kebutuhan
minimum perangkat lunak yang diperlukan oleh pengguna adalah sistem operasi
Android 4.4 ataupun iOS 8 pada smartphone yang digunakan.
Gambar 3.4 menampilkan flowchart untuk fitur cek status bibit. Pengguna
memindai kode QR yang memuat kode bibit. Setelah pemindaian, sistem akan
mencari kode bibit di database. Apabila kode bibit ditemukan, pengguna akan
dialihkan ke halaman data bibit.
26
Gambar 3.9 Flowchart halaman penyimpanan offline data ubah status bibit
34
b. Status
Objek ini memuat dan mendokumentasikan perubahan data pada objek
master.json. Data dalam objek ini tidak boleh diubah atau dihapus. Data
35
c. User
Objek ini memuat data akun pengguna sistem. Hanya pekerja di
pembibitan yang memiliki akun pengguna dalam aplikasi.
Tabel 3.3 Objek user.json yang memuat data pengguna
d. Asalbit
Objek ini memuat data asal daerah bibit yang dimiliki di pembibitan
PTPN V. Data ini juga berisi keterangan dan penjelasan asal bibit yang
dibeli.
37
e. Kirbit
Objek ini memuat data pengiriman bibit. Data ini digunakan dalam
laporan pengiriman bibit.
Tabel 3.5 Objek kirbit.json yang memuat data pengiriman bibit
No Key Type Value
f. Klmpk
Objek ini memuat data kelompok bibit. Data ini juga berisi keterangan
dan detail kelompok bibit.
Tabel 3.6 Objek klmpk.json yang menyimpan data kelompok bibit
No Key Type Value
38
g. Lokasi
Objek ini memuat data lokasi penempatan bibit. Data ini dapat memuat
lokasi pembibitan dan penanaman. Lokasi pembibitan dibagi menjadi dua,
yaitu pre nursery (PN) dan main nursery (MN).
Tabel 3.7 Objek lokasi.json yang memuat data lokasi pembibitan
No Key Type Value
h. Varietas
Objek ini memuat data varietas bibit. Varietas bibit yang dimiliki oleh
PTPN V disimpan di tabel ini
Tabel 3.8 Objek varietas.json yang memuat data varietas bibit
No Key Type Value
3.7 Implementasi
Implementasi dari aplikasi tracking bibit kelapa sawit dengan QR code
menggunakan bahasa pemrograman TypeScript, HTML, dan SQL. Penulis
menggunakan Ionic framework untuk membangun aplikasi hybrid. Aplikasi
hybrid dapat diekspor ke sistem operasi Android dan iOS.
3.8 Pengujian
Pengujian sistem dilakukan setelah aplikasi tracking bibit kelapa sawit
dengan QR code selesai dibangun. Pengujian dilakukan di Kantor Pusat PTPN V.
Pengujian dilakukan untuk membuktikan dan mendokumentasikan tingkat
keberhasilan sistem dalam mengatasi masalah pengelolaan bibit. Kepala Sub
Bagian Teknologi Informasi akan mengundang pengguna aplikasi yaitu pegawai
yang bekerja di pembibitan untuk melakukan pengujian aplikasi. Pertama, penulis
menjabarkan mekanisme penggunaan aplikasi kepada pengguna. Kemudian,
dilakukan demonstrasi pemakaian aplikasi. Setelah setiap pegawai mencoba
aplikasi, pegawai dapat menilai kesesuaian sistem dengan kebutuhan yang
diinginkan. Pengujian dilakukan dengan usability testing dan black box testing.
Untuk usability testing, penulis menggunakan quesionnaire yang diberikan pada
empat pegawai kantor pusat PTPN V dan enam pegawai pembibitan. Secara
bersamaan, usability testing dilakukan dengan black box testing dengan meminta
responden untuk menguji kesesuaian fungsi sistem sesuai dengan pernyataan
tentang sistem informasi tersebut. Kuesioner untuk usability testing pada pegawai
PTPN V dapat dilihat pada tabel 3.11.
Tabel 3.11 Tabel pernyataan usability testing
No
Pernyataan
.
42
3.10 Kesimpulan
Kesimpulan adalah tahapan terakhir dari metode waterfall. Pada tahap ini
didapatkan suatu simpulan dari aplikasi yang telah diselesaikan.
43
BAB IV
HASIL DAN PEMBAHASAN
Gambar 4.3 Tampilan menu utama sistem pada tab penambahan data
47
Gambar 4.3 Tampilan menu utama sistem pada tab pengubahan status data
pengubahan status untuk kirim, terima, dan afkir bibit. UI dari halaman
pengubahan data dapat dilihat pada gambar 4.8 dan gambar 4.9.
Gambar 4.8 Tampilan sistem pada halaman pengubahan status data tab online
51
Gambar 4.9 Tampilan sistem pada halaman pengubahan status data tab offline
Gambar 4.19 Tampilan halaman data input yang tersimpan di offline database
Gambar 4.21 Tampilan sistem detail data bibit setelah pemindaian berhasil
57
Gambar 4.22 Tampilan pop up apabila QR code yang di scan tidak valid
4.2.9 Usability Testing
Penulis menggunakan USE quesionnaire pada usability testing di sistem
ini. Pengujian ini dilakukan bersama empat pegawai kantor pusat PTPN V dan
enam responden pada pegawai pembibitan yang telah diajari penggunaan sistem.
Data respon dari usability testing ini akan dihitung dengan menggunakan skala
Likert. Hasil kuesioner komponen usefulness dapat dilihat pada tabel 4.1.
Aplikasi
dapat
mempermuda
h Pegawai
2 PTPN V 5 4 1 44 88
dalam
pendataan
pengiriman
bibit.
Fitur QR
Scan
mempermuda
3 h Pegawai 9 1 49 98
PTPN V
mengidentifik
asi data bibit
Fitur simpan
offline
membantu
Pegawai
PTPN V yang
4 6 4 46 92
bekerja di
daerah yang
sulit
mendapatkan
akses internet
Total 186
Rata-rata 9,3 93
Hasil kuesioner pada komponen ease of use pada pegawai PTPN V dapat
dilihat pada tabel 4.2.
aplikasi
memberikan
respon yang
baik ketika
digunakan.
Total 95
Rata-rata 9,5 95
Rata-rata 9,0 90
manfaat untuk
Pegawai
PTPN V
Total 94
Hasil usability testing dari enam responden pegawai PTPN V dapat dilihat
pada tabel 4.5.
Hasil black box testing dari sistem ini menunjukkan bahwa seluruh fungsi
sistem telah bekerja dengan benar.
62
BAB V
PENUTUP
5.1 Kesimpulan
Berdasarkan hasil penelitian Rancang Bangun Aplikasi Tracking Bibit
Kelapa Sawit dengan QR Code Berbasis Mobile Hybrid Application dapat
disimpulkan bahwa:
1. Sistem yang dibangun dapat menggunakan dua jenis database, yaitu Firebase
sebagai online database dan SQLite sebagai offline database.
2. Pengguna dapat melakukan login dengan akun yang telah diberikan oleh
administrator. Setiap aktivitas pengguna yang mengubah data pada database
dapat dilihat oleh administrator. Dokumentasi perubahan data status bibit
memberikan kemudahan dalam pengelolaan data bibit.
3. Sistem ini dapat menambahkan data bibit dengan jumlah besar dan dengan
durasi proses yang cukup singkat.
4. Menggunakan USE Quesionnaire, usability testing yang dilakukan pada
pengujian sistem bersama enam pegawai PTPN V menghasilkan persentase
usefulness 92,5%, ease of use 95%, ease of learning 91,67%, dan satisfaction
95%. Seluruh aspek mendapat nilai sangat memuaskan.
5. Hasil black box testing dari sistem ini menunjukkan bahwa seluruh fungsi
sistem telah bekerja dengan benar.
5.2 Saran
Pada Aplikasi Tracking Bibit Kelapa Sawit dengan QR Code Berbasis
Mobile Hybrid Application masih dapat dikembangkan. Berdasarkan berbagai
kekurangan yang ada pada sistem ini, dapat diberikan beberapa saran sebagai
berikut:
1. Performa sistem pada proses scanning perlu ditingkatkan kecepatan dan
efektifitasnya.
2. Pengujian sistem bisa dilakukan dengan metode White Box.
63
DAFTAR PUSTAKA
LAMPIRAN
67
1. Halaman Login
<ion-header>
<ion-toolbar color="light" >
<ion-title color="ptpn">Login</ion-title>
</ion-toolbar>
</ion-header>
<ion-item>
<ion-label color="ptpn"
position="floating">Username</ion-label>
<ion-input clearInput [(ngModel)]="id"></ion-input>
</ion-item>
<ion-item (click)="showw=true">
<ion-label color="ptpn"
position="floating">Password</ion-label>
<div style="display:flex;width:100%;">
<ion-input item-left type="{{type}}"
(ionChange)="showw=true" (blur)="showww()"
(click)="showww()" (change)="showww()" (focus)="showww()"
[(ngModel)]="pass" id="leftt"></ion-input>
</ion-item>
<br/>
<ion-button color="ptpn" expand="block"
(click)="buttonLogin()">Login</ion-button>
<ion-button color="ptpn" expand="block"
(click)="buttonLoginOff()">Offline Login</ion-button>
<ion-button color="light" expand="block"
(click)="luPass()">Lupa Password</ion-button>
</div>
</ion-content>
// Back-end
// import 'rxjs/add/operator/map';
import { AngularFireDatabase, AngularFireList,
AngularFireObject } from '@angular/fire/database';
@Component({
selector: 'app-login',
templateUrl: './login.page.html',
styleUrls: ['./login.page.scss'],
})
export class LoginPage implements OnInit {
max_list: any;
hitung: any = 0;
69
load: any = 0;
warna: any = "primary";
akunoff={};
constructor(
private db: DbconService,
private dbo: LokalService,
public database: AngularFireDatabase,
public alertCtrl: AlertController,
public loadCtrl: LoadingController,
public navCtrl: NavController,
public lokal: LokalService
) { }
ngOnInit() {
console.log("Enkripsi: " + this.enkripsi("potapota"));
// let x = this.lokal.loadAkunOff();
console.log(this.lokal.akun_off);
this.dbo.getDatabaseState().subscribe(rdy => {
if (rdy) {
this.dbo.getAkunOffs().subscribe(devs => {
this.akunoff = devs;
console.log(this.akunoff);
});
}
});
}
luPass(){
this.navCtrl.navigateRoot('/home');
}
buttonLogin(){
this.load = 1;
// this.cekAkun();
let p = this.return_code;
console.log("Status: "+this.return_code);
this.loadMasuk();
}
70
buttonLoginOff(){
this.load = 1;
// this.cekAkun();
let p = this.return_code;
console.log("Status: "+this.return_code);
this.loadMasukOff();
}
async loadMasuk1() {
const loading = await this.loadCtrl.create({
spinner: 'crescent',
duration: 3000,
message: 'Authenticating...'
});
await loading.present();
this.cekAkun();
async loadMasuk() {
const loading = await this.loadCtrl.create({
spinner: 'crescent',
duration: 3000,
message: 'Authenticating...'
});
await loading.present();
this.cekAkun();
async loadMasukOff() {
const loading = await this.loadCtrl.create({
spinner: 'crescent',
duration: 3000,
message: 'Authenticating...'
});
await loading.present();
this.cekAkunOff();
71
// if(kode == 202){
// this.warna = "success";
// const loading = await this.loadCtrl.create({
// spinner: 'bubbles',
// duration: 5000,
// message: 'Please wait...'
// });
// this.navCtrl.navigateRoot('/home');
// return await loading.present();
// }
// else
pl(){
this.alertGagal(this.return_code);
}
cekAkunOff() {
let hitung = 0;
let maxlist = Object.keys(this.akunoff).length;
72
this.id = this.id.toLocaleLowerCase();
while (hitung < maxlist) {
if (this.akunoff[hitung].uname == this.id) {
if (this.akunoff[hitung].passw ==
this.enkripsi(this.pass)) {
this.db.uname = this.akunoff[this.hitung].uname;
this.db.passw = this.akunoff[this.hitung].passw;
this.db.lokbit = this.akunoff[this.hitung].lokbit;
this.db.nama = this.akunoff[this.hitung].nama;
this.db.nohp = this.akunoff[this.hitung].nohp;
console.log("Welcome " + this.db.uname);
this.return_code = 202;
console.log(this.return_code);
this.db.logged = true;
this.load = 1;
this.navCtrl.navigateRoot('/home');
return 1;
}
else {
this.return_code = 401;
console.log(this.return_code);
this.pl();
return 1;
}
}
else{
hitung++;
}
}
this.return_code = 404;
console.log(this.return_code);
this.pl();
return 1;
}
cekAkun(){
this.db.akunRef$.valueChanges().subscribe(x => {
this.max_list = Object.keys(x).length;
this.hitung = 0;
this.id = this.id.toLocaleLowerCase();
while(this.hitung<this.max_list){
if(x[this.hitung].uname == this.id){
if(x[this.hitung].passw ==
this.enkripsi(this.pass)){
this.db.uname = x[this.hitung].uname;
this.db.passw = x[this.hitung].passw;
this.db.lokbit = x[this.hitung].lokbit;
this.db.nama = x[this.hitung].nama;
73
this.db.nohp = x[this.hitung].nohp;
this.lokal.addAkunOff(x[this.hitung].lokbit,
x[this.hitung].nama, x[this.hitung].nohp,
x[this.hitung].passw, x[this.hitung].uname);
console.log("Welcome "+ this.db.uname);
this.return_code = 202;
console.log(this.return_code);
this.db.logged = true;
this.load = 1;
this.navCtrl.navigateRoot('/home');
return 1;
}
else {
this.return_code = 401;
console.log(this.return_code);
this.pl();
return 1;
}
}
else{
this.hitung++;
}
}
this.return_code = 404;
console.log(this.return_code);
this.pl();
return 1;
});
}
enkripsi(text: any) {
var encrypted = "";
var action = 'encrypt';
encrypted += s;;
}
74
return encrypted;
}
2. Halaman Utama
<ion-header>
<ion-toolbar color="light" >
<ion-title color="dark">Tracking Bibit Kelapa
Sawit</ion-title>
<ion-buttons slot="primary">
<ion-button (click)="presentAlertConfirm()">
<ion-icon slot="icon-only" name="EXIT"></ion-icon>
</ion-button>
</ion-buttons>
</ion-toolbar>
<ion-segment (ionChange)="segmentChanged($event)"
color="dark" value="satu" style="z-index: 999;">
<ion-segment-button value="satu">
<ion-icon color="primary" name="home"></ion-icon>
</ion-segment-button>
<ion-segment-button value="dua">
<ion-icon color="primary" name="add-circle-
outline"></ion-icon>
</ion-segment-button>
<ion-segment-button value="tiga">
<ion-icon color="primary" name="shuffle"></ion-
icon>
</ion-segment-button>
</ion-segment>
75
</ion-header>
<div id="bg">
<img src="../../assets/imgs/mona-eendra-unsplash-
2.jpg">
<img src="../../assets/imgs/mona-eendra-unsplash-
2.jpg">
</div>
<div *ngIf="satu" padding>
<div id="item">
<ion-card>
<ion-item>
<ion-icon color="primary" name="scan-circle-
outline" slot="start"></ion-icon>
<ion-label>Scan Bibit</ion-label>
<ion-button fill="outline" slot="end"
(click)="scanCode()">Buka Kamera</ion-button>
</ion-item>
<div id="item">
<ion-card>
<ion-item>
<ion-icon color="ptpn" name="analytics-outline"
slot="start"></ion-icon>
<ion-label>Hasil Scan</ion-label>
<ion-button fill="outline" slot="end"
(click)="presentAlert()">Lihat Data</ion-button>
</ion-item>
<div id="item">
76
<ion-card>
<ion-item>
<ion-icon color="ptpn" name="help"
slot="start"></ion-icon>
<ion-label>FAQ</ion-label>
<ion-button fill="outline" slot="end"
routerLink="/listoffinput"
routerDirection="forward">Lihat</ion-button>
</ion-item>
</div>
<div id="item">
<ion-card>
<ion-item>
<ion-icon color="primary" name="options"
slot="start"></ion-icon>
<ion-label>Ubah Status</ion-label>
<ion-button fill="outline" slot="end"
routerLink="/input" routerDirection="forward">Pilih
Aksi</ion-button>
</ion-item>
<div id="item">
<ion-card>
77
<ion-item>
<ion-icon color="ptpn" name="help"
slot="start"></ion-icon>
<ion-label>Penyimpanan Offline</ion-label>
<ion-button fill="outline" slot="end"
routerLink="/listoffubahstat"
routerDirection="forward">Lihat</ion-button>
</ion-item>
<div id="item">
<ion-card>
<ion-item>
<ion-icon color="ptpn" name="help"
slot="start"></ion-icon>
<ion-label>FAQ</ion-label>
<ion-button fill="outline" slot="end"
(click)="faqChange()">Lihat</ion-button>
</ion-item>
</div>
<div id="item">
<ion-card>
<ion-item>
78
<ion-label>Tambah Data</ion-label>
<ion-button fill="outline"
slot="end"routerLink="/ubahstat"
routerDirection="forward">Pilih Aksi</ion-button>
</ion-item>
<div id="item">
<ion-card>
<ion-item>
<ion-icon color="ptpn" name="help"
slot="start"></ion-icon>
<ion-label>Penyimpanan Offline</ion-label>
<ion-button fill="outline" slot="end"
routerLink="/listoffinput"
routerDirection="forward">Lihat</ion-button>
</ion-item>
<div id="item">
<ion-card>
<ion-item>
<ion-icon color="ptpn" name="help"
slot="start"></ion-icon>
<ion-label>FAQ</ion-label>
<ion-button fill="outline" slot="end"
(click)="faqInput()">Lihat</ion-button>
</ion-item>
</div>
</div>
</ion-content>
<!--
<ion-button shape="round" expand="full" color="dark"
routerLink="/ubahstat" routerDirection="forward">
<ion-icon slot="start" name="add"></ion-icon>
Input Bibit
</ion-button>
<!--
<h1>Click To Generate QR Code</h1>
// Back-end
interface Bibit {
asal_bibit: string,
bedeng_bibit: string,
blok_bibit: string,
id_bibit: string,
jenis_bibit: string,
kebun: string,
kelompok: string,
varietas: string
}
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
81
styleUrls: ['home.page.scss'],
})
export class HomePage {
encodeData: any;
scannedData: {};
bibitList: Observable<Bibit[]>
list: any;
max_list: any;
hitung: any = 0;
logged: boolean = false;
jenis_bibit: any;
kode_bibit: any = 0;
asal_bibit: any;
vari_bibit: any;
klmpk_bibit: any;
bedeng_bibit: any;
blok_bibit: any;
kebun_bibit: any;
tampung: Array<{
asal_bibit: string,
bedeng_bibit: string,
blok_bibit: string,
id_bibit: string,
jenis_bibit: string,
kebun: string,
kelompok_bibit: string,
varietas_bibit: string
}>;
test: any;
82
barcodeScannerOptions: BarcodeScannerOptions;
constructor(
private platform: Platform,
private splashScreen: SplashScreen,
private statusBar: StatusBar,
private barcodeScanner: BarcodeScanner,
private loadCtrl: LoadingController,
private alertCtrl: AlertController,
public ngZone: NgZone,
private db: DbconService,
private navCtrl: NavController
) {
this.initializeApp();
this.logged = this.db.logged;
if(this.logged == false){
this.presentLoading();
}
this.db.getBibitList().snapshotChanges().subscribe(i =>{
this.test = i;
});
console.log('Hasildfsg');
console.log(this.test);
this.db.listRef$.valueChanges().subscribe(x=>
{
console.log(x[0].id_bibit);
// this.hitung = 0;
this.max_list = Object.keys(x).length;
console.log(this.max_list);
}
);
this.hitung = 0;
this.barcodeScannerOptions = {
showTorchButton: true,
showFlipCameraButton: true
};
this.list = this.db.last_list;
this.max_list = this.db.max_list;
console.log(this.tampung);
segmentChanged(ev: any) {
console.log('Segment changed', ev);
83
console.log(ev.detail.value);
this.slide = ev.detail.value;
if(this.slide == "satu"){
this.satu = true;
this.dua = false;
this.tiga = false;
} else
if(this.slide == "dua"){
this.satu = false;
this.dua = true;
this.tiga = false;
} else
if(this.slide == "tiga"){
this.satu = false;
this.dua = false;
this.tiga = true;
}
}
async loadData() {
const loading = await this.loadCtrl.create({
spinner: 'crescent',
cssClass: "stroke:var(--ion-color-ptpn);",
duration: 4000,
message: 'Retrieving Data...'
});
this.db.variRef$.valueChanges().subscribe(x => {
this.max_list = Object.keys(x).length;
this.hitung = 0;
this.db.varis = x;
console.log(this.db.varis);
});
this.db.asbitRef$.valueChanges().subscribe(x => {
this.max_list = Object.keys(x).length;
this.hitung = 0;
this.db.asbits = x;
console.log(this.db.asbits);
});
this.db.klmpkRef$.valueChanges().subscribe(x => {
this.max_list = Object.keys(x).length;
this.hitung = 0;
this.db.klmpks = x;
84
console.log(this.db.klmpks);
});
this.db.lokRef$.valueChanges().subscribe(x => {
this.max_list = Object.keys(x).length;
this.hitung = 0;
this.db.lokasis = x;
console.log(this.db.lokasis);
});
async presentAlertConfirm() {
const alert = await this.alertCtrl.create({
header: 'Konfirmasi Logout',
message: 'Apa anda yakin ini keluar?',
buttons: [
{
text: 'Tidak',
role: 'cancel',
handler: (blah) => {
console.log('Confirm Cancel: blah');
}
}, {
text: 'Ya',
handler: () => {
console.log('Confirm Okay');
this.navCtrl.navigateRoot('/login');
}
}
]
});
await alert.present();
}
gotoInput(){
// this.navCtrl.navigateForward('/input');
}
async presentLoading() {
const loading = await this.loadCtrl.create({
duration: 5000,
cssClass: "--spinner-color:var(--ion-color-ptpn);",
message: 'Please wait...',
translucent: true
});
85
await loading.present();
const { role, data } = await loading.onDidDismiss();
this.navCtrl.navigateRoot('/login');
console.log('Loading dismissed!');
}
ionViewDidLoad(){
if(this.db.fst != 0){
// this.presentAlert()
}
this.db.fst = 1;
}
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
this.splashScreen.hide();
this.encodeData = "https://www.ptpn5.co.id";
this.loadData();
});
}
ketemu: boolean;
verify(kode: any){
this.hitung = 0;
this.ketemu = false;
this.db.masRef$.valueChanges().subscribe(x => {
this.max_list = Object.keys(x).length;
while(this.hitung<this.max_list){
if(x[this.hitung].id == kode){
this.db.asal_bit = x[this.hitung].asal;
this.db.id_bit = x[this.hitung].id;
this.db.idgroup_bit = x[this.hitung].idgroup;
this.db.klmpk_bit = x[this.hitung].klmpk;
this.db.lokasi_bit = x[this.hitung].lokasi;
this.db.serbuk_bit = x[this.hitung].serbuk;
this.db.tgl_bit = x[this.hitung].tgl;
this.db.varietas_bit = x[this.hitung].varietas;
this.hitung = this.max_list;
this.ketemu = true;
}
else{
this.hitung++;
}
86
}
});
cekBibit(scan: any){
this.db.masRef$.valueChanges().subscribe(x => {
this.max_list = Object.keys(x).length;
this.hitung = 0;
while(this.hitung<this.max_list){
// if(scan.localeCompare(x[this.hitung].id) == 0){
if(x[this.hitung].id == scan){
this.db.i_id = x[this.hitung].id;
this.db.i_idgroup = x[this.hitung].idgroup;
this.db.i_lokasi = x[this.hitung].lokasi;
this.db.i_tgl = x[this.hitung].tgl;
this.db.i_serbuk = x[this.hitung].serbuk;
this.db.i_vari = x[this.hitung].varietas;
this.db.i_klmpk = x[this.hitung].klmpk;
this.db.i_asbit = x[this.hitung].asal;
this.ketemu = true;
this.hitung = this.max_list;
console.log("Ketemu dong");
}
else{
this.hitung++;
}
}
});
}
async ketemutidak() {
const loading = await this.loadCtrl.create({
duration: 5000,
message: 'Please wait...',
});
await loading.present();
if(this.ketemu){
this.navCtrl.navigateRoot('/detail');
}
else{
this.gagalScan();
}
scanCode() {
this.barcodeScanner.scan().then(barcodeData => {
87
this.ketemutidak();
}).catch(err => {
console.log('Error', err);
});
// this.presentLoading('Sedang Memproses...', 2000);
// this.presentAlert()
}
async gagalScan() {
const alert = await this.alertCtrl.create({
header: 'Data tidak ditemukan',
message: 'Pastikan anda memindai QR Tracking Bibit
PTPN5.',
buttons: [
{
text: 'Tidak',
role: 'cancel',
handler: (blah) => {
}
}
]
});
await alert.present();
}
encodedText() {
this.barcodeScanner.encode(this.barcodeScanner.Encode.TE
XT_TYPE, this.encodeData).then((encodedData) => {
console.log(encodedData);
this.encodeData = encodedData;
}, (err) => {
console.log("Error occured : " + err);
});
}
faqChange() {
presentAlert() {
88
faqInput() {}}
3. Halaman Input
<ion-header>
<ion-toolbar color="light">
<ion-buttons slot="start">
<ion-button routerLink="/home"
routerDirection="forward">
<ion-icon slot="icon-only" name="arrow-back"></ion-
icon>
</ion-button>
</ion-buttons>
<ion-title>Edit Data Bibit</ion-title>
</ion-toolbar>
</ion-header>
<ion-content color="dark">
<div id="bg">
<img src="../../assets/imgs/mona-eendra-unsplash-
2.jpg">
<img src="../../assets/imgs/mona-eendra-unsplash-
2.jpg">
</div>
<div id="contents" padding>
<div id="item">
<ion-card>
<ion-item>
<ion-label color="primary">Detail Input</ion-
label>
</ion-item>
<div id="item">
<ion-card>
<ion-item>
<ion-label color="primary">Detail Bibit</ion-
label>
</ion-item>
<ion-item>
<ion-label position="floating">Varietas</ion-
label>
<ion-select (ionChange)="onChangeVar($event)"
placeholder="Pilih Varietas">
<ion-select-option *ngFor="let vari of varis"
value="{{vari.kode}}">{{vari.kode}}</ion-select-option>
</ion-select>
</ion-item>
<ion-item>
<ion-label position="floating">Kelompok</ion-
label>
<ion-select (ionChange)="onChangeKel($event)"
placeholder="Pilih Kelompok">
<ion-select-option *ngFor="let klmpk of
klmpks" value="{{klmpk.kode}}">{{klmpk.kode}}</ion-select-
option>
<!-- <ion-select-option *ngIf="klmpke ==
klmpk.kode" *ngFor="let klmpk of klmpks"
value="{{klmpk.kode}}">{{klmpk.kode}}</ion-select-option>
<ion-select-option *ngIf="klmpke !=
klmpk.kode" *ngFor="let klmpk of klmpks"
value="{{klmpk.kode}}">{{klmpk.kode}}</ion-select-option>
-->
</ion-select>
</ion-item>
90
<ion-item>
<ion-label position="floating">Asal Benih</ion-
label>
<ion-select (ionChange)="onChangeAsb($event)"
placeholder="Pilih Lokasi">
<ion-select-option *ngFor="let asbit of
asbits" value="{{asbit.kode}}">{{asbit.kode}}</ion-select-
option>
</ion-select>
</ion-item>
</ion-card-content>
</ion-card>
</div>
<div id="item">
<ion-button color="light" expand="block"
(click)="confirmCheck()">Input Bibit Ke Server</ion-button>
<ion-button color="danger" expand="block"
(click)="confirmCheckoff()">Simpan Offline</ion-button>
</div>
</div>
</ion-content>
// Back-end
// import 'rxjs/add/operator/map';
import { AngularFireDatabase, AngularFireList,
AngularFireObject } from '@angular/fire/database';
@Component({
selector: 'app-ubahoff',
templateUrl: './ubahoff.page.html',
styleUrls: ['./ubahoff.page.scss'],
})
export class UbahoffPage implements OnInit {
hitung: any;
max_list: any;
varis: any;
asbits: any;
klmpks: any;
idgroup: any;
// public lokasi: string;
// public lokasi: string;
// public lokasi: string;
constructor(
private db: DbconService,
public database: AngularFireDatabase,
public alertCtrl: AlertController,
public loadCtrl: LoadingController,
public navCtrl: NavController,
public lokal: LokalService
) {
this.idgroup = this.lokal.ubah_now.idgroup;
this.recentPlace = this.lokal.ubah_now.recentPlace;
this.lokasi = this.lokal.ubah_now.lokasi;
this.tgl = this.lokal.ubah_now.tgl;
this.jmlh = this.lokal.ubah_now.jumlah;
this.serbuk = this.lokal.ubah_now.serbuk;
this.varie = this.lokal.ubah_now.varietas;
this.asbite = this.lokal.ubah_now.asal;
this.klmpke = this.lokal.ubah_now.klmpk;
this.loadMasuk();
this.initialize();
/**
*
export interface Createnew {
asal: string,
idgroup: string,
klmpk: string,
lokasi: string,
serbuk: string,
tgl: string,
varietas: string,
jumlah: string
}
*
*
*/
}
92
initialize(){
// console.log(this.recentPlace);
// console.log(this.varis);
// console.log(this.asbits);
// console.log(this.klmpks);
}
async loadMasuk() {
const loading = await this.loadCtrl.create({
spinner: 'crescent',
duration: 3000,
message: 'Authenticating...'
});
await loading.present();
this.recentPlace = this.db.lokbit;
this.varis = this.db.varis;
this.asbits = this.db.asbits;
this.klmpks = this.db.klmpks;
ngOnInit() {
}
onChangeVar(value){
// console.log(value);
this.varis = value.detail.value;
}
onChangeKel(value){
// console.log(value.detail.value);
this.klmpks = value.detail.value;
}
onChangeAsb(value){
// console.log(value.detail.value);
this.asbits = value.detail.value;
}
async confirmCheck() {
const alert = await this.alertCtrl.create({
header: 'Konfirmasi Input Ke Server',
message: 'Apa anda yakin ingin menambahkan <strong
style="color: #f04141;">'+this.jmlh+'</strong> buah bibit
dengan nomor penyerbukan <strong style="color:
#f04141;">'+this.serbuk+'</strong> ?',
buttons: [
93
{
text: 'Batal',
role: 'cancel',
handler: (blah) => {
// console.log('Confirm Cancel: blah');
}
}, {
text: 'Oke',
handler: () => {
// console.log('Confirm Okay');
this.inputBibit();
}
}
]
});
await alert.present();
}
async confirmCheckoff() {
const alert = await this.alertCtrl.create({
header: 'Konfirmasi Simpan Offline',
message: 'Apa anda yakin ingin menambahkan <strong
style="color: #f04141;">'+this.jmlh+'</strong> buah bibit
dengan nomor penyerbukan <strong style="color:
#f04141;">'+this.serbuk+'</strong> ?',
buttons: [
{
text: 'Batal',
role: 'cancel',
handler: (blah) => {
// console.log('Confirm Cancel: blah');
}
}, {
text: 'Oke',
handler: () => {
// console.log('Confirm Okay');
this.inputBibitoff();
}
}
]
});
await alert.present();
}
uuid = uuid+'-'+this.db.uname;
return uuid;
}
async loadInput() {
let hit = 0;
const loading = await this.loadCtrl.create({
spinner: 'crescent',
duration: 10000,
message: 'Menginput Data ...'
});
// this.recentPlace = this.db.lokbit;
// this.varis = this.db.varis;
// this.asbits = this.db.asbits;
// this.klmpks = this.db.klmpks;
await loading.present();
while(hit<this.jmlh){
this.db.inputData(this.lokasi,this.tgl,this.serbuk,thi
s.varis,this.klmpks,this.asbits, this.idgroup);
hit++;
}
this.confirmRedirect();
async confirmRedirect() {
const alert = await this.alertCtrl.create({
header: 'Berhasil Dimasukkan!',
message: this.jmlh+' data bibit telah disimpan.',
buttons: [
{
text: 'Oke',
handler: () => {
// console.log('Confirm Okay');
this.navCtrl.navigateRoot('/home');
95
}
}
]
});
await alert.present();
}
async gagalInput() {
const alert = await this.alertCtrl.create({
header: 'Gagal Menyimpan',
message: ':(',
buttons: [
{
text: 'Yalah',
handler: () => {
// console.log('Confirm Okay');
this.navCtrl.navigateRoot('/home');
}
}
]
});
await alert.present();
}
async confirmRedirectoff() {
const alert = await this.alertCtrl.create({
header: 'Berhasil Disimpan!',
message: 'Apa anda ingin melihat list data
tersimpan?',
buttons: [
{
text: 'Ya',
handler: () => {
// console.log('Confirm Okay');
this.navCtrl.navigateRoot('/listoffinput');
}
},
{
text: 'Tidak',
handler: () => {
// console.log('Confirm Okay');
this.navCtrl.navigateRoot('/home');
}
}
]
});
await alert.present();
}
96
inputBibitoff(){
this.idgroup = this.generateID();
let a = 0;
this.db.i_jmlh = this.jmlh;
this.db.i_lokasi = this.lokasi;
this.db.i_serbuk = this.serbuk;
this.db.i_tgl = this.tgl;
this.db.i_vari = this.varis;
this.db.i_klmpk = this.klmpks;
this.db.i_asbit = this.asbits;
this.lokal.addCreatenew(this.asbits, this.idgroup,
this.klmpks, this.lokasi, this.serbuk, this.tgl, this.varis,
this.jmlh).then(x=>{
this.confirmRedirectoff();
},
error => {
this.gagalInput();
a = 1;
}
);
// if(a!=1){
// this.confirmRedirectoff();
// a=0;
// }
}
inputBibit(){
this.idgroup = this.generateID();
this.db.i_jmlh = this.jmlh;
this.db.i_lokasi = this.lokasi;
this.db.i_serbuk = this.serbuk;
this.db.i_tgl = this.tgl;
this.db.i_vari = this.varis;
this.db.i_klmpk = this.klmpks;
this.db.i_asbit = this.asbits;
// console.log(this.db.i_jmlh);
// console.log(this.db.i_lokasi);
// console.log(this.db.i_serbuk);
// console.log(this.db.i_tgl);
this.loadInput();
97
//
this.db.inputData(this.lokasi,this.tgl,this.serbuk,this.vari
s,this.klmpks,this.asbits);
// this.db.variRef$.valueChanges().subscribe(x => {
// this.max_list = Object.keys(x).length;
// this.hitung = 0;
// this.varis = x;
// console.log(this.varis);
// });
}
}
interface Bibit {
asal_bibit: string,
bedeng_bibit: string,
blok_bibit: string,
id_bibit: string,
jenis_bibit: string,
kebun: string,
kelompok_bibit: string,
varietas_bibit: string
}
interface Akun {
uname: string,
passw: string,
nama: string,
nohp: string,
lokbit: string
}
interface Vari{
id: string,
ket: string,
98
kode: string
}
interface Lok{
id: string,
kebun: string,
ket: string,
nama: string
}
interface Master{
asal: string,
id: string,
klmpk: string,
lokasi: string,
serbuk: string,
tgl: string,
varietas: string,
idgroup: string
}
interface Stat{
id: string,
id_bibit: string,
ket: string,
lokasi_akhir: string,
lokasi_awal: string,
stat: string,
waktu: string
}
@Injectable({
providedIn: 'root'
})
export class DbconService {
asal_bit: any;
id_bit: any;
idgroup_bit: any;
klmpk_bit: any;
lokasi_bit: any;
serbuk_bit: any;
tgl_bit: any;
varietas_bit: any;
// get_list: AngularFirestoreCollection<Bibit>;
public dbRef = this.database.list<Bibit>('bibit');
public akunRef = this.database.list<Akun>('migrasi/user');
public variRef =
this.database.list<Vari>('migrasi/varietas');
99
public asbitRef =
this.database.list<Vari>('migrasi/asalbit');
public klmpkRef =
this.database.list<Vari>('migrasi/klmpk');
public lokRef = this.database.list<Lok>('migrasi/lokasi');
public masterRef =
this.database.list<Master>('migrasi/master');
public statRef =
this.database.list<Stat>('migrasi/status');
// public variRef =
this.database.list<Vari>('migrasi/varietas');
// public variRef =
this.database.list<Vari>('migrasi/varietas');
varis: any;
asbits: any;
klmpks: any;
lokasis: any;
listRef$: AngularFireList<Bibit>;
akunRef$: AngularFireList<Akun>;
variRef$: AngularFireList<Vari>;
asbitRef$: AngularFireList<Vari>;
klmpkRef$: AngularFireList<Vari>;
lokRef$: AngularFireList<Lok>;
masRef$: AngularFireList<Master>;
statRef$: AngularFireList<Stat>;
item_list: Observable<Bibit[]>;
cnta_list: any;
last_list: AngularFireList<Bibit[]>;
max_list: any;
item_stat: Observable<Stat[]>;
cnta_stat: any;
last_stat: AngularFireList<Stat[]>;
max_stat: any;
item_lok: Observable<Bibit[]>;
cnta_lok: any;
last_lok: AngularFireList<Bibit[]>;
max_lok: any;
//input
public i_idgroup: any;
public i_lokasi: any;
public i_tgl: any;
public i_jmlh: any;
public i_serbuk: any;
scanLok: any;
scanKet: any;
scanLoktuj: any;
scanNoker: any;
scanNosur: any;
scanSupir: any;
scanKawal: any;
constructor(
// public firestore: AngularFirestore,
public database: AngularFireDatabase) {
this.listRef$ = this.database.list('bibit');
this.akunRef$ = this.database.list('migrasi/user');
this.variRef$ = this.database.list('migrasi/varietas');
this.asbitRef$ = this.database.list('migrasi/asalbit');
this.klmpkRef$ = this.database.list('migrasi/klmpk');
this.lokRef$ = this.database.list('migrasi/lokasi');
this.masRef$ = this.database.list('migrasi/master');
this.statRef$ = this.database.list('migrasi/status');
// this.akunLogin.map(x => {
// x.nama = "Lukman";
// })
this.func1();
// this.getBibitList().valueChanges().subscribe(i =>{
// this.last_list = i;
// });
101
console.log(this.last_list);
}
getBibitList() {
return this.dbRef;
}
func1(){
let y = this.database.list('/bibit').valueChanges();
let x = this.database.list('/bibit').snapshotChanges();
x.subscribe(i =>{
this.max_list = Object.keys(i).length;
this.cnta_list = 0;
});
}
ambilAkun(){
let akun =
this.database.list('/migrasi/user').snapshotChanges();
akun.subscribe(a => {
})
}
ambilLok(){
let lok =
this.database.list('/migrasi/lokasi').snapshotChanges();
lok.subscribe(l => {
})
}
var uuid =
'master-xxxxxxxxxxxxxxxxxxyxxx'.replace(/[xy]/g, function
(c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
return uuid;
}
inputData(
v_lokasi: any,
v_tgl: any,
v_serbuk: any,
v_vari: any,
v_klmpk: any,
v_asal: any,
v_group: any
){
let v_id = this.generateUUID();
this.inputStatus(v_id, 'Bibit baru diinput ke database',
v_lokasi, v_lokasi, 'AKTIF');
return this.database.list('/migrasi/master').set(v_id,{
asal: v_asal,
id: v_id,
klmpk: v_klmpk,
lokasi: v_lokasi,
serbuk: v_serbuk,
tgl: v_tgl,
varietas: v_vari,
idgroup: v_group
});
}
inputStatus(
s_idbibit: any,
s_ket: any,
s_lokakhir: any,
s_lokawal: any,
s_stat: any
103
) {
let maxt = 9999999999999999;
let s_date = new Date().getTime();
let mint = maxt - s_date;
let s_id = mint+this.generateStatUUID();
return this.database.list('/migrasi/status').set(s_id,{
id: s_id,
id_bibit: s_idbibit,
ket: s_ket,
lokasi_akhir: s_lokakhir,
lokasi_awal: s_lokawal,
stat: s_stat,
waktu: s_date
});
}
}
idgroup: string,
klmpk: string,
lokasi: string,
serbuk: string,
tgl: string,
varietas: string,
jumlah: string
}
@Injectable({
providedIn: 'root'
})
export class LokalService {
ubah_now: any;
akunlogin: any;
seedDatabase() {
this.http.get('assets/sql/seed.sql', { responseType:
'text'})
.subscribe(sql => {
this.sqlitePorter.importSqlToDb(this.database, sql)
.then(_ => {
this.loadCreatenew();
this.loadAkunOff();
this.loadChangestat();
this.dbReady.next(true);
})
.catch(e => console.error(e));
});
}
getDatabaseState() {
return this.dbReady.asObservable();
}
/**
*
* edited code
*
*/
getChangestats(): Observable<Changestat[]>{
return this.change_stat.asObservable();
}
106
getCreatenews(): Observable<Createnew[]>{
return this.create_new.asObservable();
}
getKirimOffs(): Observable<KirimOff[]>{
return this.kirim_off.asObservable();
}
getAkunOffs(): Observable<AkunOff[]>{
return this.akun_off.asObservable();
}
// end
// getDevs(): Observable<Dev[]> {
// return this.developers.asObservable();
// }
// getProducts(): Observable<any[]> {
// return this.products.asObservable();
// }
/**
*
* edited code
*
*
*
*/
loadChangestat(){
return this.database.executeSql('SELECT * FROM
change_stat', []).then(data => {
let changestat: Changestat[] = [];
if (data.rows.length > 0) {
for (var i = 0; i < data.rows.length; i++) {
// let val = [];
// if (data.rows.item(i).skills != '') {
// val = JSON.parse(data.rows.item(i).skills);
// }
changestat.push({
id_bibit: data.rows.item(i).id_bibit,
ket: data.rows.item(i).ket,
lokasi_akhir: data.rows.item(i).lokasi_awal,
lokasi_awal: data.rows.item(i).lokasi_akhir,
stat: data.rows.item(i).stat,
waktu: data.rows.item(i).waktu
});
}
}
this.change_stat.next(changestat);
107
});
}
getChangestat(waktu): Promise<Changestat> {
return this.database.executeSql('SELECT * FROM
change_stat WHERE waktu = ?', [waktu]).then(data => {
// let skills = [];
// if (data.rows.item(0).skills != '') {
// skills = JSON.parse(data.rows.item(0).skills);
// }
let i = 0;
return {
id_bibit: data.rows.item(i).id_bibit,
ket: data.rows.item(i).ket,
lokasi_akhir: data.rows.item(i).lokasi_akhir,
lokasi_awal: data.rows.item(i).lokasi_awal,
stat: data.rows.item(i).stat,
waktu: data.rows.item(i).waktu
}
});
}
deleteChangestat(waktu) {
return this.database.executeSql('DELETE FROM change_stat
WHERE waktu = ?', [waktu]).then(_ => {
this.loadChangestat();
// this.loadProducts();
});
}
updateChangestat(cn: Changestat) {
let data = [cn.id_bibit, cn.ket, cn.lokasi_akhir,
cn.lokasi_awal, cn.stat, cn.waktu];
return this.database.executeSql(
`UPDATE buat_baru
SET
ket = ?,
lokasi_akhir = ?,
lokasi_awal = ? ,
stat = ? ,
waktu = ?
108
// Create New
loadCreatenew(){
return this.database.executeSql('SELECT * FROM
buat_baru', []).then(data => {
let createnew: Createnew[] = [];
if (data.rows.length > 0) {
for (var i = 0; i < data.rows.length; i++) {
// let val = [];
// if (data.rows.item(i).skills != '') {
// val = JSON.parse(data.rows.item(i).skills);
// }
createnew.push({
asal: data.rows.item(i).asal,
idgroup: data.rows.item(i).idgroup,
jumlah: data.rows.item(i).jumlah,
klmpk: data.rows.item(i).klmpk,
lokasi: data.rows.item(i).lokasi,
serbuk: data.rows.item(i).serbuk,
tgl: data.rows.item(i).tgl,
varietas: data.rows.item(i).varietas
});
}
}
this.create_new.next(createnew);
});
}
// asal TEXT,
// idgroup TEXT,
// jumlah TEXT,
// klmpk TEXT,
// lokasi TEXT,
// serbuk TEXT,
// tgl TEXT,
// varietas TEXT
getCreatenew(idgroup): Promise<Createnew> {
return this.database.executeSql('SELECT * FROM buat_baru
WHERE idgroup = ?', [idgroup]).then(data => {
// let skills = [];
// if (data.rows.item(0).skills != '') {
// skills = JSON.parse(data.rows.item(0).skills);
// }
let i = 0;
return {
asal: data.rows.item(i).asal,
idgroup: data.rows.item(i).idgroup,
jumlah: data.rows.item(i).jumlah,
klmpk: data.rows.item(i).klmpk,
lokasi: data.rows.item(i).lokasi,
serbuk: data.rows.item(i).serbuk,
tgl: data.rows.item(i).tgl,
varietas: data.rows.item(i).varietas
}
});
}
deleteCreatenew(idgroup) {
return this.database.executeSql('DELETE FROM buat_baru
WHERE idgroup = ?', [idgroup]).then(_ => {
this.loadCreatenew();
// this.loadProducts();
});
}
updateCreatenew(cn: Createnew) {
let data = [cn.asal, cn.idgroup, cn.jumlah, cn.klmpk,
cn.lokasi, cn.serbuk, cn.tgl, cn.varietas];
return this.database.executeSql(
110
`UPDATE buat_baru
(asal,jumlah,klmpk,lokasi,serbuk,tgl,varietas)
SET
asal = ?,
jumlah = ?,
klmpk = ? ,
lokasi = ? ,
serbuk = ? ,
tgl = ? ,
varietas = ?
WHERE idgroup = ${cn.idgroup}`, data)
.then(data => {
this.loadCreatenew();
})
}
/**
*
*
id_bibit TEXT PRIMARY KEY,
id_kirim TEXT,
tgl TEXT,
lokasi_asal TEXT,
lokasi_tujuan TEXT,
no_surat TEXT,
nama_supir TEXT,
nama_kawal TEXT,
ket TEXT
*
*/
loadKirimOff(){
return this.database.executeSql('SELECT * FROM
offline_kirim', []).then(data => {
let kirimoff: KirimOff[] = [];
if (data.rows.length > 0) {
for (var i = 0; i < data.rows.length; i++) {
// let val = [];
// if (data.rows.item(i).skills != '') {
// val = JSON.parse(data.rows.item(i).skills);
// }
kirimoff.push({
id_bibit: data.rows.item(i).id_bibit,
id_kirim: data.rows.item(i).id_kirim,
tgl: data.rows.item(i).tgl,
lokasi_asal: data.rows.item(i).lokasi_asal,
lokasi_tujuan: data.rows.item(i).lokasi_tujuan,
no_surat: data.rows.item(i).no_surat,
nama_supir: data.rows.item(i).nama_supir,
111
nama_kawal: data.rows.item(i).nama_kawal,
ket: data.rows.item(i).ket
});
}
}
this.kirim_off.next(kirimoff);
});
}
getKirimOff(id_bibit): Promise<KirimOff> {
return this.database.executeSql('SELECT * FROM
offline_kirim WHERE id_bibit = ?', [id_bibit]).then(data =>
{
// let skills = [];
// if (data.rows.item(0).skills != '') {
// skills = JSON.parse(data.rows.item(0).skills);
// }
let i = 0;
return {
id_bibit: data.rows.item(i).id_bibit,
id_kirim: data.rows.item(i).id_kirim,
tgl: data.rows.item(i).tgl,
lokasi_asal: data.rows.item(i).lokasi_asal,
lokasi_tujuan: data.rows.item(i).lokasi_tujuan,
no_surat: data.rows.item(i).no_surat,
nama_supir: data.rows.item(i).nama_supir,
nama_kawal: data.rows.item(i).nama_kawal,
ket: data.rows.item(i).ket
}
});
}
updateKirimOff(kof: KirimOff) {
let data =
[kof.id_bibit,kof.id_kirim,kof.tgl,kof.lokasi_asal,kof.lokas
i_tujuan,kof.no_surat,kof.nama_supir,kof.nama_kawal,kof.ket]
;
return this.database.executeSql(
`UPDATE offline_kirim
(id_bibit,id_kirim,tgl,lokasi_asal,lokasi_tujuan,no_surat,na
ma_supir,nama_kawal,ket)
SET
id_bibit = ?,
id_kirim = ?,
tgl = ?,
lokasi_asal = ?,
lokasi_tujuan = ?,
no_surat = ?,
nama_supir = ?,
nama_kawal = ?,
112
ket = ?
WHERE id_bibit = ${kof.id_bibit}`, data)
.then(data => {
this.loadKirimOff();
})
}
deleteKirimOff(id_bibit) {
return this.database.executeSql('DELETE FROM
offline_kirim WHERE id_bibit = ?', [id_bibit]).then(_ => {
this.loadKirimOff();
// this.loadProducts();
});
}
// End
//
//
deleteAkunOff() {
return this.database.executeSql('DELETE FROM
offline_akun WHERE 1').then(_ => {
this.loadAkunOff();
});
113
loadAkunOff() {
return this.database.executeSql('SELECT * FROM
offline_akun', []).then(data => {
let akunoff: AkunOff[] = [];
if (data.rows.length > 0) {
for (var i = 0; i < data.rows.length; i++) {
// let val = [];
// if (data.rows.item(i).skills != '') {
// val = JSON.parse(data.rows.item(i).skills);
// }
akunoff.push({
uname: data.rows.item(i).uname,
passw: data.rows.item(i).passw,
lokbit: data.rows.item(i).lokbit,
nama: data.rows.item(i).nama,
nohp: data.rows.item(i).nohp
});
}
}
this.akun_off.next(akunoff);
});
}
}