X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/95f601bd5af1c5a76ed4950d4f68984bbf9649ad..c1c6288ab29bae1eaec8009a0a80aeb5ece70e4d:/SL/Controller/YearEndTransactions.pm diff --git a/SL/Controller/YearEndTransactions.pm b/SL/Controller/YearEndTransactions.pm new file mode 100644 index 000000000..b9bca983e --- /dev/null +++ b/SL/Controller/YearEndTransactions.pm @@ -0,0 +1,286 @@ +package SL::Controller::YearEndTransactions; + +use strict; + +use parent qw(SL::Controller::Base); + +use DateTime; +use SL::Locale::String qw(t8); +use SL::ReportGenerator; +use SL::Helper::Flash; +use SL::DBUtils; + +use SL::DB::Chart; +use SL::DB::GLTransaction; +use SL::DB::AccTransaction; +use SL::DB::Helper::AccountingPeriod qw(get_balance_starting_date); + +use Rose::Object::MakeMethods::Generic ( + 'scalar --get_set_init' => [ qw(charts charts9000 cbob_chart cb_date cb_startdate ob_date cb_reference ob_reference cb_description ob_description) ], +); + +__PACKAGE__->run_before('check_auth'); + +sub action_filter { + my ($self) = @_; + + $self->ob_date(DateTime->today->truncate(to => 'year')) if !$self->ob_date; + $self->cb_date(DateTime->today->truncate(to => 'year')->add(days => -1)) if !$self->cb_date; + $self->ob_reference(t8('OB Transaction')) if !$self->ob_reference; + $self->cb_reference(t8('CB Transaction')) if !$self->cb_reference; + $self->ob_description(t8('OB Transaction')) if !$self->ob_description; + $self->cb_description(t8('CB Transaction')) if !$self->cb_description; + $self->render('gl/yearend_filter', + title => t8('CB/OB Transactions'), + make_title_of_chart => sub { $_[0]->accno.' '.$_[0]->description } + ); + +} + +sub action_list { + my ($self) = @_; + $main::lxdebug->enter_sub(); + + my $report = SL::ReportGenerator->new(\%::myconfig, $::form); + + $self->prepare_report($report); + + $report->set_options( + output_format => 'HTML', + raw_top_info_text => $::form->parse_html_template('gl/yearend_top', { SELF => $self }), + raw_bottom_info_text => $::form->parse_html_template('gl/yearend_bottom', { SELF => $self }), + allow_pdf_export => 0, + allow_csv_export => 0, + title => $::locale->text('CB/OB Transactions'), + ); + $report->generate_with_headers(); + $main::lxdebug->leave_sub(); +} + +sub action_generate { + my ($self) = @_; + + my $cnt = $self->make_booking(); + + flash('info', $::locale->text('#1 CB transactions and #1 OB transactions generated.',$cnt)) if $cnt > 0; + + $self->action_list; +} + +sub check_auth { + $::auth->assert('general_ledger'); +} + +# +# helpers +# + +sub make_booking { + my ($self) = @_; + $main::lxdebug->enter_sub(); + my @ids = map { $::form->{"trans_id_$_"} } grep { $::form->{"multi_id_$_"} } (1..$::form->{rowcount}); + my $cnt = 0; + $main::lxdebug->message(LXDebug->DEBUG2(),"generate for ".$::form->{cbob_chart}." # ".scalar(@ids)." charts"); + if (scalar(@ids) && $::form->{cbob_chart}) { + my $carryoverchart = SL::DB::Manager::Chart->get_first( query => [ id => $::form->{cbob_chart} ] ); + my $charts = SL::DB::Manager::Chart->get_all( query => [ id => \@ids ] ); + foreach my $chart (@{ $charts }) { + $main::lxdebug->message(LXDebug->DEBUG2(),"chart_id=".$chart->id." accno=".$chart->accno); + my $balance = $self->get_balance($chart); + if ( $balance != 0 ) { + # SB + $self->gl_booking($balance,$self->cb_date,$::form->{cb_reference},$::form->{cb_description},$chart,$carryoverchart,0,1); + # EB + $self->gl_booking($balance,$self->ob_date,$::form->{ob_reference},$::form->{ob_description},$carryoverchart,$chart,1,0); + $cnt++; + } + } + } + $main::lxdebug->leave_sub(); + return $cnt; +} + + +sub prepare_report { + my ($self,$report) = @_; + $main::lxdebug->enter_sub(); + my $idx = 1; + my $cgi = $::request->{cgi}; + + my %column_defs = ( + 'ids' => { 'text' => '', 'align' => 'center' }, + 'chart' => { 'text' => $::locale->text('Account'), }, + 'description' => { 'text' => $::locale->text('Description'), }, + 'saldo' => { 'text' => $::locale->text('Saldo'), 'align' => 'right'}, + 'sum_cb' => { 'text' => $::locale->text('Sum CB Transactions'), 'align' => 'right'}, ##close == Schluss + 'sum_ob' => { 'text' => $::locale->text('Sum OB Transactions'), 'align' => 'right'}, ##open == Eingang + ); + my @columns = qw(ids chart description saldo sum_cb sum_ob); + map { $column_defs{$_}->{visible} = 1 } @columns; + my $ob_next_date = $::locale->parse_date_to_object($self->ob_date)->add(years => 1)->add(days => -1)->to_kivitendo; + + $self->cb_startdate($self->get_balance_starting_date($self->cb_date)); + + my @custom_headers = (); + # Zeile 1: + push @custom_headers, [ + { 'text' => ' ', 'colspan' => 3 }, + { 'text' => $::locale->text("Timerange")."
".$self->cb_startdate." - ".$self->cb_date, 'colspan' => 2, 'align' => 'center'}, + { 'text' => $::locale->text("Timerange")."
".$self->ob_date." - ".$ob_next_date, 'align' => 'center'}, + ]; + + # Zeile 2: + my @line_2 = (); + map { push @line_2 , $column_defs{$_} } grep { $column_defs{$_}->{visible} } @columns; + push @custom_headers, [ @line_2 ]; + + $report->set_custom_headers(@custom_headers); + $report->set_columns(%column_defs); + $report->set_column_order(@columns); + + my $chart9actual = SL::DB::Manager::Chart->get_first( query => [ id => $self->cbob_chart ] ); + $self->{cbob_chartaccno} = $chart9actual->accno.' '.$chart9actual->description; + + foreach my $chart (@{ $self->charts }) { + my $balance = $self->get_balance($chart); + if ( $balance != 0 ) { + my $chart_id = $chart->id; + my $row = { map { $_ => { 'data' => '' } } @columns }; + $row->{ids} = { + 'raw_data' => $cgi->hidden('-name' => "trans_id_${idx}", '-value' => $chart_id) + . $cgi->checkbox('-name' => "multi_id_${idx}",' id' => "multi_id_id_".$chart_id, '-value' => 1, '-label' => ''), + 'valign' => 'center', + 'align' => 'center', + }; + $row->{chart}->{data} = $chart->accno; + $row->{description}->{data} = $chart->description; + if ( $balance > 0 ) { + $row->{saldo}->{data} = $::form->format_amount(\%::myconfig, $balance, 2)." H"; + } elsif ( $balance < 0 ) { + $row->{saldo}->{data} = $::form->format_amount(\%::myconfig,-$balance, 2)." S"; + } else { + $row->{saldo}->{data} = $::form->format_amount(\%::myconfig,0, 2)." "; + } + my $sum_cb = 0; + foreach my $acc ( @{ SL::DB::Manager::AccTransaction->get_all(where => [ chart_id => $chart->id, cb_transaction => 't', + transdate => { ge => $self->cb_startdate}, + transdate => { le => $self->cb_date }]) }) { + $sum_cb += $acc->amount; + } + my $sum_ob = 0; + foreach my $acc ( @{ SL::DB::Manager::AccTransaction->get_all(where => [ chart_id => $chart->id, ob_transaction => 't', + transdate => { ge => $self->ob_date}, + transdate => { le => $ob_next_date }]) }) { + $sum_ob += $acc->amount; + } + if ( $sum_cb > 0 ) { + $row->{sum_cb}->{data} = $::form->format_amount(\%::myconfig, $sum_cb, 2)." H"; + } elsif ( $sum_cb < 0 ) { + $row->{sum_cb}->{data} = $::form->format_amount(\%::myconfig,-$sum_cb, 2)." S"; + } else { + $row->{sum_cb}->{data} = $::form->format_amount(\%::myconfig,0, 2)." "; + } + if ( $sum_ob > 0 ) { + $row->{sum_ob}->{data} = $::form->format_amount(\%::myconfig, $sum_ob, 2)." H"; + } elsif ( $sum_ob < 0 ) { + $row->{sum_ob}->{data} = $::form->format_amount(\%::myconfig,-$sum_ob, 2)." S"; + } else { + $row->{sum_ob}->{data} = $::form->format_amount(\%::myconfig,0, 2)." "; + } + $report->add_data($row); + } + $idx++; + } + + $self->{row_count} = $idx; + $main::lxdebug->leave_sub(); +} + +sub get_balance { + $main::lxdebug->enter_sub(); + my ($self,$chart) = @_; + +## eigene Abfrage da SL:DB:Chart->get_balance keine cb_transactions mitzählt +## Alternative in Chart cb_transaction abfrage per neuem Parameter 'with_cb' disablen: +# my %balance_params = ( fromdate => $self->startdate, +# todate => $self->cb_date, +# accounting_method => 'accrual', +# with_cb => 1, ## in Chart cb_transaction abfrage disablen +# ); +# return $chart->get_balance(%balance_params); + + $main::lxdebug->message(LXDebug->DEBUG2(),"get_balance from=".$self->cb_startdate." to=".$self->cb_date); + my $query = qq|SELECT SUM(amount) AS sum FROM acc_trans WHERE chart_id = ? | . + qq| AND transdate >= ? AND transdate <= ? |; + my @query_args = ( $chart->id, $self->cb_startdate, $self->cb_date); + my ($balance) = selectfirst_array_query($::form, $chart->db->dbh, $query, @query_args); + + $main::lxdebug->leave_sub(); + return 0 unless $balance != 0; + return $balance; +} + +sub gl_booking { + my ($self, $amount, $transdate, $reference, $description, $konto, $gegenkonto, $ob, $cb) = @_; + $::form->get_employee(); + my $employee_id = $::form->{employee_id}; + $main::lxdebug->message(LXDebug->DEBUG2(),"employee_id=".$employee_id." ob=".$ob." cb=".$cb); + my $gl_entry = SL::DB::GLTransaction->new(); + $gl_entry->assign_attributes( + employee_id => $employee_id, + transdate => $transdate, + reference => $reference, + description => $description, + ob_transaction => $ob, + cb_transaction => $cb, + ); + $gl_entry->save; + my $kto_trans1 = SL::DB::AccTransaction->new(); + $kto_trans1->assign_attributes( + trans_id => $gl_entry->id, + transdate => $transdate, + ob_transaction => $ob, + cb_transaction => $cb, + chart_id => $gegenkonto->id, + chart_link => $konto->link, + tax_id => 0, + taxkey => 0, + amount => $amount, + ); + $kto_trans1->save; + my $kto_trans2 = SL::DB::AccTransaction->new(); + $kto_trans2->assign_attributes( + trans_id => $gl_entry->id, + transdate => $transdate, + ob_transaction => $ob, + cb_transaction => $cb, + chart_id => $konto->id, + chart_link => $konto->link, + tax_id => 0, + taxkey => 0, + amount => -$amount, + ); + $kto_trans2->save; +} + +sub init_cbob_chart { $::form->{cbob_chart} } +sub init_ob_date { $::form->{ob_date} } +sub init_ob_reference { $::form->{ob_reference} } +sub init_ob_description { $::form->{ob_description} } +sub init_cb_startdate { $::form->{cb_startdate} } +sub init_cb_date { $::form->{cb_date} } +sub init_cb_reference { $::form->{cb_reference} } +sub init_cb_description { $::form->{cb_description} } + +sub init_charts9000 { + # wie geht prüfen von länge auf 4 in rose ? + SL::DB::Manager::Chart->get_all( query => [ \ "accno like '9%' and length(accno) = 4"] ); + #SL::DB::Manager::Chart->get_all( query => [ accno => { like => '9%'}] ); +} + +sub init_charts { + # wie geht 'not like' in rose ? + SL::DB::Manager::Chart->get_all( query => [ \ "accno not like '9%'"], sort_by => 'accno ASC' ); +} + +1;