X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FAM.pm;h=bf5c97d0ce91fd5258d0660cfac9c8bc2c9a97c4;hb=3d7898cf2bab46c72face3011460d093d8778b32;hp=ec4c3f00cd69dd511725a0133314f9c464a436bc;hpb=6216f7b53a81a73641a2d98ea43f363b6a615b07;p=kivitendo-erp.git diff --git a/SL/AM.pm b/SL/AM.pm index ec4c3f00c..bf5c97d0c 100644 --- a/SL/AM.pm +++ b/SL/AM.pm @@ -37,9 +37,13 @@ package AM; +use Carp; use Data::Dumper; +use Encode; use SL::DBUtils; +use strict; + sub get_account { $main::lxdebug->enter_sub(); @@ -63,11 +67,11 @@ sub get_account { }; - $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query"); + $main::lxdebug->message(LXDebug->QUERY(), "\$query=\n $query"); my $sth = $dbh->prepare($query); $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})"); - my $ref = $sth->fetchrow_hashref(NAME_lc); + my $ref = $sth->fetchrow_hashref("NAME_lc"); foreach my $key (keys %$ref) { $form->{"$key"} = $ref->{"$key"}; @@ -78,13 +82,13 @@ sub get_account { # get default accounts $query = qq|SELECT inventory_accno_id, income_accno_id, expense_accno_id FROM defaults|; - $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query"); + $main::lxdebug->message(LXDebug->QUERY(), "\$query=\n $query"); $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); - $ref = $sth->fetchrow_hashref(NAME_lc); + $ref = $sth->fetchrow_hashref("NAME_lc"); - map { $form->{$_} = $ref->{$_} } keys %ref; + map { $form->{$_} = $ref->{$_} } keys %{ $ref }; $sth->finish; @@ -101,13 +105,13 @@ sub get_account { rate FROM tax ORDER BY taxkey }; - $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query"); + $main::lxdebug->message(LXDebug->QUERY(), "\$query=\n $query"); $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); $form->{TAXKEY} = []; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { push @{ $form->{TAXKEY} }, $ref; } @@ -118,12 +122,12 @@ sub get_account { FROM chart WHERE link = ? ORDER BY accno|; - $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query"); + $main::lxdebug->message(LXDebug->QUERY(), "\$query=\n $query"); $sth = $dbh->prepare($query); $sth->execute($form->{link}) || $form->dberror($query . " ($form->{link})"); $form->{NEWACCOUNT} = []; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { push @{ $form->{NEWACCOUNT} }, $ref; } @@ -149,14 +153,14 @@ sub get_account { WHERE tk.chart_id = ? ORDER BY startdate DESC }; - $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query"); + $main::lxdebug->message(LXDebug->QUERY(), "\$query=\n $query"); $sth = $dbh->prepare($query); $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})"); $form->{ACCOUNT_TAXKEYS} = []; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { push @{ $form->{ACCOUNT_TAXKEYS} }, $ref; } @@ -166,7 +170,7 @@ sub get_account { # check if we have any transactions $query = qq|SELECT a.trans_id FROM acc_trans a WHERE a.chart_id = ?|; - $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query"); + $main::lxdebug->message(LXDebug->QUERY(), "\$query=\n $query"); $sth = $dbh->prepare($query); $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})"); @@ -179,7 +183,7 @@ sub get_account { if ($form->{new_chart_id}) { $query = qq|SELECT current_date-valid_from FROM chart WHERE id = ?|; - $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query"); + $main::lxdebug->message(LXDebug->QUERY(), "\$query=\n $query"); my ($count) = selectrow_query($form, $dbh, $query, $form->{id}); if ($count >=0) { $form->{new_chart_valid} = 1; @@ -229,6 +233,13 @@ sub save_account { $form->{id} = ""; } + if (!$form->{id} || $form->{id} eq "") { + $query = qq|SELECT nextval('id')|; + ($form->{"id"}) = selectrow_query($form, $dbh, $query); + $query = qq|INSERT INTO chart (id, accno) VALUES (?, ?)|; + do_query($form, $dbh, $query, $form->{"id"}, $form->{"accno"}); + } + my @values; if ($form->{id}) { @@ -261,52 +272,6 @@ sub save_account { $form->{id}, ); - } - elsif ($form->{id} && !$form->{new_chart_valid}) { - - $query = qq| - UPDATE chart - SET new_chart_id = ?, - valid_from = ? - WHERE id = ? - |; - - @values = ( - conv_i($form->{new_chart_id}), - conv_date($form->{valid_from}), - $form->{id} - ); - } - else { - - $query = qq| - INSERT INTO chart ( - accno, - description, - charttype, - category, - link, - pos_bwa, - pos_bilanz, - pos_eur, - new_chart_id, - valid_from, - datevautomatik ) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - |; - - @values = ( - $form->{accno}, - $form->{description}, - $form->{charttype}, - $form->{category}, $form->{link}, - conv_i($form->{pos_bwa}), - conv_i($form->{pos_bilanz}), conv_i($form->{pos_eur}), - conv_i($form->{new_chart_id}), - conv_date($form->{valid_from}), - ($form->{datevautomatik} eq 'T') ? 'true':'false', - ); - } do_query($form, $dbh, $query, @values); @@ -324,6 +289,9 @@ sub save_account { # Loop control # Check if the account already exists, else cancel + + print(STDERR "Keine Taxkeys weil ID =: $form->{id}\n"); + last READTAXKEYS if ( $form->{'id'} == 0); # check if there is a startdate @@ -332,12 +300,6 @@ sub save_account { next READTAXKEYS; } - # check if there is at least one relation to pos_ustva or tax_id - if ( $form->{"taxkey_pos_ustva_$tk_count"} eq '' && $form->{"taxkey_tax_$tk_count"} == 0 ) { - $tk_count++; - next READTAXKEYS; - } - # Add valid taxkeys into the array push @taxkeys , { @@ -345,7 +307,7 @@ sub save_account { tax_id => conv_i($form->{"taxkey_tax_$tk_count"}), startdate => conv_date($form->{"taxkey_startdate_$tk_count"}), chart_id => conv_i($form->{"id"}), - pos_ustva => $form->{"taxkey_pos_ustva_$tk_count"}, + pos_ustva => conv_i($form->{"taxkey_pos_ustva_$tk_count"}), delete => ( $form->{"taxkey_del_$tk_count"} eq 'delete' ) ? '1' : '', }; @@ -489,11 +451,11 @@ sub departments { FROM department d ORDER BY 2|; - $sth = $dbh->prepare($query); + my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); $form->{ALL} = []; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { push @{ $form->{ALL} }, $ref; } @@ -517,7 +479,7 @@ sub get_department { my $sth = $dbh->prepare($query); $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})"); - my $ref = $sth->fetchrow_hashref(NAME_lc); + my $ref = $sth->fetchrow_hashref("NAME_lc"); map { $form->{$_} = $ref->{$_} } keys %$ref; @@ -540,6 +502,7 @@ sub save_department { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; + my ($query); # connect to database my $dbh = $form->dbconnect($myconfig); @@ -566,6 +529,7 @@ sub delete_department { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; + my ($query); # connect to database my $dbh = $form->dbconnect($myconfig); @@ -591,11 +555,10 @@ sub lead { FROM leads ORDER BY 2|; - $sth = $dbh->prepare($query); + my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); - $form->{ALL}; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { push @{ $form->{ALL} }, $ref; } @@ -620,7 +583,7 @@ sub get_lead { my $sth = $dbh->prepare($query); $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})"); - my $ref = $sth->fetchrow_hashref(NAME_lc); + my $ref = $sth->fetchrow_hashref("NAME_lc"); map { $form->{$_} = $ref->{$_} } keys %$ref; @@ -635,6 +598,7 @@ sub save_lead { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; + my ($query); # connect to database my $dbh = $form->dbconnect($myconfig); @@ -662,6 +626,7 @@ sub delete_lead { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; + my ($query); # connect to database my $dbh = $form->dbconnect($myconfig); @@ -683,15 +648,14 @@ sub business { # connect to database my $dbh = $form->dbconnect($myconfig); - my $query = qq|SELECT id, description, discount, customernumberinit + my $query = qq|SELECT id, description, discount, customernumberinit, salesman FROM business ORDER BY 2|; - $sth = $dbh->prepare($query); + my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); - $form->{ALL}; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { push @{ $form->{ALL} }, $ref; } @@ -710,13 +674,13 @@ sub get_business { my $dbh = $form->dbconnect($myconfig); my $query = - qq|SELECT b.description, b.discount, b.customernumberinit + qq|SELECT b.description, b.discount, b.customernumberinit, b.salesman FROM business b WHERE b.id = ?|; my $sth = $dbh->prepare($query); $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})"); - my $ref = $sth->fetchrow_hashref(NAME_lc); + my $ref = $sth->fetchrow_hashref("NAME_lc"); map { $form->{$_} = $ref->{$_} } keys %$ref; @@ -731,24 +695,25 @@ sub save_business { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; + my ($query); # connect to database my $dbh = $form->dbconnect($myconfig); - my @values = ($form->{description}, $form->{discount}, - $form->{customernumberinit}); + my @values = ($form->{description}, $form->{discount}, $form->{customernumberinit}, $form->{salesman} ? 't' : 'f'); # id is the old record if ($form->{id}) { $query = qq|UPDATE business SET description = ?, discount = ?, - customernumberinit = ? + customernumberinit = ?, + salesman = ? WHERE id = ?|; push(@values, $form->{id}); } else { $query = qq|INSERT INTO business - (description, discount, customernumberinit) - VALUES (?, ?, ?)|; + (description, discount, customernumberinit, salesman) + VALUES (?, ?, ?, ?)|; } do_query($form, $dbh, $query, @values); @@ -765,7 +730,7 @@ sub delete_business { # connect to database my $dbh = $form->dbconnect($myconfig); - $query = qq|DELETE FROM business + my $query = qq|DELETE FROM business WHERE id = ?|; do_query($form, $dbh, $query, $form->{id}); @@ -788,12 +753,12 @@ sub language { " output_numberformat, output_dateformat, output_longdates " . "FROM language ORDER BY description"; - $sth = $dbh->prepare($query); + my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); my $ary = []; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { push(@{ $ary }, $ref); } @@ -824,7 +789,7 @@ sub get_language { my $sth = $dbh->prepare($query); $sth->execute($form->{"id"}) || $form->dberror($query . " ($form->{id})"); - my $ref = $sth->fetchrow_hashref(NAME_lc); + my $ref = $sth->fetchrow_hashref("NAME_lc"); map { $form->{$_} = $ref->{$_} } keys %$ref; @@ -895,12 +860,13 @@ sub delete_language { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; + my $query; # connect to database my $dbh = $form->dbconnect_noauto($myconfig); foreach my $table (qw(translation_payment_terms units_language)) { - my $query = qq|DELETE FROM $table WHERE language_id = ?|; + $query = qq|DELETE FROM $table WHERE language_id = ?|; do_query($form, $dbh, $query, $form->{"id"}); } @@ -944,11 +910,11 @@ sub buchungsgruppe { FROM buchungsgruppen ORDER BY sortkey|; - $sth = $dbh->prepare($query); + my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); $form->{ALL} = []; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { push @{ $form->{ALL} }, $ref; } @@ -962,12 +928,13 @@ sub get_buchungsgruppe { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; + my $query; # connect to database my $dbh = $form->dbconnect($myconfig); if ($form->{id}) { - my $query = + $query = qq|SELECT description, inventory_accno_id, (SELECT accno FROM chart WHERE id = inventory_accno_id) AS inventory_accno, income_accno_id_0, @@ -991,13 +958,13 @@ sub get_buchungsgruppe { my $sth = $dbh->prepare($query); $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})"); - my $ref = $sth->fetchrow_hashref(NAME_lc); + my $ref = $sth->fetchrow_hashref("NAME_lc"); map { $form->{$_} = $ref->{$_} } keys %$ref; $sth->finish; - my $query = + $query = qq|SELECT count(id) = 0 AS orphaned FROM parts WHERE buchungsgruppen_id = ?|; @@ -1019,7 +986,7 @@ sub get_buchungsgruppe { my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { foreach my $key (split(/:/, $ref->{link})) { if (!$form->{"std_inventory_accno_id"} && ($key eq "IC")) { $form->{"std_inventory_accno_id"} = $ref->{"id"}; @@ -1106,7 +1073,7 @@ sub delete_buchungsgruppe { # connect to database my $dbh = $form->dbconnect($myconfig); - $query = qq|DELETE FROM buchungsgruppen WHERE id = ?|; + my $query = qq|DELETE FROM buchungsgruppen WHERE id = ?|; do_query($form, $dbh, $query, $form->{id}); $dbh->disconnect; @@ -1142,105 +1109,6 @@ sub swap_sortkeys { $main::lxdebug->leave_sub(); } -sub printer { - $main::lxdebug->enter_sub(); - - my ($self, $myconfig, $form) = @_; - - # connect to database - my $dbh = $form->dbconnect($myconfig); - - my $query = qq|SELECT id, printer_description, template_code, printer_command - FROM printers - ORDER BY 2|; - - $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); - - $form->{"ALL"} = []; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { - push @{ $form->{ALL} }, $ref; - } - - $sth->finish; - $dbh->disconnect; - - $main::lxdebug->leave_sub(); -} - -sub get_printer { - $main::lxdebug->enter_sub(); - - my ($self, $myconfig, $form) = @_; - - # connect to database - my $dbh = $form->dbconnect($myconfig); - - my $query = - qq|SELECT p.printer_description, p.template_code, p.printer_command - FROM printers p - WHERE p.id = ?|; - my $sth = $dbh->prepare($query); - $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})"); - - my $ref = $sth->fetchrow_hashref(NAME_lc); - - map { $form->{$_} = $ref->{$_} } keys %$ref; - - $sth->finish; - - $dbh->disconnect; - - $main::lxdebug->leave_sub(); -} - -sub save_printer { - $main::lxdebug->enter_sub(); - - my ($self, $myconfig, $form) = @_; - - # connect to database - my $dbh = $form->dbconnect($myconfig); - - my @values = ($form->{printer_description}, - $form->{template_code}, - $form->{printer_command}); - - # id is the old record - if ($form->{id}) { - $query = qq|UPDATE printers SET - printer_description = ?, template_code = ?, printer_command = ? - WHERE id = ?|; - push(@values, $form->{id}); - } else { - $query = qq|INSERT INTO printers - (printer_description, template_code, printer_command) - VALUES (?, ?, ?)|; - } - do_query($form, $dbh, $query, @values); - - $dbh->disconnect; - - $main::lxdebug->leave_sub(); -} - -sub delete_printer { - $main::lxdebug->enter_sub(); - - my ($self, $myconfig, $form) = @_; - - # connect to database - my $dbh = $form->dbconnect($myconfig); - - $query = qq|DELETE FROM printers - WHERE id = ?|; - do_query($form, $dbh, $query, $form->{id}); - - $dbh->disconnect; - - $main::lxdebug->leave_sub(); -} - sub payment { $main::lxdebug->enter_sub(); @@ -1251,11 +1119,11 @@ sub payment { my $query = qq|SELECT * FROM payment_terms ORDER BY sortkey|; - $sth = $dbh->prepare($query); + my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); $form->{ALL} = []; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { push @{ $form->{ALL} }, $ref; } @@ -1277,7 +1145,7 @@ sub get_payment { my $sth = $dbh->prepare($query); $sth->execute($form->{"id"}) || $form->dberror($query . " ($form->{id})"); - my $ref = $sth->fetchrow_hashref(NAME_lc); + my $ref = $sth->fetchrow_hashref("NAME_lc"); map { $form->{$_} = $ref->{$_} } keys %$ref; $sth->finish(); @@ -1294,7 +1162,7 @@ sub get_payment { $sth->execute($form->{"id"}) || $form->dberror($query . " ($form->{id})"); my %mapping; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { $mapping{ $ref->{"language_id"} } = $ref unless (defined($mapping{ $ref->{"language_id"} })); } @@ -1448,6 +1316,8 @@ sub load_template { close(TEMPLATE); } + $content = Encode::decode('utf-8-strict', $content) if $::locale->is_utf8; + $main::lxdebug->leave_sub(); return ($content, $lines); @@ -1463,6 +1333,7 @@ sub save_template { my $error = ""; if (open(TEMPLATE, ">$filename")) { + $content = Encode::encode('utf-8-strict', $content) if $::locale->is_utf8; $content =~ s/\r\n/\n/g; print(TEMPLATE $content); close(TEMPLATE); @@ -1475,117 +1346,123 @@ sub save_template { return $error; } -sub save_preferences { +sub save_defaults { $main::lxdebug->enter_sub(); - my ($self, $myconfig, $form, $memberfile, $userspath, $webdav) = @_; + my $self = shift; + my %params = @_; - map { ($form->{$_}) = split(/--/, $form->{$_}) } - qw(inventory_accno income_accno expense_accno fxgain_accno fxloss_accno); + my $myconfig = \%main::myconfig; + my $form = $main::form; - my @a; - $form->{curr} =~ s/ //g; - map { push(@a, uc pack "A3", $_) if $_ } split(/:/, $form->{curr}); - $form->{curr} = join ':', @a; + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); - # connect to database - my $dbh = $form->dbconnect_noauto($myconfig); + my %accnos; + map { ($accnos{$_}) = split(m/--/, $form->{$_}) } qw(inventory_accno income_accno expense_accno fxgain_accno fxloss_accno ar_paid_accno); + + $form->{curr} =~ s/ //g; + my @currencies = grep { $_ ne '' } split m/:/, $form->{curr}; + my $currency = join ':', @currencies; # these defaults are database wide - # user specific variables are in myconfig - # save defaults + my $query = - qq|UPDATE defaults SET | . - qq|inventory_accno_id = (SELECT c.id FROM chart c WHERE c.accno = ?), | . - qq|income_accno_id = (SELECT c.id FROM chart c WHERE c.accno = ?), | . - qq|expense_accno_id = (SELECT c.id FROM chart c WHERE c.accno = ?), | . - qq|fxgain_accno_id = (SELECT c.id FROM chart c WHERE c.accno = ?), | . - qq|fxloss_accno_id = (SELECT c.id FROM chart c WHERE c.accno = ?), | . - qq|invnumber = ?, | . - qq|cnnumber = ?, | . - qq|sonumber = ?, | . - qq|ponumber = ?, | . - qq|sqnumber = ?, | . - qq|rfqnumber = ?, | . - qq|customernumber = ?, | . - qq|vendornumber = ?, | . - qq|articlenumber = ?, | . - qq|servicenumber = ?, | . - qq|yearend = ?, | . - qq|curr = ?, | . - qq|businessnumber = ?|; - my @values = ($form->{inventory_accno}, $form->{income_accno}, - $form->{expense_accno}, - $form->{fxgain_accno}, $form->{fxloss_accno}, - $form->{invnumber}, $form->{cnnumber}, - $form->{sonumber}, $form->{ponumber}, - $form->{sqnumber}, $form->{rfqnumber}, - $form->{customernumber}, $form->{vendornumber}, - $form->{articlenumber}, $form->{servicenumber}, - $form->{yearend}, $form->{curr}, - $form->{businessnumber}); + qq|UPDATE defaults SET + inventory_accno_id = (SELECT c.id FROM chart c WHERE c.accno = ?), + income_accno_id = (SELECT c.id FROM chart c WHERE c.accno = ?), + expense_accno_id = (SELECT c.id FROM chart c WHERE c.accno = ?), + fxgain_accno_id = (SELECT c.id FROM chart c WHERE c.accno = ?), + fxloss_accno_id = (SELECT c.id FROM chart c WHERE c.accno = ?), + ar_paid_accno_id = (SELECT c.id FROM chart c WHERE c.accno = ?), + invnumber = ?, + cnnumber = ?, + sonumber = ?, + ponumber = ?, + sqnumber = ?, + rfqnumber = ?, + customernumber = ?, + vendornumber = ?, + articlenumber = ?, + servicenumber = ?, + sdonumber = ?, + pdonumber = ?, + curr = ?, + businessnumber = ?, + weightunit = ?|; + my @values = ($accnos{inventory_accno}, $accnos{income_accno}, $accnos{expense_accno}, + $accnos{fxgain_accno}, $accnos{fxloss_accno}, $accnos{ar_paid_accno}, + $form->{invnumber}, $form->{cnnumber}, + $form->{sonumber}, $form->{ponumber}, + $form->{sqnumber}, $form->{rfqnumber}, + $form->{customernumber}, $form->{vendornumber}, + $form->{articlenumber}, $form->{servicenumber}, + $form->{sdonumber}, $form->{pdonumber}, + $currency, + $form->{businessnumber}, $form->{weightunit}); do_query($form, $dbh, $query, @values); + $dbh->commit(); + + $main::lxdebug->leave_sub(); +} + + +sub save_preferences { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form) = @_; + + my $dbh = $form->get_standard_dbh($myconfig); + + my ($currency, $businessnumber) = selectrow_query($form, $dbh, qq|SELECT curr, businessnumber FROM defaults|); + # update name - $query = qq|UPDATE employee - SET name = ? - WHERE login = ?|; + my $query = qq|UPDATE employee SET name = ? WHERE login = ?|; do_query($form, $dbh, $query, $form->{name}, $form->{login}); - my $rc = $dbh->commit; - $dbh->disconnect; + my $rc = $dbh->commit(); # save first currency in myconfig - $form->{currency} = substr($form->{curr}, 0, 3); + $currency =~ s/:.*//; + $form->{currency} = $currency; + + $form->{businessnumber} = $businessnumber; - my $myconfig = new User "$memberfile", "$form->{login}"; + $myconfig = new User($form->{login}); foreach my $item (keys %$form) { $myconfig->{$item} = $form->{$item}; } - $myconfig->save_member($memberfile, $userspath); - - if ($webdav) { - @webdavdirs = - qw(angebote bestellungen rechnungen anfragen lieferantenbestellungen einkaufsrechnungen); - foreach $directory (@webdavdirs) { - $file = "webdav/" . $directory . "/webdav-user"; - if ($myconfig->{$directory}) { - open(HTACCESS, "$file") or die "cannot open webdav-user $!\n"; - while () { - ($login, $password) = split(/:/, $_); - if ($login ne $form->{login}) { - $newfile .= $_; - } - } - close(HTACCESS); - open(HTACCESS, "> $file") or die "cannot open webdav-user $!\n"; - $newfile .= $myconfig->{login} . ":" . $myconfig->{password} . "\n"; - print(HTACCESS $newfile); - close(HTACCESS); - } else { - $form->{$directory} = 0; - open(HTACCESS, "$file") or die "cannot open webdav-user $!\n"; - while () { - ($login, $password) = split(/:/, $_); - if ($login ne $form->{login}) { - $newfile .= $_; - } - } - close(HTACCESS); - open(HTACCESS, "> $file") or die "cannot open webdav-user $!\n"; - print(HTACCESS $newfile); - close(HTACCESS); - } - } - } + $myconfig->save_member; + + my $auth = $main::auth; $main::lxdebug->leave_sub(); return $rc; } +sub get_defaults { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + + my $defaults = selectfirst_hashref_query($form, $dbh, qq|SELECT * FROM defaults|) || {}; + + $defaults->{weightunit} ||= 'kg'; + + $main::lxdebug->leave_sub(); + + return $defaults; +} + sub defaultaccounts { $main::lxdebug->enter_sub(); @@ -1599,12 +1476,15 @@ sub defaultaccounts { my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); - $form->{defaults} = $sth->fetchrow_hashref(NAME_lc); - $form->{defaults}{IC} = $form->{defaults}{inventory_accno_id}; - $form->{defaults}{IC_income} = $form->{defaults}{income_accno_id}; - $form->{defaults}{IC_expense} = $form->{defaults}{expense_accno_id}; - $form->{defaults}{FX_gain} = $form->{defaults}{fxgain_accno_id}; - $form->{defaults}{FX_loss} = $form->{defaults}{fxloss_accno_id}; + $form->{defaults} = $sth->fetchrow_hashref("NAME_lc"); + $form->{defaults}{IC} = $form->{defaults}{inventory_accno_id}; + $form->{defaults}{IC_income} = $form->{defaults}{income_accno_id}; + $form->{defaults}{IC_expense} = $form->{defaults}{expense_accno_id}; + $form->{defaults}{FX_gain} = $form->{defaults}{fxgain_accno_id}; + $form->{defaults}{FX_loss} = $form->{defaults}{fxloss_accno_id}; + $form->{defaults}{AR_paid} = $form->{defaults}{ar_paid_accno_id}; + + $form->{defaults}{weightunit} ||= 'kg'; $sth->finish; @@ -1615,10 +1495,10 @@ sub defaultaccounts { $sth = $dbh->prepare($query); $sth->execute || $self->dberror($query); - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { foreach my $key (split(/:/, $ref->{link})) { if ($key =~ /IC/) { - $nkey = $key; + my $nkey = $key; if ($key =~ /cogs/) { $nkey = "IC_expense"; } @@ -1642,7 +1522,7 @@ sub defaultaccounts { $sth = $dbh->prepare($query); $sth->execute || $self->dberror($query); - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { %{ $form->{IC}{FX_gain}{ $ref->{accno} } } = ( id => $ref->{id}, description => $ref->{description} @@ -1658,7 +1538,7 @@ sub defaultaccounts { $sth = $dbh->prepare($query); $sth->execute || $self->dberror($query); - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { %{ $form->{IC}{FX_loss}{ $ref->{accno} } } = ( id => $ref->{id}, description => $ref->{description} @@ -1675,13 +1555,31 @@ sub defaultaccounts { $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { $form->{taxrates}{ $ref->{accno} }{id} = $ref->{id}; $form->{taxrates}{ $ref->{accno} }{description} = $ref->{description}; $form->{taxrates}{ $ref->{accno} }{taxnumber} = $ref->{taxnumber} if $ref->{taxnumber}; $form->{taxrates}{ $ref->{accno} }{rate} = $ref->{rate} if $ref->{rate}; } + # Abfrage für Standard Umlaufvermögenskonto + $query = + qq|SELECT id, accno, description, link | . + qq|FROM chart | . + qq|WHERE link LIKE ? |. + qq|ORDER BY accno|; + $sth = prepare_execute_query($form, $dbh, $query, '%AR%'); + $sth->execute || $form->dberror($query);# + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { + foreach my $item (split(/:/, $ref->{link})) { + if ($item eq "AR_paid") { + %{ $form->{IC}{AR_paid}{ $ref->{accno} } } = ( + id => $ref->{id}, + description => $ref->{description} + ); + } + } + } $sth->finish; $dbh->disconnect; @@ -1755,19 +1653,13 @@ sub get_base_unit { sub retrieve_units { $main::lxdebug->enter_sub(); - my ($self, $myconfig, $form, $type, $prefix) = @_; + my ($self, $myconfig, $form, $prefix) = @_; - my $dbh = $form->dbconnect($myconfig); + my $dbh = $form->get_standard_dbh; my $query = "SELECT *, base_unit AS original_base_unit FROM units"; - my @values; - if ($type) { - $query .= " WHERE (type = ?)"; - @values = ($type); - } - my $sth = $dbh->prepare($query); - $sth->execute(@values) || $form->dberror($query . " (" . join(", ", @values) . ")"); + my $sth = prepare_execute_query($form, $dbh, $query); my $units = {}; while (my $ref = $sth->fetchrow_hashref()) { @@ -1779,7 +1671,7 @@ sub retrieve_units { $sth = $dbh->prepare($query_lang); $sth->execute() || $form->dberror($query_lang); my @languages; - while ($ref = $sth->fetchrow_hashref()) { + while (my $ref = $sth->fetchrow_hashref()) { push(@languages, $ref); } $sth->finish(); @@ -1799,19 +1691,32 @@ sub retrieve_units { } $sth->execute($unit->{"name"}) || $form->dberror($query_lang . " (" . $unit->{"name"} . ")"); - while ($ref = $sth->fetchrow_hashref()) { + while (my $ref = $sth->fetchrow_hashref()) { map({ $unit->{"LANGUAGES"}->{$ref->{"template_code"}}->{$_} = $ref->{$_} } keys(%{$ref})); } } - $sth->finish(); - - $dbh->disconnect(); + $sth->finish; $main::lxdebug->leave_sub(); return $units; } +sub retrieve_all_units { + $main::lxdebug->enter_sub(); + + my $self = shift; + + if (!$main::all_units) { + $main::all_units = $self->retrieve_units(\%main::myconfig, $main::form); + } + + $main::lxdebug->leave_sub(); + + return $main::all_units; +} + + sub translate_units { $main::lxdebug->enter_sub(); @@ -1881,10 +1786,50 @@ sub units_in_use { $main::lxdebug->leave_sub(); } +sub convertible_units { + $main::lxdebug->enter_sub(); + + my $self = shift; + my $units = shift; + my $filter_unit = shift; + my $not_smaller = shift; + + my $conv_units = []; + + $filter_unit = $units->{$filter_unit}; + + foreach my $name (sort { lc $a cmp lc $b } keys %{ $units }) { + my $unit = $units->{$name}; + + if (($unit->{base_unit} eq $filter_unit->{base_unit}) && + (!$not_smaller || ($unit->{factor} >= $filter_unit->{factor}))) { + push @{$conv_units}, $unit; + } + } + + my @sorted = sort { $b->{factor} <=> $a->{factor} } @{ $conv_units }; + + $main::lxdebug->leave_sub(); + + return \@sorted; +} + +# if $a is translatable to $b, return the factor between them. +# else return 1 +sub convert_unit { + $main::lxdebug->enter_sub(2); + my ($this, $a, $b, $all_units) = @_; + + $main::lxdebug->leave_sub(2) and return 0 unless $a && $b; + $main::lxdebug->leave_sub(2) and return 0 unless $all_units->{$a} && $all_units->{$b}; + $main::lxdebug->leave_sub(2) and return 0 unless $all_units->{$a}{base_unit} eq $all_units->{$b}{base_unit}; + $main::lxdebug->leave_sub(2) and return $all_units->{$a}{factor} / $all_units->{$b}{factor}; +} + sub unit_select_data { $main::lxdebug->enter_sub(); - my ($self, $units, $selected, $empty_entry) = @_; + my ($self, $units, $selected, $empty_entry, $convertible_into) = @_; my $select = []; @@ -1893,10 +1838,14 @@ sub unit_select_data { } foreach my $unit (sort({ $units->{$a}->{"sortkey"} <=> $units->{$b}->{"sortkey"} } keys(%{$units}))) { - push(@{$select}, { "name" => $unit, - "base_unit" => $units->{$unit}->{"base_unit"}, - "factor" => $units->{$unit}->{"factor"}, - "selected" => ($unit eq $selected) ? "selected" : "" }); + if (!$convertible_into || + ($units->{$convertible_into} && + ($units->{$convertible_into}->{base_unit} eq $units->{$unit}->{base_unit}))) { + push @{$select}, { "name" => $unit, + "base_unit" => $units->{$unit}->{"base_unit"}, + "factor" => $units->{$unit}->{"factor"}, + "selected" => ($unit eq $selected) ? "selected" : "" }; + } } $main::lxdebug->leave_sub(); @@ -1925,19 +1874,49 @@ sub unit_select_html { return $select; } +sub sum_with_unit { + $main::lxdebug->enter_sub(); + + my $self = shift; + + my $units = $self->retrieve_all_units(); + + my $sum = 0; + my $base_unit; + + while (2 <= scalar(@_)) { + my $qty = shift(@_); + my $unit = $units->{shift(@_)}; + + croak "No unit defined with name $unit" if (!defined $unit); + + if (!$base_unit) { + $base_unit = $unit->{base_unit}; + } elsif ($base_unit ne $unit->{base_unit}) { + croak "Adding values with incompatible base units $base_unit/$unit->{base_unit}"; + } + + $sum += $qty * $unit->{factor}; + } + + $main::lxdebug->leave_sub(); + + return wantarray ? ($sum, $base_unit) : $sum; +} + sub add_unit { $main::lxdebug->enter_sub(); - my ($self, $myconfig, $form, $name, $base_unit, $factor, $type, $languages) = @_; + my ($self, $myconfig, $form, $name, $base_unit, $factor, $languages) = @_; my $dbh = $form->dbconnect_noauto($myconfig); my $query = qq|SELECT COALESCE(MAX(sortkey), 0) + 1 FROM units|; my ($sortkey) = selectrow_query($form, $dbh, $query); - $query = "INSERT INTO units (name, base_unit, factor, type, sortkey) " . - "VALUES (?, ?, ?, ?, ?)"; - do_query($form, $dbh, $query, $name, $base_unit, $factor, $type, $sortkey); + $query = "INSERT INTO units (name, base_unit, factor, sortkey) " . + "VALUES (?, ?, ?, ?)"; + do_query($form, $dbh, $query, $name, $base_unit, $factor, $sortkey); if ($languages) { $query = "INSERT INTO units_language (unit, language_id, localized, localized_plural) VALUES (?, ?, ?, ?)"; @@ -1958,7 +1937,7 @@ sub add_unit { sub save_units { $main::lxdebug->enter_sub(); - my ($self, $myconfig, $form, $type, $units, $delete_units) = @_; + my ($self, $myconfig, $form, $units, $delete_units) = @_; my $dbh = $form->dbconnect_noauto($myconfig); @@ -2016,7 +1995,7 @@ sub save_units { sub swap_units { $main::lxdebug->enter_sub(); - my ($self, $myconfig, $form, $dir, $name_1, $unit_type) = @_; + my ($self, $myconfig, $form, $dir, $name_1) = @_; my $dbh = $form->dbconnect_noauto($myconfig); @@ -2027,9 +2006,9 @@ sub swap_units { $query = qq|SELECT sortkey FROM units | . - qq|WHERE sortkey | . ($dir eq "down" ? ">" : "<") . qq| ? AND type = ? | . + qq|WHERE sortkey | . ($dir eq "down" ? ">" : "<") . qq| ? | . qq|ORDER BY sortkey | . ($dir eq "down" ? "ASC" : "DESC") . qq| LIMIT 1|; - my ($sortkey_2) = selectrow_query($form, $dbh, $query, $sortkey_1, $unit_type); + my ($sortkey_2) = selectrow_query($form, $dbh, $query, $sortkey_1); if (defined($sortkey_1)) { $query = qq|SELECT name FROM units WHERE sortkey = ${sortkey_2}|; @@ -2068,11 +2047,11 @@ sub taxes { FROM tax t ORDER BY taxkey|; - $sth = $dbh->prepare($query); + my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); $form->{TAX} = []; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { push @{ $form->{TAX} }, $ref; } @@ -2098,11 +2077,11 @@ sub get_tax_accounts { ORDER BY accno }; - $sth = $dbh->prepare($query); + my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); $form->{ACCOUNTS} = []; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { push @{ $form->{ACCOUNTS} }, $ref; } @@ -2132,7 +2111,7 @@ sub get_tax { my $sth = $dbh->prepare($query); $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})"); - my $ref = $sth->fetchrow_hashref(NAME_lc); + my $ref = $sth->fetchrow_hashref("NAME_lc"); map { $form->{$_} = $ref->{$_} } keys %$ref; @@ -2158,7 +2137,7 @@ sub get_tax { $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})"); $form->{TAXINUSE} = []; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { push @{ $form->{TAXINUSE} }, $ref; } @@ -2174,6 +2153,7 @@ sub save_tax { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; + my $query; # connect to database my $dbh = $form->get_standard_dbh($myconfig); @@ -2213,6 +2193,7 @@ sub delete_tax { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; + my $query; # connect to database my $dbh = $form->get_standard_dbh($myconfig); @@ -2298,5 +2279,154 @@ sub delete_price_factor { $main::lxdebug->leave_sub(); } +sub save_warehouse { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form) = @_; + + # connect to database + my $dbh = $form->get_standard_dbh($myconfig); + + my ($query, @values, $sth); + + if (!$form->{id}) { + $query = qq|SELECT nextval('id')|; + ($form->{id}) = selectrow_query($form, $dbh, $query); + + $query = qq|INSERT INTO warehouse (id, sortkey) VALUES (?, (SELECT COALESCE(MAX(sortkey), 0) + 1 FROM warehouse))|; + do_query($form, $dbh, $query, $form->{id}); + } + + do_query($form, $dbh, qq|UPDATE warehouse SET description = ?, invalid = ? WHERE id = ?|, + $form->{description}, $form->{invalid} ? 't' : 'f', conv_i($form->{id})); + + if (0 < $form->{number_of_new_bins}) { + $query = qq|INSERT INTO bin (warehouse_id, description) VALUES (?, ?)|; + $sth = prepare_query($form, $dbh, $query); + + foreach my $i (1..$form->{number_of_new_bins}) { + do_statement($form, $sth, $query, conv_i($form->{id}), "$form->{prefix}${i}"); + } + + $sth->finish(); + } + + $dbh->commit(); + + $main::lxdebug->leave_sub(); +} + +sub save_bins { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form) = @_; + + # connect to database + my $dbh = $form->get_standard_dbh($myconfig); + + my ($query, @values, $commit_necessary, $sth); + + @values = map { $form->{"id_${_}"} } grep { $form->{"delete_${_}"} } (1..$form->{rowcount}); + + if (@values) { + $query = qq|DELETE FROM bin WHERE id IN (| . join(', ', ('?') x scalar(@values)) . qq|)|; + do_query($form, $dbh, $query, @values); + + $commit_necessary = 1; + } + + $query = qq|UPDATE bin SET description = ? WHERE id = ?|; + $sth = prepare_query($form, $dbh, $query); + + foreach my $row (1..$form->{rowcount}) { + next if ($form->{"delete_${row}"}); + + do_statement($form, $sth, $query, $form->{"description_${row}"}, conv_i($form->{"id_${row}"})); + + $commit_necessary = 1; + } + + $sth->finish(); + + $dbh->commit() if ($commit_necessary); + + $main::lxdebug->leave_sub(); +} + +sub delete_warehouse { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form) = @_; + + # connect to database + my $dbh = $form->get_standard_dbh($myconfig); + + my $id = conv_i($form->{id}); + my $query = qq|SELECT i.bin_id FROM inventory i WHERE i.bin_id IN (SELECT b.id FROM bin b WHERE b.warehouse_id = ?) LIMIT 1|; + my ($count) = selectrow_query($form, $dbh, $query, $id); + + if ($count) { + $main::lxdebug->leave_sub(); + return 0; + } + + do_query($form, $dbh, qq|DELETE FROM bin WHERE warehouse_id = ?|, conv_i($form->{id})); + do_query($form, $dbh, qq|DELETE FROM warehouse WHERE id = ?|, conv_i($form->{id})); + + $dbh->commit(); + + $main::lxdebug->leave_sub(); + + return 1; +} + +sub get_all_warehouses { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form) = @_; + + # connect to database + my $dbh = $form->get_standard_dbh($myconfig); + + my $query = qq|SELECT w.id, w.description, w.invalid, + (SELECT COUNT(b.description) FROM bin b WHERE b.warehouse_id = w.id) AS number_of_bins + FROM warehouse w + ORDER BY w.sortkey|; + + $form->{WAREHOUSES} = selectall_hashref_query($form, $dbh, $query); + + $main::lxdebug->leave_sub(); +} + +sub get_warehouse { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form) = @_; + + # connect to database + my $dbh = $form->get_standard_dbh($myconfig); + + my $id = conv_i($form->{id}); + my $query = qq|SELECT w.description, w.invalid + FROM warehouse w + WHERE w.id = ?|; + + my $ref = selectfirst_hashref_query($form, $dbh, $query, $id); + + map { $form->{$_} = $ref->{$_} } keys %{ $ref }; + + $query = qq|SELECT b.*, EXISTS + (SELECT i.warehouse_id + FROM inventory i + WHERE i.bin_id = b.id + LIMIT 1) + AS in_use + FROM bin b + WHERE b.warehouse_id = ?|; + + $form->{BINS} = selectall_hashref_query($form, $dbh, $query, conv_i($form->{id})); + + $main::lxdebug->leave_sub(); +} 1;