# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1335, USA.
#======================================================================
#
# Genereal Ledger
use SL::FU;
use SL::GL;
use SL::IS;
-use SL::PE;
use SL::ReportGenerator;
+use SL::DBUtils qw(selectrow_query selectall_hashref_query);
+use SL::Webdav;
+use SL::Locale::String qw(t8);
require "bin/mozilla/common.pl";
-require "bin/mozilla/drafts.pl";
require "bin/mozilla/reportgenerator.pl";
# this is for our long dates
sub add {
$main::lxdebug->enter_sub();
- $main::auth->assert('general_ledger');
+ $main::auth->assert('gl_transactions');
my $form = $main::form;
my %myconfig = %main::myconfig;
- return $main::lxdebug->leave_sub() if (load_draft_maybe());
-
$form->{title} = "Add";
$form->{callback} = "gl.pl?action=add" unless $form->{callback};
$form->{credit} = 0;
$form->{tax} = 0;
- # departments
- $form->all_departments(\%myconfig);
- if (@{ $form->{all_departments} || [] }) {
- $form->{selectdepartment} = "<option>\n";
-
- map {
- $form->{selectdepartment} .=
- "<option>$_->{description}--$_->{id}\n"
- } (@{ $form->{all_departments} || [] });
- }
+ $::form->{ALL_DEPARTMENTS} = SL::DB::Manager::Department->get_all;
$form->{show_details} = $myconfig{show_form_details} unless defined $form->{show_details};
sub prepare_transaction {
$main::lxdebug->enter_sub();
- $main::auth->assert('general_ledger');
+ $main::auth->assert('gl_transactions');
my $form = $main::form;
my %myconfig = %main::myconfig;
$form->{amount} = $form->format_amount(\%myconfig, $form->{amount}, 2);
- # departments
- $form->all_departments(\%myconfig);
- if (@{ $form->{all_departments} || [] }) {
- $form->{selectdepartment} = "<option>\n";
-
- map {
- $form->{selectdepartment} .=
- "<option>$_->{description}--$_->{id}\n"
- } (@{ $form->{all_departments} || [] });
- }
+ $::form->{ALL_DEPARTMENTS} = SL::DB::Manager::Department->get_all;
my $i = 1;
my $tax = 0;
$form->{totalcredit} += $ref->{amount};
$form->{"credit_$i"} = $ref->{amount};
}
- $form->{"taxchart_$i"} = "0--0.00";
+ $form->{"taxchart_$i"} = $ref->{id}."--0.00000";
$form->{"project_id_$i"} = $ref->{project_id};
$i++;
}
sub edit {
$main::lxdebug->enter_sub();
- $main::auth->assert('general_ledger');
+ $main::auth->assert('gl_transactions');
my $form = $main::form;
my %myconfig = %main::myconfig;
$form->{show_details} = $myconfig{show_form_details} unless defined $form->{show_details};
+ if ($form->{reference} && $::instance_conf->get_webdav) {
+ my $webdav = SL::Webdav->new(
+ type => 'general_ledger',
+ number => $form->{reference},
+ );
+ my $webdav_path = $webdav->webdav_path;
+ my @all_objects = $webdav->get_all_objects;
+ @{ $form->{WEBDAV} } = map { { name => $_->filename,
+ type => t8('File'),
+ link => File::Spec->catfile($_->full_filedescriptor),
+ } } @all_objects;
+ }
form_header();
display_rows();
form_footer();
sub search {
$::lxdebug->enter_sub;
- $::auth->assert('general_ledger');
+ $::auth->assert('general_ledger | gl_transactions');
- $::form->all_departments(\%::myconfig);
$::form->get_lists(
projects => { key => "ALL_PROJECTS", all => 1 },
);
- $::form->{ALL_EMPLOYEES} = SL::DB::Manager::Employee->get_all(query => [ deleted => 0 ]);
+ $::form->{ALL_EMPLOYEES} = SL::DB::Manager::Employee->get_all_sorted(query => [ deleted => 0 ]);
+ $::form->{ALL_DEPARTMENTS} = SL::DB::Manager::Department->get_all;
$::form->header;
print $::form->parse_html_template('gl/search', {
- department_label => sub { ("$_[0]{description}--$_[0]{id}")x2 },
employee_label => sub { "$_[0]{id}--$_[0]{name}" },
});
sub generate_report {
$main::lxdebug->enter_sub();
- $main::auth->assert('general_ledger');
+ $main::auth->assert('general_ledger | gl_transactions');
my $form = $main::form;
my %myconfig = %main::myconfig;
my $locale = $main::locale;
- # generate_report wird beim ersten Aufruf per Weiter-Knopf und POST mit der hidden Variablen sort mit Wert "datesort" (früher "transdate" als Defaultsortiervariable) übertragen
+ # generate_report wird beim ersten Aufruf per Weiter-Knopf und POST mit der hidden Variablen sort mit Wert "datesort" (früher "transdate" als Defaultsortiervariable) übertragen
# <form method=post action=gl.pl>
# <input type=hidden name=sort value=datesort> # form->{sort} setzen
# <input type=hidden name=nextsub value=generate_report>
# anhand von neuer Variable datesort wird jetzt $form->{sort} auf transdate oder gldate gesetzt
- # damit ist die Hidden Variable "sort" wahrscheinlich sogar überflüssig
+ # damit ist die Hidden Variable "sort" wahrscheinlich sogar überflüssig
- # ändert man die Sortierreihenfolge per Klick auf eine der Überschriften wird die Variable "sort" per GET übergeben, z.B. id,transdate, gldate, ...
+ # ändert man die Sortierreihenfolge per Klick auf eine der Überschriften wird die Variable "sort" per GET übergeben, z.B. id,transdate, gldate, ...
# gl.pl?action=generate_report&employee=18383--Jan%20B%c3%bcren&datesort=transdate&category=X&l_transdate=Y&l_gldate=Y&l_id=Y&l_reference=Y&l_description=Y&l_source=Y&l_debit=Y&l_credit=Y&sort=gldate&sortdir=0
if ( $form->{sort} eq 'datesort' ) { # sollte bei einem Post (Aufruf aus Suchmaske) immer wahr sein
);
# add employee here, so that variable is still known and passed in url when choosing a different sort order in resulting table
- my @hidden_variables = qw(accno source reference department description notes project_id datefrom dateto employee datesort category l_subtotal);
+ my @hidden_variables = qw(accno source reference description notes project_id datefrom dateto employee_id datesort category l_subtotal);
push @hidden_variables, map { "l_${_}" } @columns;
- foreach ( @hidden_variables ) {
- print URL "$_\n";
- };
+
+ my $employee = $form->{employee_id} ? SL::DB::Employee->new(id => $form->{employee_id})->load->name : '';
my (@options, @date_options);
push @options, $locale->text('Account') . " : $form->{accno} $form->{account_description}" if ($form->{accno});
push @options, $locale->text('Reference') . " : $form->{reference}" if ($form->{reference});
push @options, $locale->text('Description') . " : $form->{description}" if ($form->{description});
push @options, $locale->text('Notes') . " : $form->{notes}" if ($form->{notes});
- push @options, $locale->text('Employee') . " : $form->{employee_name}" if ($form->{employee_name});
+ push @options, $locale->text('Employee') . " : $employee" if $employee;
my $datesorttext = $form->{datesort} eq 'transdate' ? $locale->text('Invoice Date') : $locale->text('Booking Date');
push @date_options, "$datesorttext" if ($form->{datesort} and ($form->{datefrom} or $form->{dateto}));
push @date_options, $locale->text('From'), $locale->date(\%myconfig, $form->{datefrom}, 1) if ($form->{datefrom});
push @date_options, $locale->text('Bis'), $locale->date(\%myconfig, $form->{dateto}, 1) if ($form->{dateto});
push @options, join(' ', @date_options) if (scalar @date_options);
- if ($form->{department}) {
- my ($department) = split /--/, $form->{department};
- push @options, $locale->text('Department') . " : $department";
+ if ($form->{department_id}) {
+ my $department = SL::DB::Manager::Department->find_by( id => $form->{department_id} );
+ push @options, $locale->text('Department') . " : " . $department->description;
}
-
my $callback = build_std_url('action=generate_report', grep { $form->{$_} } @hidden_variables);
- print URL $callback;
- close URL;
$form->{l_credit_accno} = 'Y';
$form->{l_debit_accno} = 'Y';
$main::lxdebug->leave_sub();
}
+sub show_draft {
+ $::form->{transdate} = DateTime->today_local->to_kivitendo if !$::form->{transdate};
+ $::form->{gldate} = $::form->{transdate} if !$::form->{gldate};
+ update();
+}
+
sub update {
$main::lxdebug->enter_sub();
- $main::auth->assert('general_ledger');
+ $main::auth->assert('gl_transactions');
my $form = $main::form;
my %myconfig = %main::myconfig;
my $creditcount = 0;
my ($debitcredit, $amount);
+ my $dbh = SL::DB->client->dbh;
+ my ($notax_id) = selectrow_query($form, $dbh, "SELECT id FROM tax WHERE taxkey = 0 LIMIT 1", );
+ my $zerotaxes = selectall_hashref_query($form, $dbh, "SELECT id FROM tax WHERE rate = 0", );
+
my @flds =
qw(accno debit credit projectnumber fx_transaction source memo tax taxchart);
$form->{debitlock} = 1;
}
if ($debitcredit && $credittax) {
- $form->{"taxchart_$i"} = "0--0.00";
+ $form->{"taxchart_$i"} = "$notax_id--0.00";
}
if (!$debitcredit && $debittax) {
- $form->{"taxchart_$i"} = "0--0.00";
+ $form->{"taxchart_$i"} = "$notax_id--0.00";
}
$amount =
($form->{"debit_$i"} == 0)
: $form->{"debit_$i"};
my $j = $#a;
if (($debitcredit && $credittax) || (!$debitcredit && $debittax)) {
- $form->{"taxchart_$i"} = "0--0.00";
+ $form->{"taxchart_$i"} = "$notax_id--0.00";
$form->{"tax_$i"} = 0;
}
my ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"});
- if ($taxkey > 1) {
+ my $iswithouttax = grep { $_->{id} == $taxkey } @{ $zerotaxes };
+ if (!$iswithouttax) {
if ($debitcredit) {
$debittax = 1;
} else {
$credittax = 1;
}
- if ($form->{taxincluded}) {
- $form->{"tax_$i"} = $amount / ($rate + 1) * $rate;
- } else {
- $form->{"tax_$i"} = $amount * $rate;
- }
- } else {
- $form->{"tax_$i"} = 0;
- }
+ };
+ my ($tmpnetamount,$tmpdiff);
+ ($tmpnetamount,$form->{"tax_$i"},$tmpdiff) = $form->calculate_tax($amount,$rate,$form->{taxincluded} *= 1,2);
for (@flds) { $a[$j]->{$_} = $form->{"${_}_$i"} }
$count++;
my ($init) = @_;
$main::lxdebug->enter_sub();
- $main::auth->assert('general_ledger');
+ $main::auth->assert('gl_transactions');
my $form = $main::form;
my %myconfig = %main::myconfig;
my ($init) = @_;
$main::lxdebug->enter_sub();
- $main::auth->assert('general_ledger');
+ $main::auth->assert('gl_transactions');
my $form = $main::form;
my %myconfig = %main::myconfig;
my %charts = ();
my $taxchart_init;
foreach my $item (@{ $form->{ALL_CHARTS} }) {
- if ($item->{charttype} eq 'H'){ #falls überschrift
- next; #überspringen (Bug 1150)
+ if ($item->{charttype} eq 'H'){ # skip headings
+ next;
}
my $key = $item->{accno} . "--" . $item->{tax_id};
$taxchart_init = $item->{tax_id} unless (@chart_values);
$charts{$item->{accno}} = $item;
}
- my %taxchart_labels = ();
- my @taxchart_values = ();
- my %taxcharts = ();
- foreach my $item (@{ $form->{ALL_TAXCHARTS} }) {
- my $key = $item->{id} . "--" . $item->{rate};
- $taxchart_init = $key if ($taxchart_init == $item->{id});
- push(@taxchart_values, $key);
- $taxchart_labels{$key} = $item->{taxdescription} . " " . $item->{rate} * 100 . ' %';
- $taxcharts{$item->{id}} = $item;
- }
-
my ($source, $memo, $source_hidden, $memo_hidden);
for my $i (1 .. $form->{rowcount}) {
if ($form->{show_details}) {
my ($selected_accno, $selected_tax_id) = split(/--/, $selected_accno_full);
my ($previous_accno, $previous_tax_id) = split(/--/, $form->{"previous_accno_$i"});
+ my %taxchart_labels = ();
+ my @taxchart_values = ();
+ my %taxcharts = ();
+ my $filter_accno;
+ $filter_accno = $::form->{ALL_CHARTS}[0]->{accno};
+ $filter_accno = $selected_accno if (!$init and $i < $form->{rowcount});
+ foreach my $item ( GL->get_tax_dropdown($filter_accno) ) {
+ my $key = $item->{id} . "--" . $item->{rate};
+ $taxchart_init = $key if ($taxchart_init == $item->{id});
+ push(@taxchart_values, $key);
+ $taxchart_labels{$key} = $item->{taxdescription} . " " . $item->{rate} * 100 . ' %';
+ $taxcharts{$item->{id}} = $item;
+ }
+
if ($previous_accno &&
($previous_accno eq $selected_accno) &&
($previous_tax_id ne $selected_tax_id)) {
my $accno = qq|<td>| .
NTI($cgi->popup_menu('-name' => "accno_$i",
'-id' => "accno_$i",
- '-onChange' => "setTaxkey($i)",
+ '-onChange' => "updateTaxes($i);",
'-style' => 'width:200px',
'-values' => \@chart_values,
'-labels' => \%chart_labels,
. qq|</td>|;
my $tax_ddbox = qq|<td>| .
NTI($cgi->popup_menu('-name' => "taxchart_$i",
- '-id' => "taxchart_$i",
- '-style' => 'width:200px',
- '-values' => \@taxchart_values,
- '-labels' => \%taxchart_labels,
- '-default' => $selected_taxchart))
+ '-id' => "taxchart_$i",
+ '-style' => 'width:200px',
+ '-values' => \@taxchart_values,
+ '-labels' => \%taxchart_labels,
+ '-default' => $selected_taxchart))
. qq|</td>|;
my ($fx_transaction, $checked);
sub form_header {
$::lxdebug->enter_sub;
- $::auth->assert('general_ledger');
+ $::auth->assert('gl_transactions');
my ($init) = @_;
$::form->get_lists("projects" => { "key" => "ALL_PROJECTS",
"all" => 0,
"old_id" => \@old_project_ids },
+
"charts" => { "key" => "ALL_CHARTS",
- "transdate" => $::form->{transdate} },
- "taxcharts" => "ALL_TAXCHARTS");
+ "transdate" => $::form->{transdate} });
+
+ $::form->{ALL_DEPARTMENTS} = SL::DB::Manager::Department->get_all;
GL->get_chart_balances('charts' => $::form->{ALL_CHARTS});
map { $::form->{$_} =~ s/\"/"/g }
qw(chart taxchart);
- $::form->{selectdepartment} =~ s/ selected//;
- $::form->{selectdepartment} =~
- s/option>\Q$::form->{department}\E/option selected>$::form->{department}/;
-
if ($init) {
$::request->{layout}->focus("#reference");
$::form->{taxincluded} = "1";
sub form_footer {
$::lxdebug->enter_sub;
- $::auth->assert('general_ledger');
+ $::auth->assert('gl_transactions');
my ($follow_ups, $follow_ups_due);
if ($::form->{id}) {
- $follow_ups = FU->follow_ups('trans_id' => $::form->{id});
+ $follow_ups = FU->follow_ups('trans_id' => $::form->{id}, 'not_done' => 1);
$follow_ups_due = sum map { $_->{due} * 1 } @{ $follow_ups || [] };
}
if (GL->delete_transaction(\%myconfig, \%$form)){
# saving the history
if(!exists $form->{addition} && $form->{id} ne "") {
- $form->{snumbers} = qq|ordnumber_| . $form->{ordnumber};
+ $form->{snumbers} = qq|gltransaction_| . $form->{id};
$form->{addition} = "DELETED";
+ $form->{what_done} = "gl_transaction";
$form->save_history;
}
# /saving the history
my $debitcredit;
my %split_safety = ();
+ my $dbh = SL::DB->client->dbh;
+ my ($notax_id) = selectrow_query($form, $dbh, "SELECT id FROM tax WHERE taxkey = 0 LIMIT 1", );
+ my $zerotaxes = selectall_hashref_query($form, $dbh, "SELECT id FROM tax WHERE rate = 0", );
+
my @flds = qw(accno debit credit projectnumber fx_transaction source memo tax taxchart);
for my $i (1 .. $form->{rowcount}) {
$form->{debitlock} = 1;
}
if ($debitcredit && $credittax) {
- $form->{"taxchart_$i"} = "0--0.00";
+ $form->{"taxchart_$i"} = "$notax_id--0.00";
}
if (!$debitcredit && $debittax) {
- $form->{"taxchart_$i"} = "0--0.00";
+ $form->{"taxchart_$i"} = "$notax_id--0.00";
}
my $amount = ($form->{"debit_$i"} == 0)
? $form->{"credit_$i"}
: $form->{"debit_$i"};
my $j = $#a;
if (($debitcredit && $credittax) || (!$debitcredit && $debittax)) {
- $form->{"taxchart_$i"} = "0--0.00";
+ $form->{"taxchart_$i"} = "$notax_id--0.00";
$form->{"tax_$i"} = 0;
}
my ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"});
- if ($taxkey > 1) {
+ my $iswithouttax = grep { $_->{id} == $taxkey } @{ $zerotaxes };
+ if (!$iswithouttax) {
if ($debitcredit) {
$debittax = 1;
} else {
$credittax = 1;
}
- if ($form->{taxincluded}) {
- $form->{"tax_$i"} = $amount / ($rate + 1) * $rate;
- if ($debitcredit) {
- $form->{"debit_$i"} = $form->{"debit_$i"} - $form->{"tax_$i"};
- } else {
- $form->{"credit_$i"} = $form->{"credit_$i"} - $form->{"tax_$i"};
- }
+
+ my ($tmpnetamount,$tmpdiff);
+ ($tmpnetamount,$form->{"tax_$i"},$tmpdiff) = $form->calculate_tax($amount,$rate,$form->{taxincluded} *= 1,2);
+ if ($debitcredit) {
+ $form->{"debit_$i"} = $tmpnetamount;
} else {
- $form->{"tax_$i"} = $amount * $rate;
+ $form->{"credit_$i"} = $tmpnetamount;
}
+
} else {
$form->{"tax_$i"} = 0;
}
$form->{taxincluded} = 0 if !$taxtotal;
# this is just for the wise guys
+
+ $form->error($locale->text('Cannot post transaction above the maximum future booking date!'))
+ if ($form->date_max_future($form->{"transdate"}, \%myconfig));
$form->error($locale->text('Cannot post transaction for a closed period!'))
if ($form->date_closed($form->{"transdate"}, \%myconfig));
if ($form->round_amount($debit, 2) != $form->round_amount($credit, 2)) {
undef($form->{callback});
# saving the history
if(!exists $form->{addition} && $form->{id} ne "") {
- $form->{snumbers} = qq|ordnumber_| . $form->{ordnumber};
- $form->{addition} = "SAVED";
- $form->{what_done} = $locale->text("Buchungsnummer") . " = " . $form->{id};
+ $form->{snumbers} = qq|gltransaction_| . $form->{id};
+ $form->{addition} = "POSTED";
+ $form->{what_done} = "gl transaction";
$form->save_history;
}
# /saving the history
sub post {
$main::lxdebug->enter_sub();
- $main::auth->assert('general_ledger');
+ $main::auth->assert('gl_transactions');
my $form = $main::form;
my $locale = $main::locale;
- if ($::myconfig{mandatory_departments} && !$form->{department}) {
+ if ($::myconfig{mandatory_departments} && !$form->{department_id}) {
$form->{saved_message} = $::locale->text('You have to specify a department.');
update();
exit;
$form->{storno} = 0;
post_transaction();
+ if ($::instance_conf->get_webdav) {
+ SL::Webdav->new(type => 'general_ledger',
+ number => $form->{reference},
+ )->webdav_path;
+ }
- remove_draft() if $form->{remove_draft};
-
- $form->{callback} = build_std_url("action=add&DONT_LOAD_DRAFT=1", "show_details");
+ $form->{callback} = build_std_url("action=add", "show_details");
$form->redirect($form->{callback});
$main::lxdebug->leave_sub();
sub post_as_new {
$main::lxdebug->enter_sub();
- $main::auth->assert('general_ledger');
+ $main::auth->assert('gl_transactions');
my $form = $main::form;
sub storno {
$main::lxdebug->enter_sub();
- $main::auth->assert('general_ledger');
+ $main::auth->assert('gl_transactions');
my $form = $main::form;
my %myconfig = %main::myconfig;
# saving the history
if(!exists $form->{addition} && $form->{id} ne "") {
- $form->{snumbers} = "ordnumber_$form->{ordnumber}";
+ $form->{snumbers} = qq|gltransaction_| . $form->{id};
$form->{addition} = "STORNO";
+ $form->{what_done} = "gl_transaction";
$form->save_history;
}
# /saving the history
call_sub($main::form->{nextsub});
}
+sub get_tax_dropdown {
+ $main::lxdebug->enter_sub();
+
+ my $form = $main::form;
+ my @tax_accounts = GL->get_tax_dropdown($form->{accno});
+
+ foreach my $item (@tax_accounts) {
+ $item->{taxdescription} = $::locale->{iconv_utf8}->convert($item->{taxdescription});
+ $item->{taxdescription} .= ' ' . $form->round_amount($item->{rate} * 100);
+ }
+
+ $form->{TAX_ACCOUNTS} = [ @tax_accounts ];
+
+ print $form->ajax_response_header, $form->parse_html_template("gl/update_tax_accounts");
+
+ $main::lxdebug->leave_sub();
+
+}
+
1;