Langsung ke konten utama

BELAJAR PYTHON : MANAJAMEN STATUS STOK BARANG | APLIKASI KASIR POS ANDROID IOS MUDAH

 

SESI 06 : MANAJAMEN STATUS STOK BARANG


Assalamualaikum warahmatullohi wabarohatuh salam sukses. Mari kita lanjutkan coding kita pada bagian ke 6 (enam) ini kita akan membuat halaman untuk merubah status stok barang, detail tutorialnya ada di video ini :



Dimateri ini kita akan membuat beberapa kelas untuk merancang bentuk atau tampilan menu memanajemen status stok ini. bentuk halaman dan detail isinya yang dirancang seperti ini :
  
Untuk menangani tampilan tersebut kita membuat beberapa kelas baru meliputi :

Class StokList(MDBoxLayout)
Digunakan untuk merancang tampilan tan tata urutan item field yang akan di tampilkan, beserta tombol button sebagai pengontrol perintahnya.

Class StokBarang(Screen)
Digunakan untuk merancang form halaman menu display stats stok barangnya, yang terdiri dari    header, bagian detail isi data stoknya dan tombol ntuk pindah ke menu utama.

Class MyResto(MDApp)
Disini kita menambahi atau membuat fungsi/metod pengontrol perubahan statusnya.

Selain it kita juga membat file kivy baru yaitu :

Stok_list.kv
Ini adalah file penataan bentuk objek-objek yang dibutuhkan sebagai penerjemah dari class  StokList.

Stok_barang.kv
Ini adalah file penataan bentuk objek-objek menu atau display yang dibutuhkan sebagai penerjemah dari class  StokBarang.

Secara lengkapnya source programnya menjadi sebagai berikut :

FILE MAIN.PY dilengkapi menjadi seperti ini :

from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.properties import StringProperty,BooleanProperty

from kivymd.app import MDApp
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.dialog import MDDialog
from kivymd.uix.button import MDFlatButton

# bila install manuual --> pip install pysqlite3
import sqlite3

Window.size = (400,600)

Builder.load_file('menu.kv')
Builder.load_file('barang.kv')
Builder.load_file('barang_item.kv')
Builder.load_file('barang_new.kv')
Builder.load_file('stok_list.kv')
Builder.load_file('stok_barang.kv')

def buat_database():
    conn = sqlite3.connect("data_resto.db")
    mycursor = conn.cursor()
   
    try:
        mycursor.execute("select * from barang ")
    except:  
        queri = "CREATE TABLE IF NOT EXISTS barang("\
                "kode INTEGER PRIMARY KEY AUTOINCREMENT,"\
                "jenis TEXT DEFAULT '',"\
                "nama TEXT DEFAULT '',"\
                "harga INTEGER  DEFAULT 0,"\
                "gambar TEXT DEFAULT '',"\
                "status TEXT DEFAULT '') "  
        mycursor.execute(queri)    
        conn.commit()    

    conn.close()

class MenuUtama(Screen):
    def buka_menubarang(self):
        self.manager.transition.direction = 'left'
        self.manager.current = 'MenuBarang'

class StokList(MDBoxLayout):
    jenis = StringProperty ("Food")
    nama = StringProperty ("Food No: 01")
    harga = StringProperty ('10000')
    status = StringProperty ('kosong')
    tebal = BooleanProperty(False)
    tombolmati = BooleanProperty(False)

class StokBarang(Screen):
    def on_pre_enter(self):
        self.ids.idheader.clear_widgets()
        self.ids.idgridstok.clear_widgets()
        item=StokList()
        item.jenis = "JENIS"
        item.nama = "NAMA BARANG"
        item.harga = "HARGA"
        item.status = "STATUS"
        item.tebal = True
        item.tombolmati = True
        self.ids.idheader.add_widget(item)  
        self.tampil_barang()
        return self

    def tampil_barang(self):
        conn = sqlite3.connect('data_resto.db')
        conn.row_factory = sqlite3.Row
        cur = conn.cursor()
        cur.execute("SELECT * FROM barang order by jenis ")
        daftarbarang = cur.fetchall()
        conn.commit()
        conn.close()
       
        for record in daftarbarang:
            item=StokList()                          
            if record['jenis']=='1': item.jenis='Food'
            if record['jenis']=='2': item.jenis='Drink'
            if record['jenis']=='3': item.jenis='Snack'
            item.kode=str(record['kode'])
            item.nama=record['nama']
            item.harga=str(record['harga'])
            item.status=record['status']
            item.tebal = False
            item.tombolmati = False
            self.ids.idgridstok.add_widget(item)
        return self


