Anda di halaman 1dari 45

Nama : Widya Handriana Listyawati

NIM : 20190801072
Mata Kuliah : Pemrograman Mobile
Dosen Pengampu : Ir. Sawali Wahyu, S. Kom, M.Kom.

UTS

Note!
• Section pertama adalah jawaban essai
• Section kedua adalah penjelasan serta screenshoot aplikasi studi kasus
• Section ketiga adalah source code aplikasi
• Section terakhir adalah perancangan seperti flowchart, use case diagram, class diagram,
sequence diagram dan activity diagram

No.1
Jelaskan dengan detail menurut pemahaman anda, Konsep Dasar Android dan
Arsitekturnya dan Apa Kelebihannya !

Android merupakan perangkat lunak dalam perangkat mobile yang mencakup system operasi,
middleware dan aplikasi utama mobile. Android adalah sistem operasi berbasis Linux yang
dipergunakan sebagai pengelola sumber daya perangkat keras, baik untuk ponsel, smartphone
dan juga PC tablet. Secara umum Android adalah platform yang terbuka (Open Source) bagi para
pengembang untuk menciptakan aplikasi mereka sendiri yang digunakan oleh berbagai piranti
bergerak.

Karakteristik Android
Sistem operasi open source untuk perangkat mobile dan proyek open source yang sesuai yang
dipimpin oleh Google. Situs ini dan repositori Android Open Source Project (AOSP)
menawarkan informasi dan source code yang diperlukan untuk membuat varian custom dari OS
Android, perangkat Port dan aksesori ke platform Android, dan memastikan perangkat
memenuhi persyaratan kompatibilitas yangmenjaga ekosistem Android sebagai lingkungan yang
sehat dan stabil bagi jutaan pengguna.
Berikut karakteristik android
1. Lengkap
2. Terbuka (Open Source)
3. Free
4. Semua aplikasi dibuat sama
5. Memecahkan hambatan pada aplikasi
6. Pengembangan aplikasi yang cepat dan mudah

Arsitektur Android
Google sebagai pencipta Android yang kemudian diasuh oleh Handset Alliance mengibaratkan
Android sebagai sebuah tumpukan software. Setiap lapisan pada tumpukan ini menghimpun
beberapa program yang mendukung fungsi-fungsi spesifik dari sistem operasi.
1. Linux Kernel
Linux Kernel adalah layer di mana inti dari operating system dari Android itu berada.
Berisi file-file sistem yang mengatur system processing, memory, resource, drivers, dan
sistem-sistem operasi Android lainnya.
2. Android Runtime
Lapisan setelah Kernel Linux adalah Android Runtime. Android Runtime ini berisi Core
Libraries dan Dalvik Virtual Machine. Core Libraries mencakup serangkaian inti library
Java, artinya Android menyertakan satu set librarylibrary dasar yang menyediakan
sebagian besar fungsi-fungsi yang ada pada library-library dasar bahasa pemrograman
Java.
3. Libraries
Bertempat di level yang sama dengan Android Runtime adalah Libraries. Android
menyertakan satu set library-library dalam bahasa C/C++ yang digunakan oleh berbagai
komponen yang ada pada sistem Android.
4. Application Framework
Lapisan selanjutnya adalah yang mencakup program untuk mengatur fungsi-fungsi dasar
smartphone. Application Framework merupakan 10 serangkaian tool dasar seperti alokasi
resource smartphone, aplikasi telepon, pergantian antar – proses atau program, dan
pelacakan lokasi fisik telepon.
5. Application dan Widgets
Di lapisan teratas bertempat pada aplikasi itu sendiri. Di lapisan inilah anda menemukan
fungsi-fungsi dasar smartphone seperti menelepon dan mengirim pesan singkat,
menjalankan web browser, mengakses daftar kontak, dan lainlain. Bagi rata-rata
pengguna, lapisan inilah yang paling sering mereka akses. Mereka mengakses fungsi-
fungsi dasar tersebut melalui user interface.
Kelebihan dan Kekurangan

Kelebihan Sistem Android

1. Sistem Terbuka (Open Source)


Dapat menambahkan, menghapus serta mengupdate system sesuai keinginan. Oleh
karena itu, user dapat bebas bereksplorasi.
2. Dikembangkan oleh berbagai user
Banyak terciptanya aplikasi android kedepannya
3. User dapat mengembangkan aplikasi
Mengembangkan aplikasi dapat dengan mudah yakni menggunakan Bahasa Java atau
Dart dsb.
4. Dapat dipakai diberbagai macam platform
Notebook, tablet, kamera digital, smart TV, dan GPS.
5. Ukuran aplikasi relative berukuran kecil
Tidak perlu takut memory cepat habis

