bapiede wrote on Mon Aug 7 13:41:03 MEST 2006:
Hi, after upgrading to Eclipse 3.2 and EPIC 0.4 some Perl Skripts couldn't be opened. Only "large" file are affected (example: 2574 lines). Small files could be opened as before. Eclipse error: java.lang.OutOfMemoryError: Java heap space Thanks to everybody! Regards, Christian
jploski wrote on Mon Aug 7 13:47:38 MEST 2006:
I also had OutOfMemory problems after upgrading to Eclipse 3.2, however, unrelated to EPIC. Adding the following arguments to Eclipse's command line helped: -vmargs -XX:MaxPermSize=128m You can also try with -Xmx256M which extends the memory available to the Java VM to 256 MB.
jgangemi wrote on Mon Aug 7 14:41:36 MEST 2006:
this may also be related to a jvm bug, see: https://bugs.eclipse.org/bugs/show_bug.cgi?id=92250. supposedly sun's jre 1.5.0_07 helps address part of this issue.
jgangemi wrote on Mon Aug 7 14:47:41 MEST 2006:
actually, is this error prompting a popup dialog asking you to restart eclipse, or does the error appear in the editor window? it may that the perl file contains syntax the parser doesn't understand (this was the case w/ perl format syntax not in the previous release). if you're getting the error in the editor window itself, would it be possible for you to attach the file causing exhibitting the problem?
bapiede wrote on Mon Aug 7 15:24:12 MEST 2006:
The error message appears in the editor window Here's the Perl Code: #!/usr/bin/perl # # Kassen-Terminal # use strict; use Gtk2 "-init"; use Gtk2::GladeXML; use Gtk2::SimpleList; use DBI; use utf8; use warnings; use Date::Manip; use lib "../lib"; use pos_common; use pos_print; my $version = "0.2.0"; my $lastchange = "31.05.06"; # Konfig einlesen our %config = pos_read_config("/srv/pos/etc/client.conf"); # Datenbank Verbindung our $db = pos_db_connect(); # # # Datenbank Abfragen vorbereiten # # my $get_funktion = $db->prepare("SELECT funktion FROM stamm_hotkeys WHERE gruppe=? AND pos=?;"); my $get_artikel = $db->prepare( "SELECT artbez, eigpreis, mwst, oem FROM stamm_artikel WHERE ttnr=?;"); # # # GUI initialisieren # # my $gladexml = Gtk2::GladeXML->new("glade/terminal.glade"); $gladexml->signal_autoconnect_from_package("main"); sub gtk_main_quit { Gtk2->main_quit; } # # # globale Variablen # # # Tooltipps my $tooltip = Gtk2::Tooltips->new; # Welches Zahlen wurden eingebenen # erscheinen im Display my @zahlen; # der Hash speichert den Bon my %bon; # Die Gruppe der Hotkey-Tasten die zuerst angezeigt werden soll my $gruppe = "start"; # wer ist der aktuelle Verkäufer my $uid = 0; # und sein Name my $username = ""; my $longname = ""; # Bar Betrag my %bar; # Karten Betrag my %karte; # Kunden-Nummer my %kunde; # Rabatt my %rabatt; # mit Rechnung bezahlter Betrag my %calculaterechnung; my %rechnung; # mit Gutschein bezahlter Betrag my %gutschein; # und die Gutschein-Nummer my %gutscheinnr; # wird eine Bonkopie erstellt, dann steht in diesem Hash die entsprechende Bon-ID my %bonid; # Stückelung für Kassen-Ist my %kassenist = ( '1cent' => { 'label' => 'Wie viele 1 Cent Münzen befinden sich in der Kasse', 'value' => '0' }, '2cent' => { 'label' => 'Wie viele 2 Cent Münzen befinden sich in der Kasse', 'value' => '0' }, '5cent' => { 'label' => 'Wie viele 5 Cent Münzen befinden sich in der Kasse', 'value' => '0' }, '10cent' => { 'label' => 'Wie viele 10 Cent Münzen befinden sich in der Kasse', 'value' => '0' }, '20cent' => { 'label' => 'Wie viele 20 Cent Münzen befinden sich in der Kasse', 'value' => '0' }, '50cent' => { 'label' => 'Wie viele 50 Cent Münzen befinden sich in der Kasse', 'value' => '0' }, '1euro' => { 'label' => 'Wie viele 1 Euro Münzen befinden sich in der Kasse', 'value' => '0' }, '2euro' => { 'label' => 'Wie viele 2 Euro Münzen befinden sich in der Kasse', 'value' => '0' }, '5euro' => { 'label' => 'Wie viele 5 Euro Scheine befinden sich in der Kasse', 'value' => '0' }, '10euro' => { 'label' => 'Wie viele 10 Euro Scheine befinden sich in der Kasse', 'value' => '0' }, '20euro' => { 'label' => 'Wie viele 20 Euro Scheine befinden sich in der Kasse', 'value' => '0' }, '50euro' => { 'label' => 'Wie viele 50 Euro Scheine befinden sich in der Kasse', 'value' => '0' }, '100euro' => { 'label' => 'Wie viele 100 Euro Scheine befinden sich in der Kasse', 'value' => '0' }, '200euro' => { 'label' => 'Wie viele 200 Euro Scheine befinden sich in der Kasse', 'value' => '0' }, '500euro' => { 'label' => 'Wie viele 500 Euro Scheine befinden sich in der Kasse', 'value' => '0' } ); # alle möglichen Stückelungen #my @stueckelung = ( # '1cent', '2cent', '5cent', '10cent', '20cent', '50cent', # '1euro', '2euro', '5euro', '10euro', '20euro', '50euro', # '100euro', '200euro', '500euro' #); # Reihenfolge geändert: 500 € -> 1 Cent my @stueckelung = ( '500euro', '200euro', '100euro', '50euro', '20euro', '10euro', '5euro', '2euro', '1euro', '50cent', '20cent', '10cent', '5cent', '2cent', '1cent' ); # wie oft wurde das Kassen-Ist korrigiert my $kassenistkorrektur = 0; # Welche Stückelung wird gerade abgefragt? my $aktstueckelung = 0; # Debug Code ##print $_ foreach (keys %kassenist); # # # Glade Widgets # # # Hauptfenster my $terminal = $gladexml->get_widget("Terminal"); # Fehlermeldungen my $dialogFehler = $gladexml->get_widget("dialogFehler"); my $labelFehler = $gladexml->get_widget("labelFehler"); # Informationen my $dialogInfo = $gladexml->get_widget("dialogInfo"); my $labelInfo = $gladexml->get_widget("labelInfo"); # und andere: my $dialogQuit = $gladexml->get_widget("dialogQuit"); my $labelQuit = $gladexml->get_widget("labelQuit"); my $aboutDialog = $gladexml->get_widget("aboutdialog"); my $buttonOk = $gladexml->get_widget("okbutton1"); my $buttonCancel = $gladexml->get_widget("cancelbutton1"); my $window = $gladexml->get_widget("Terminal"); my $button1 = $gladexml->get_widget("button1"); my $button2 = $gladexml->get_widget("button2"); my $button3 = $gladexml->get_widget("button3"); my $button4 = $gladexml->get_widget("button4"); my $button5 = $gladexml->get_widget("button5"); my $button6 = $gladexml->get_widget("button6"); my $button7 = $gladexml->get_widget("button7"); my $button8 = $gladexml->get_widget("button8"); my $button9 = $gladexml->get_widget("button9"); my $button0 = $gladexml->get_widget("button0"); my $buttonKomma = $gladexml->get_widget("buttonKomma"); my $buttonEnter = $gladexml->get_widget("buttonEnter"); my $buttonPlus = $gladexml->get_widget("buttonPlus"); my $display = $gladexml->get_widget("display"); my $beenden = $gladexml->get_widget("buttonQuit"); my $listebestandwidget = $gladexml->get_widget("treeviewBestand"); my $listebestand; # wird in Funktion artikel_fill definiert my $listebonwidget = $gladexml->get_widget("treeviewBon"); my $listebon; # wird in Funktion create_bon definiert my $listezbon; # wird in Funktion create_zbon definiert my $listezbonwidget = $gladexml->get_widget("treeviewZBon"); my $displayNetto = $gladexml->get_widget("displayNetto"); my $displayMwst = $gladexml->get_widget("displayMwSt"); my $displaySumme = $gladexml->get_widget("displaySumme"); my $labelZurueck = $gladexml->get_widget("labelZurueck"); my $displayZurueck = $gladexml->get_widget("displayZurueck"); my $displayGegeben = $gladexml->get_widget("displayGegeben"); my $dialogSonstige = $gladexml->get_widget("dialogSonstige"); # Dialog Z-Bon my $labelverkaeufe = $gladexml->get_widget("labelverkaeufe"); my $labelUmsatz = $gladexml->get_widget("labelUmsatz"); my $labelMaxUmsatz = $gladexml->get_widget("labelMaxUmsatz"); my $labelArtikel = $gladexml->get_widget("labelArtikel"); my $labelBar = $gladexml->get_widget("labelBar"); my $labelKarte = $gladexml->get_widget("labelKarte"); my $labelRechnung = $gladexml->get_widget("labelRechnung"); my $labelGutschein = $gladexml->get_widget("labelGutschein"); my $dialogZbon = $gladexml->get_widget("dialogZbon"); # Dialog Stammkunde my $dialogKunde = $gladexml->get_widget("dialogKunde"); my $dialogKundeErgebnis = $gladexml->get_widget("dialogKundeErgebnis"); my $displayKunde = $gladexml->get_widget("displayKunde"); # Dialog NeuerKunde my $dialogNeuerKunde = $gladexml->get_widget("dialogNeuerKunde"); my $labelNKPerson = $gladexml->get_widget("labelNKPerson"); my $labelNKFirma = $gladexml->get_widget("labelNKFirma"); my $labelNKAnschrift = $gladexml->get_widget("labelNKAnschrift"); my $labelNKTelefon = $gladexml->get_widget("labelNKTelefon"); my $labelNKDurchwahl = $gladexml->get_widget("labelNKDurchwahl"); my $labelNKFax = $gladexml->get_widget("labelNKFax"); my $labelNKeMail = $gladexml->get_widget("labelNKeMail"); my $labelNKDrucker = $gladexml->get_widget("labelNKDrucker"); my $labelNKDruckerDesc = $gladexml->get_widget("labelNKDruckerDesc"); my $labelNKAnfragen = $gladexml->get_widget("labelNKAnfragen"); my $labelNKAnfragenStatus = $gladexml->get_widget("labelNKAnfragenStatus"); my $labelNKBemerk = $gladexml->get_widget("labelNKBemerk"); # Dialog Auftrag erstellen my $dialogAuftragerstellen = $gladexml->get_widget("dialogAuftragerstellen"); my $comboboxAuftragerstellen = $gladexml->get_widget("comboboxAuftragerstellen"); my $calendarAuftragerstellen = $gladexml->get_widget("calendarAuftragerstellen"); my $checkbuttonAuftragerstellen = $gladexml->get_widget("checkbuttonAuftragerstellen"); my $textviewAuftragerstellen = $gladexml->get_widget("textviewAuftragerstellen"); # Dialog GutscheinNr my $dialogGutscheinNr = $gladexml->get_widget("dialogGutscheinNr"); my $entryGutscheinNr = $gladexml->get_widget("entryGutscheinNr"); # Dialog Extras my $dialogExtras = $gladexml->get_widget("dialogExtras"); # Dialog Kassen-Ist my $dialogKassenIst = $gladexml->get_widget("dialogKassenIst"); my $labelKassenIst = $gladexml->get_widget("labelKassenIst"); my $spinbuttonKassenIst = $gladexml->get_widget("spinbuttonKassenIst"); # Dialog Bonkopie my $dialogBonkopieNummer = $gladexml->get_widget("dialogBonkopieNummer"); my $entryBonkopie = $gladexml->get_widget("entryBonkopie"); my $dialogBonkopieWarten = $gladexml->get_widget("dialogBonkopieWarten"); my $dialogBonkopieListe = $gladexml->get_widget("dialogBonkopieListe"); my $listebonkopieliste = $gladexml->get_widget("treeviewBonkopieListe"); # Labels für Kunden my $labelKundennummer = $gladexml->get_widget("labelKundenNummer"); my $labelPerson = $gladexml->get_widget("labelPerson"); my $labelFirma = $gladexml->get_widget("labelFirma"); my $labelAnschrift = $gladexml->get_widget("labelAnschrift"); my $labelTelefon = $gladexml->get_widget("labelTelefon"); my $labelDurchwahl = $gladexml->get_widget("labelDurchwahl"); my $labelFax = $gladexml->get_widget("labelFax"); my $labeleMail = $gladexml->get_widget("labeleMail"); my $labelDrucker = $gladexml->get_widget("labelDrucker"); my $labelDruckerDesc = $gladexml->get_widget("labelDruckerDesc"); my $labelAnfragen = $gladexml->get_widget("labelAnfragen"); my $labelAnfragenstatus = $gladexml->get_widget("labelAnfragenStatus"); my $labelBemerk = $gladexml->get_widget("labelBemerk"); my $labelZahlungsart = $gladexml->get_widget("labelZahlungsart"); my $labelRabatt = $gladexml->get_widget("labelRabatt"); my $labelatime = $gladexml->get_widget("labelatime"); my $labelauser = $gladexml->get_widget("labelauser"); my $labelctime = $gladexml->get_widget("labelctime"); my $labelcuser = $gladexml->get_widget("labelcuser"); # Suche my $entrySuche = $gladexml->get_widget("entrySuche"); my $listesuche; my $listesuchergebnis = $gladexml->get_widget("treeviewSuche"); my $dialogSuche = $gladexml->get_widget("dialogSuche"); my $dialogSucheInformationen = $gladexml->get_widget("dialogSucheInformationen"); # Suche Informationen my $labelwgruppe = $gladexml->get_widget("labelwgruppe"); my $labelttnr = $gladexml->get_widget("labelttnr"); my $labelmarke = $gladexml->get_widget("labelmarke"); my $labeloem = $gladexml->get_widget("labeloem"); my $labeldrucker = $gladexml->get_widget("labeldrucker"); my $labelean = $gladexml->get_widget("labelean"); my $labelkompatibel = $gladexml->get_widget("labelkompatibel"); my $labelemstar = $gladexml->get_widget("labelemstar"); my $labelartbez = $gladexml->get_widget("labelartbez"); my $labelartnr = $gladexml->get_widget("labelartnr"); my $labelseiten = $gladexml->get_widget("labelseiten"); my $labelgruppe = $gladexml->get_widget("labelgruppe"); my $labelfarbe = $gladexml->get_widget("labelfarbe"); my $labelspez = $gladexml->get_widget("labelspez"); my $labelinhalt = $gladexml->get_widget("labelinhalt"); my $labelbemerk = $gladexml->get_widget("labelbemerk"); my $labelregal = $gladexml->get_widget("labelregal"); my $labeleigpreis = $gladexml->get_widget("labeleigpreis"); my $labelfremdpreis = $gladexml->get_widget("labelfremdpreis"); my $labelkomppreis = $gladexml->get_widget("labelkomppreis"); my $labelverglpreis = $gladexml->get_widget("labelverglpreis"); # Verkaeufer Namen anzeigen my $labelVerkaeufer = $gladexml->get_widget("labelClient"); # Widgets im About Dialog my $windowAbout = $gladexml->get_widget("windowAbout"); my $labelLastchange = $gladexml->get_widget("labelLastchange"); my $labelVersion = $gladexml->get_widget("labelVersion"); # Widgets für Verkäufer Wechseln Dialog my $dialogVerkaeufer = $gladexml->get_widget("dialogVerkaeufer"); my $entryVerkaeuferNummer = $gladexml->get_widget("entryVerkaeuferNummer"); my $dialogVerkaeuferUndefiniert = $gladexml->get_widget("dialogVerkaeuferUndefiniert"); # Widgets für Gesamtstorno my $dialogGesamtstorno = $gladexml->get_widget("dialogGesamtstorno"); # handler fuer Hotkeys my $labelHotkey = $gladexml->get_widget("labelHotkey"); my @hotkey; $hotkey[1] = $gladexml->get_widget("hotkey1"); $hotkey[2] = $gladexml->get_widget("hotkey2"); $hotkey[3] = $gladexml->get_widget("hotkey3"); $hotkey[4] = $gladexml->get_widget("hotkey4"); $hotkey[5] = $gladexml->get_widget("hotkey5"); $hotkey[6] = $gladexml->get_widget("hotkey6"); $hotkey[7] = $gladexml->get_widget("hotkey7"); $hotkey[8] = $gladexml->get_widget("hotkey8"); $hotkey[9] = $gladexml->get_widget("hotkey9"); $hotkey[10] = $gladexml->get_widget("hotkey10"); $hotkey[11] = $gladexml->get_widget("hotkey11"); $hotkey[12] = $gladexml->get_widget("hotkey12"); sub float { my $float = shift; $float =~ s/,/./g; return $float; } sub on_buttonAbout_clicked { $labelVersion->set_text($version); $labelLastchange->set_text($lastchange); $windowAbout->show; } sub on_closebuttonAbout_clicked { $windowAbout->hide; return 1; } sub on_okbuttonQuit_clicked { Gtk2->main_quit; } sub on_cancelbuttonQuit_clicked { $dialogQuit->hide; return 1; } sub on_cancelbuttonSonstige_clicked { $dialogSonstige->hide; return 1; } sub beenden { my $pos = keys %{ $bon{$uid} }; if ( ( $pos > 0 ) && ( $bonid{$uid} eq "" ) ) { $labelQuit->set_markup( "Möchten Sie das Programm wirklich beenden?\nDer aktuelle Bon geht dann verloren!" ); } else { $labelQuit->set_text("Möchten Sie das Programm wirklich beenden?"); } $dialogQuit->show; return 1; } sub on_buttonQuit_clicked { beenden(); } sub on_button1_clicked { my $text = $display->get_text; $text = $text . "1"; $display->set_text($text); } sub on_button2_clicked { my $text = $display->get_text; $text = $text . "2"; $display->set_text($text); } sub on_button3_clicked { my $text = $display->get_text; $text = $text . "3"; $display->set_text($text); } sub on_button4_clicked { my $text = $display->get_text; $text = $text . "4"; $display->set_text($text); } sub on_button5_clicked { my $text = $display->get_text; $text = $text . "5"; $display->set_text($text); } sub on_button6_clicked { my $text = $display->get_text; $text = $text . "6"; $display->set_text($text); } sub on_button7_clicked { my $text = $display->get_text; $text = $text . "7"; $display->set_text($text); } sub on_button8_clicked { my $text = $display->get_text; $text = $text . "8"; $display->set_text($text); } sub on_button9_clicked { my $text = $display->get_text; $text = $text . "9"; $display->set_text($text); } sub on_button0_clicked { my $text = $display->get_text; $text = $text . "0"; $display->set_text($text); } sub on_buttonKomma_clicked { my $text = $display->get_text; # nur dann einen Punkt hinzufügen, wenn nicht bereits einer existiert. if ( $text !~ /,/ ) { $text = "$text."; $display->set_text($text); } } sub on_buttonNeuerKunde_clicked { $dialogKunde->hide; $dialogNeuerKunde->show; } sub on_buttonNeuerPreis_clicked { my @index = $listebon->get_selected_indices; if ( @index == 1 ) { if ( $display->get_text ne "" ) { # es war ein Betrag im Feld display my $neuerpreis = $display->get_text + 0; # wird brutto eingegeben $neuerpreis = $neuerpreis / 116 * 100; $bon{$uid}->{ ++$index[0] }->{"Stuckpreis"} = $neuerpreis; $display->set_text(""); update_bon(); } else { # kein Betrag im Feld display $labelFehler->set_text( "Markieren Sie die gewünschte Position des Bons und geben Sie im Tastenfeld den gewünschten neuen Preis ein. Danach klicken Sie auf \"Neuer Preis\"." ); $dialogFehler->reshow_with_initial_size; } } else { $labelFehler->set_text( "Markieren Sie die gewünschte Position des Bons und geben Sie im Tastenfeld den gewünschten neuen Preis ein. Danach klicken Sie auf \"Neuer Preis\"." ); $dialogFehler->reshow_with_initial_size; } } sub on_buttonCE_clicked { $display->set_text(""); @zahlen = undef; } sub on_buttonExtras_clicked { $dialogExtras->show; } sub on_buttonSonstigeGutschein_clicked { # Button Gutschein, bei Zahlungsart Sonstige $dialogSonstige->hide; $dialogGutscheinNr->show; } sub on_buttonGutschein_clicked { return if commit() == 1; my $betrag = $display->get_text; $betrag += 0; if ( $betrag <= 0 ) { $labelFehler->set_text( "Geben Sie den Gutschein-Betrag ein und klicken Sie danach auf die Schalftfläche Gutschein." ); $dialogFehler->reshow_with_initial_size; } else { # wie viele Positionen hat der aktuelle Bon? my $pos = keys %{ $bon{$uid} }; $pos++; $bon{$uid}->{$pos}->{"TTNr"} = "00090002"; $bon{$uid}->{$pos}->{"Bezeichn"} = "Gutschein"; $bon{$uid}->{$pos}->{"Anzahl"} = "1"; $bon{$uid}->{$pos}->{"Stuckpreis"} = $betrag; $bon{$uid}->{$pos}->{"MwSt"} = ""; $bon{$uid}->{$pos}->{"OEM"} = ""; update_bon(); $display->set_text(""); } } sub on_hotkey1_clicked { $get_funktion->execute( $gruppe, 1 ); my ($funktion) = $get_funktion->fetchrow_array; change_hotkeys( $funktion, 1 ); } sub on_hotkey2_clicked { $get_funktion->execute( $gruppe, 2 ); my ($funktion) = $get_funktion->fetchrow_array; change_hotkeys( $funktion, 2 ); } sub on_hotkey3_clicked { $get_funktion->execute( $gruppe, 3 ); my ($funktion) = $get_funktion->fetchrow_array; change_hotkeys( $funktion, 3 ); } sub on_hotkey4_clicked { $get_funktion->execute( $gruppe, 4 ); my ($funktion) = $get_funktion->fetchrow_array; change_hotkeys( $funktion, 4 ); } sub on_hotkey5_clicked { $get_funktion->execute( $gruppe, 5 ); my ($funktion) = $get_funktion->fetchrow_array; change_hotkeys( $funktion, 5 ); } sub on_hotkey6_clicked { $get_funktion->execute( $gruppe, 6 ); my ($funktion) = $get_funktion->fetchrow_array; change_hotkeys( $funktion, 6 ); } sub on_hotkey7_clicked { $get_funktion->execute( $gruppe, 7 ); my ($funktion) = $get_funktion->fetchrow_array; change_hotkeys( $funktion, 7 ); } sub on_hotkey8_clicked { $get_funktion->execute( $gruppe, 8 ); my ($funktion) = $get_funktion->fetchrow_array; change_hotkeys( $funktion, 8 ); } sub on_hotkey9_clicked { $get_funktion->execute( $gruppe, 9 ); my ($funktion) = $get_funktion->fetchrow_array; change_hotkeys( $funktion, 9 ); } sub on_hotkey10_clicked { $get_funktion->execute( $gruppe, 10 ); my ($funktion) = $get_funktion->fetchrow_array; change_hotkeys( $funktion, 10 ); } sub on_hotkey11_clicked { $get_funktion->execute( $gruppe, 11 ); my ($funktion) = $get_funktion->fetchrow_array; change_hotkeys( $funktion, 11 ); } sub on_hotkey12_clicked { $get_funktion->execute( $gruppe, 12 ); my ($funktion) = $get_funktion->fetchrow_array; change_hotkeys( $funktion, 12 ); } sub on_buttonArtikel_clicked { return if commit() == 1; # wie viele Positionen hat der aktuelle Bon? my $pos = keys %{ $bon{$uid} }; my $text = $display->get_text; my $temp = $text + 0; if ( $text ne "" ) { # der von Hand eingegebene Artikel ist immer inkl. 16 % MwSt. $temp = $temp / 116 * 100; $pos++; $bon{$uid}->{$pos}->{"TTNr"} = "00090001"; $bon{$uid}->{$pos}->{"Bezeichn"} = "Bezeichnung"; $bon{$uid}->{$pos}->{"Anzahl"} = "1"; $bon{$uid}->{$pos}->{"Stuckpreis"} = $temp; $bon{$uid}->{$pos}->{"MwSt"} = "16"; $bon{$uid}->{$pos}->{"OEM"} = ""; update_bon(); $display->set_text(""); } else { # wenn nichts im Display steht, erhöhen wir die Anzahl der letzten Artikels if ( $pos > 0 ) { my $anzahl = $bon{$uid}->{$pos}->{"Anzahl"}; $anzahl++; $bon{$uid}->{$pos}->{"Anzahl"} = $anzahl; update_bon(); } } } sub on_buttonAuftragerstellen_clicked { $dialogExtras->hide; my $pos = keys %{ $bon{$uid} }; if ( $pos > 0 ) { # Abfrage um Kunden zu ermitteln my $getcustomer = $db->prepare( "SELECT id, firma, person FROM stamm_kunden ORDER BY id;"); $getcustomer->execute(); my $modell = Gtk2::ListStore->new('Glib::String'); while ( my ( $id, $firma, $person ) = $getcustomer->fetchrow_array ) { my $string = "$id - $firma - $person"; my $iter = $modell->append; $modell->set( $iter, 0, $string ); } $comboboxAuftragerstellen->set_model($modell); $comboboxAuftragerstellen->set_text_column(0); $dialogAuftragerstellen->show; } else { $labelFehler->set_text( "Fügen Sie alle gewünschten Artikel dem Kassen-Bon hinzu und klicken Sie danach auf die Schaltfläche "Auftrag erstellen"." ); $dialogFehler->reshow_with_initial_size; } } sub on_buttonGesamtstorno_clicked { if ( keys %{ $bon{$uid} } > 0 ) { $dialogGesamtstorno->show; } } sub on_okbuttonGesamtstorno_clicked { $dialogGesamtstorno->hide; reset_vars(); update_bon(); } sub on_okbuttonGutscheinNr_clicked { my $id = $entryGutscheinNr->get_text; my $getgutschein = $db->prepare("SELECT betrag, used FROM stamm_gutscheine WHERE id=?"); $getgutschein->execute($id); my ( $betrag, $used ) = $getgutschein->fetchrow_array; if ( $betrag <= 0 ) { $labelFehler->set_text("Unbekannte Gutschein-Nummer."); $dialogFehler->reshow_with_initial_size; return; } if ( $used != 0 ) { $labelFehler->set_text("Der Gutschein wurde bereits eingelöst."); $dialogFehler->reshow_with_initial_size; return; } $dialogGutscheinNr->hide; $entryGutscheinNr->set_text(""); $gutschein{$uid} = $betrag; $gutscheinnr{$uid} = $id; update_bon(); } sub on_okbuttonDialogInfo_clicked { $dialogInfo->hide; return 1; } sub on_cancelbuttonGutscheinNr_clicked { $dialogGutscheinNr->hide; return 1; } sub on_cancelbuttonGesamtstorno_clicked { $dialogGesamtstorno->hide; return 1; } sub on_buttonRechnung_clicked { $dialogSonstige->hide; $calculaterechnung{$uid} = 1; update_bon(); } sub on_buttonSonstige_clicked { my $pos = keys %{ $bon{$uid} }; # wenn noch keine Positionen im Bon sind, kann man keine Zahlungsart auswählen if ( $pos > 0 ) { $dialogSonstige->show; } } sub on_buttonStorno_clicked { my @index = $listebon->get_selected_indices; if ( @index > 0 ) { # Hash neu aufbauen (Löcher schließen) my %temp = %{ $bon{$uid} }; %{ $bon{$uid} } = (); my $counter = 1; ##debug print "Lösche Index: $_\n" foreach @index; # alle Hash-Einträge durch gehen foreach my $aktkey ( sort keys %temp ) { ##debug print "Aktueller Hash Key: $aktkey\n"; foreach my $aktindex (@index) { print "Aktueller Index $aktindex\n"; # die Listenelemente beginnen bei 0, der Hash aber bei 1 #$aktindex++; # steht der aktuelle key in der Liste? if ( $aktindex + 1 == $aktkey ) { ##debug print "Überspringe Index $aktindex\n"; # dann wird dieser Eintrag im neuen Array übersprungen next; } else { # der Eintrag steht nicht in der Liste, d.h. die Werte werden in den neuen Hash übernommen ##debug print "Übernehme Index $aktindex\n"; $bon{$uid}->{$counter}->{"TTNr"} = $temp{$aktkey}->{"TTNr"}; $bon{$uid}->{$counter}->{"Bezeichn"} = $temp{$aktkey}->{"Bezeichn"}; $bon{$uid}->{$counter}->{"Anzahl"} = $temp{$aktkey}->{"Anzahl"}; $bon{$uid}->{$counter}->{"Stuckpreis"} = $temp{$aktkey}->{"Stuckpreis"}; $bon{$uid}->{$counter}->{"MwSt"} = $temp{$aktkey}->{"MwSt"}; $counter++; } } } ##debug print keys %bon, "\n", keys %temp, "\n\n"; update_bon(); } else { $labelFehler->set_text( "Markieren Sie zuerst die Position des Bons, die Sie stornieren möchten." ); $dialogFehler->reshow_with_initial_size; } } sub on_buttonBonkopie_clicked { # da bei der Bonkopie der aktuelle Bon ersetzt wird, muss dieser zuerst abgespeichert werden return if commit() == 1; $dialogExtras->hide; $dialogBonkopieNummer->show; } sub on_buttonBondrucken_clicked { # nur drucken, wenn bonid bekannt if ( $bonid{$uid} ne "" ) { pos_printbon( $bonid{$uid} ); $dialogBonkopieWarten->show; my $rc = pos_printbon( $bonid{$uid} ); if ( $rc == 1 ) { $labelFehler->set_text("Fehler beim Druck der Bonkopie."); $dialogFehler->reshow_with_initial_size; } if ( $rc == 2 ) { $labelFehler->set_text("Unbekannte Bon-Nummer."); $dialogFehler->reshow_with_initial_size; } if ( $rc == 3 ) { $labelFehler->set_text( "Fehler beim Drucken des Bons. Bitte prüfen Sie den Standard-Drucker." ); $dialogFehler->reshow_with_initial_size; } $dialogBonkopieWarten->hide; } else { $labelFehler->set_text( "Sie können einen Bon erst drucken, wenn der Bezahlvorgang abgeschlossen wurde oder mit der Funktion Bon Kopie im Menü Extras ein Bon ausgewählt wurde." ); $dialogFehler->reshow_with_initial_size; } } sub on_buttonBar_clicked { my $pos = keys %{ $bon{$uid} }; # wenn noch keine Positionen im Bon sind, kann man keinen Bar Betrag eingeben if ( $pos > 0 ) { $bar{$uid} = $display->get_text + 0; $display->set_text(""); update_bon(); } } sub on_buttonKassenIst_clicked { # wenn bereits ein Kassen-Ist Bericht durchgeführt wurde, aber seit dem nochmal was verkauft wurde # dann darf man noch einen machen my $kassenisttable = pos_hostname() . "_kassenist"; my $checkkassenist = $db->prepare("SELECT timestamp FROM $kassenisttable WHERE timestamp LIKE ?"); # wurde heute schon ein Kassen-Ist gespeichert? my ($timestamp) = pos_time() =~ /(\d{8})\d{6}/; my $query=$timestamp."%"; $checkkassenist->execute($query); my ($kassenisttimestamp)=$checkkassenist->fetchrow_array; if ( $kassenisttimestamp ne "" ) { # es wurde heute schon ein Kassen-Ist Bericht durchgeführt # prüfen ob DANACH noch ein neuer Bon dazukam my $bondb = pos_hostname() . "_bon"; my $gettimestamp = $db->prepare( "SELECT timestamp FROM $bondb ORDER BY timestamp DESC LIMIT 1;"); $gettimestamp->execute; my ($dbtimestamp) = $gettimestamp->fetchrow_array; print STDERR "Kassen-Ist: $kassenisttimestamp, Kassen-Bon: $dbtimestamp\n"; if ( $dbtimestamp <= $kassenisttimestamp ) { # ist die letzte Position im Kassen-Bon nicht neuer als der Kassen-Abschluss, dann ist kein weiterer Kassen-Ist möglich $labelFehler->set_text( "Es wurde bereits ein Kassen-Abschluss durchgeführt." ); $dialogFehler->reshow_with_initial_size; return; } } # für alle Scheine und Münzen einmal fragen # 1cent, 2cent, 5cent, 10cent, 20cent, 50cent, 1euro, 2euro, 5euro, 10euro, 20euro, 50euro, 100euro, 200euro, 500euro my $temp = $stueckelung[$aktstueckelung]; my $temp2 = $kassenist{$temp}->{'label'}; $labelKassenIst->set_text($temp2); $temp = $kassenist{$temp}->{"value"}; $spinbuttonKassenIst->set_value($temp); $dialogKassenIst->show; } sub on_buttonKarte_clicked { my $pos = keys %{ $bon{$uid} }; # wenn noch keine Positionen im Bon sind, kann man keinen Bar Betrag eingeben if ( $pos > 0 ) { $karte{$uid} = $display->get_text + 0; $display->set_text(""); update_bon(); } } sub on_buttonKunde_clicked { $dialogKunde->show; } sub on_okbuttonAuftragerstellen_clicked { # neuen Auftrag erstellen my $index = $comboboxAuftragerstellen->get_active; my ( $jahr, $monat, $tag ) = $calendarAuftragerstellen->get_date; # Monat ist 0-11, Tag 1-31, deshalb: $monat++; ##db print "Kalender: $tag.$monat.$jahr\n"; my $keinliefertermin = $checkbuttonAuftragerstellen->get_active; ##db print "Liefertermin: $keinliefertermin\n"; my $heute = ParseDate("today"); my $kalender = ParseDate("$jahr/$monat/$tag"); ##db print "Heute: $heute, Kalender: $kalender\n"; my $flag = Date_Cmp( $heute, $kalender ); ##db print "Flag: $flag\n"; # Wenn im Kalender heute oder ein vergangenes Datum gewählt wurde, und nicht die Option "Kein Liefertermin" # dann muss eine Fehlermeldung angezeigt werden if ( ( $flag > 0 ) && ( $keinliefertermin != 1 ) ) { $labelFehler->set_text( "Das Datum für den Liefertermin muss in der Zukunft liegen."); $dialogFehler->reshow_with_initial_size; return; } else { # Auftrag abspeichern my $buffer = $textviewAuftragerstellen->get_buffer; my $startiter = $buffer->get_start_iter; my $enditer = $buffer->get_end_iter; my $bemerk = $buffer->get_text( $startiter, $enditer, 0 ); ##db print "$bemerk\n"; # Kunde ermitteln my $getkunde = $db->prepare("SELECT id FROM stamm_kunden ORDER BY id;"); $getkunde->execute; my $kunde; my $counter = 0; while ( ($kunde) = $getkunde->fetchrow_array ) { if ( $counter == $index ) { last; } $counter++; } # Termin ist 0 wenn kein Liefertermin ausgewählt wurde my $termin; if ( $keinliefertermin == 1 ) { $termin = 0; } else { ($termin) = $kalender =~ /(\d{8})\d{2}:\d{2}:\d{2}/; } my $table = pos_hostname() . "_auftraege"; my $saveauftrag = $db->prepare( "INSERT INTO $table (timestamp, user, bemerk, ttnr, anzahl, kunde, termin) VALUES (?,?,?,?,?,?,?)" ); my $timestamp = pos_time(); foreach my $aktkey ( keys %{ $bon{$uid} } ) { my $ttnr = $bon{$uid}->{$aktkey}->{"TTNr"}; my $anzahl = $bon{$uid}->{$aktkey}->{"Anzahl"}; my $rc = $saveauftrag->execute( $timestamp, $uid, $bemerk, $ttnr, $anzahl, $kunde, $termin ); if ( $rc != 1 ) { $labelFehler->set_text( "Ein kritischer Fehler beim Arbeiten mit der Datenbank ist aufgetreten. Notieren Sie alle Positionen des aktuellen Bons und beenden Sie die Kasse umgehend!\nBenachrichtigen Sie schnellstens einen Administrator!" ); $dialogFehler->reshow_with_initial_size; } } $dialogAuftragerstellen->hide; reset_vars(); update_bon(); } } sub on_okbuttonBonkopieListe_clicked { # zwei häufig benötigte Abfragen my $getoem = $db->prepare("SELECT oem FROM stamm_artikel WHERE ttnr=?;"); my $getartbez = $db->prepare("SELECT artbez FROM stamm_artikel WHERE ttnr=?;"); my @index = $listebonkopieliste->get_selected_indices; if ( @index > 0 ) { # es wurde was ausgewählt if ( @index > 1 ) { $labelFehler->set_text( "Es können nicht mehrere Bons ausgewählt werden."); $dialogFehler->reshow_with_initial_size; } else { # Fenster gleich zumachen $dialogBonkopieListe->hide; my $aktindex = $index[0]; my $datum = ${ $listebonkopieliste->{data} }[$aktindex][0]; my $uhrzeit = ${ $listebonkopieliste->{data} }[$aktindex][1]; my $table = pos_hostname() . "_bon"; my ( $tag, $monat, $jahr ) = $datum =~ /(\d{2})\.(\d{2})\.(\d{4})/; my ( $stunde, $minute, $sekunde ) = $uhrzeit =~ /(\d{2}):(\d{2}):(\d{2})/; $bonid{$uid} = pos_hostname() . "_" . $jahr . $monat . $tag . $stunde . $minute . $sekunde; # diesen Bon auslesen my $getbon = $db->prepare( "SELECT pos, ttnr, preis, anzahl, user, kunde, mwst, gutschein FROM $table WHERE bonid=? ORDER BY pos;" ); $getbon->execute( $bonid{$uid} ); my $summe = 0; my $mwst = 0; my $karte = 0; my $bar = 0; my $rabatt = 0; my $rechnung = 0; my $gutschein = 0; my $gutscheinnr = 0; while ( my ( $aktpos, $aktttnr, $aktpreis, $aktanzahl, $aktuser, $aktkunde, $aktmwst, $aktgutschein ) = $getbon->fetchrow_array ) { if ( $aktttnr eq "900000000" ) { $bar{$uid} = $aktpreis; next; } if ( $aktttnr eq "900000001" ) { $karte{$uid} = $aktpreis; next; } if ( $aktttnr eq "900000002" ) { $rabatt{$uid} = $aktpreis; next; } if ( $aktttnr eq "900000003" ) { $rechnung{$uid} = $aktpreis; next; } # ist es ein Gutschein? if ( $aktttnr eq "900000004" ) { $gutschein{$uid} = $aktpreis; $gutscheinnr{$uid} = $aktgutschein; next; } # OEM-Nummer $getoem->execute($aktttnr); my ($oem) = $getoem->fetchrow_array; # Bezeichnung $getartbez->execute($aktttnr); my ($bez) = $getartbez->fetchrow_array; # in den aktuellen Bon speichern $bon{$uid}->{$aktpos}->{"TTNr"} = $aktttnr; $bon{$uid}->{$aktpos}->{"Bezeichn"} = $bez; $bon{$uid}->{$aktpos}->{"Anzahl"} = $aktanzahl; $bon{$uid}->{$aktpos}->{"Stuckpreis"} = $aktpreis; $bon{$uid}->{$aktpos}->{"MwSt"} = $aktmwst; $bon{$uid}->{$aktpos}->{"OEM"} = $oem; } # und korrekt anzeigen update_bon(); } } else { $labelFehler->set_text( "Wählen Sie einen Bon aus der Liste, um diesen zu drucken."); $dialogFehler->reshow_with_initial_size; } } sub on_okbuttonBonkopieNummer_clicked { my $bonid = $entryBonkopie->get_text; if ( $bonid eq "" ) { # es wurde keine Bon-ID eingegeben, also muss die Auswahl-Liste angezeigt werden $dialogBonkopieNummer->hide; my $table = pos_hostname() . "_bon"; @{ $listebonkopieliste->{data} } = (); my $getbons = $db->prepare( "SELECT DISTINCT bonid FROM $table ORDER BY bonid desc;"); my $getumsatz = $db->prepare( "SELECT preis, mwst, anzahl FROM $table WHERE bonid=? AND ttnr NOT LIKE \"90000000%\";" ); $getbons->execute; while ( my ($bonid) = $getbons->fetchrow_array ) { $getumsatz->execute($bonid); my $umsatz = 0; while ( my ( $preis, $mwst, $anzahl ) = $getumsatz->fetchrow_array ) { $preis += $preis / 100 * $mwst; $preis = $preis * $anzahl; $umsatz += $preis; } $umsatz = sprintf( "%.2f", $umsatz ); my ( $jahr, $monat, $tag, $stunde, $minute, $sekunde ) = $bonid =~ /.*_(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/; my $datum = $tag . "." . $monat . "." . $jahr; my $uhrzeit = $stunde . ":" . $minute . ":" . $sekunde; push @{ $listebonkopieliste->{data} }, [ $datum, $uhrzeit, $umsatz ]; } $dialogBonkopieListe->reshow_with_initial_size; } else { $dialogBonkopieWarten->show; $dialogBonkopieNummer->hide; my $rc = pos_printbon($bonid); if ( $rc == 1 ) { $labelFehler->set_text("Fehler beim Druck der Bonkopie."); $dialogFehler->reshow_with_initial_size; } if ( $rc == 2 ) { $labelFehler->set_text("Unbekannte Bon-Nummer."); $dialogFehler->reshow_with_initial_size; } if ( $rc == 3 ) { $labelFehler->set_text( "Fehler beim Drucken des Bons. Bitte prüfen Sie den Standard-Drucker." ); $dialogFehler->reshow_with_initial_size; } $dialogBonkopieWarten->hide; } } sub on_okbuttonDialogFehler_clicked { $dialogFehler->hide; return 1; } sub on_okbuttonDialogVerkaeufer_clicked { my $localuid = $entryVerkaeuferNummer->get_text; # gibt die Rückfrage 0 treffer, existiert der User nicht my $localusername = pos_get_username($localuid); if ( $localusername eq "" ) { $labelFehler->set_text( "Die angegebene Verkäufer-Nummer ist unbekannt."); $dialogFehler->reshow_with_initial_size; } else { $uid = $localuid; $username = $localusername; $longname = pos_get_longname($username); $labelVerkaeufer->set_label("Aktueller Verkäufer: $longname"); # Bon für aktuellen Verkäufer wiederherstellen update_bon(); $entryVerkaeuferNummer->set_text(""); $dialogVerkaeufer->hide; } } sub on_okbuttonExtras_clicked { $dialogExtras->hide; return 1; } sub on_cancelbuttonBonkopieNummer_clicked { $dialogBonkopieNummer->hide; return 1; } sub on_cancelbuttonAuftragerstellen_clicked { $dialogAuftragerstellen->hide; return 1; } sub on_cancelbuttonBonkopieListe_clicked { $dialogBonkopieListe->hide; return 1; } sub on_cancelbuttonDialogVerkaeufer_clicked { if ( $uid > 0 ) { # wechsel erlaubt weil uid schon definiert $dialogVerkaeufer->hide; } else { # uid nicht definiert, daher Fehler $dialogVerkaeufer->hide; $dialogVerkaeuferUndefiniert->show; } return 1; } sub on_buttonVerkaeuferWechseln_clicked { $dialogVerkaeufer->show; } sub on_okbuttonVerkaeuferUndefiniert_clicked { $dialogVerkaeuferUndefiniert->hide; } sub on_quitbuttonVerkaeuferUndefiniert_clicked { $dialogVerkaeuferUndefiniert->hide; beenden(); } sub on_zurueckbuttonKassenIst_clicked { $aktstueckelung--; if ( $aktstueckelung < 0 ) { $aktstueckelung = 0; } my $temp = $stueckelung[$aktstueckelung]; my $temp2 = $kassenist{$temp}->{'label'}; $labelKassenIst->set_text($temp2); $temp = $kassenist{$temp}->{"value"}; $spinbuttonKassenIst->set_value($temp); $dialogKassenIst->reshow_with_initial_size; } sub on_buttonZbon_clicked { my $bondb = pos_hostname . "_bon"; #my $timestamp = $year . $monat . $day; my $timestamp=pos_time()=~/(\d{8})\d{6}/; my $bonid = "%" . pos_hostname . "_" . $timestamp . "%"; # gibt den Z-Bon aus # Anzahl der verkauften Artikel my $getartikel = $db->prepare( "SELECT count(*) FROM $bondb WHERE bonid LIKE ? AND ttnr NOT LIKE \"90000000%\";" ); $getartikel->execute($bonid); my ($artikel) = $getartikel->fetchrow_array; # Anzahl der Bons my $getbon = $db->prepare( "SELECT DISTINCT(bonid) FROM $bondb WHERE bonid LIKE ? AND ttnr NOT LIKE \"90000000%\";" ); $getbon->execute($bonid); my $verkaeufe = 0; while ( my ($dummy) = $getbon->fetchrow_array ) { $verkaeufe++; } # Maximaler Umsatz my $getumsatz = $db->prepare( "SELECT preis,anzahl,ttnr,mwst FROM $bondb WHERE bonid LIKE ? AND ttnr NOT LIKE \"90000000%\";" ); $getumsatz->execute($bonid); my $maxumsatz = 0; my $umsatz = 0; my %wgruppe = (); my %mwst = (); my %artikel = (); while ( my ( $aktpreis, $aktanzahl, $aktttnr, $aktmwst ) = $getumsatz->fetchrow_array ) { my $temp = $aktpreis * $aktanzahl; $temp += $temp / 100 * $aktmwst; if ( $temp > $maxumsatz ) { $maxumsatz = $temp; } $umsatz += $temp; my ( $aktmarke, $aktwgruppe, $id ) = $aktttnr =~ /(\d{2})(\d{2})(\d{4})/; $aktwgruppe += 0; # zum Hash wgruppe wird der Umsatz für diese Warengruppe addiert $wgruppe{$aktwgruppe} += $temp; # zum Hash mwst die dabei bezahlte MwSt. $mwst{$aktwgruppe} += $temp - $aktpreis; # zum Hash artikel wird die Anzahl der Artikel / wgruppe gespeichert $artikel{$aktwgruppe}++; } $umsatz = sprintf( "%.2f €", $umsatz ); $labelUmsatz->set_text($umsatz); $maxumsatz = sprintf( "%.2f €", $maxumsatz ); $labelMaxUmsatz->set_text($maxumsatz); $labelverkaeufe->set_text($verkaeufe); $labelArtikel->set_text($artikel); # Bar-Zahlung my $getbar = $db->prepare( "SELECT preis FROM $bondb WHERE bonid LIKE ? and ttnr=\"900000000\";"); $getbar->execute($bonid); my $barsumme = 0; while ( my ($aktbar) = $getbar->fetchrow_array ) { $barsumme += $aktbar; } $barsumme = sprintf( "%.2f €", $barsumme ); $labelBar->set_text($barsumme); # Zahlung mit Karte my $getkarte = $db->prepare( "SELECT preis FROM $bondb WHERE bonid LIKE ? and ttnr=\"900000001\";"); $getkarte->execute($bonid); my $kartensumme = 0; while ( my ($aktkarte) = $getkarte->fetchrow_array ) { $kartensumme += $aktkarte; } $kartensumme = sprintf( "%.2f €", $kartensumme ); $labelKarte->set_text($kartensumme); # Zahlung mit Rechnung my $getrechnung = $db->prepare( "SELECT preis FROM $bondb WHERE bonid LIKE ? and ttnr=\"900000003\";"); $getrechnung->execute($bonid); my $rechnungsumme = 0; while ( my ($aktrechnung) = $getrechnung->fetchrow_array ) { $rechnungsumme += $aktrechnung; } $rechnungsumme = sprintf( "%.2f €", $rechnungsumme ); $labelRechnung->set_text($rechnungsumme); # Zahlung mit Gutschein my $getgutschein = $db->prepare( "SELECT SUM(preis) FROM $bondb WHERE bonid LIKE ? and ttnr=\"900000004\";" ); $getgutschein->execute($bonid); my ($gutscheinsumme) = $getgutschein->fetchrow_array; $gutscheinsumme = sprintf( "%.2f €", $gutscheinsumme ); $labelGutschein->set_text($gutscheinsumme); # Umsätze/Wgruppe in Tabelle eintragen @{ $listezbon->{data} } = (); foreach my $aktwgruppe ( sort keys %wgruppe ) { my $bez; if ( $aktwgruppe == 0 ) { $bez = "Sonstige"; } else { $bez = pos_get_wgruppe($aktwgruppe); utf8::decode($bez); } push @{ $listezbon->{data} }, [ $bez, $artikel{$aktwgruppe}, sprintf( "%.2f €", $wgruppe{$aktwgruppe} ), sprintf( "%.2f €", $mwst{$aktwgruppe} ) ]; } $dialogZbon->reshow_with_initial_size; } sub on_okbuttonZbon_clicked { $dialogZbon->hide; return 1; } sub on_buttonSuche_clicked { $dialogSuche->show; } sub on_buttonSucheStarten_clicked { my $search = $entrySuche->get_text; $search = "\%$search\%"; my $searchlist = $db->prepare( "SELECT ttnr, marke, wgruppe, artbez, eigpreis, mwst, oem FROM stamm_artikel WHERE wgruppe like ? OR marke like ? OR ean like ? OR drucker like ? OR oem like ? OR kompatibel like ? OR ttnr like ? OR emstar like ? OR artnr like ? OR artbez like ? OR regal like ? OR bemerk like ?" ); $searchlist->execute( $search, $search, $search, $search, $search, $search, $search, $search, $search, $search, $search, $search ); @{ $listesuche->{data} } = (); while ( my ( $aktttnr, $aktmarke, $aktwgruppe, $aktbez, $aktpreis, $aktmwst, $aktoem ) = $searchlist->fetchrow_array ) { $aktpreis += $aktpreis / 100 * $aktmwst; $aktpreis = sprintf( "%.2f", $aktpreis ); push @{ $listesuche->{data} }, [ $aktttnr, $aktoem, pos_get_marke($aktmarke), $aktbez, $aktpreis, $aktmwst ]; } $dialogSuche->show; } sub on_okbuttonSuche_clicked { return if commit() == 1; my $pos = keys %{ $bon{$uid} }; my @index = $listesuche->get_selected_indices; if ( @index > 0 ) { ##debug print "Index >0\n"; # nur wenn mindestens ein Artkel ausgewählt wurde, kann man was übernehmen foreach my $aktindex (@index) { ##debug print "Aktindex $aktindex\n"; $pos++; my $ttnr = ${ $listesuche->{data} }[$aktindex][0]; my $oem = ${ $listesuche->{data} }[$aktindex][1]; my $marke = ${ $listesuche->{data} }[$aktindex][2]; my $artbez = ${ $listesuche->{data} }[$aktindex][3]; my $preis = ${ $listesuche->{data} }[$aktindex][4]; my $mwst = ${ $listesuche->{data} }[$aktindex][5]; # Preis steht brutto in der Tabelle $preis = float($preis); $preis = $preis / 116 * 100; $bon{$uid}->{$pos}->{"TTNr"} = $ttnr; $bon{$uid}->{$pos}->{"Bezeichn"} = $artbez; $bon{$uid}->{$pos}->{"Anzahl"} = "1"; $bon{$uid}->{$pos}->{"Stuckpreis"} = $preis; $bon{$uid}->{$pos}->{"MwSt"} = $mwst; $bon{$uid}->{$pos}->{"OEM"} = $oem; } update_bon(); } $dialogSuche->hide; } sub on_buttonSucheInformationen_clicked { my @index = $listesuche->get_selected_indices; my $temp; if ( @index == 1 ) { # nur wenn genau ein Artikel ausgwählt wurde, werden die Details angezeigt $temp = $index[0]; my $getdetails = $db->prepare( "SELECT wgruppe, ttnr, marke, oem, drucker, ean, kompatibel, emstar, artbez, artnr, seiten, gruppe, farbe, bemerk, spez, inhalt, regal, eigpreis,fremdpreis,komppreis,verglpreis,mwst FROM stamm_artikel WHERE ttnr=?;" ); my $tempttnr = ${ $listesuche->{data} }[$temp][0]; $getdetails->execute($tempttnr); my ( $sqlwgruppe, $sqlttnr, $sqlmarke, $sqloem, $sqldrucker, $sqlean, $sqlkompatibel, $sqlemstar, $sqlartbez, $sqlartnr, $sqlseiten, $sqlgruppe, $sqlfarbe, $sqlbemerk, $sqlspez, $sqlinhalt, $sqlregal, $sqleigpreis, $sqlfremdpreis, $sqlkomppreis, $sqlverglpreis, $sqlmwst ) = $getdetails->fetchrow_array; my $t1 = pos_get_wgruppe($sqlwgruppe); utf8::decode($t1); $labelwgruppe->set_text($t1); $labelttnr->set_text($sqlttnr); my $t2 = pos_get_marke($sqlmarke); $labelmarke->set_text($t2); $labeloem->set_text($sqloem); $labeldrucker->set_text($sqldrucker); $labelean->set_text($sqlean); $labelkompatibel->set_text($sqlkompatibel); $labelemstar->set_text($sqlemstar); utf8::decode($sqlartbez); $labelartbez->set_text($sqlartbez); $labelartnr->set_text($sqlartnr); $labelseiten->set_text($sqlseiten); $labelgruppe->set_text($sqlgruppe); $labelfarbe->set_text($sqlfarbe); utf8::decode($sqlbemerk); $labelbemerk->set_text($sqlbemerk); $labelspez->set_text($sqlspez); $labelinhalt->set_text($sqlinhalt); utf8::decode($sqlregal); $labelregal->set_text($sqlregal); # Preise schöner formatieren $sqleigpreis += $sqleigpreis / 100 * $sqlmwst; my $temppreis = sprintf( "%.2f", $sqleigpreis ); $labeleigpreis->set_text($temppreis); $sqlfremdpreis += $sqlfremdpreis / 100 * $sqlmwst; $temppreis = sprintf( "%.2f", $sqlfremdpreis ); $labelfremdpreis->set_text($temppreis); $sqlkomppreis += $sqlkomppreis / 100 * $sqlmwst; $temppreis = sprintf( "%.2f", $sqlkomppreis ); $labelkomppreis->set_text($temppreis); $sqlverglpreis += $sqlverglpreis / 100 * $sqlmwst; $temppreis = sprintf( "%.2f", $sqlverglpreis ); $labelverglpreis->set_text($temppreis); $dialogSucheInformationen->reshow_with_initial_size; } } sub on_okbuttonSucheInformationen_clicked { $dialogSucheInformationen->hide; return 1; } sub on_cancelbuttonSuche_clicked { $dialogSuche->hide; return 1; } sub on_okbuttonNeuerKunde_clicked { my $firma = $labelNKFirma->get_text; my $person = $labelNKPerson->get_text; my $anschrift = $labelNKAnschrift->get_text; my $telefon = $labelNKTelefon->get_text; my $durchwahl = $labelNKDurchwahl->get_text; my $fax = $labelNKFax->get_text; my $email = $labelNKeMail->get_text; my $drucker = $labelNKDrucker->get_text; my $druckerdesc = $labelNKDruckerDesc->get_text; my $anfragen = $labelNKAnfragen->get_text; my $anfragenstatus = $labelNKAnfragenStatus->get_text; my $bemerk = $labelNKBemerk->get_text; if ( $firma eq "" ) { $labelFehler->set_text("Der Name der Firma muss angegeben werden."); $dialogFehler->reshow_with_initial_size; return; } if ( $person eq "" ) { $labelFehler->set_text( "Der Name des Ansprechpartners muss angegeben werden."); $dialogFehler->reshow_with_initial_size; return; } if ( $anschrift eq "" ) { $labelFehler->set_text("Die Anschrift muss angegeben werden."); $dialogFehler->reshow_with_initial_size; return; } my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(); $year += 1900; my $monat; $mon++; if ( $mon < 10 ) { $monat = "0" . $mon; } else { $monat = $mon; } my $day; if ( $mday < 10 ) { $day = "0" . $mday; } else { $day = $mday; } if ( $hour < 10 ) { $hour = "0" . $hour; } if ( $min < 10 ) { $min = "0" . $min; } if ( $sec < 10 ) { $sec = "0" . $sec; } my $timestamp = $year . $monat . $day . $hour . $min . $sec; my $table = pos_hostname() . "_kunden"; my $savecustomer = $db->prepare( "INSERT INTO $table (firma, person, anschrift, telefon, durchwahl, fax, email, drucker, druckerdesc, anfragen, anfragenstatus, bemerk, cuser, timestamp) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?);" ); my $rc = $savecustomer->execute( $firma, $person, $anschrift, $telefon, $durchwahl, $fax, $email, $drucker, $druckerdesc, $anfragen, $anfragenstatus, $bemerk, $uid, $timestamp ); if ( $rc eq undef ) { $labelFehler->set_text( "Fehler beim Speichern des Kunden in die Datenbank."); $dialogFehler->reshow_with_initial_size; } $dialogNeuerKunde->hide; } sub on_okbuttonKassenIst_clicked { my $temp = $stueckelung[$aktstueckelung]; $kassenist{$temp}->{'value'} = $spinbuttonKassenIst->get_value_as_int; $aktstueckelung++; if ( $aktstueckelung == @stueckelung ) { # Einmal durchgelaufen # Summe des Kassen-Ist bilden my $summe = $kassenist{'1cent'}->{'value'} * 0.01; $summe += $kassenist{'2cent'}->{'value'} * 0.02; $summe += $kassenist{'5cent'}->{'value'} * 0.05; $summe += $kassenist{'10cent'}->{'value'} * 0.10; $summe += $kassenist{'20cent'}->{'value'} * 0.20; $summe += $kassenist{'50cent'}->{'value'} * 0.50; $summe += $kassenist{'1euro'}->{'value'} * 1; $summe += $kassenist{'2euro'}->{'value'} * 2; $summe += $kassenist{'5euro'}->{'value'} * 5; $summe += $kassenist{'10euro'}->{'value'} * 10; $summe += $kassenist{'20euro'}->{'value'} * 20; $summe += $kassenist{'50euro'}->{'value'} * 50; $summe += $kassenist{'100euro'}->{'value'} * 100; $summe += $kassenist{'200euro'}->{'value'} * 200; $summe += $kassenist{'500euro'}->{'value'} * 500; # Tagessumsatz berechnen my $bondb = pos_hostname() . "_bon"; my ($bonid) = pos_time() =~ /(\d{8})\d{6}/; $bonid = pos_hostname() . "_$bonid\%"; ##db print "BonID: $bonid\n"; my $getsummebar = $db->prepare( "SELECT sum(preis) FROM $bondb WHERE bonid LIKE ? AND ttnr=900000000;" ); $getsummebar->execute($bonid); my ($dbsumme) = $getsummebar->fetchrow_array; # Summe des Wechselgelds berechnen my $getsummezurueck=$db->prepare("SELECT sum(preis) FROM $bondb WHERE bonid LIKE ? AND ttnr=900000005;"); $getsummezurueck->execute($bonid); my ($zurueck)=$getsummezurueck->fetchrow_array; $dbsumme-=$zurueck; # morgens wird Wechselgeld in die Kasse gelegt $dbsumme += 250; $dbsumme = sprintf( "%.2f", $dbsumme ); $dbsumme = float($dbsumme); $summe = float($summe); ##db print "Kassen-Ist: $summe, Datenbank: $dbsumme\n"; if ( $dbsumme != $summe ) { $kassenistkorrektur++; if ( $kassenistkorrektur < 3 ) { $dialogKassenIst->hide; if ( $kassenistkorrektur == 2 ) { $labelFehler->set_text( "Der Kassen-Bericht stimmt nicht mit dem Tages-Umsatz überein. Bitte korrigieren Sie Ihre Angaben. Sie können nur noch einmal die Daten korrigieren!" ); } else { $labelFehler->set_text( "Der Kassen-Bericht stimmt nicht mit dem Tages-Umsatz überein. Bitte korrigieren Sie Ihre Angaben." ); } $dialogFehler->reshow_with_initial_size; $aktstueckelung = 0; # Funktion verlassen, damit Speichern nicht aufgerufen wird return; } else { $dialogKassenIst->hide; $labelFehler->set_text( "Der Kassen-Bericht stimmt nicht mit dem Tages-Umsatz überein. Der Kassen-Bericht wird gedruckt und abgespeichert. Eine weitere Korrektur ist nicht möglich." ); $dialogFehler->reshow_with_initial_size; } } else { # Kassen-Bericht stimmt $dialogKassenIst->hide; $labelInfo->set_text( "Kassen-Ist ist korrekt. Der Kassen-Bericht wird gedruckt und abgespeichert." ); $dialogInfo->reshow_with_initial_size; } # Speichern my $table = pos_hostname() . "_kassenist"; my $savekassenist = $db->prepare( "INSERT INTO $table (user,timestamp,summe,dbsumme,1cent,2cent,5cent,10cent,20cent,50cent,1euro,2euro,5euro,10euro,20euro,50euro,100euro,200euro,500euro) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);" ); my $timestamp = pos_time(); my $rc = $savekassenist->execute( $uid, $timestamp, $summe, $dbsumme, $kassenist{'1cent'}->{'value'}, $kassenist{'2cent'}->{'value'}, $kassenist{'5cent'}->{'value'}, $kassenist{'10cent'}->{'value'}, $kassenist{'20cent'}->{'value'}, $kassenist{'50cent'}->{'value'}, $kassenist{'1euro'}->{'value'}, $kassenist{'2euro'}->{'value'}, $kassenist{'5euro'}->{'value'}, $kassenist{'10euro'}->{'value'}, $kassenist{'20euro'}->{'value'}, $kassenist{'50euro'}->{'value'}, $kassenist{'100euro'}->{'value'}, $kassenist{'200euro'}->{'value'}, $kassenist{'500euro'}->{'value'} ); if ( $rc eq undef ) { $labelFehler->set_text( "Fehler beim Speichern des Kassen-Ist in die Datenbank! Bitte benachrichtigen Sie umgehend Ihren Administrator." ); $dialogFehler->reshow_with_initial_size; } } else { # noch nicht komplett durchgelaufen, also nächste Stückelung abfragen my $temp = $stueckelung[$aktstueckelung]; my $temp2 = $kassenist{$temp}->{'label'}; $labelKassenIst->set_text($temp2); $temp = $kassenist{$temp}->{"value"}; $spinbuttonKassenIst->set_value($temp); $dialogKassenIst->reshow_with_initial_size; } } sub on_okbuttonKunde_clicked { my $suchekunde = $db->prepare( "SELECT id, person, telefon, durchwahl, fax, email, firma, anschrift, drucker, druckerdesc, anfragen, anfragenstatus, zahlungsart, rabatt, bemerk, ctime, cuser, atime, auser FROM stamm_kunden WHERE id LIKE ? OR firma LIKE ? OR person LIKE ?;" ); my $muster = $displayKunde->get_text; $muster = "%" . $muster . "%"; my $rc = $suchekunde->execute( $muster, $muster, $muster ); if ( $rc != 1 ) { $labelFehler->set_text("Der Kunde wurde nicht gefunden."); $dialogFehler->reshow_with_initial_size; return; } my ( $kundennummer, $person, $telefon, $durchwahl, $fax, $email, $firma, $anschrift, $drucker, $druckerdesc, $anfragen, $anfragenstatus, $zahlungsart, $rabatt, $bemerk, $ctime, $cuser, $atime, $auser ) = $suchekunde->fetchrow_array; $labelKundennummer->set_text($kundennummer); utf8::decode($person); $labelPerson->set_text($person); $labelTelefon->set_text($telefon); $labelDurchwahl->set_text($durchwahl); $labelFax->set_text($fax); $labeleMail->set_text($email); utf8::decode($firma); $labelFirma->set_text($firma); utf8::decode($anschrift); $labelAnschrift->set_text($anschrift); $labelDrucker->set_text($drucker); utf8::decode($druckerdesc); $labelDruckerDesc->set_text($druckerdesc); utf8::decode($anfragen); $labelAnfragen->set_text($anfragen); $labelAnfragenstatus->set_text($anfragenstatus); $labelZahlungsart->set_text($zahlungsart); $labelRabatt->set_text($rabatt); utf8::decode($bemerk); $labelBemerk->set_text($bemerk); my ( $jahr, $monat, $tag, $stunde, $min, $sekunde ) = $ctime =~ /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/; $labelctime->set_text("$stunde:$min:$sekunde am $tag.$monat.$jahr"); ( $jahr, $monat, $tag, $stunde, $min, $sekunde ) = $atime =~ /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/; if ( $jahr eq undef ) { $labelatime->set_text("keine Änderung"); } else { $labelatime->set_text("$stunde:$min:$sekunde am $tag.$monat.$jahr"); } $cuser = pos_get_longname($cuser); utf8::decode($cuser); $labelcuser->set_text($cuser); $auser = pos_get_longname($auser); utf8::decode($auser); if ( $auser eq undef ) { $labelauser->set_text("keine Änderung"); } else { $labelauser->set_text($auser); } $kunde{$uid} = $kundennummer; $rabatt{$uid} = $rabatt; $dialogKunde->hide; $dialogKundeErgebnis->show; update_bon(); } sub on_cancelbuttonKundeErgebnis_clicked { $kunde{$uid} = 0; $rabatt{$uid} = 0; $dialogKundeErgebnis->hide; update_bon(); return 1; } sub on_okbuttonKundeErgebnis_clicked { $dialogKundeErgebnis->hide; } sub on_cancelbuttonNeuerKunde_clicked { $dialogNeuerKunde->hide; return 1; } sub on_cancelbuttonKassenIst_clicked { $dialogKassenIst->hide; $aktstueckelung = 0; return 1; } sub on_cancelbuttonKunde_clicked { $kunde{$uid} = 0; $rabatt{$uid} = 0; $dialogKunde->hide; update_bon(); return 1; } # # # Sub Routinen # # sub reset_vars { # setzt alle Variablen zurück $bon{$uid} = (); $bonid{$uid} = ""; $bar{$uid} = 0; $rechnung{$uid} = 0; $karte{$uid} = 0; $kunde{$uid} = 0; $rabatt{$uid} = 0; $gutschein{$uid} = 0; $gutscheinnr{$uid} = 0; $calculaterechnung{$uid} = 0; } sub commit { # # wurde heute schon ein Kassen-Ist gespeichert? # my ($timestamp) = pos_time() =~ /(\d{8})\d{6}/; # $timestamp .= "%"; # my $rc = $checkkassenist->execute($timestamp); # if ( $rc >= 1 ) { # $labelFehler->set_text( #"Es wurde bereits ein Kassen-Abschluss durchgeführt. Es sind keine weiteren Bezahlvorgänge mehr möglich." # ); # $dialogFehler->reshow_with_initial_size; # return 1; # } # wenn die Variable $bonid{$uid} gesetzt ist, kann der aktuelle Bon OHNE speichern gelöscht werden if ( $bonid{$uid} ne "" ) { reset_vars(); update_bon(); } # ist der Bezahlvorgang abgeschlossen? # dann ist folgendes erfüllt: # mehr als zu zahlender Betrag wurde eingegeben (egal ob Karte, Bar oder Gutschein) # dann löst eine beliebige Funktionen einen neuen Vorgang aus my $tempbar = $bar{$uid} + 0; my $tempkarte = $karte{$uid} + 0; my $temprechnung = $rechnung{$uid} + 0; my $tempgutschein = $gutschein{$uid} + 0; if ( ( $tempbar == 0 ) && ( $tempkarte == 0 ) && ( $temprechnung == 0 ) && ( $tempgutschein == 0 ) ) { # nichts zu tun return; } # bei Rechnung ist bar und Karte nicht erlaubt if ( $temprechnung > 0 ) { if ( ( $tempbar > 0 ) || ( $tempkarte > 0 ) ) { $labelFehler->set_text( "Bei Zahlung per Rechung ist keine Bar- oder Karten-Zahlung möglich." ); $dialogFehler->reshow_with_initial_size; $bar{$uid} = 0; $karte{$uid} = 0; update_bon(); return; } } # Gesamtpreis ermitteln my $summe = 0; foreach my $aktkey ( keys %{ $bon{$uid} } ) { my $temp = $bon{$uid}->{$aktkey}->{"Stuckpreis"} * $bon{$uid}->{$aktkey}->{"Anzahl"}; my $mwst = $bon{$uid}->{$aktkey}->{"Stuckpreis"} * $bon{$uid}->{$aktkey}->{"Anzahl"} / 100 * $bon{$uid}->{$aktkey}->{"MwSt"}; $temp += $mwst; $summe += $temp; } # Rabatt abziehen $summe = $summe - $summe / 100 * $rabatt{$uid}; my $gezahlt = $tempbar + $tempkarte + $temprechnung + $tempgutschein; ##db print "$gezahlt - $summe\n"; if ( $gezahlt >= $summe ) { # enthält Return-Code von SQL-Aufrufen my $rc = 0; # wenn kein Kunde ausgewählt, dann kunden-Nummer = 0 my $kd; if ( $kunde{$uid} eq undef ) { $kd = 0; } else { $kd = $kunde{$uid}; } # Kartenbetrag übersteigt Rechungsbetrag if ( $tempkarte > $summe ) { $labelFehler->set_text( "Der mit Karte bezahlte Betrag ist höher als der fällige Rechnungsbetrag.\n Bitte korrigieren Sie den mit Karte bezahlten Betrag." ); $dialogFehler->reshow_with_initial_size; $karte{$uid} = 0; $tempkarte = 0; update_bon(); return; } # Vorgang wurde abgeschlossen # Bon in DB speichern my $hostname = pos_hostname(); my $bondb = $hostname . "_bon"; my $savebon = $db->prepare( "INSERT INTO $bondb (bonid, pos, ttnr, preis, anzahl, mwst, user, timestamp, kunde) VALUES (?,?,?,?,?,?,?,?,?);" ); my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(); $year += 1900; my $monat; $mon++; if ( $mon < 10 ) { $monat = "0" . $mon; } else { $monat = $mon; } my $day; if ( $mday < 10 ) { $day = "0" . $mday; } else { $day = $mday; } if ( $hour < 10 ) { $hour = "0" . $hour; } if ( $min < 10 ) { $min = "0" . $min; } if ( $sec < 10 ) { $sec = "0" . $sec; } my $timestamp = $year . $monat . $day . $hour . $min . $sec; my $bonid = pos_hostname . "_" . $timestamp; foreach my $aktkey ( keys %{ $bon{$uid} } ) { my $ttnr = $bon{$uid}->{$aktkey}->{"TTNr"}; my $preis = $bon{$uid}->{$aktkey}->{"Stuckpreis"}; my $anzahl = $bon{$uid}->{$aktkey}->{"Anzahl"}; my $mwst = $bon{$uid}->{$aktkey}->{"MwSt"}; $preis = float($preis); $rc = $savebon->execute( $bonid, $aktkey, $ttnr, $preis, $anzahl, $mwst, $uid, $timestamp, $kd ); if ( $rc != 1 ) { $labelFehler->set_text( "Ein kritischer Fehler beim Arbeiten mit der Datenbank ist aufgetreten. Notieren Sie alle Positionen des aktuellen Bons und beenden Sie die Kasse umgehend!\nBenachrichtigen Sie schnellstens einen Administrator!" ); $dialogFehler->reshow_with_initial_size; } } # bar speichern my $temp = 0; if ( $bar{$uid} eq undef ) { $temp = 0; } else { $temp = float( $bar{$uid} ); } $rc = $savebon->execute( $bonid, "0", "900000000", $temp, "1", "0", $uid, $timestamp, $kd ); if ( $rc != 1 ) { $labelFehler->set_text( "Ein kritischer Fehler beim Arbeiten mit der Datenbank ist aufgetreten. Notieren Sie alle Positionen des aktuellen Bons und beenden Sie die Kasse umgehend!\nBenachrichtigen Sie schnellstens einen Administrator!" ); $dialogFehler->reshow_with_initial_size; } # karte speichern if ( $karte{$uid} eq undef ) { $temp = 0; } else { $temp = float( $karte{$uid} ); } $rc = $savebon->execute( $bonid, "0", "900000001", $temp, "1", "0", $uid, $timestamp, $kd ); if ( $rc != 1 ) { $labelFehler->set_text( "Ein kritischer Fehler beim Arbeiten mit der Datenbank ist aufgetreten. Notieren Sie alle Positionen des aktuellen Bons und beenden Sie die Kasse umgehend!\nBenachrichtigen Sie schnellstens einen Administrator!" ); $dialogFehler->reshow_with_initial_size; } # Rabatt speichern if ( $rabatt{$uid} eq undef ) { $temp = 0; } else { $temp = float( $rabatt{$uid} ); } $rc = $savebon->execute( $bonid, "0", "900000002", $temp, "1", "0", $uid, $timestamp, $kd ); if ( $rc != 1 ) { $labelFehler->set_text( "Ein kritischer Fehler beim Arbeiten mit der Datenbank ist aufgetreten. Notieren Sie alle Positionen des aktuellen Bons und beenden Sie die Kasse umgehend!\nBenachrichtigen Sie schnellstens einen Administrator!" ); $dialogFehler->reshow_with_initial_size; } # Rechnung speichern $temp = 0; if ( $rechnung{$uid} eq undef ) { $temp = 0; } else { $temp = float( $rechnung{$uid} ); } $rc = $savebon->execute( $bonid, "0", "900000003", $temp, "1", "0", $uid, $timestamp, $kd ); if ( $rc != 1 ) { $labelFehler->set_text( "Ein kritischer Fehler beim Arbeiten mit der Datenbank ist aufgetreten. Notieren Sie alle Positionen des aktuellen Bons und beenden Sie die Kasse umgehend!\nBenachrichtigen Sie schnellstens einen Administrator!" ); $dialogFehler->reshow_with_initial_size; } # Gutschein speichern $temp = 0; if ( $gutschein{$uid} eq undef ) { $temp = 0; } else { $temp = float( $gutschein{$uid} ); my $savegutschein = $db->prepare( "INSERT INTO $bondb (bonid, pos, ttnr, preis, anzahl, mwst, user, timestamp, kunde, gutschein ) VALUES (?,?,?,?,?,?,?,?,?,?);" ); $rc = $savegutschein->execute( $bonid, "0", "900000004", $temp, "1", "0", $uid, $timestamp, $kd, $gutscheinnr{$uid} ); # $rc = # $savebon->execute( $bonid, "0", "900000004", $temp, "1", "0", # $uid, $timestamp, $kd ); if ( $rc != 1 ) { $labelFehler->set_text( "Ein kritischer Fehler beim Arbeiten mit der Datenbank ist aufgetreten. Notieren Sie alle Positionen des aktuellen Bons und beenden Sie die Kasse umgehend!\nBenachrichtigen Sie schnellstens einen Administrator!" ); $dialogFehler->reshow_with_initial_size; } } reset_vars(); update_bon(); } } sub update_bon { my $summe = int(0); my $summenetto = int(0); my $gesamtmwst = int(0); @{ $listebon->{data} } = (); foreach my $aktkey ( sort nummeric keys %{ $bon{$uid} } ) { my $netto = $bon{$uid}->{$aktkey}->{"Stuckpreis"} * $bon{$uid}->{$aktkey}->{"Anzahl"}; my $stuckpreis = $bon{$uid}->{$aktkey}->{"Stuckpreis"}; my $mwst = $bon{$uid}->{$aktkey}->{"Stuckpreis"} * $bon{$uid}->{$aktkey}->{"Anzahl"} / 100 * $bon{$uid}->{$aktkey}->{"MwSt"}; # es soll immer der Brutto-Preis angezeigt werden my $brutto = $netto + $mwst; $gesamtmwst += $mwst; my $stuckpreisbrutto = $bon{$uid}->{$aktkey}->{"Stuckpreis"} + $bon{$uid}->{$aktkey}->{"Stuckpreis"} / 100 * $bon{$uid}->{$aktkey}->{"MwSt"}; push @{ $listebon->{data} }, [ $aktkey, $bon{$uid}->{$aktkey}->{"TTNr"}, $bon{$uid}->{$aktkey}->{"OEM"}, $bon{$uid}->{$aktkey}->{"Bezeichn"}, $bon{$uid}->{$aktkey}->{"Anzahl"}, sprintf( "%.2f", $stuckpreisbrutto ), sprintf( "%.2f", $stuckpreis ), sprintf( "%.2f", $brutto ) ]; $summenetto += $netto; $summe += $brutto; } # Netto Summe anzeigen $summenetto = sprintf( "%.2f", $summenetto ); $displayNetto->set_markup("$summenetto"); my $tempbar = $bar{$uid} + 0; my $tempkarte = $karte{$uid} + 0; my $temprechnung = $rechnung{$uid} + 0; my $tempgutschein = $gutschein{$uid} + 0; my $temprabatt = $rabatt{$uid} + 0; my $gegeben = $tempbar + $tempkarte + $temprechnung + $tempgutschein; # Rabatt anzeigen if ( $temprabatt > 0 ) { my $rabattbetrag = $summe / 100 * $temprabatt; $summe -= $rabattbetrag; $rabattbetrag = sprintf( "%.2f", $rabattbetrag ); push @{ $listebon->{data} }, [ "", "Rabatt", "$temprabatt %", "", "", "- $rabattbetrag €" ]; } # eingelösten Gutschein anzeigen if ( $tempgutschein > 0 ) { my $gutscheinbetrag = sprintf( "%.2f", $tempgutschein ); push @{ $listebon->{data} }, [ "", "Gutschein", "", "Nummer: $gutscheinnr{$uid}", "", "$gutscheinbetrag €" ]; } # Rechnung anzeigen if ( $calculaterechnung{$uid} == 1 ) { $rechnung{$uid} = $summe - $gegeben; $gegeben = $summe; my $rechnungsbetrag = sprintf( "%.2f", $rechnung{$uid} ); push @{ $listebon->{data} }, [ "", "Rechnung", "", "", "", "$rechnungsbetrag €" ]; } # wenn bei Kartenzahlung zu viel gezahlt wird, ist das ein Fehler! # bei Kartenzahlung darf es kein Rückgeld geben if ( $tempkarte > $summe ) { $labelFehler->set_text( "Der mit Karte bezahlte Betrag ist höher als der fällige Rechnungsbetrag. Bitte korrigieren Sie den mit Karte bezahlten Betrag." ); $dialogFehler->reshow_with_initial_size; $karte{$uid} = 0; $tempkarte = 0; } # Bei Rechnung ist kein Bar oder Karte erlaubt if ( $temprechnung > 0 ) { if ( ( $tempbar > 0 ) || ( $tempkarte > 0 ) ) { $labelFehler->set_text( "Bei Zahlung per Rechung ist keine Bar- oder Karten-Zahlung möglich." ); $dialogFehler->reshow_with_initial_size; $bar{$uid} = 0; $karte{$uid} = 0; $tempbar = 0; $tempkarte = 0; } } my $zurueck = 0; my $rest = 0; $rest = $summe - $gegeben; $zurueck = $gegeben - $summe; my $tempgegeben = 0; $tempgegeben = sprintf( "%.2f", $gegeben ); $displayGegeben->set_markup("$tempgegeben"); if ( $tempbar > 0 ) { # bereits gezahlten Bar Betrag anzeigen push @{ $listebon->{data} }, [ "", "Bar", "", "", "", sprintf( "%.2f", $tempbar ) ]; } if ( $tempkarte > 0 ) { # bereits gezahlten Karten Betrag anzeigen push @{ $listebon->{data} }, [ "", "Karte", "", "", "", sprintf( "%.2f", $tempkarte ) ]; } if ( ( $tempkarte == 0 ) && ( $tempbar == 0 ) && ( $temprechnung == 0 ) && ( $tempgutschein == 0 ) ) { # nichts zurückzugeben $displayGegeben->set_markup("0,00"); } # Zurück und Rest korrekt anzeigen $zurueck =~ s/,/./g; if ( $zurueck > 0 ) { $zurueck = sprintf( "%.2f", $zurueck ); $labelZurueck->set_markup( "Zurück:"); $displayZurueck->set_markup( "$zurueck"); } elsif ( ( $gegeben > 0 ) && ( $rest > 0 ) ) { $rest = sprintf( "%.2f", $rest ); $labelZurueck->set_markup( "Rest:"); $displayZurueck->set_markup( "$rest"); } else { $labelZurueck->set_markup( "Zurück:"); $displayZurueck->set_markup("0,00"); } my $summetemp = sprintf( "%.2f", $summe ); my $gesamtmwsttemp = sprintf( "%.2f", $gesamtmwst ); $displaySumme->set_markup("$summetemp"); $displayMwst->set_markup("$gesamtmwsttemp"); ##debug ##dbprint "Gegeben: $gegeben, Zurück: $zurueck, Rest: $rest, Karte: $tempkarte, Bar: $tempbar, Summe: $summe\n"; } sub change_hotkeys { my $funktion = shift; my $aktkey = shift; if ( $funktion =~ /^gruppe:/ ) { ($gruppe) = $funktion =~ /^gruppe:(.*)/; if ( $gruppe =~ /start/ ) { $labelHotkey->set_text("Aktuelle Tastengruppe: Start"); } else { my $hotkeylabel = $hotkey[$aktkey]->get_label; ($hotkeylabel) = $hotkeylabel =~ /F\d+\s(.*)/; $labelHotkey->set_text("Aktuelle Tastengruppe: $hotkeylabel"); } update_hotkeys(); } elsif ( $funktion =~ /^artikel/ ) { return if commit() == 1; # wie viele Positionen hat der aktuelle Bon? my $pos = keys %{ $bon{$uid} }; my ($ttnr) = $funktion =~ /^artikel:(\d{8})/; # befindet sich der Artikel schon im Bon? # ja - dann Anzahl erhöhen my $counter = 0; foreach my $aktpos ( keys %{ $bon{$uid} } ) { if ( $bon{$uid}->{$aktpos}->{"TTNr"} eq $ttnr ) { $bon{$uid}->{$aktpos}->{"Anzahl"}++; $counter++; } } if ( $counter == 0 ) { $get_artikel->execute($ttnr); my ( $artbez, $eigpreis, $mwst, $oem ) = $get_artikel->fetchrow_array; $pos++; $bon{$uid}->{$pos}->{"TTNr"} = $ttnr; $bon{$uid}->{$pos}->{"Bezeichn"} = $artbez; $bon{$uid}->{$pos}->{"OEM"} = $oem; $bon{$uid}->{$pos}->{"Anzahl"} = "1"; $bon{$uid}->{$pos}->{"Stuckpreis"} = $eigpreis; $bon{$uid}->{$pos}->{"MwSt"} = $mwst; } update_bon(); } } sub create_bon { $listebon = Gtk2::SimpleList->new_from_treeview( $listebonwidget, 'Pos' => 'int', 'TT-Nummer' => 'text', 'OEM-Nummer' => 'text', 'Bezeichnung' => 'text', 'Anzahl' => 'text', 'Stückpreis' => 'text', 'Netto' => 'text', 'Gesamtpreis' => 'text' ); foreach ( $listebon->get_columns() ) { $_->set_resizable(1); } $listebon->set_headers_visible(1); } sub create_zbon { $listezbon = Gtk2::SimpleList->new_from_treeview( $listezbonwidget, 'Warengruppe' => 'text', 'Anzahl Artikel' => 'text', 'Gesamtumsatz' => 'text', 'davon MwSt.' => 'text' ); foreach ( $listezbon->get_columns() ) { $_->set_resizable(1); } $listezbon->set_headers_visible(1); } sub create_bonkopieliste { $listebonkopieliste = Gtk2::SimpleList->new_from_treeview( $listebonkopieliste, 'Datum' => 'text', 'Uhrzeit' => 'text', 'Umsatz' => 'text' ); foreach ( $listebonkopieliste->get_columns() ) { $_->set_resizable(1); } $listebonkopieliste->set_headers_visible(1); } sub create_suchergebnis { $listesuche = Gtk2::SimpleList->new_from_treeview( $listesuchergebnis, 'TT-Nummer' => 'text', 'OEM-Nummer' => 'text', 'Hersteller' => 'text', 'Artikel Bez.' => 'text', 'Preis' => 'text', 'MwSt' => 'text' ); foreach ( $listesuchergebnis->get_columns() ) { $_->set_resizable(1); } $listesuchergebnis->set_headers_visible(1); } sub update_hotkeys { if ( $gruppe eq "" ) { $gruppe = "start"; } my $get_hotkeys = $db->prepare( 'SELECT label, bubble, funktion, pos FROM stamm_hotkeys WHERE gruppe=? ORDER BY pos;' ); $get_hotkeys->execute($gruppe); # Tasten aus Datenbank auslesen my $index = 1; while ( my ( $label, $bubble, $funktion, $pos ) = $get_hotkeys->fetchrow_array ) { utf8::decode($label); $hotkey[$pos]->set_label($label); utf8::decode($bubble); $tooltip->set_tip( $hotkey[$pos], $bubble, undef ); } } sub nummeric { # für nummerisches sortieren $a <=> $b; } # # # Hauptprogramm # # # Liste für Suchergebnis generieren create_suchergebnis(); # Liste für Z-Bon generieren create_zbon(); # Bon-Liste generieren create_bon(); # Liste für Bonkopie generieren create_bonkopieliste(); # Hotkeys befüllen update_hotkeys(); # Hauptfenster anzeigen $terminal->show; # Main Loop Gtk2->main; exit 0;
jploski wrote on Mon Aug 7 15:38:16 MEST 2006:
Can you email the file to jploski@users.sourceforge.net? It is rather difficult to extract the text from the forum message (encoding of characters and whitespace may matter).
bapiede wrote on Mon Aug 7 14:47:28 MEST 2006:
Thank you for your fast answer! You're suggested parms didn't work. I tried with ./eclipse -vmargs -Xmx512M -Xms512M and the same error occured. I'm not fimilar with those settings. Do you know other settings to try? regards, Christian
jploski wrote on Mon Aug 7 18:12:28 MEST 2006:
I submitted a bug report describing your problem: http://sourceforge.net/tracker/index.php?func=detail&aid=1536109&group_id=75859&atid=545274 A quick workaround would be to encode your source files in ISO-8859-1.
bapiede wrote on Mon Aug 7 18:59:15 MEST 2006:
it worked! I saved the file with iso-8859-1 encoding - and everything is fine! Thank you again and again... ;-)
jploski wrote on Mon Aug 7 19:23:45 MEST 2006:
You should upgrade to 0.4.1. The problem was not caused by encoding, as long as you have an Euro sign in your file, you will still have trouble in 0.4.0.
Note: The above is an archived snapshot of a forum thread. Use the original thread at sf.net to post comments.