class BarangItem(MDFloatLayout):
    jenis = StringProperty ("Item Food")
    nama = StringProperty ("Food No: 01")
    harga = StringProperty ('10000')
    gambar = StringProperty ("image/food01.png")
    kode = StringProperty ("*")
    iconkiri= StringProperty ("*")
    iconkanan= StringProperty ("*")
    bawaclass= StringProperty ("*")

class BarangNew(Screen):
    datanew = StringProperty ("*")
    datakode = StringProperty ("*")

    def on_enter(self):
        if BarangNew.datanew=='edit':
            self.isiform()
        else:
            self.kosongform()
   
    def kosongform(self):
        self.ids.jenis.text =''
        self.ids.nama.text=''
        self.ids.harga.text=''
        self.ids.gambar.text=''
        self.ids.cetakgambar.source=''
        BarangNew.datanew='*'
        BarangNew.datakode='*'

    def isiform(self):
        carikode=BarangNew.datakode
        conn = sqlite3.connect('data_resto.db')
        conn.row_factory = sqlite3.Row
        cur = conn.cursor()
        cur.execute("SELECT * FROM barang where kode='"+carikode+"'")
        daftarbarang = cur.fetchall()
        conn.close()
        for record in daftarbarang:                  
            self.ids.jenis.text =record['jenis']
            self.ids.nama.text=record['nama']
            self.ids.harga.text=str(record['harga'])
            self.ids.gambar.text=record['gambar']
            self.ids.cetakgambar.source=record['gambar']

    def tampilkan_gambar(self,lokasi):
        self.ids.cetakgambar.source=lokasi

    def simpan(self):
        isijenis= self.ids.jenis.text.strip()
        isinama = self.ids.nama.text.strip()
        isiharga= '0' if self.ids.harga.text.strip()=='' else self.ids.harga.text
        isigambar= self.ids.gambar.text.strip()
        isistatus='kosong'

        conn = sqlite3.connect("data_resto.db")
        mycursor = conn.cursor()
        if self.datanew=='edit':
            carikode=self.datakode
            queri = "UPDATE barang set jenis=?,nama=?,harga=?,gambar=?,status=? WHERE kode=?"
            isinya=(isijenis,isinama,isiharga,isigambar,isistatus,carikode)
        else:
            queri = "INSERT INTO barang (jenis,nama,harga,gambar,status) VALUES (?,?,?,?,?)"
            isinya=(isijenis,isinama,isiharga,isigambar,isistatus)

        mycursor.execute(queri,isinya)
        conn.commit()
        conn.close()      
        self.kosongform()
        self.manager.transition.direction = 'right'
        self.manager.current = 'MenuBarang'

class MenuBarang(Screen):
    def on_pre_enter(self):
        self.ids.gridbarang.clear_widgets()
        self.tampil_barang()
       
    def tampil_barang(self):
        conn = sqlite3.connect('data_resto.db')
        conn.row_factory = sqlite3.Row
        cur = conn.cursor()
        cur.execute("SELECT * FROM barang ")
        daftarbarang = cur.fetchall()
        conn.commit()
        conn.close()
       
        for record in daftarbarang:
            item=BarangItem()
            item.bawaclass = 'MenuBarang'
            item.iconkiri="delete-circle"
            item.iconkanan="circle-edit-outline"  
            item.kode=str(record['kode'])
            if record['jenis']=='1': item.jenis='Food'
            if record['jenis']=='2': item.jenis='Drink'
            if record['jenis']=='3': item.jenis='Snack'
            item.nama=record['nama']
            item.harga=str(record['harga'])
            item.gambar=record['gambar']
            self.ids.gridbarang.add_widget(item)
        return self