Kekurangan Sistem Android


1. Sistem operasi yang merupakan hasil modifikasi memiliki kinerja yang kurang
optimal
Terkadang operasi sistem android yang telah dimodifikasi oleh user dapat menjadi
tidak optimal dan tidak responsive lagi saat digunakan kedepannya, tentu hal ini juga
dapat berakibat smartphone anda menjadi lebih cepat panas hingga kerusakan pada
memory yang error dan tidak stabil.
2. Kurang responsive apabila dijalankan pada hardware dengan spesifikasi rendah
Semakin tinggi spesifikai, maka dalam membuat system operasi android jad lebih
lancer dengan performa yang optimal. Sebaliknya jika spesifikasi rendah akan
cenderung error dan lelet.
3. Dapat memakan RAM cukup banyak
4. Baterai dengan smartphone android akan sangat boros dibandingkan dnegan OS
lainnya
No.2
Jelaskan dengan detail menurut pemahaman anda, konsep dasar Widget dalam Membuat
Layout dengan Pemrograman Flutter / Dart
Widget sendiri adalah kumpulan komponen pendukung pada flutter dalam User Interfacenya
dalam membuat layout aplikasi menggunakan framework flutter.
Flutter menggunakan konsep widget untuk membuat UI nya. Semua UI adalah terdiri dari
widget-widget. Contohnya adalah ElevatedButton widget, ListView widget, DateTimePicker
widget, TabBar widget, Text widget, Label widget, dan banyak widget lainnya. Karena konsep
semua UI adalah widget, misalnya isi dari tombol bisa diberi widget lain, contohnya memberi
gambar, tulisan dan memberi tombol lagi.
Widget pada Flutter mempunyai dua tipe yaitu :
• Stateful widget
Stateful widget adalah widget bisa melakukan gambar ulang jika ada perubahan data.
• Stateless widget
Stateless widget adalah widget yang tidak bisa melakukan gambar ulang
Contoh widget pada flutter
No.3
Jelaskan dengan detail menurut pemahaman anda, Apa Itu User eXperience dalam
Merancang Desain User Interface, dan Mengapa Penting !
User Experience adalah proses peningkatan kepuasan pengguna (pengguna aplikasi, pengunjung
website) dalam peningkatan kegunaan aplikasi dan interaksi yang diberikan antara pengguna
dengan produk. UX sendiri merupakan desain yang berkerjasama dengan berbagai lintas
fungsional, mencari spot terbaik antara kebutuhan pengguna, tujuan bisnis, kemajuan teknologi
kemudian menciptakan pengalaman luar biasa melalui desain produk yang bermakna, berguna
dan menyenangkan.
User Experience sangat penting dalam membuat produk atau layanan yang dapat memenuhi
kebutuhan dan mengatasi masalah dari pengguna serta menciptakan pengalaman yang
menyenangkan secara keseluruhan dalam menggunakan sebuah produk atau layanan. Jika kita
dapat mengetahui user experience dengan baik, sebuah produk atau layanan yang dibuat dapat
meningkatkan kepuasan pelanggan.

No.4
Jelaskan dengan detail menurut pemahaman anda, Mengenai Konsep Dasar Location
Based Service, Baik Secara Arsitektur dan Secara Service Apa yang ditampilkan dalam
Konsep LBS !
Sistem Layanan Berbasis Lokasi atau bisa disebut LBS merupakan layanan informasi yang
berbentuk geografis yang dapat diakses menggunakan smartphone melalui konejsi jaringan
internet agar dapat memetakan lokasi secara tepat. LBS digunakan dalam penggambaran
teknologi yang diperuntukkan untuk menemukan lokasi perangkat yang digunakan. Terdapat dua
unsur utama pada LBS, yakni :
• Location Manager (API Maps)
• Location Provide (API Location)
Arsitektur LBS
a. Mobile Device
Alat untuk meminta informasi yang akan dibutuhkan.
b. Communication Network
Jaringan yang akan mengirimkan data pengguna dan permintaan layanan.
c. Positioning Component
Posisi pengguna dapat diperoleh menggunakan jaringan internet atau dengan GPS.
d. Service and Application Provider
Penyedia layanan yang bertanggung jawab untuk memproses layanan. Provider
melakukan proses komputasi yakni menentukan rute perjalanan, informasi terdekat,
mencari ke database external seperti google API untuk menghasilkan informasi yang
dibutuhkan oleh pengguna.
e. Data dan Content Provider
Penyedia layanan yang dapat diminta oleh pengguna

