Seite 1 von 2

Kassensoftware für eine Kleine Bar V0.4.9 - Beta

Verfasst: 06.05.2007 10:00
von Ground0
Hallo

Dies ist ein Kleines Projekt welches ich für eine Kollegin schreiben musste sie wolte einfach nur ne art kasse mit der Sie alles eintippen kann damit sie +/- am abend weiss was sie eingenommen hat...

Code: Alles auswählen

;Kleine Kassensoftware, um Einnahmen zu überprüfen.
; Funktioniert mit dem FSC 10er Block. Spezielle Funktionen wird die Maus gebraucht.
;(c)2007 by René Linder
;Mit unterstützung aus dem Pure-Board.
;Changelog:
;****************************
;V0.1
;=======
; - Erste Version
;
;V0.2
;=======
; - Der del Button ist jetzt endlich zu was zu gebrauchen, eintrag Links Markieren und da drauf drücken ;)
; - Textfonts abgeändert.
; - Speichern des Logs geschieht jetzt Mit Datum-Zeit Kenzeichen.
;
;V0.3
;=======
; - Bugfix mit nicht gezeichneten Buttons. (Danke an D@nte)
; - Bugfix mit zu kurzem Stringgadget für die Textgrösse. (Danke an D@nte & edel)
; - Code Optimierung und Flackern behoben (Danke an D@nte & edel)
;
;V0.4
;======
; - Letzer eintrag markieren und löschen geht nicht löscht immer den ersten. Variabelschreibfehler...
;
;V0.4.5 - beta
;======
; - Testversion Vollbild ohne Fontanpassung
;
;V0.4.9 - beta
;======
; - Infobox welches die Fontgrösse zurückgibt entfernt
; - Herunterfahrenmöglichkeit mit Maus geschaffen. (Momentan Windows Only)


Declare ZeichenHinzu(Zeichen$)
Declare Shutdown(flags.l)

Macro MSGLF
  Chr(13)+Chr(10)
