package AM;
+use Carp;
use Data::Dumper;
+use Encode;
use SL::DBUtils;
+use strict;
+
sub get_account {
$main::lxdebug->enter_sub();
# connect to database
my $dbh = $form->dbconnect($myconfig);
- my $query =
- qq!SELECT c.accno, c.description, c.charttype, c.gifi_accno, c.category,! .
- qq! c.link, c.pos_bilanz, c.pos_eur, c.new_chart_id, c.valid_from, ! .
- qq! c.pos_bwa, ! .
- qq! tk.taxkey_id, tk.pos_ustva, tk.tax_id, ! .
- qq! tk.tax_id || '--' || tk.taxkey_id AS tax, tk.startdate ! .
- qq!FROM chart c ! .
- qq!LEFT JOIN taxkeys tk ! .
- qq!ON (c.id=tk.chart_id AND tk.id = ! .
- qq! (SELECT id FROM taxkeys ! .
- qq! WHERE taxkeys.chart_id = c.id AND startdate <= current_date ! .
- qq! ORDER BY startdate DESC LIMIT 1)) ! .
- qq!WHERE c.id = ?!;
-
+ my $query = qq{
+ SELECT c.accno, c.description, c.charttype, c.category,
+ c.link, c.pos_bilanz, c.pos_eur, c.new_chart_id, c.valid_from,
+ c.pos_bwa, datevautomatik,
+ tk.taxkey_id, tk.pos_ustva, tk.tax_id,
+ tk.tax_id || '--' || tk.taxkey_id AS tax, tk.startdate
+ FROM chart c
+ LEFT JOIN taxkeys tk
+ ON (c.id=tk.chart_id AND tk.id =
+ (SELECT id FROM taxkeys
+ WHERE taxkeys.chart_id = c.id AND startdate <= current_date
+ ORDER BY startdate DESC LIMIT 1))
+ WHERE c.id = ?
+ };
+
+
+ $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"};
# 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");
$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;
+
+
# get taxkeys and description
- $query = qq§SELECT id, taxkey,id||'--'||taxkey AS tax, taxdescription
- FROM tax ORDER BY taxkey§;
+ $query = qq{
+ SELECT
+ id,
+ (SELECT accno FROM chart WHERE id=tax.chart_id) AS chart_accno,
+ taxkey,
+ id||'--'||taxkey AS tax,
+ taxdescription,
+ rate
+ FROM tax ORDER BY taxkey
+ };
+ $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;
}
if ($form->{id}) {
# get new accounts
$query = qq|SELECT id, accno,description
- FROM chart WHERE link = ?|;
+ FROM chart
+ WHERE link = ?
+ ORDER BY accno|;
+ $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;
}
$sth->finish;
+
+ # get the taxkeys of account
+
+ $query = qq{
+ SELECT
+ tk.id,
+ tk.chart_id,
+ c.accno,
+ tk.tax_id,
+ t.taxdescription,
+ t.rate,
+ tk.taxkey_id,
+ tk.pos_ustva,
+ tk.startdate
+ FROM taxkeys tk
+ LEFT JOIN tax t ON (t.id = tk.tax_id)
+ LEFT JOIN chart c ON (c.id = t.chart_id)
+
+ WHERE tk.chart_id = ?
+ ORDER BY startdate DESC
+ };
+ $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")) {
+ push @{ $form->{ACCOUNT_TAXKEYS} }, $ref;
+ }
+
+ $sth->finish;
+
}
# 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");
$sth = $dbh->prepare($query);
$sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})");
if ($form->{new_chart_id}) {
$query = qq|SELECT current_date-valid_from FROM chart
WHERE id = ?|;
+ $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;
sub save_account {
$main::lxdebug->enter_sub();
+ # TODO: it should be forbidden to change an account to a heading if there
+ # have been bookings to this account in the past
+
my ($self, $myconfig, $form) = @_;
# connect to database, turn off AutoCommit
# sanity check, can't have AR with AR_...
if ($form->{AR} || $form->{AP} || $form->{IC}) {
map { delete $form->{$_} }
- qw(AR_amount AR_tax AR_paid AP_amount AP_tax AP_paid IC_sale IC_cogs IC_taxpart IC_income IC_expense IC_taxservice CT_tax);
+ qw(AR_amount AR_tax AR_paid AP_amount AP_tax AP_paid IC_sale IC_cogs IC_taxpart IC_income IC_expense IC_taxservice);
+ }
+
+ if ($form->{AR_include_in_dropdown}) {
+ $form->{$form->{AR_include_in_dropdown}} = $form->{AR_include_in_dropdown};
+ }
+ if ($form->{AP_include_in_dropdown}) {
+ $form->{$form->{AP_include_in_dropdown}} = $form->{AP_include_in_dropdown};
}
$form->{link} = "";
$form->{IC}, $form->{IC_sale},
$form->{IC_cogs}, $form->{IC_taxpart},
$form->{IC_income}, $form->{IC_expense},
- $form->{IC_taxservice}, $form->{CT_tax}
+ $form->{IC_taxservice}
) {
$form->{link} .= "${item}:" if ($item);
}
$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;
- my ($tax_id, $taxkey) = split(/--/, $form->{tax});
- my $startdate = $form->{startdate} ? $form->{startdate} : "1970-01-01";
if ($form->{id}) {
+
+ # if charttype is heading make sure certain values are empty
+ # specifically, if charttype is changed from an existing account, empty the
+ # fields unnecessary for headings, so that e.g. heading doesn't appear in
+ # drop-down menues due to still having a valid "link" entry
+
+ if ( $form->{charttype} eq 'H' ) {
+ $form->{link} = '';
+ $form->{pos_bwa} = '';
+ $form->{pos_bilanz} = '';
+ $form->{pos_eur} = '';
+ $form->{new_chart_id} = '';
+ $form->{valid_from} = '';
+ };
+
$query = qq|UPDATE chart SET
- accno = ?, description = ?, charttype = ?,
- gifi_accno = ?, category = ?, link = ?,
- taxkey_id = ?,
- pos_ustva = ?, pos_bwa = ?, pos_bilanz = ?,
- pos_eur = ?, new_chart_id = ?, valid_from = ?
+ accno = ?,
+ description = ?,
+ charttype = ?,
+ category = ?,
+ link = ?,
+ pos_bwa = ?,
+ pos_bilanz = ?,
+ pos_eur = ?,
+ new_chart_id = ?,
+ valid_from = ?,
+ datevautomatik = ?
WHERE id = ?|;
- @values = ($form->{accno}, $form->{description}, $form->{charttype},
- $form->{gifi_accno}, $form->{category}, $form->{link},
- conv_i($taxkey),
- conv_i($form->{pos_ustva}), 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->{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,
- gifi_accno, category, link,
- taxkey_id,
- pos_ustva, pos_bwa, pos_bilanz, pos_eur,
- new_chart_id, valid_from)
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)|;
- @values = ($form->{accno}, $form->{description}, $form->{charttype},
- $form->{gifi_accno}, $form->{category}, $form->{link},
- conv_i($taxkey),
- conv_i($form->{pos_ustva}), 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}));
+
+ @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',
+ $form->{id},
+ );
+
}
+
do_query($form, $dbh, $query, @values);
- #Save Taxes
- if (!$form->{id}) {
- $query =
- qq|INSERT INTO taxkeys | .
- qq|(chart_id, tax_id, taxkey_id, pos_ustva, startdate) | .
- qq|VALUES ((SELECT id FROM chart WHERE accno = ?), ?, ?, ?, ?)|;
- do_query($form, $dbh, $query,
- $form->{accno}, conv_i($tax_id), conv_i($taxkey),
- conv_i($form->{pos_ustva}), conv_date($startdate));
+ #Save Taxkeys
- } else {
- $query = qq|DELETE FROM taxkeys WHERE chart_id = ? AND tax_id = ?|;
- do_query($form, $dbh, $query, $form->{id}, conv_i($tax_id));
+ my @taxkeys = ();
+
+ my $MAX_TRIES = 10; # Maximum count of taxkeys in form
+ my $tk_count;
+
+ READTAXKEYS:
+ for $tk_count (0 .. $MAX_TRIES) {
+
+ # 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
+ if ( $form->{"taxkey_startdate_$tk_count"} eq '' ) {
+ $tk_count++;
+ next READTAXKEYS;
+ }
+
+ # Add valid taxkeys into the array
+ push @taxkeys ,
+ {
+ id => ($form->{"taxkey_id_$tk_count"} eq 'NEW') ? conv_i('') : conv_i($form->{"taxkey_id_$tk_count"}),
+ 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 => conv_i($form->{"taxkey_pos_ustva_$tk_count"}),
+ delete => ( $form->{"taxkey_del_$tk_count"} eq 'delete' ) ? '1' : '',
+ };
+
+ $tk_count++;
+ }
+
+ TAXKEY:
+ for my $j (0 .. $#taxkeys){
+ if ( defined $taxkeys[$j]{'id'} ){
+ # delete Taxkey?
+
+ if ($taxkeys[$j]{'delete'}){
+ $query = qq{
+ DELETE FROM taxkeys WHERE id = ?
+ };
+
+ @values = ($taxkeys[$j]{'id'});
+
+ do_query($form, $dbh, $query, @values);
+
+ next TAXKEY;
+ }
+
+ # UPDATE Taxkey
+
+ $query = qq{
+ UPDATE taxkeys
+ SET taxkey_id = (SELECT taxkey FROM tax WHERE tax.id = ?),
+ chart_id = ?,
+ tax_id = ?,
+ pos_ustva = ?,
+ startdate = ?
+ WHERE id = ?
+ };
+ @values = (
+ $taxkeys[$j]{'tax_id'},
+ $taxkeys[$j]{'chart_id'},
+ $taxkeys[$j]{'tax_id'},
+ $taxkeys[$j]{'pos_ustva'},
+ $taxkeys[$j]{'startdate'},
+ $taxkeys[$j]{'id'},
+ );
+ do_query($form, $dbh, $query, @values);
+ }
+ else {
+ # INSERT Taxkey
+
+ $query = qq{
+ INSERT INTO taxkeys (
+ taxkey_id,
+ chart_id,
+ tax_id,
+ pos_ustva,
+ startdate
+ )
+ VALUES ((SELECT taxkey FROM tax WHERE tax.id = ?), ?, ?, ?, ?)
+ };
+ @values = (
+ $taxkeys[$j]{'tax_id'},
+ $taxkeys[$j]{'chart_id'},
+ $taxkeys[$j]{'tax_id'},
+ $taxkeys[$j]{'pos_ustva'},
+ $taxkeys[$j]{'startdate'},
+ );
+
+ do_query($form, $dbh, $query, @values);
+ }
- $query =
- qq|INSERT INTO taxkeys | .
- qq|(chart_id, tax_id, taxkey_id, pos_ustva, startdate) | .
- qq|VALUES (?, ?, ?, ?, ?)|;
- do_query($form, $dbh, $query,
- $form->{id}, conv_i($tax_id), conv_i($taxkey),
- conv_i($form->{pos_ustva}), conv_date($startdate));
}
+ # Update chart.taxkey_id to the latest from taxkeys for this chart.
+ $query = <<SQL;
+ UPDATE chart
+ SET taxkey_id = (
+ SELECT taxkey_id
+ FROM taxkeys
+ WHERE taxkeys.chart_id = chart.id
+ ORDER BY startdate DESC
+ LIMIT 1
+ )
+ WHERE id = ?
+SQL
+
+ do_query($form, $dbh, $query, $form->{id});
+
# commit
my $rc = $dbh->commit;
$dbh->disconnect;
WHERE id = ?|;
do_query($form, $dbh, $query, $form->{id});
+ # delete account taxkeys
+ $query = qq|DELETE FROM taxkeys
+ WHERE chart_id = ?|;
+ do_query($form, $dbh, $query, $form->{id});
+
# commit and redirect
my $rc = $dbh->commit;
$dbh->disconnect;
return $rc;
}
-sub departments {
- $main::lxdebug->enter_sub();
-
- my ($self, $myconfig, $form) = @_;
-
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
-
- my $query = qq|SELECT d.id, d.description, d.role
- FROM department d
- 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_department {
- $main::lxdebug->enter_sub();
-
- my ($self, $myconfig, $form) = @_;
-
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
-
- my $query = qq|SELECT d.description, d.role
- FROM department d
- WHERE d.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;
-
- # see if it is in use
- $query = qq|SELECT count(*) FROM dpt_trans d
- WHERE d.department_id = ?|;
- ($form->{orphaned}) = selectrow_query($form, $dbh, $query, $form->{id});
-
- $form->{orphaned} = !$form->{orphaned};
- $sth->finish;
-
- $dbh->disconnect;
-
- $main::lxdebug->leave_sub();
-}
-
-sub save_department {
- $main::lxdebug->enter_sub();
-
- my ($self, $myconfig, $form) = @_;
-
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
-
- my @values = ($form->{description}, $form->{role});
- if ($form->{id}) {
- $query = qq|UPDATE department SET
- description = ?, role = ?
- WHERE id = ?|;
- push(@values, $form->{id});
- } else {
- $query = qq|INSERT INTO department
- (description, role)
- VALUES (?, ?)|;
- }
- do_query($form, $dbh, $query, @values);
-
- $dbh->disconnect;
-
- $main::lxdebug->leave_sub();
-}
-
-sub delete_department {
- $main::lxdebug->enter_sub();
-
- my ($self, $myconfig, $form) = @_;
-
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
-
- $query = qq|DELETE FROM department
- WHERE id = ?|;
- do_query($form, $dbh, $query, $form->{id});
-
- $dbh->disconnect;
-
- $main::lxdebug->leave_sub();
-}
-
sub lead {
$main::lxdebug->enter_sub();
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;
}
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;
$main::lxdebug->enter_sub();
my ($self, $myconfig, $form) = @_;
+ my ($query);
# connect to database
my $dbh = $form->dbconnect($myconfig);
$query = qq|UPDATE leads SET
lead = ?
WHERE id = ?|;
- puhs(@values, $form->{id});
+ push(@values, $form->{id});
} else {
$query = qq|INSERT INTO leads
(lead)
$main::lxdebug->enter_sub();
my ($self, $myconfig, $form) = @_;
+ my ($query);
# connect to database
my $dbh = $form->dbconnect($myconfig);
$main::lxdebug->leave_sub();
}
-sub business {
- $main::lxdebug->enter_sub();
-
- my ($self, $myconfig, $form) = @_;
-
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
-
- my $query = qq|SELECT id, description, discount, customernumberinit
- FROM business
- 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_business {
- $main::lxdebug->enter_sub();
-
- my ($self, $myconfig, $form) = @_;
-
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
-
- my $query =
- qq|SELECT b.description, b.discount, b.customernumberinit
- 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);
-
- map { $form->{$_} = $ref->{$_} } keys %$ref;
-
- $sth->finish;
-
- $dbh->disconnect;
-
- $main::lxdebug->leave_sub();
-}
-
-sub save_business {
- $main::lxdebug->enter_sub();
-
- my ($self, $myconfig, $form) = @_;
-
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
-
- my @values = ($form->{description}, $form->{discount},
- $form->{customernumberinit});
- # id is the old record
- if ($form->{id}) {
- $query = qq|UPDATE business SET
- description = ?,
- discount = ?,
- customernumberinit = ?
- WHERE id = ?|;
- push(@values, $form->{id});
- } else {
- $query = qq|INSERT INTO business
- (description, discount, customernumberinit)
- VALUES (?, ?, ?)|;
- }
- do_query($form, $dbh, $query, @values);
-
- $dbh->disconnect;
-
- $main::lxdebug->leave_sub();
-}
-
-sub delete_business {
- $main::lxdebug->enter_sub();
-
- my ($self, $myconfig, $form) = @_;
-
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
-
- $query = qq|DELETE FROM business
- WHERE id = ?|;
- do_query($form, $dbh, $query, $form->{id});
-
- $dbh->disconnect;
-
- $main::lxdebug->leave_sub();
-}
-
-
sub language {
$main::lxdebug->enter_sub();
" 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);
}
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;
$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 = ?|;
+ foreach my $table (qw(generic_translations units_language)) {
+ $query = qq|DELETE FROM $table WHERE language_id = ?|;
do_query($form, $dbh, $query, $form->{"id"});
}
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;
}
$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,
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 = ?|;
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"};
# 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;
my ($self, $myconfig, $form, $table) = @_;
# connect to database
- my $dbh = $form->dbconnect_noauto($myconfig);
+ my $dbh = $form->get_standard_dbh($myconfig);
my $query =
qq|SELECT
(SELECT sortkey FROM $table WHERE id = ?) AS sortkey1,
(SELECT sortkey FROM $table WHERE id = ?) AS sortkey2|;
- my @values = ($form->{"id1"}, $form->{"id2"});
+ my @values = ($form->{"id1"}, $form->{"id2"});
my @sortkeys = selectrow_query($form, $dbh, $query, @values);
- $main::lxdebug->dump(0, "v", \@values);
- $main::lxdebug->dump(0, "s", \@sortkeys);
- $query = qq|UPDATE $table SET sortkey = ? WHERE id = ?|;
- my $sth = $dbh->prepare($query);
- $sth->execute($sortkeys[1], $form->{"id1"}) ||
- $form->dberror($query . " ($sortkeys[1], $form->{id1})");
- $sth->execute($sortkeys[0], $form->{"id2"}) ||
- $form->dberror($query . " ($sortkeys[0], $form->{id2})");
+ $query = qq|UPDATE $table SET sortkey = ? WHERE id = ?|;
+ my $sth = prepare_query($form, $dbh, $query);
+
+ do_statement($form, $sth, $query, $sortkeys[1], $form->{"id1"});
+ do_statement($form, $sth, $query, $sortkeys[0], $form->{"id2"});
+
$sth->finish();
$dbh->commit();
- $dbh->disconnect;
$main::lxdebug->leave_sub();
}
-sub printer {
+sub prepare_template_filename {
$main::lxdebug->enter_sub();
my ($self, $myconfig, $form) = @_;
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
+ my ($filename, $display_filename);
- my $query = qq|SELECT id, printer_description, template_code, printer_command
- FROM printers
- ORDER BY 2|;
+ if ($form->{type} eq "stylesheet") {
+ $filename = "css/$myconfig->{stylesheet}";
+ $display_filename = $myconfig->{stylesheet};
- $sth = $dbh->prepare($query);
- $sth->execute || $form->dberror($query);
+ } else {
+ $filename = $form->{formname};
- $form->{"ALL"} = [];
- while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
- push @{ $form->{ALL} }, $ref;
- }
+ if ($form->{language}) {
+ my ($id, $template_code) = split(/--/, $form->{language});
+ $filename .= "_${template_code}";
+ }
- $sth->finish;
- $dbh->disconnect;
+ if ($form->{printer}) {
+ my ($id, $template_code) = split(/--/, $form->{printer});
+ $filename .= "_${template_code}";
+ }
+
+ $filename .= "." . ($form->{format} eq "html" ? "html" : "tex");
+ if ($form->{"formname"} =~ m|\.\.| || $form->{"formname"} =~ m|^/|) {
+ $filename =~ s|.*/||;
+ }
+ $display_filename = $filename;
+ $filename = "$myconfig->{templates}/$filename";
+ }
$main::lxdebug->leave_sub();
+
+ return ($filename, $display_filename);
}
-sub get_printer {
+
+sub load_template {
$main::lxdebug->enter_sub();
- my ($self, $myconfig, $form) = @_;
+ my ($self, $filename) = @_;
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
+ my ($content, $lines) = ("", 0);
- 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) = @_;
+ local *TEMPLATE;
- # 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 (?, ?, ?)|;
+ if (open(TEMPLATE, $filename)) {
+ while (<TEMPLATE>) {
+ $content .= $_;
+ $lines++;
+ }
+ close(TEMPLATE);
}
- do_query($form, $dbh, $query, @values);
- $dbh->disconnect;
+ $content = Encode::decode('utf-8-strict', $content) if $::locale->is_utf8;
$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();
+ return ($content, $lines);
}
-sub payment {
+sub save_template {
$main::lxdebug->enter_sub();
- my ($self, $myconfig, $form) = @_;
-
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
+ my ($self, $filename, $content) = @_;
- my $query = qq|SELECT * FROM payment_terms ORDER BY sortkey|;
+ local *TEMPLATE;
- $sth = $dbh->prepare($query);
- $sth->execute || $form->dberror($query);
+ my $error = "";
- $form->{ALL} = [];
- while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
- push @{ $form->{ALL} }, $ref;
+ 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);
+ } else {
+ $error = $!;
}
- $sth->finish;
- $dbh->disconnect;
-
$main::lxdebug->leave_sub();
-}
-
-sub get_payment {
- $main::lxdebug->enter_sub();
- my ($self, $myconfig, $form) = @_;
-
- # connect to database
- my $dbh = $form->dbconnect($myconfig);
-
- my $query = qq|SELECT * FROM payment_terms WHERE 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();
-
- $query =
- qq|SELECT t.language_id, t.description_long, l.description AS language | .
- qq|FROM translation_payment_terms t | .
- qq|LEFT JOIN language l ON t.language_id = l.id | .
- qq|WHERE t.payment_terms_id = ? | .
- qq|UNION | .
- qq|SELECT l.id AS language_id, NULL AS description_long, | .
- qq| l.description AS language | .
- qq|FROM language l|;
- $sth = $dbh->prepare($query);
- $sth->execute($form->{"id"}) || $form->dberror($query . " ($form->{id})");
-
- my %mapping;
- while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
- $mapping{ $ref->{"language_id"} } = $ref
- unless (defined($mapping{ $ref->{"language_id"} }));
- }
- $sth->finish;
-
- $form->{"TRANSLATION"} = [sort({ $a->{"language"} cmp $b->{"language"} }
- values(%mapping))];
-
- $dbh->disconnect;
-
- $main::lxdebug->leave_sub();
+ return $error;
}
-sub save_payment {
+sub save_defaults {
$main::lxdebug->enter_sub();
- my ($self, $myconfig, $form) = @_;
+ my $self = shift;
+ my %params = @_;
- # connect to database
- my $dbh = $form->dbconnect_noauto($myconfig);
+ my $myconfig = \%main::myconfig;
+ my $form = $main::form;
- my $query;
+ my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig);
- if (!$form->{id}) {
- $query = qq|SELECT nextval('id'), COALESCE(MAX(sortkey) + 1, 1) | .
- qq|FROM payment_terms|;
- my $sortkey;
- ($form->{id}, $sortkey) = selectrow_query($form, $dbh, $query);
+ my %accnos;
+ map { ($accnos{$_}) = split(m/--/, $form->{$_}) } qw(inventory_accno income_accno expense_accno fxgain_accno fxloss_accno ar_paid_accno);
- $query = qq|INSERT INTO payment_terms (id, sortkey) VALUES (?, ?)|;
- do_query($form, $dbh, $query, $form->{id}, $sortkey);
+ $form->{curr} =~ s/ //g;
+ my @currencies = grep { $_ ne '' } split m/:/, $form->{curr};
+ my $currency = join ':', @currencies;
- } else {
- $query =
- qq|DELETE FROM translation_payment_terms | .
- qq|WHERE payment_terms_id = ?|;
- do_query($form, $dbh, $query, $form->{"id"});
- }
+ # these defaults are database wide
- $query = qq|UPDATE payment_terms SET
- description = ?, description_long = ?,
- ranking = ?,
- terms_netto = ?, terms_skonto = ?,
- percent_skonto = ?
- WHERE id = ?|;
- my @values = ($form->{description}, $form->{description_long},
- $form->{ranking} * 1,
- $form->{terms_netto} * 1, $form->{terms_skonto} * 1,
- $form->{percent_skonto} * 1,
- $form->{id});
+ my $query =
+ 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 = ?,
+ language_id = ?|;
+ 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},
+ conv_i($form->{language_id}));
do_query($form, $dbh, $query, @values);
- $query = qq|SELECT id FROM language|;
- my @language_ids;
- my $sth = $dbh->prepare($query);
- $sth->execute() || $form->dberror($query);
-
- while (my ($id) = $sth->fetchrow_array()) {
- push(@language_ids, $id);
- }
- $sth->finish();
-
- $query =
- qq|INSERT INTO translation_payment_terms | .
- qq|(language_id, payment_terms_id, description_long) | .
- qq|VALUES (?, ?, ?)|;
- $sth = $dbh->prepare($query);
-
- foreach my $language_id (@language_ids) {
- do_statement($form, $sth, $query, $language_id, $form->{"id"},
- $form->{"description_long_${language_id}"});
- }
- $sth->finish();
-
$dbh->commit();
- $dbh->disconnect;
$main::lxdebug->leave_sub();
}
-sub delete_payment {
+
+sub save_preferences {
$main::lxdebug->enter_sub();
my ($self, $myconfig, $form) = @_;
- # connect to database
- my $dbh = $form->dbconnect_noauto($myconfig);
-
- my $query =
- qq|DELETE FROM translation_payment_terms WHERE payment_terms_id = ?|;
- do_query($form, $dbh, $query, $form->{"id"});
+ my $dbh = $form->get_standard_dbh($myconfig);
- $query = qq|DELETE FROM payment_terms WHERE id = ?|;
- do_query($form, $dbh, $query, $form->{"id"});
+ my ($currency, $businessnumber) = selectrow_query($form, $dbh, qq|SELECT curr, businessnumber FROM defaults|);
- $dbh->commit();
- $dbh->disconnect;
+ # update name
+ my $query = qq|UPDATE employee SET name = ? WHERE login = ?|;
+ do_query($form, $dbh, $query, $form->{name}, $form->{login});
- $main::lxdebug->leave_sub();
-}
+ my $rc = $dbh->commit();
-sub load_template {
- $main::lxdebug->enter_sub();
+ # save first currency in myconfig
+ $currency =~ s/:.*//;
+ $form->{currency} = $currency;
- my ($self, $form) = @_;
+ $form->{businessnumber} = $businessnumber;
- open(TEMPLATE, "$form->{file}") or $form->error("$form->{file} : $!");
+ $myconfig = User->new(login => $form->{login});
- while (<TEMPLATE>) {
- $form->{body} .= $_;
+ foreach my $item (keys %$form) {
+ $myconfig->{$item} = $form->{$item};
}
- close(TEMPLATE);
-
- $main::lxdebug->leave_sub();
-}
-
-sub save_template {
- $main::lxdebug->enter_sub();
-
- my ($self, $form) = @_;
+ $myconfig->save_member;
- open(TEMPLATE, ">$form->{file}") or $form->error("$form->{file} : $!");
-
- # strip
- $form->{body} =~ s/\r\n/\n/g;
- print TEMPLATE $form->{body};
-
- close(TEMPLATE);
+ my $auth = $main::auth;
$main::lxdebug->leave_sub();
+
+ return $rc;
}
-sub save_preferences {
+sub get_defaults {
$main::lxdebug->enter_sub();
- my ($self, $myconfig, $form, $memberfile, $userspath, $webdav) = @_;
-
- map { ($form->{$_}) = split(/--/, $form->{$_}) }
- qw(inventory_accno income_accno expense_accno fxgain_accno fxloss_accno);
+ my $self = shift;
+ my %params = @_;
- my @a;
- $form->{curr} =~ s/ //g;
- map { push(@a, uc pack "A3", $_) if $_ } split(/:/, $form->{curr});
- $form->{curr} = join ':', @a;
+ my $myconfig = \%main::myconfig;
+ my $form = $main::form;
- # connect to database
- my $dbh = $form->dbconnect_noauto($myconfig);
+ my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig);
- # 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});
- do_query($form, $dbh, $query, @values);
+ my $defaults = selectfirst_hashref_query($form, $dbh, qq|SELECT * FROM defaults|) || {};
- # update name
- $query = qq|UPDATE employee
- SET name = ?
- WHERE login = ?|;
- do_query($form, $dbh, $query, $form->{name}, $form->{login});
-
- my $rc = $dbh->commit;
- $dbh->disconnect;
-
- # save first currency in myconfig
- $form->{currency} = substr($form->{curr}, 0, 3);
-
- my $myconfig = new User "$memberfile", "$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 (<HTACCESS>) {
- ($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 (<HTACCESS>) {
- ($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);
- }
- }
- }
+ $defaults->{weightunit} ||= 'kg';
$main::lxdebug->leave_sub();
- return $rc;
+ return $defaults;
}
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;
$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";
}
$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}
$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}
$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;
sub retrieve_units {
$main::lxdebug->enter_sub();
- my ($self, $myconfig, $form, $type, $prefix) = @_;
+ my ($self, $myconfig, $form, $prefix) = @_;
+ $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()) {
$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();
}
$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 (!$::request->{cache}{all_units}) {
+ $::request->{cache}{all_units} = $self->retrieve_units(\%main::myconfig, $main::form);
+ }
+
+ $main::lxdebug->leave_sub();
+
+ return $::request->{cache}{all_units};
+}
+
+
sub translate_units {
$main::lxdebug->enter_sub();
$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) = @_;
+
+ if (!$all_units) {
+ $all_units = $this->retrieve_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 = [];
push(@{$select}, { "name" => "", "base_unit" => "", "factor" => "", "selected" => "" });
}
- foreach my $unit (sort({ $a->{"sortkey"} <=> $b->{"sortkey"} } keys(%{$units}))) {
- push(@{$select}, { "name" => $unit,
- "base_unit" => $units->{$unit}->{"base_unit"},
- "factor" => $units->{$unit}->{"factor"},
- "selected" => ($unit eq $selected) ? "selected" : "" });
+ foreach my $unit (sort({ $units->{$a}->{"sortkey"} <=> $units->{$b}->{"sortkey"} } keys(%{$units}))) {
+ 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();
my $select = "<select name=${name}>";
- foreach my $unit (sort({ $a->{"sortkey"} <=> $b->{"sortkey"} } keys(%{$units}))) {
+ foreach my $unit (sort({ $units->{$a}->{"sortkey"} <=> $units->{$b}->{"sortkey"} } keys(%{$units}))) {
if (!$convertible_into ||
($units->{$convertible_into} &&
($units->{$convertible_into}->{"base_unit"} eq $units->{$unit}->{"base_unit"}))) {
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 (?, ?, ?, ?)";
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);
$main::lxdebug->leave_sub();
}
-sub swap_units {
+sub taxes {
$main::lxdebug->enter_sub();
- my ($self, $myconfig, $form, $dir, $name_1, $unit_type) = @_;
+ my ($self, $myconfig, $form) = @_;
- my $dbh = $form->dbconnect_noauto($myconfig);
+ # connect to database
+ my $dbh = $form->dbconnect($myconfig);
+
+ my $query = qq|SELECT
+ t.id,
+ t.taxkey,
+ t.taxdescription,
+ round(t.rate * 100, 2) AS rate,
+ (SELECT accno FROM chart WHERE id = chart_id) AS taxnumber,
+ (SELECT description FROM chart WHERE id = chart_id) AS account_description
+ FROM tax t
+ ORDER BY taxkey|;
+ my $sth = $dbh->prepare($query);
+ $sth->execute || $form->dberror($query);
+
+ $form->{TAX} = [];
+ while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
+ push @{ $form->{TAX} }, $ref;
+ }
+
+ $sth->finish;
+ $dbh->disconnect;
+
+ $main::lxdebug->leave_sub();
+}
+
+sub get_tax_accounts {
+ $main::lxdebug->enter_sub();
+
+ my ($self, $myconfig, $form) = @_;
+
+ my $dbh = $form->dbconnect($myconfig);
+
+ # get Accounts from chart
+ my $query = qq{ SELECT
+ id,
+ accno || ' - ' || description AS taxaccount
+ FROM chart
+ WHERE link LIKE '%_tax%'
+ ORDER BY accno
+ };
+
+ my $sth = $dbh->prepare($query);
+ $sth->execute || $form->dberror($query);
+
+ $form->{ACCOUNTS} = [];
+ while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
+ push @{ $form->{ACCOUNTS} }, $ref;
+ }
+
+ $sth->finish;
+
+ $dbh->disconnect;
+
+ $main::lxdebug->leave_sub();
+}
+
+sub get_tax {
+ $main::lxdebug->enter_sub();
+
+ my ($self, $myconfig, $form) = @_;
+
+ # connect to database
+ my $dbh = $form->dbconnect($myconfig);
+
+ my $query = qq|SELECT
+ taxkey,
+ taxdescription,
+ round(rate * 100, 2) AS rate,
+ chart_id
+ FROM tax
+ WHERE 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;
+
+ # see if it is used by a taxkey
+ $query = qq|SELECT count(*) FROM taxkeys
+ WHERE tax_id = ? AND chart_id >0|;
+
+ ($form->{orphaned}) = selectrow_query($form, $dbh, $query, $form->{id});
+
+ $form->{orphaned} = !$form->{orphaned};
+ $sth->finish;
+
+ if (!$form->{orphaned} ) {
+ $query = qq|SELECT DISTINCT c.id, c.accno
+ FROM taxkeys tk
+ JOIN tax t ON (t.id = tk.tax_id)
+ JOIN chart c ON (c.id = tk.chart_id)
+ WHERE tk.tax_id = ?|;
+
+ $sth = $dbh->prepare($query);
+ $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})");
+
+ $form->{TAXINUSE} = [];
+ while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
+ push @{ $form->{TAXINUSE} }, $ref;
+ }
+
+ $sth->finish;
+ }
+
+ $dbh->disconnect;
+
+ $main::lxdebug->leave_sub();
+}
+
+sub save_tax {
+ $main::lxdebug->enter_sub();
+
+ my ($self, $myconfig, $form) = @_;
my $query;
- $query = qq|SELECT sortkey FROM units WHERE name = ?|;
- my ($sortkey_1) = selectrow_query($form, $dbh, $query, $name_1);
+ # connect to database
+ my $dbh = $form->get_standard_dbh($myconfig);
+
+ $form->{rate} = $form->{rate} / 100;
+
+ my @values = ($form->{taxkey}, $form->{taxdescription}, $form->{rate}, $form->{chart_id}, $form->{chart_id} );
+ if ($form->{id} ne "") {
+ $query = qq|UPDATE tax SET
+ taxkey = ?,
+ taxdescription = ?,
+ rate = ?,
+ chart_id = ?,
+ taxnumber = (SELECT accno FROM chart WHERE id= ? )
+ WHERE id = ?|;
+ push(@values, $form->{id});
- $query =
- qq|SELECT sortkey FROM units | .
- qq|WHERE sortkey | . ($dir eq "down" ? ">" : "<") . qq| ? AND type = ? | .
- qq|ORDER BY sortkey | . ($dir eq "down" ? "ASC" : "DESC") . qq| LIMIT 1|;
- my ($sortkey_2) = selectrow_query($form, $dbh, $query, $sortkey_1, $unit_type);
+ } else {
+ #ok
+ $query = qq|INSERT INTO tax (
+ taxkey,
+ taxdescription,
+ rate,
+ chart_id,
+ taxnumber
+ )
+ VALUES (?, ?, ?, ?, (SELECT accno FROM chart WHERE id = ?) )|;
+ }
+ do_query($form, $dbh, $query, @values);
+
+ $dbh->commit();
+
+ $main::lxdebug->leave_sub();
+}
+
+sub delete_tax {
+ $main::lxdebug->enter_sub();
+
+ my ($self, $myconfig, $form) = @_;
+ my $query;
+
+ # connect to database
+ my $dbh = $form->get_standard_dbh($myconfig);
+
+ $query = qq|DELETE FROM tax
+ WHERE id = ?|;
+ do_query($form, $dbh, $query, $form->{id});
+
+ $dbh->commit();
+
+ $main::lxdebug->leave_sub();
+}
+
+sub save_price_factor {
+ $main::lxdebug->enter_sub();
+
+ my ($self, $myconfig, $form) = @_;
+
+ # connect to database
+ my $dbh = $form->get_standard_dbh($myconfig);
+
+ my $query;
+ my @values = ($form->{description}, conv_i($form->{factor}));
+
+ if ($form->{id}) {
+ $query = qq|UPDATE price_factors SET description = ?, factor = ? WHERE id = ?|;
+ push @values, conv_i($form->{id});
+
+ } else {
+ $query = qq|INSERT INTO price_factors (description, factor, sortkey) VALUES (?, ?, (SELECT COALESCE(MAX(sortkey), 0) + 1 FROM price_factors))|;
+ }
+
+ do_query($form, $dbh, $query, @values);
+
+ $dbh->commit();
+
+ $main::lxdebug->leave_sub();
+}
+
+sub get_all_price_factors {
+ $main::lxdebug->enter_sub();
+
+ my ($self, $myconfig, $form) = @_;
+
+ # connect to database
+ my $dbh = $form->get_standard_dbh($myconfig);
- if (defined($sortkey_1)) {
- $query = qq|SELECT name FROM units WHERE sortkey = ${sortkey_2}|;
- my ($name_2) = selectrow_query($form, $dbh, $query);
+ $form->{PRICE_FACTORS} = selectall_hashref_query($form, $dbh, qq|SELECT * FROM price_factors ORDER BY sortkey|);
+
+ $main::lxdebug->leave_sub();
+}
+
+sub get_price_factor {
+ $main::lxdebug->enter_sub();
+
+ my ($self, $myconfig, $form) = @_;
- if (defined($name_2)) {
- $query = qq|UPDATE units SET sortkey = ? WHERE name = ?|;
- my $sth = $dbh->prepare($query);
+ # connect to database
+ my $dbh = $form->get_standard_dbh($myconfig);
+
+ my $query = qq|SELECT description, factor,
+ ((SELECT COUNT(*) FROM parts WHERE price_factor_id = ?) +
+ (SELECT COUNT(*) FROM invoice WHERE price_factor_id = ?) +
+ (SELECT COUNT(*) FROM orderitems WHERE price_factor_id = ?)) = 0 AS orphaned
+ FROM price_factors WHERE id = ?|;
+
+ ($form->{description}, $form->{factor}, $form->{orphaned}) = selectrow_query($form, $dbh, $query, (conv_i($form->{id})) x 4);
+
+ $main::lxdebug->leave_sub();
+}
+
+sub delete_price_factor {
+ $main::lxdebug->enter_sub();
+
+ my ($self, $myconfig, $form) = @_;
+
+ # connect to database
+ my $dbh = $form->get_standard_dbh($myconfig);
+
+ do_query($form, $dbh, qq|DELETE FROM price_factors WHERE id = ?|, conv_i($form->{id}));
+ $dbh->commit();
- do_statement($form, $sth, $query, $sortkey_1, $name_2);
- do_statement($form, $sth, $query, $sortkey_2, $name_1);
+ $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();
- $dbh->disconnect();
+
+ $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();
}