Service LBS
Secara garis besar, LBS dibagi menjadi dua, yaitu :
1. Pull Service
Diberikan Ketika ada permintaan dari pengguna
2. Push Service
Diberikan langsung oleh service provider tanpa menunggu permintaan dari pengguna.
Layanan LBS dapat sebagai berikut
1. Lokasi
Dapat menentukan dimana lokasi suatu titik dipermukaan bumu
2. Navigasi
Membantu mencari lokasi titik wilayah
3. Tracking
Memonitoring pergerakan obyek, memetakan posisi tertentu dan melakukan perhitungan
dengan jarak terdekat.

No.5
Berikan Penjelasan Mengenai Simpel Location Based Service Berikut Ini

Pada Tabel di atas Temukan Kode Lokasi Di Google Maps, Temukan Informasi Lintang&
Bujur dan Jelaskan Analisis Anda !

Location Current Konversi


Code To Code Latitude Longitude Latitude Longitude
Hasil Analisa
Location Location code code to code to code
location location location location
RRWW+4W RQ7H+MG -6.15443 106.84731 - 106.77880 Pada code
6.18560 location
“RRWW+4W”
merupakan
sebuah titik
lokasi
Beralamat di
Jalan Rendani
No.10 No.4,
RW.10, Gn.
Sahari Sel.,
Kec.
Kemayoran,
Kota Jakarta
Pusat, Daerah
Khusus
Ibukota
Jakarta 10720
Pada code
“RQ7H+MG”
Merupakan
sebuah tempat
dilingkungan
Universitas
Esa Unggul
digedung A.
Beralamat
dijalan 1, Jl.
Kebon Raya
No.56b,
RT.1/RW.2,
Duri Kepa,
Kec. Kb.
Jeruk, Kota
Jakarta Barat,
Daerah
Khusus
Ibukota
Jakarta 11510.
Daerah duri
Kepa
RQ7H+MG RXRC+9W -6.18560 106.77880 - 106.97230 Pada code
6.15881 “RQ7H+MG”
Merupakan
sebuah tempat
dilingkungan
Universitas
Esa Unggul
digedung A.
Beralamat
dijalan 1, Jl.
Kebon Raya
No.56b,
RT.1/RW.2,
Duri Kepa,
Kec. Kb.
Jeruk, Kota
Jakarta Barat,
Daerah
Khusus
Ibukota
Jakarta 11510.
Daerah duri
Kepa.
Pada kode
“RXRC+9C”
merupakan
lokasi
Universitas
Esa Unggul
cabang
Harapan
Indah.
Memiliki
alamat Jl.
Harapan Indah
Boulevard
No.2, Pusaka
Rakyat, Kec.
Tarumajaya,
Kabupaten
Bekasi, Jawa
Barat 17214

Kesimpulan : Pada nomor pertama merupakan sebuah daerah gunung sahari ke Kampus
Universitas Esa Unggul Kebon Jeruk. Pada nomor kedua merupakan tempat Universitas Esa
Unggul Kebon Jeruk ke Universitas Esa Unggul Harapan Indah.
Penjelasan
Pembuatan Apps Sistem Penggajian yang sesuai dengan ketentuan soal UTS Pada pembuatan
apss ini digunakan SQFlite sebagai tempat database yang akan menampung informasi pada
mobile apps ini. Terdapat penghitungan gaji karyawan dan database rincian gaji karyawan untuk
report.
LAMPIRAN I
1.1 First Page
Halaman pertama berisi splashscreen sebelum memasuki aplikasi.

1.2 List View Bar


Dalam list view bar ini diberikan dua pilihan yakni : Aplikasi Penggajian dan Database
Pegawai
Pengguna dapat mengklik “Aplikasi Penggajian” untuk dapat menghitung gaji yang akan
diterima. Sedangkan “Database Pegawai” adalah sebuah penampungan informasi tentang
rincian gaji yang akan diterima oleh pegawai.

2
LAMPIRAN II
2.1 Aplikasi Penggajian
Pengguna dapat menginput nama, id, memilih status, memilih type, memilih posisition, dan
memasukkan jam lembur
2.1.1 Tampilan Aplikasi Penggajian
Merupakan section yang berisi berita pembangunan desa.