EndMacro
Macro Tastenabfragen
  Select Gadget
    Case #Button_Num0
      ZeichenHinzu("0")
    Case #Button_Num1
      ZeichenHinzu("1")
    Case #Button_Num2
      ZeichenHinzu("2")
    Case #Button_Num3
      ZeichenHinzu("3")
    Case #Button_Num4
      ZeichenHinzu("4")
    Case #Button_Num5
      ZeichenHinzu("5")
    Case #Button_Num6
      ZeichenHinzu("6")
    Case #Button_Num7
      ZeichenHinzu("7")
    Case #Button_Num8
      ZeichenHinzu("8")
    Case #Button_Num9
      ZeichenHinzu("9")
    Case #Button_Num00
      ZeichenHinzu("00")
    Case #Button_M
      Artikel$="Mineral"
    Case #Button_W
      Artikel$="Wein / Spirituosen"
    Case #Button_B
      Artikel$="Bier"
    Case #Button_X
      Artikel$=""
      Preis$=""
    Case #Button_Ok
      If Artikel$<>"" And Preis$<>""
        Laenge = Len(Preis$)
        Preis$ = Left(Preis$,Laenge - 2)+"."+Right(Preis$,2)
        AddGadgetItem(#Listview_0,-1,Artikel$+Chr(10)+Preis$)
        Artikel$=""
        Preis$=""
      EndIf
    Case #Button_Z
      Ergebnis = CountGadgetItems(#Listview_0)
      Abschluss$= "Wollen sie Wircklich abschliessen bei "+Str(Ergebnis)+" einträgen?"
      Result = MessageRequester("Tagesabschluss...",Abschluss$,#PB_MessageRequester_YesNo)
      If Result = #PB_MessageRequester_Yes
        Preisende.f=0
        Preisbier.f=0
        PreisWein.f=0
        PreisMineral.f=0
        CreateFile(#File_Log,FormatDate("%dd-%mm-%yyyy--%hh-%ii-%ss", Date())+".txt")
        For Zaehlen = 0 To Ergebnis-1
          Artikelb$ = GetGadgetItemText(#Listview_0,Zaehlen,0)
          Preisb$ = GetGadgetItemText(#Listview_0,Zaehlen,1)
          WriteStringN(#File_Log,"Artikel:" + Artikelb$ +" Preis:"+Preisb$)
          Preisende = Preisende + ValF(Preisb$)
          Select Artikelb$
            Case "Mineral"
              PreisMineral = PreisMineral + ValF(Preisb$)
            Case "Wein / Spirituosen"
              PreisWein = PreisWein + ValF(Preisb$)
            Case "Bier"
              Preisbier = Preisbier + ValF(Preisb$)
          EndSelect
        Next
        WriteStringN(#File_Log,"Endabrechnung:"+StrF(Preisende,2))
        WriteStringN(#File_Log,"Endabrechnung Bier:"+StrF(Preisbier,2))
        WriteStringN(#File_Log,"Endabrechnung Wein / Spirituosen:"+StrF(PreisWein,2))
        WriteStringN(#File_Log,"Endabrechnung Mineral:"+StrF(PreisMineral,2))
        CloseFile(#File_Log)
        MessageRequester("Info","Abschluss bei:"+StrF(Preisende,2)+MSGLF+"Total Bier:"+StrF(Preisbier,2)+MSGLF+"Total Mineral:"+StrF(PreisMineral,2)+MSGLF+"Total Wein / Spirituosen:"+StrF(PreisWein,2))
        ClearGadgetItemList(#Listview_0)
      EndIf
    Case #Button_Del
      Markiert=GetGadgetState(#Listview_0)
      ArtikelM$ = GetGadgetItemText(#Listview_0,Markiert,0)
      PreisM$ = GetGadgetItemText(#Listview_0,Markiert,1)
      Result = MessageRequester("Info","Eintrag Wircklich löschen?"+MSGLF+"Artikel:"+ArtikelM$+" Preis:"+PreisM$,#PB_MessageRequester_YesNo)
      If Result = #PB_MessageRequester_Yes
        RemoveGadgetItem(#Listview_0,Markiert)
      EndIf
    Case #Button_Stdn
      Result = MessageRequester("Abfrage","Herunterfahren?",#PB_MessageRequester_YesNo)
      If Result = #PB_MessageRequester_Yes
        CompilerIf #PB_Compiler_OS = #PB_OS_Windows
          Shutdown(1 )
        CompilerEndIf
      EndIf
  EndSelect
EndMacro
Global Artikel$, Preis$, Status$

Enumeration
  #Window_0
EndEnumeration

ExamineDesktops()
DeskX = DesktopWidth(0)
DeskY = DesktopHeight(0)
OpenWindow(#Window_0, 0, 0, DesktopWidth(0), DesktopHeight(0),"Kasse V0.4 , (c)2007 by René Linder",#PB_Window_BorderLess)

Enumeration
  #File_Log
EndEnumeration

Enumeration
  #Button_0
  #Button_M
  #Button_W
  #Listview_0
  #String_0
  #Button_B
  #Button_Num7
  #Button_Num8
  #Button_Num9
  #Button_Num4
  #Button_Num5
  #Button_Num6
  #Button_Num1
  #Button_Num2
  #Button_Num3
  #Button_Z
  #Button_X
  #Button_Num0
  #Button_Num00
  #Button_Ok
  #Button_Del
  #Button_Stdn
EndEnumeration

If CreateGadgetList(WindowID(#Window_0))
  ButtonX=(DeskX-280)/4-10
  ButtonY=(DeskY-10)/6-10
  ButtonXP=ButtonX+10
  ButtonYP=ButtonY+10
  ;***********************
  ;* Default Fontgrösse Setzen
  FontsX=DeskX/31-1
  ;MessageRequester("Info","Info:"+Str(FontsX))
  If LoadFont(1,"Courier",FontsX)
    SetGadgetFont(#PB_Default, FontID(1))
  EndIf
  
  ButtonGadget(#Button_Del,  280             , 10             , ButtonX, ButtonY, "Del")
  ButtonGadget(#Button_M,    280+ButtonXP    , 10             , ButtonX, ButtonY, "Mineral")
  ButtonGadget(#Button_W,    280+(2*ButtonXP), 10             , ButtonX, ButtonY, "Wein Sprit.", #PB_Button_MultiLine | #PB_ListIcon_AlwaysShowSelection)
  ButtonGadget(#Button_B,    280+(3*ButtonXP), 10             , ButtonX, ButtonY, "Bier")
  ButtonGadget(#Button_Num7, 280             , 10+ButtonYP    , ButtonX, ButtonY, "7")
  ButtonGadget(#Button_Num8, 280+ButtonXP    , 10+ButtonYP    , ButtonX, ButtonY, "8")
  ButtonGadget(#Button_Num9, 280+(2*ButtonXP), 10+ButtonYP    , ButtonX, ButtonY, "9")
  ButtonGadget(#Button_Num4, 280             , 10+(2*ButtonYP), ButtonX, ButtonY, "4")
  ButtonGadget(#Button_Num5, 280+ButtonXP    , 10+(2*ButtonYP), ButtonX, ButtonY, "5")
  ButtonGadget(#Button_Num6, 280+(2*ButtonXP), 10+(2*ButtonYP), ButtonX, ButtonY, "6")
  ButtonGadget(#Button_Num1, 280             , 10+(3*ButtonYP), ButtonX, ButtonY, "1")
  ButtonGadget(#Button_Num2, 280+ButtonXP    , 10+(3*ButtonYP), ButtonX, ButtonY, "2")
  ButtonGadget(#Button_Num3, 280+(2*ButtonXP), 10+(3*ButtonYP), ButtonX, ButtonY, "3")
  ButtonGadget(#Button_Z,    280+(3*ButtonXP), 10+ButtonYP    , ButtonX, 2*ButtonY+10, "Z")
  ButtonGadget(#Button_X,    280+(3*ButtonXP), 10+(3*ButtonYP), ButtonX, ButtonY, "X")
  ButtonGadget(#Button_Num0, 280             , 10+(4*ButtonYP), 10+(2*ButtonX), ButtonY, "0")
  ButtonGadget(#Button_Num00,280+(2*ButtonXP), 10+(4*ButtonYP), ButtonX, ButtonY, "00")
  ButtonGadget(#Button_Ok,   280+(3*ButtonXP), 10+(4*ButtonYP), ButtonX, ButtonY, "Ok")
  ButtonGadget(#Button_Stdn, 280+(3*ButtonXP), 10+(5*ButtonYP), ButtonX, ButtonY, "Ende")
  ListIconGadget(#Listview_0, 10, 10, 260, 5*ButtonYP-10,"Artikel",180,#PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect )
  StringGadget(#String_0, 10, 10+5*ButtonYP, 280+(3*ButtonXP)-20, ButtonY, "")
EndIf
AddGadgetColumn(#Listview_0, 1, "Preis", 55)
SetGadgetText(#String_0,Artikel$ + ", Preis:" + Preis$)

;************************
;* Gadget Formatierungen

If LoadFont(0,"Courier",10)
  SetGadgetFont(#Listview_0, FontID(0))
EndIf 

AddKeyboardShortcut(#Window_0, #PB_Shortcut_Pad0, #Button_Num0)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Pad1, #Button_Num1)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Pad2, #Button_Num2)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Pad3, #Button_Num3)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Pad4, #Button_Num4)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Pad5, #Button_Num5)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Pad6, #Button_Num6)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Pad7, #Button_Num7)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Pad8, #Button_Num8)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Pad9, #Button_Num9)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Divide, #Button_M)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Multiply, #Button_W)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Subtract, #Button_B)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Add, #Button_Z)
AddKeyboardShortcut(#Window_0, 110, #Button_Num00)
AddKeyboardShortcut(#Window_0, 255, #Button_X)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Return, #Button_Ok)


Repeat
  EventID = WaitWindowEvent()
  PreisA$=Preis$
  ArtikelA$=Artikel$
  If EventID = #PB_Event_Gadget
    Gadget = EventGadget()
    Tastenabfragen
  EndIf
  If EventID = #PB_Event_Menu
    Gadget = EventMenu()
    Tastenabfragen
  EndIf
  
  If EventID = #PB_Event_CloseWindow
    Quit=1
  EndIf
  Delay(0)
  If Artikel$<>ArtikelA$ Or Preis$<>PreisA$
    SetGadgetText(#String_0,Artikel$ + ", Preis:" + Preis$)
  EndIf
Until Quit=1

Procedure Shutdown( flags.l )
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    Privileges.TOKEN_PRIVILEGES
    OpenProcessToken_(GetCurrentProcess_(), 40, @hToken)
    Privileges\PrivilegeCount           = 1
    Privileges\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED
    LookupPrivilegeValue_(0, "SeShutdownPrivilege", @Privileges\Privileges[0]\Luid)
    AdjustTokenPrivileges_(hToken, 0, @Privileges, 0, 0, 0)
    CloseHandle_(hToken)
    ExitWindowsEx_(flags, 0)
  CompilerEndIf
EndProcedure

Procedure ZeichenHinzu(Zeichen$)
  If Artikel$ = ""
    
  EndIf
  If Artikel$ <> ""
    If Len(Preis$)<5
      If Preis$ = "" And Zeichen$="0"
      Else
        Preis$ = Preis$ + Zeichen$
      EndIf
    EndIf
  EndIf
EndProcedure 
Vieleicht kans ja mal jemand brauchen bzw. erweitern...
Ich werde selbst noch weiter drann schreiben so das ein Ständiges Protokoll gedruckt wird sobald ich ein solchen Protokolldrucker in die Finger Krieg ^^

Gruss G0

Dankeschöns und Changelog im Source.

Verfasst: 06.05.2007 10:32
von D@nte
Line 82 : ClearGadgetItemList(#Listview_0)

Ist da glaubig falsch...
Oder ist das gewollt dass wenn ich gefragt werde (#Button_Z) "Wollen Sie wirklich abschliessen" -> "NEIN" die komplette Preisliste gelöscht wird?!

Verfasst: 06.05.2007 11:35
von Ground0
Ouch nein :(

Wird gleich korrigiert...

Gruss G0

Verfasst: 06.05.2007 11:56
von X0r
O.O

Das ist doch mal ne geile Idee. Benutzt man einfach den eigenen Rechner als Kasse.

Verfasst: 06.05.2007 14:11
von PureBasic4.0
Es wird nur leider niemand ein Notebook zum Abrechnen verwenden :,-(

Verfasst: 06.05.2007 14:37
von Ground0
Naja so flasch ist das nicht, weis nicht ob in Deutschland Winware bekannt ist... aber die haben eine Kassensoftware mit zusätzlichem Protokolldrucker, haben etwa 4 solche Pakete im einsatz und alle laufen mit NB...

Meine Software dient nur dazu einen Einahme überblick zu haben... die hat noch keinerelei normen die sie Als vollwertige kasse machen würden ;)

Achja nebenbei hab jetzt noch ein paar Features hinzugefügt...

Gruss G0

Verfasst: 06.05.2007 15:28
von D@nte
Soooo....

Pack ma das

Code: Alles auswählen

StringGadget(#String_0, 10, 310, 260, 40, "")
Line : 147 ans Ende deines CreateGadgetList dann werden alle Buttons angezeigt.

Und ich persönlich würd versuchen die Lines : 212 / 213 anders zu lösen ersten mag ich son delay gewurste im Repeat nit und was viel schlimmer is die Schrift flackert ;p
Achja und die FONT is viel zu gross für dein Gadget #String_0 bei Wein & Sprit wird fast nix angezeigt

@Lapi als POS
Warum nit?! Ham auch mehrere Kunden die ihren Laptop als Kassensystem benutzen...
Und wir selber tun das auch wenn wir "on-the-fly" Rechnungen im Wagen drucken müssen...

Verfasst: 06.05.2007 15:39
von edel
Das hat nichts mit persoenlich zu tun , das hat da einfach nichts zu suchen.
SetGadgetText erzeugt ein Event, dadurch wird SetGadgetText wieder
aufgerufen usw. ... eine Endlosschleife.

Rufe SetGadgetText nur dort auf, wo es auch benoetigt wird, Z.B.
bei einem gedrueckten Button.

Wenn du das hast , klappt es auch mit dem Anzeigen deiner
restlichen Button ;-)

Verfasst: 06.05.2007 18:06
von bluejoke
Hallo!

Also es spricht aus meinen Augen nichts dagegen, sowas mitm PC / Laptop zu machen, nur so wie das Programm grad läuft kann ich mir nicht vorstellen, dass es verwendet wird. Die "usability" ist irgendwo bei 0 angelangt, wenn ich zunächst mit der Maus den richtigen Button suchen muss, und dann mit der Tastatur den Preis eingeben muss.

Simon

Verfasst: 06.05.2007 20:07
von Ground0
Das Programm ist so ausgelegt das bis auf eine Funktion (Mit müh und not läst sich sogar dies noch mit einem Zehnerblock machen) als mit einem Zehner Block gemacht werden kann.

Nur der del Button um einen beliebigen betrag aus der liste zu löschen ist nicht daüf ausgelegt daüf solte die maus verwedet werden.

Grob gesagt tipst du so ein:
Zuerst Artikel (Mineral[/] Wein Spirituosen [*] Bier [-])
Danach den Preis eine beliebige zahl alle stellen incl. bei einem Totalbetrag von 6€ z.B. 600 anschliessend auf die enter Taste so das sich der Betrag richtig als 6.00€ Speichert...

Danach gehts wieder von vorne los...

Ganz simpel...

Gruss G0