# connect to database
my $dbh = $form->dbconnect($myconfig);
- my $query =
- qq!SELECT c.accno, c.description, c.charttype, 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})");
# 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);
$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);
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})");
}
$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;
my @values;
- my ($tax_id, $taxkey) = split(/--/, $form->{tax});
- my $startdate = $form->{startdate} ? $form->{startdate} : "1970-01-01";
-
if ($form->{id}) {
$query = qq|UPDATE chart SET
- accno = ?, description = ?, charttype = ?,
- 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->{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,
- 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->{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},
+ );
+
+ }
+ 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);
- #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
+
+ 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
+ last READTAXKEYS if ( $form->{'id'} == 0);
+
+ # check if there is a startdate
+ if ( $form->{"taxkey_startdate_$tk_count"} eq '' ) {
+ $tk_count++;
+ next READTAXKEYS;
+ }
- } else {
- $query = qq|DELETE FROM taxkeys WHERE chart_id = ? AND tax_id = ?|;
- do_query($form, $dbh, $query, $form->{id}, conv_i($tax_id));
+ # 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;
+ }
- $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));
+ # 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);
+ }
+
}
# commit
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;
$main::lxdebug->leave_sub();
}
-sub load_template {
+
+sub prepare_template_filename {
$main::lxdebug->enter_sub();
- my ($self, $form) = @_;
+ my ($self, $myconfig, $form) = @_;
+
+ my ($filename, $display_filename);
- open(TEMPLATE, "$form->{file}") or $form->error("$form->{file} : $!");
+ if ($form->{type} eq "stylesheet") {
+ $filename = "css/$myconfig->{stylesheet}";
+ $display_filename = $myconfig->{stylesheet};
- while (<TEMPLATE>) {
- $form->{body} .= $_;
+ } else {
+ $filename = $form->{formname};
+
+ if ($form->{language}) {
+ my ($id, $template_code) = split(/--/, $form->{language});
+ $filename .= "_${template_code}";
+ }
+
+ if ($form->{printer}) {
+ my ($id, $template_code) = split(/--/, $form->{printer});
+ $filename .= "_${template_code}";
+ }
+
+ $filename .= "." . ($form->{format} eq "html" ? "html" : "tex");
+ $filename =~ s|.*/||;
+ $display_filename = $filename;
+ $filename = "$myconfig->{templates}/$filename";
}
- close(TEMPLATE);
+ $main::lxdebug->leave_sub();
+
+ return ($filename, $display_filename);
+}
+
+
+sub load_template {
+ $main::lxdebug->enter_sub();
+
+ my ($self, $filename) = @_;
+
+ my ($content, $lines) = ("", 0);
+
+ local *TEMPLATE;
+
+ if (open(TEMPLATE, $filename)) {
+ while (<TEMPLATE>) {
+ $content .= $_;
+ $lines++;
+ }
+ close(TEMPLATE);
+ }
$main::lxdebug->leave_sub();
+
+ return ($content, $lines);
}
sub save_template {
$main::lxdebug->enter_sub();
- my ($self, $form) = @_;
+ my ($self, $filename, $content) = @_;
- open(TEMPLATE, ">$form->{file}") or $form->error("$form->{file} : $!");
+ local *TEMPLATE;
- # strip
- $form->{body} =~ s/\r\n/\n/g;
- print TEMPLATE $form->{body};
+ my $error = "";
- close(TEMPLATE);
+ if (open(TEMPLATE, ">$filename")) {
+ $content =~ s/\r\n/\n/g;
+ print(TEMPLATE $content);
+ close(TEMPLATE);
+ } else {
+ $error = $!;
+ }
$main::lxdebug->leave_sub();
+
+ return $error;
}
sub save_preferences {
push(@{$select}, { "name" => "", "base_unit" => "", "factor" => "", "selected" => "" });
}
- foreach my $unit (sort({ $a->{"sortkey"} <=> $b->{"sortkey"} } keys(%{$units}))) {
+ 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"},
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"}))) {