2.1.2 Dropdownbutton Type


Pengguna dapat memilih type kepegawaian, apakah permanen atau tidak
untuk menentukan gaji pokok

2.1.3 Dropdownbutton Status


Pegawai dapat memilih status kepegawaian apakah sudah menikah atau belum untuk
mendapatkan tunjangan
2.1.4 Dropdownbutton Posisition
Pengguna dapat memilih posisition kepegawaian apakah staf, supervisor, manager, head
of department atau direktur untuk mendapatkan insentif
2.1.5 TextField Lembur
Pengguna dapat memasukkan jam lembur untuk mendapatkan bonus.
2.1.6 Hasil
Pengguna yang menghitung gaji dengan memasukkan input serta pilihan akan langsung
mengetahui gaji yang akan diterima
2.2 Database Pegawai
Database yang digunakan adalah database local bawaan flutter, yakni sqflite. Pengguna yang
telah mengetahui rincian gaji yang telah dihitung, dapat memasukkannya kedalam database
secara manual. Berikut adalah tampilannya. Jika ingin menginput secara manual pencet
tombol “+”
2.2.1 Tampilan Form
Lampiran III
Berisi Source Code keseluruhan aplikasi

Main.dart
import 'package:flutter/material.dart';
import 'package:gajikaryawan/daftarpegawai.dart';
import 'package:gajikaryawan/gaji.dart';
import 'package:gajikaryawan/gajii.dart';
import 'package:gajikaryawan/homepage.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {


@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "Aplikasi Penggajian",
theme: new ThemeData(primarySwatch: Colors.blue),
home: new Rumah(),
debugShowCheckedModeBanner: false,
routes: <String, WidgetBuilder>{
'/gajiii': (BuildContext context) => new gajiPage(),
'/daftarpegawai': (BuildContext context) => new ListPegawaiPage(),
});
}
}

Homepage.dart
import 'package:flutter/material.dart';
import 'package:gajikaryawan/gajii.dart';
import 'package:gajikaryawan/daftarpegawai.dart';

class Rumah extends StatefulWidget {


@override
_RumahState createState() => _RumahState();
}

class _RumahState extends State<Rumah> {


@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Aplikasi Penggajian"),
backgroundColor: Colors.purpleAccent,
centerTitle: true,
),
drawer: new Drawer(
child: new ListView(
children: <Widget>[
new Container(
padding: new EdgeInsets.all(20.0),
child: new Text("Silahkan Pilih Menu Dibawah ini :",
style: new TextStyle(fontSize: 20.0)),
),
/*ListTile(
title: new Text("Kalkulator BMI"),
onTap: () {
Navigator.pushNamed(context, "/bmi");
},
),*/

ListTile(
title: new Text("Aplikasi Penggajian"),
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: ((context) {
return gajiPage();
})));
},
),
ListTile(
title: new Text("Database Pegawai"),
onTap: () {
Navigator.push(context,
MaterialPageRoute(builder: ((context) {
return ListPegawaiPage();
})));
}),
],
)),
body: new ListView(
children: <Widget>[
new Container(
padding: new EdgeInsets.all(30.0),
),
new Padding(
padding: new EdgeInsets.only(top: 5.0, bottom: 15.0),
child: new Text("Aplikasi Penghitung Gaji",
textAlign: TextAlign.center,
style: new TextStyle(
fontSize: 40.0, fontWeight: FontWeight.bold)),
),
new Text("Hitung Gaji Anda",
textAlign: TextAlign.center,
style: new TextStyle(fontSize: 20.0)),
],
));
}
}

Gajii.dart
import 'package:flutter/material.dart';
import "dart:math";

class gajiPage extends StatefulWidget {


const gajiPage({super.key});
@override
State<gajiPage> createState() => _gajiPageState();
}

class _gajiPageState extends State<gajiPage> {


@override
Widget build(BuildContext context) {
return Scaffold(
appBar: new AppBar(
title: new Text("Widya Handriana"),
backgroundColor: Colors.purpleAccent,
centerTitle: true,
),
body: new Container(
padding: new EdgeInsets.all(20.0),
child: new ListView(
children: <Widget>[new proses()],
),
),
);
}
}
class proses extends StatefulWidget {
@override
_prosesState createState() => _prosesState();
}

