public SuratPermintaan(string noSuratPermintaan, string keterangan, DateTime tanggal, JobOrder jobOrder)
 {
     this.noSuratPermintaan        = noSuratPermintaan;
     this.keterangan               = keterangan;
     this.tanggal                  = tanggal;
     this.jobOrder                 = jobOrder;
     this.listDetilSuratPermintaan = new List <DetilSuratPermintaan>();
 }
        // method untuk mengubah data  overhead produksi saat ada barang tambahan
        public static string UpdateOverheadProduksi(JobOrder pJob)
        {
            string sql = "UPDATE jobOrder SET overheadProduksi = " +
                         pJob.DirectMaterial + " where kodeJobOrder = '" + pJob.KodeJobOrder + "'";

            try
            {
                Koneksi.JalankanPerintahDML(sql);
                return("1");
            }
            catch (MySqlException ex)
            {
                return(ex.Message + ". Perintah sql: " + sql);
            }
        }
        public static string TambahData(JobOrder pJobOrder)
        {
            using (var tranScope = new TransactionScope(TransactionScopeOption.RequiresNew))
            {
                // perintah sql 1 = untuk menambahkan data ke tabel Job Order
                string sql1 = "INSERT INTO JobOrder(kodeJobOrder, quantity,  directLabor, directMaterial, overheadProduksi, tglMulai, tglSelesai, kodeBarang, " +
                              " noNotaPenjualan, status) VALUES ('" +
                              pJobOrder.KodeJobOrder + "', " +
                              pJobOrder.Quantity + ", " +
                              pJobOrder.DirectLabor + ", " +
                              pJobOrder.DirectMaterial + ", " +
                              pJobOrder.OverheadProduksi + ", '" +
                              pJobOrder.TglMulai.ToString("yyyy-MM-dd ") + "', '" +
                              pJobOrder.TglSelesai.ToString("yyyy-MM-dd ") + "', '" +
                              pJobOrder.Barang.KodeBarang + "', '" +
                              pJobOrder.NotaPenjualan.NoNotaPenjualan + "','" +
                              pJobOrder.Status + "')";

                try
                {
                    //jalankan perintah untuk menambahkan  ke tabel JobOrder
                    Koneksi.JalankanPerintahDML(sql1);
                    //menambahkan data karyawan yang harus dibayar atau gajikaryawan yang terlibat
                    for (int i = 0; i < pJobOrder.ListDetilJobOrder.Count; i++)
                    {
                        //perintah sql2 = untuk menambahkan ke tabel detiljoborder
                        string sql2 = "INSERT INTO detilJobOrder(kodeJobOrder, idKaryawan, satuan, gajiPerSatuan) VALUES ('" +
                                      pJobOrder.KodeJobOrder + "', " +
                                      pJobOrder.ListDetilJobOrder[i].Karyawan.IdKaryawan + ", '" +
                                      pJobOrder.ListDetilJobOrder[i].Satuan + "', " +
                                      pJobOrder.ListDetilJobOrder[i].GajiPerSatuan + ")";

                        //menjalankan perintah untuk menambahkan  ke tabel detilJobOrder
                        Koneksi.JalankanPerintahDML(sql2);
                    }
                    //jika semua perinth dml berhasil dijalankan
                    tranScope.Complete();
                    return("1");
                }
                catch (Exception e)
                {
                    //jika ada kegagalan perintah dml
                    tranScope.Dispose();
                    return(e.Message);
                }
            }
        }
        public static string BacaData(string kriteria, string nilaiKriteria, List <SuratPermintaan> listSuratPermintaan)
        {
            string sql1 = "";

            if (kriteria == "")
            {
                //tuliskan perintah sql1 = untuk menampilkan semua data  ditabel suratpermintaan
                sql1 = "select SP.noSuratPermintaan, SP.tanggal, SP.keterangan, SP.kodejoborder, JO.quantity, JO.directlabor, " +
                       " JO.directmaterial, JO.overheadproduksi, JO.status from suratpermintaan SP inner join joborder JO on SP.kodejoborder = JO.kodejoborder " +
                       " order by noSuratPermintaan desc";
            }
            else
            {
                sql1 = "select SP.noSuratPermintaan, SP.tanggal, SP.keterangan, SP.kodejoborder, JO.quantity, JO.directlabor, " +
                       " JO.directmaterial, JO.overheadproduksi, JO.status from suratpermintaan SP inner join joborder JO on SP.kodejoborder = JO.kodejoborder " +
                       "  where " + kriteria + " LIKE '%" + nilaiKriteria + "%' order by noSuratPermintaan desc";
            }

            try
            {
                //data reader 1 = memperoleh semua data di tabelsurat permintaan
                MySqlDataReader hasilData1 = Koneksi.JalankanPerintahQuery(sql1);
                listSuratPermintaan.Clear();//kosongi isi list terlebih dahulu

                while (hasilData1.Read())
                {
                    //mendapatkan  nosurat ,dll
                    string   nomorSurat = hasilData1.GetValue(0).ToString();
                    DateTime tgl        = DateTime.Parse(hasilData1.GetValue(1).ToString());
                    string   ket        = hasilData1.GetValue(2).ToString();

                    //permintaan dari job order
                    //mendapatkan kode job order
                    string kodeJob   = hasilData1.GetValue(3).ToString();
                    int    pquantity = int.Parse(hasilData1.GetValue(4).ToString());
                    int    labor     = int.Parse(hasilData1.GetValue(5).ToString());
                    int    material  = int.Parse(hasilData1.GetValue(6).ToString());
                    int    over      = int.Parse(hasilData1.GetValue(7).ToString());
                    string pStatus   = hasilData1.GetValue(8).ToString();

                    //buat object bertipe joborder
                    JobOrder job = new JobOrder();
                    //tambahkan  data
                    job.KodeJobOrder     = kodeJob;
                    job.Quantity         = pquantity;
                    job.DirectLabor      = labor;
                    job.DirectMaterial   = material;
                    job.OverheadProduksi = over;
                    job.Status           = pStatus;

                    //Surat Permintaan
                    //buat object surat Permintaan dan tambahkan data
                    SuratPermintaan surat = new SuratPermintaan(nomorSurat, ket, tgl, job);

                    //DETAIL surat permintaan
                    //query utk detail suratpermintaan dari tiap surat
                    //sql2 untuk mendapatkan barang yang akan di gunakan
                    string sql2 = "SELECT DSP.kodeBarang, B.Nama,  DSP.Jumlah FROM suratpermintaan SP INNER JOIN " +
                                  "detilsuratpermintaan DSP ON SP.nosuratpermintaan = DSP.nosuratpermintaan INNER JOIN Barang B ON " +
                                  "DSP.KodeBarang = B.KodeBarang WHERE SP.nosuratpermintaan = '" + nomorSurat + "'";

                    //memperoleh semua data barang ditabel detilsuratpermintaan
                    MySqlDataReader hasilData2 = Koneksi.JalankanPerintahQuery(sql2);

                    while (hasilData2.Read())
                    {
                        //mendapatkan  kode dan nama barang yang akan digunakan
                        string kodeBrg = hasilData2.GetValue(0).ToString();
                        string namaBrg = hasilData2.GetValue(1).ToString();

                        //buat object barang dan tambahkan
                        Barang brg = new Barang();
                        brg.KodeBarang = kodeBrg;
                        brg.Nama       = namaBrg;


                        //mendapatkan jumlah
                        int jumlah = int.Parse(hasilData2.GetValue(2).ToString());

                        //buat object bertipe detilsurat dan tambahkan
                        //ingat baik baik agar fk tidak duplicate
                        DetilSuratPermintaan detilSurat = new DetilSuratPermintaan(brg, jumlah);

                        //simpan detil barang
                        surat.TambahDetilBarang(brg, jumlah);
                    }
                    //simpan ke list
                    listSuratPermintaan.Add(surat);
                }
                return("1");
            }
            catch (MySqlException ex)
            {
                return(ex.Message);
            }
        }
        public static string BacaData(string kriteria, string nilaiKriteria, List <JobOrder> listJobOrder)
        {
            string sql1 = "";

            if (kriteria == "")
            {
                //tuliskan perintah sql1 = untuk menampilkan semua data  ditabel JobOrder
                sql1 = "SELECT J.kodeJobOrder, B.kodeBarang, B.nama as Item, B.hargaBeliTerbaru, J.quantity, B.satuan, J.directMaterial, J.directLabor, " +
                       " J.overheadProduksi, J.tglMulai, J.tglSelesai, J.noNotaPenjualan, J.status FROM notapenjualan NP inner join " +
                       " joborder J on NP.noNotaPenjualan = J.noNotaPenjualan inner join barang B on B.kodeBarang = J.kodebarang order by kodejoborder DESC ";
            }
            else
            {
                sql1 = "SELECT J.kodeJobOrder, B.kodeBarang, B.nama as Item, B.hargaBeliTerbaru, J.quantity, B.satuan, J.directMaterial, J.directLabor, " +
                       " J.overheadProduksi, J.tglMulai, J.tglSelesai, J.noNotaPenjualan, J.status FROM notapenjualan NP inner join " +
                       " joborder J on NP.noNotaPenjualan = J.noNotaPenjualan inner join barang B on B.kodeBarang = J.kodebarang  where " +
                       kriteria + " LIKE '%" + nilaiKriteria + "%' order by kodejoborder DESC";
            }

            try
            {
                //data reader 1 = memperoleh semua data di tabel job order
                MySqlDataReader hasilData1 = Koneksi.JalankanPerintahQuery(sql1);
                listJobOrder.Clear();//kosongi isi list terlebih dahulu
                while (hasilData1.Read())
                {
                    //mendapatkan  kodeJobOrder, quantity , satuan, dll
                    string   kodeJob   = hasilData1.GetValue(0).ToString();
                    int      pQuantity = int.Parse(hasilData1.GetValue(4).ToString());
                    int      pMaterial = int.Parse(hasilData1.GetValue(6).ToString());
                    int      pLabor    = int.Parse(hasilData1.GetValue(7).ToString());
                    int      pOver     = int.Parse(hasilData1.GetValue(8).ToString());
                    DateTime pMulai    = DateTime.Parse(hasilData1.GetValue(9).ToString());
                    DateTime pSelesai  = DateTime.Parse(hasilData1.GetValue(10).ToString());
                    string   pStatus   = hasilData1.GetValue(12).ToString();

                    //tambahkan no nota
                    string        noNota = hasilData1.GetValue(11).ToString();
                    NotaPenjualan nota   = new NotaPenjualan();
                    nota.NoNotaPenjualan = noNota;

                    //barang  yang akan dibuat
                    //mendapatkan kode barang, nama, harga
                    string kodeBrng = hasilData1.GetValue(1).ToString();
                    string namaBrng = hasilData1.GetValue(2).ToString();
                    int    harga    = int.Parse(hasilData1.GetValue(3).ToString());
                    string pSatuan  = hasilData1.GetValue(5).ToString();

                    //buat object bertipe barang
                    Barang barang = new Barang();
                    //tambahkan 4 data dibawah
                    barang.KodeBarang       = kodeBrng;
                    barang.Nama             = namaBrng;
                    barang.HargaBeliTerbaru = harga;
                    barang.Satuan           = pSatuan;

                    //job order
                    //buat object joborder dan tambahkan data
                    JobOrder job = new JobOrder(kodeJob, pQuantity, pLabor, pMaterial, pOver, pMulai, pSelesai, pStatus, barang, nota);

                    //DETAIL Job Order
                    //query utk detail Job Order
                    //sql2 untuk menghitung directlabor
                    string sql2 = "SELECT K.idkaryawan, K.Nama, K.gender, K.notelepon, DJO.satuan, DJO.gajiPerSatuan FROM joborder JO INNER JOIN " +
                                  "detilJobOrder DJO ON JO.kodejoborder = DJO.kodejoborder INNER JOIN karyawan K ON " +
                                  "DJO.idkaryawan = K.idkaryawan WHERE JO.kodejobOrder = '" + kodeJob + "'";

                    //memperoleh semua data
                    MySqlDataReader hasilData2 = Koneksi.JalankanPerintahQuery(sql2);

                    while (hasilData2.Read())
                    {
                        //mendapatkan  id dan nama karyawan yang bekerja
                        string idKary   = hasilData2.GetValue(0).ToString();
                        string namaKary = hasilData2.GetValue(1).ToString();
                        string pGender  = hasilData2.GetValue(2).ToString();
                        string noTelp   = hasilData2.GetValue(3).ToString();

                        //buat object Karyawan dan tambahkan
                        Karyawan K = new Karyawan();
                        K.IdKaryawan = idKary;
                        K.Nama       = namaKary;
                        K.Gender     = pGender;
                        K.NoTelepon  = noTelp;

                        //mendapatkan satuan dan Gaji persatuan transaksi
                        string pSat       = hasilData2.GetValue(4).ToString();
                        int    gajiSatuan = int.Parse(hasilData2.GetValue(5).ToString());

                        //buat object bertipe detilJoborder dan tambahkan
                        //ingat baik baik agar fk tidak duplicate
                        DetilJobOrder detilJob = new DetilJobOrder(K, pSat, gajiSatuan);

                        //simpan
                        job.TambahDetilJobOrder(K, pSat, gajiSatuan);
                    }
                    //simpan ke list
                    listJobOrder.Add(job);
                }
                return("1");
            }
            catch (MySqlException ex)
            {
                return(ex.Message);
            }
        }