class MyResto(MDApp):
    def build(self):
        buat_database()
        sm = ScreenManager()
        sm.add_widget(MenuUtama(name='MenuUtama'))        
        sm.add_widget(MenuBarang(name='MenuBarang'))
        sm.add_widget(BarangNew(name='BarangNew'))
        sm.add_widget(StokBarang(name='StokBarang'))
        return sm        
       
           
    def klik_ataskanan(self,bwkelas,bwkode):
        BarangNew.datanew = 'edit'
        BarangNew.datakode = bwkode
        self.root.current = 'BarangNew'

    def klik_ataskiri(self,bwkelas,bwkode):
        tombol_ok = MDFlatButton(text="OK", on_release=lambda x:self.hapus_barang(bwkode))
        tombol_no = MDFlatButton(text="canc", on_release=lambda x:self.dialog.dismiss())
        self.dialog = MDDialog(title="Konfirmasi",
                        text='Apakah anda yakin hapus..?',
                        radius=[20, 7, 20, 7],
                        buttons=[tombol_ok, tombol_no])
        self.dialog.open()

    def hapus_barang(self,kode):
        self.dialog.dismiss()
        conn = sqlite3.connect('data_resto.db')
        cur = conn.cursor()
        cur.execute("DELETE FROM barang where kode='"+kode+"'")
        conn.commit()
        conn.close()
        self.root.current = 'MenuUtama'
        self.root.current = 'MenuBarang'
   
    def ubahstok(self,bwkode,bwstatus):
        if bwstatus=='kosong':
            statusbaru='Ada'
        else:
            statusbaru='kosong'
       
        conn = sqlite3.connect('data_resto.db')
        cur = conn.cursor()
        cur.execute("UPDATE barang set status=? where kode=?",(statusbaru,bwkode))
        conn.commit()
        conn.close()
        return statusbaru
   
   
MyResto().run()

FILE KIVY BARU : STOK_LIST.KV 

<StokList>:
    line_color: rgba(0, 0, 0, 255)

    MDLabel:
        id:idjenis
        text: root.jenis
        bold: root.tebal
        font_size:"12sp"
        size_hint: .15,.1
        pos_hint:{'x':.0, 'center_y':.5}

    MDLabel:
        id:idnama
        text: root.nama
        bold: root.tebal
        font_size:"12sp"
        size_hint: .5,.1
        pos_hint:{'x':.15, 'center_y':.5}

    MDLabel:
        id:idharga
        text: root.harga
        bold: root.tebal
        font_size:"12sp"
        size_hint: .2,.1
        pos_hint:{'x':.6, 'center_y':.5}
   
    MDLabel:
        id:idstatus
        text: root.status
        bold: root.tebal
        font_size:"12sp"
        size_hint: .15,.1
        pos_hint:{'x':.8, 'center_y':.5}
   
    MDIconButton:
        icon: "dots-vertical" if root.tombolmati==False else ''
        disabled: root.tombolmati
        icon_size: "20sp"
        pos_hint:{'x':.9, 'center_y':.5}
        on_release:
            idstatus.text=app.ubahstok(root.kode,idstatus.text)

FILE KIVY BARU : STOK_BARANG.KV 

<StokBarang>:
    #box header
    MDBoxLayout:
        id:idheader
        size_hint: 1,.1
        pos_hint: {'x':0,'y':.9}
        md_bg_color: rgba(255,255,0, 255)
   
    # box tampil data
    MDBoxLayout:
        size_hint: 1,.9
        pos_hint: {'x':0,'y':0}

        ScrollView:
            size_hint_x: self.size_hint_x
            size_hint_y: self.size_hint_y
            do_scroll_x: False

            MDGridLayout:
                id:idgridstok
                cols: 1
                row_default_height: "35dp"
                row_force_default: True
                adaptive_height: True
   
    MDIconButton:
        icon: "select-group"
        icon_color: rgba(255, 255, 255, 255)
        md_bg_color: rgba(0, 0, 250, 255)
        pos_hint: {'x':.03,'y':.1}
        on_release:
            root.manager.transition.direction='right'
            root.manager.current='MenuUtama'

Sedangkan file kivy MENU.KV hanya dibah di bagian ini saja, khusus untuk memberikan perintah agar menuju atau menjalankan halaman menu stok barang, perubahan di kleasnya menjadi :

        FitImage:
            source: 'image/menu-stok.png'
        MDRectangleFlatIconButton:
            icon: "list-status"
            text:'Status Barang'
            text_color: rgba(0, 0, 0, 255)
            user_font_size: '20dp'
            md_bg_color:rgba(255, 255, 0, 255)
            size_hint_x: 1
            pos_hint: {"center_x": .5}
            on_release:
                root.manager.transition.direction= 'left'
                root.manager.current= 'StokBarang'

Demikian tutorial sesi ke 6 (enam) ini insya Allah kita akan lanjutkan disesi ke 7 (tujuh), Semoga bermanfaat dan mampirlah ke chanel kami untuk melihat video secara detailnya. terimakasih.






Komentar

...