class _prosesState extends State<proses> {


GlobalKey<FormState> formKey = GlobalKey<FormState>();
TextEditingController namaController = TextEditingController();
TextEditingController idController = TextEditingController();
TextEditingController statusController = TextEditingController();
TextEditingController typeController = TextEditingController();
TextEditingController tunjanganController = TextEditingController();
TextEditingController baseController = TextEditingController();
TextEditingController overtimeController = TextEditingController();
TextEditingController insentifController = TextEditingController();
TextEditingController bonusController = TextEditingController();
TextEditingController grossController = TextEditingController();
TextEditingController taxController = TextEditingController();
TextEditingController pphController = TextEditingController();
TextEditingController nettController = TextEditingController();
TextEditingController bpjsController = TextEditingController();

String? typeValue;
String? statusValue;
String? position;
String? insentifValue;
bool staffValue = false;
bool spvValue = false;
bool managerValue = false;
bool hodValue = false;
bool direkturValue = false;
double insentif = 0;

double tunjangan = 0;
double basesalary = 0;
double overtime = 0;
double bonus = 0;
double gross = 0;
double tax = 0;
double pph = 0;
double bpjs = 0;
double status = 0;
double type = 0;
double nett = 0;
void resetAllValue() {
namaController.text = " ";
idController.text = " ";
insentifValue = null;
direkturValue = false;
spvValue = false;
hodValue = false;
managerValue = false;
staffValue = false;
typeValue = null;
statusValue = null;
position = null;
tunjangan = 0;
basesalary = 0;
overtime = 0;
bonus = 0;
gross = 0;
tax = 0;
pph = 0;
bpjs = 0;
nett = 0;

insentif = 0;

typeController.text = " ";


tunjanganController.text = " ";
baseController.text = " ";
overtimeController.text = " ";
insentifController.text = " ";
bonusController.text = " ";
grossController.text = " ";
taxController.text = " ";
nettController.text = " ";
}

void validateInput() {
FormState? form = formKey.currentState;
SnackBar message = const SnackBar(
content: Text("Proses Selesai"),
);

if (form!.validate()) {
ScaffoldMessenger.of(context).showSnackBar(message);
}
}

void rumus() {
setState(() {
int? overtime;
if (overtimeController.text != '') {
overtime = int.parse(overtimeController.text);

//Type Staff
if (typeValue == 'Permanen') {
basesalary = 5500000;
} else if (typeValue == 'Tidak') {
basesalary = 4500000;
}

//TUNJANGAN STATUS
if (statusValue == 'Menikah') {
tunjangan = 1000000;
} else if (statusValue == 'Belum') {
tunjangan = 0;
}

//INSENTIF PILIHAN

if (position == 'Staf') {
insentif = 1000000;
} else if (position == 'Supervisor') {
insentif = 3000000;
} else if (position == 'HoDpt') {
insentif = 10000000;
} else if (position == 'Direktur') {
insentif = 25000000;
} else if (position == 'Manager') {
insentif = 4500000;
}

//totalgaji

bonus = overtime * 100000;

gross = bonus + insentif + tunjangan;

//pph 10%
pph = gross * 0.11;
pphController.text = pph.toString();
//bpjs 2,5%
bpjs = gross * 0.025;
bpjsController.text = bpjs.toString();
//Total Potongan
tax = pph + bpjs;
taxController.text = tax.toString();
//gaji bersih
nett = gross - tax;
nettController.text = nett.toString();
}
});
}

@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Padding(
padding: EdgeInsets.only(top: 20.0, bottom: 25.0),
child: Text(
"Aplikasi Penggaji Karyawan",
style: TextStyle(fontSize: 25.0),
),
),
TextField(
controller: namaController,
keyboardType: TextInputType.text,
decoration: InputDecoration(
hintText: "Masukkan Nama Anda",
labelText: "Nama",
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
)),
),
TextField(
controller: idController,
keyboardType: TextInputType.text,
decoration: InputDecoration(
hintText: "Masukkan ID Anda",
labelText: "ID Pegawai",
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
)),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Status',
style: TextStyle(
fontSize: 20,
),
),
SizedBox(
width: 250,
child: DropdownButtonFormField(
value: statusValue,
items: [
'Menikah',
'Belum',
].map((String items) {
return DropdownMenuItem(
value: items,
child: Text(items),
);
}).toList(),
onChanged: (String? newValue) {
setState(() {
statusValue = newValue!;
});
},
))
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Type',
style: TextStyle(
fontSize: 20,
),
),
SizedBox(
width: 250,
child: DropdownButtonFormField(
value: typeValue,
items: [
'Permanen',
'Tidak',
].map((String typ) {
return DropdownMenuItem(
value: typ,
child: Text(typ),
);
}).toList(),
onChanged: (String? ve) {
setState(() {
typeValue = ve!;
});
},
))
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Posisition',
style: TextStyle(
fontSize: 20,
),
),
SizedBox(
width: 250,
child: DropdownButton<String>(
value: position,
items: [
'Staf',
'Supervisor',
'Manager',
'HoDpt',
'Direktur',
].map((String pos) {
return DropdownMenuItem(
value: pos,
child: Text(pos),
);
}).toList(),
onChanged: (String? qw) {
setState(() {
position = qw!;
});
},
))
],
),
TextField(
controller: overtimeController,
keyboardType: TextInputType.text,
decoration: InputDecoration(
hintText: "Masukkan Jam Lembur",
labelText: "Lembur",
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
),
),
),
Padding(
padding: new EdgeInsets.only(top: 20.0, bottom: 20.0),
child: new Row(children: <Widget>[
ElevatedButton(
onPressed: rumus,
style: ElevatedButton.styleFrom(primary: Colors.purpleAccent),
child: new Text("Hitung Gaji!"),
),
Padding(
padding: new EdgeInsets.only(left: 10.0),
child: ElevatedButton(
onPressed: resetAllValue,
child: new Text("Hapus!"),
style:
ElevatedButton.styleFrom(primary:
Colors.purpleAccent)),
),
])),
Text("Gaji Kotor : $basesalary", style: new TextStyle(fontSize: 20.0)),
Text("Tunjangan Status : $tunjangan",
style: new TextStyle(fontSize: 20.0)),
Text("Insentif : $insentif", style: new TextStyle(fontSize: 20.0)),
Text("Lembur : $bonus", style: new TextStyle(fontSize: 20.0)),
Text("BPJS : $pph", style: new TextStyle(fontSize: 20.0)),
Text("BPJS : $bpjs", style: new TextStyle(fontSize: 20.0)),
Text("Gaji Bersih : $gross", style: new TextStyle(fontSize: 20.0)),
],
);
}
}
Pegawai.dart
class Pegawai {
int? id;
String? nama;
String? nokaryawan;
String? tunjangan;
String? insentif;
String? bonus;
String? lembur;
String? nett;
String? tax;

Pegawai(this.id, this.nama, this.nokaryawan, this.insentif, this.bonus,


this.tunjangan, this.lembur, this.nett);
Pegawai.fromMap(Map<String, dynamic> map) {
id = map['id'];
nama = map['nama'];
nokaryawan = map['nokaryawan'];
tunjangan = map['tunjangan'];
insentif = map['insentif'];
bonus = map['bonus'];
nett = map['nett'];
tax = map['tax'];
}
Map<String, dynamic> toMap() {
var map = Map<String, dynamic>();
if (id != null) {
map['id'] = id;
}
nama = map['nama'];
nokaryawan = map['nokaryawan'];
tunjangan = map['tunjangan'];
insentif = map['insentif'];
bonus = map['bonus'];
nett = map['nett'];
tax = map['tax'];
return map;
}
}

Entryform.dart
import 'package:flutter/material.dart';
import 'package:gajikaryawan/Pegawai.dart';
import 'package:gajikaryawan/dbhelper.dart';

class FormPegawai extends StatefulWidget {


final Pegawai? pegawai;

FormPegawai({this.pegawai});

@override
_FormPegawaiState createState() => _FormPegawaiState();
}

class _FormPegawaiState extends State<FormPegawai> {


DbHelper db = DbHelper();

TextEditingController? nama;
TextEditingController? nokaryawan;
TextEditingController? tunjangan;
TextEditingController? insentif;
TextEditingController? bonus;
TextEditingController? tax;
TextEditingController? nett;

@override
void initState() {
nama = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.nama);
nokaryawan = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.nokaryawan);
tunjangan = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.tunjangan);
insentif = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.insentif);
bonus = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.bonus);
tax = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.tax);
nett = TextEditingController(
text: widget.pegawai == null ? '' : widget.pegawai!.nett);

super.initState();
}

@override
Widget build(BuildContext context) {
final ButtonStyle style = ElevatedButton.styleFrom(
primary: Colors.purpleAccent,
shape: RoundedRectangleBorder(borderRadius:
BorderRadius.circular(20)));
return Scaffold(
appBar: AppBar(
title: Text('Form Pegawai'),
backgroundColor: Colors.purple,
),
body: ListView(
padding: EdgeInsets.all(16.0),
children: [
TextField(
controller: nama,
decoration: InputDecoration(
labelText: 'Nama Pegawai',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
TextField(
controller: nokaryawan,
decoration: InputDecoration(
labelText: 'ID Pegawai',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
TextField(
controller: tunjangan,
decoration: InputDecoration(
labelText: 'Tunjangan',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
TextField(
controller: insentif,
decoration: InputDecoration(
labelText: 'Insentif',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
TextField(
controller: bonus,
decoration: InputDecoration(
labelText: 'Bonus',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
TextField(
controller: tax,
decoration: InputDecoration(
labelText: 'Potongan',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
TextField(
controller: nett,
decoration: InputDecoration(
labelText: 'Gaji yang Diterima',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
)),
),
ElevatedButton(
child: (widget.pegawai == null)
? Text(
'Add',
style: TextStyle(color: Colors.white),
)
: Text(
'Update',
style: TextStyle(color: Colors.white),
),
style: style,
onPressed: () {
upsertPegawai();
},
)
],
),
);
}

Future<void> upsertPegawai() async {


if (widget.pegawai != null) {
//insert

await db.updatePegawai(Pegawai.fromMap({
'id': widget.pegawai!.id,
'Nama': nama!.text,
'Id Karyawan': nokaryawan!.text,
'Tunjangan': tunjangan!.text,
'Insentif': insentif!.text,
'Bonus': bonus!.text,
'Potongan': tax!.text,
'Gaji yang Diterima': nett!.text,
}));
Navigator.pop(context, 'update');
} else {
//update

Navigator.pop(context, 'save');
}
}
}

Detail.dart
import 'package:flutter/material.dart';

import 'package:gajikaryawan/Pegawai.dart';

class DetailPage extends StatelessWidget {


final Pegawai? pegawai;

DetailPage(this.pegawai);

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Detail Page'),
),
body: Center(
child: Column(
children: [
Text('ID Karyawan: ${pegawai!.nokaryawan}'),
Text('Nama Pegawai : ${pegawai!.nama}'),
Text('Tunjangan : ${pegawai!.tunjangan}'),
Text('Insentif : ${pegawai!.insentif}'),
Text('Bonus : ${pegawai!.bonus}'),
Text('Potongan : ${pegawai!.tax}'),
Text('Gaji yang diterima : ${pegawai!.nett}'),
],
),
),
);
}
}

dbhelper.dart
import 'package:gajikaryawan/Pegawai.dart';

import 'package:sqflite/sqflite.dart';
import 'dart:async';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';

class DbHelper {
static final DbHelper _instance = DbHelper._internal();
static Database? _database;

final String tableName = 'tablePegawai';

final String kolomid = 'id';


final String nama = 'nama';
final String nokaryawan = 'nokaryawan';
final String tunjangan = 'tunjangan';
final String insentif = 'insentif';
final String bonus = 'bonus';
final String tax = 'tax';
final String nett = 'nett';

DbHelper._internal();
factory DbHelper() => _instance;

Future<Database?> get _db async {


if (_database != null) {
return _database;
}
_database = await _initDb();
return _database;
}

Future<Database?> _initDb() async {


String databasePath = await getDatabasesPath();
String path = join(databasePath, 'pegawai.db');

return await openDatabase(path, version: 1, onCreate: _onCreate);


}

Future<void> _onCreate(Database db, int version) async {


var sql = "CREATE TABLE $tableName($kolomid INTEGER PRIMARY KEY, "
"$nama TEXT,"
"$nokaryawan TEXT,"
"$tunjangan TEXT,"
"$insentif TEXT,"
"$bonus TEXT,"
"$tax TEXT),"
"$nett TEXT)";
await db.execute(sql);
}

Future<int?> savePegawai(Pegawai pegawai) async {


var dbClient = await _db;
return await dbClient!.insert(tableName, pegawai.toMap());
}

Future<List?> getAllPegawai() async {


var dbClient = await _db;
var result = await dbClient!.query(tableName, columns: [
kolomid,
nama,
nokaryawan,
tunjangan,
bonus,
insentif,
tax,
nett
]);

return result.toList();
}
Future<int?> updatePegawai(Pegawai pegawai) async {
var dbClient = await _db;
return await dbClient!.update(tableName, pegawai.toMap(),
where: '$kolomid = ?', whereArgs: [pegawai.id]);
}

Future<int?> deletePegawai(int id) async {


var dbClient = await _db;
return await dbClient!
.delete(tableName, where: '$kolomid = ?', whereArgs: [id]);
}
}

daftarpegawai.dart
import 'package:gajikaryawan/detail.dart';

class ListPegawaiPage extends StatefulWidget {


const ListPegawaiPage({Key? key}) : super(key: key);

@override
_ListPegawaiPageState createState() => _ListPegawaiPageState();
}

class _ListPegawaiPageState extends State<ListPegawaiPage> {


List<Pegawai> listPegawai = [];
DbHelper db = DbHelper();

@override
void initState() {
_getAllPegawai();
super.initState();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Daftar Pegawai'),
backgroundColor: Colors.red,
),
body: ListView.builder(
itemCount: listPegawai.length,
itemBuilder: (context, index) {
Pegawai pegawai = listPegawai[index];

return ListTile(
onTap: () {
//edit
_openFormEdit(pegawai);
},
contentPadding: EdgeInsets.all(16),
title: Text(
'${pegawai.nama} ${pegawai.nokaryawan}',
style: TextStyle(
fontSize: 18,
fontStyle: FontStyle.italic,
color: Colors.deepOrangeAccent),
),
subtitle: Text('${pegawai.nett}'),
trailing: IconButton(
icon: Icon(Icons.delete),
onPressed: () {
AlertDialog hapus = AlertDialog(
title: Text('Information'),
content: Container(
height: 100,
child: Column(
children: [
Text(
'Apakah anda yakin ingin menghapus data
${pegawai.nett}'),
],
),
),
actions: [
TextButton(
child: Text('Ya'),
onPressed: () {
//delete
_deletePegawai(pegawai, index);
Navigator.pop(context);
},
),
TextButton(
child: Text('Tidak'),
onPressed: () {
Navigator.pop(context);
},
),
],
);
showDialog(context: context, builder: (context) => hapus);
},
),
leading: IconButton(
onPressed: () {
//detail
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DetailPage(pegawai)));
},
icon: Icon(Icons.visibility),
),
);
}),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
backgroundColor: Colors.red,
onPressed: () {
//add
_openFormCreate();
},
),
);
}

Future<void> _getAllPegawai() async {


var list = await db.getAllPegawai();
setState(() {
listPegawai.clear();
list!.forEach((pegawai) {
listPegawai.add(Pegawai.fromMap(pegawai));
});
});
}

Future<void> _deletePegawai(Pegawai pegawai, int position) async {


await db.deletePegawai(pegawai.id!);

setState(() {
listPegawai.removeAt(position);
});
}

Future<void> _openFormCreate() async {


var result = await Navigator.push(
context, MaterialPageRoute(builder: (context) => FormPegawai()));
if (result == 'save') {
await _getAllPegawai();
}
}

Future<void> _openFormEdit(Pegawai pegawai) async {


var result = await Navigator.push(context,
MaterialPageRoute(builder: (context) => FormPegawai(pegawai:
pegawai)));
if (result == 'update') {
await _getAllPegawai();
}
}
}
Lampiran IV
Berisi Flowchart Aplikasi, Class Diagram, Activity Diagram, Use Case Diagram

4.1 Class Diagram


Dikarenakan keterbatasan waktu serta aplikasi yang sederhana, penulis membuat class
diagram yang berisi data yang berkaitan dengan aplikasi penggajian, yakni : Data type untuk
menampung data tipe pegawai, data status untuk menampung status pernikahan pegawai, data
posisition untuk menampung jabatan pegawai, data lembur untuk menampung total jam lembur,
dara potongan untuk menyimpan potongan gaji pegawai serta data pegawai yang berisi data-data
pegawai.
4.2 Activity Diagram
Dikarenakan keterbatasan waktu dan aplikasi sederhana, penulis membuat activity diagram
dalam aktivitas penghitungan gaji pegawai. Ini merupakan gambaran besar saat pengguna
menggunakan aplikasi ini.
4.3 Use Case Diagram
Dikarenakan keterbatasan waktu dan aplikasi sederhana, penulis membuat activity diagram
dalam aktivitas penghitungan gaji pegawai. Fitur yang ada pada apliakasi hanyalah penghitungan
gaji pegawai serta penyimpanan rincian data gaji pegawai

4.4 Sequence Diagram


Dikarenakan keterbatasan waktu dan aplikasi sederhana, penulis membuat activity diagram
dalam aktivitas penghitungan gaji pegawai. Beberapa hal yang dapat dilakukan oleh pengguna
dalam menggunakan aplikasi ini.
4.5 Flowchart Diagram

Anda mungkin juga menyukai