+ my $asset_cb_debit_entry = SL::DB::GLTransaction->new(
+ employee_id => $employee_id,
+ transdate => $cb_date,
+ reference => 'SB ' . $cb_date->year,
+ description => 'Automatische SB-Buchungen Bestandskonten Soll für ' . $cb_date->year,
+ ob_transaction => 0,
+ cb_transaction => 1,
+ );
+ my $asset_ob_debit_entry = SL::DB::GLTransaction->new(
+ employee_id => $employee_id,
+ transdate => $ob_date,
+ reference => 'EB ' . $ob_date->year,
+ description => 'Automatische EB-Buchungen Bestandskonten Haben für ' . $ob_date->year,
+ ob_transaction => 1,
+ cb_transaction => 0,
+ );
+ my $asset_cb_credit_entry = SL::DB::GLTransaction->new(
+ employee_id => $employee_id,
+ transdate => $cb_date,
+ reference => 'SB ' . $cb_date->year,
+ description => 'Automatische SB-Buchungen Bestandskonten Haben für ' . $cb_date->year,
+ ob_transaction => 0,
+ cb_transaction => 1,
+ );
+ my $asset_ob_credit_entry = SL::DB::GLTransaction->new(
+ employee_id => $employee_id,
+ transdate => $ob_date,
+ reference => 'EB ' . $ob_date->year,
+ description => 'Automatische EB-Buchungen Bestandskonten Soll für ' . $ob_date->year,
+ ob_transaction => 1,
+ cb_transaction => 0,
+ );
+ $asset_cb_debit_entry->transactions([]);
+ $asset_ob_debit_entry->transactions([]);
+ $asset_cb_credit_entry->transactions([]);
+ $asset_ob_credit_entry->transactions([]);
+
+ foreach my $asset_account ( @asset_accounts ) {
+ next if $asset_account->{amount_with_cb} == 0;
+
+ # create cb and ob acc_trans entry here, but decide which gl entry to add it to later
+ my $asset_cb_acc = SL::DB::AccTransaction->new(
+ transdate => $cb_date,
+ ob_transaction => 0,
+ cb_transaction => 1,
+ chart_id => $asset_account->{chart_id},
+ chart_link => $asset_account->{chart_link},
+ tax_id => 0,
+ taxkey => 0,
+ amount => - $asset_account->{amount_with_cb},
+ );
+ my $asset_ob_acc = SL::DB::AccTransaction->new(
+ transdate => $ob_date,
+ ob_transaction => 1,
+ cb_transaction => 0,
+ chart_id => $asset_account->{chart_id},
+ chart_link => $asset_account->{chart_link},
+ tax_id => 0,
+ taxkey => 0,
+ amount => $asset_account->{amount_with_cb},
+ );
+
+ if ( $asset_account->{amount_with_cb} < 0 ) {
+ $debit_balance += $asset_account->{amount_with_cb};
+ # $main::lxdebug->message(0, sprintf("adding accno %s with balance %s to debit", $asset_account->{accno}, $asset_account->{amount_with_cb}));
+
+ $asset_cb_debit_entry->add_transactions($asset_cb_acc);
+ $asset_ob_debit_entry->add_transactions($asset_ob_acc);
+ } else {
+ # $main::lxdebug->message(0, sprintf("adding accno %s with balance %s to credit", $asset_account->{accno}, $asset_account->{amount_with_cb}));
+ $credit_balance += $asset_account->{amount_with_cb};
+ $asset_cb_credit_entry->add_transactions($asset_cb_acc);
+ $asset_ob_credit_entry->add_transactions($asset_ob_acc);
+ };
+ };
+
+ my $debit_cb_acc = SL::DB::AccTransaction->new(
+ transdate => $cb_date,
+ ob_transaction => 0,
+ cb_transaction => 1,
+ chart_id => $carry_over_chart->id,
+ chart_link => $carry_over_chart->link, # maybe leave chart_link empty?
+ tax_id => 0,
+ taxkey => 0,
+ amount => $debit_balance,
+ );
+ my $debit_ob_acc = SL::DB::AccTransaction->new(
+ transdate => $ob_date,
+ ob_transaction => 1,
+ cb_transaction => 0,
+ chart_id => $carry_over_chart->id,
+ chart_link => $carry_over_chart->link,
+ tax_id => 0,
+ taxkey => 0,
+ amount => - $debit_balance,
+ );
+ my $credit_cb_acc = SL::DB::AccTransaction->new(
+ transdate => $cb_date,
+ ob_transaction => 0,
+ cb_transaction => 1,
+ chart_id => $carry_over_chart->id,
+ chart_link => $carry_over_chart->link, # maybe leave chart_link empty?
+ tax_id => 0,
+ taxkey => 0,
+ amount => $credit_balance,
+ );
+ my $credit_ob_acc = SL::DB::AccTransaction->new(
+ transdate => $ob_date,
+ ob_transaction => 1,
+ cb_transaction => 0,
+ chart_id => $carry_over_chart->id,
+ chart_link => $carry_over_chart->link,
+ tax_id => 0,
+ taxkey => 0,
+ amount => - $credit_balance,
+ );
+ $asset_cb_debit_entry->add_transactions($debit_cb_acc);
+ $asset_ob_debit_entry->add_transactions($debit_ob_acc);
+ $asset_cb_credit_entry->add_transactions($credit_cb_acc);
+ $asset_ob_credit_entry->add_transactions($credit_ob_acc);
+
+ $asset_cb_debit_entry->save if scalar @{ $asset_cb_debit_entry->transactions } > 1;
+ $asset_ob_debit_entry->save if scalar @{ $asset_ob_debit_entry->transactions } > 1;
+ $asset_cb_credit_entry->save if scalar @{ $asset_cb_credit_entry->transactions } > 1;
+ $asset_ob_credit_entry->save if scalar @{ $asset_ob_credit_entry->transactions } > 1;
+
+ ####### profit-loss accounts #######
+ # these only have a closing balance, the balance is transferred to the profit-loss account
+
+ # need to know if profit or loss first!
+ # use amount_with_cb, so it can be run several times. So sum may be 0 the second time.
+ my $profit_loss_sum = sum map { $_->{amount_with_cb} }
+ grep { $_->{account_type} eq 'profit_loss_account' }
+ @{$report_data};
+ my $pl_chart;
+ if ( $profit_loss_sum > 0 ) {
+ $pl_chart = $profit_chart;
+ } else {
+ $pl_chart = $loss_chart;
+ };
+
+ my $pl_debit_balance = 0;
+ my $pl_credit_balance = 0;
+ # soll = debit, haben = credit
+ my $pl_cb_debit_entry = SL::DB::GLTransaction->new(
+ employee_id => $employee_id,
+ transdate => $cb_date,
+ reference => 'SB ' . $cb_date->year,
+ description => 'Automatische SB-Buchungen Erfolgskonten Soll für ' . $cb_date->year,
+ ob_transaction => 0,
+ cb_transaction => 1,
+ );
+ my $pl_cb_credit_entry = SL::DB::GLTransaction->new(
+ employee_id => $employee_id,
+ transdate => $cb_date,
+ reference => 'SB ' . $cb_date->year,
+ description => 'Automatische SB-Buchungen Erfolgskonten Haben für ' . $cb_date->year,
+ ob_transaction => 0,
+ cb_transaction => 1,
+ );
+ $pl_cb_debit_entry->transactions([]);
+ $pl_cb_credit_entry->transactions([]);
+
+ foreach my $profit_loss_account ( @profit_loss_accounts ) {
+ # $main::lxdebug->message(0, sprintf("found chart %s with balance %s", $profit_loss_account->{accno}, $profit_loss_account->{amount_with_cb}));
+
+ next if $profit_loss_account->{amount_with_cb} == 0;
+
+ my $debit_cb_acc = SL::DB::AccTransaction->new(
+ transdate => $cb_date,
+ ob_transaction => 0,
+ cb_transaction => 1,
+ chart_id => $profit_loss_account->{chart_id},
+ chart_link => $profit_loss_account->{chart_link},
+ tax_id => 0,
+ taxkey => 0,
+ amount => - $profit_loss_account->{amount_with_cb},
+ );
+ my $credit_cb_acc = SL::DB::AccTransaction->new(
+ transdate => $cb_date,
+ ob_transaction => 0,
+ cb_transaction => 1,
+ chart_id => $profit_loss_account->{chart_id},
+ chart_link => $profit_loss_account->{chart_link},
+ tax_id => 0,
+ taxkey => 0,
+ amount => $profit_loss_account->{amount_with_cb},
+ );
+ if ( { $profit_loss_account->{amount_with_cb} < 0 } ) {
+ $pl_debit_balance += $profit_loss_account->{amount_with_cb};
+ $pl_cb_debit_entry->add_transactions($debit_cb_acc);
+ } else {
+ $pl_credit_balance += $profit_loss_account->{amount_with_cb};
+ $pl_cb_credit_entry->add_transactions($credit_cb_acc);
+ };
+ };
+
+ my $debit_cb_acc = SL::DB::AccTransaction->new(
+ transdate => $cb_date,
+ ob_transaction => 0,
+ cb_transaction => 1,
+ chart_id => $pl_chart->id,
+ chart_link => $pl_chart->link,
+ tax_id => 0,
+ taxkey => 0,
+ amount => $pl_debit_balance,
+ );
+ my $credit_cb_acc = SL::DB::AccTransaction->new(
+ transdate => $cb_date,
+ ob_transaction => 0,
+ cb_transaction => 1,
+ chart_id => $pl_chart->id,
+ chart_link => $pl_chart->link,
+ tax_id => 0,
+ taxkey => 0,
+ amount => - $pl_credit_balance,
+ );
+ $pl_cb_debit_entry->add_transactions($debit_cb_acc);
+ $pl_cb_credit_entry->add_transactions($credit_cb_acc);
+
+ $pl_cb_debit_entry->save if scalar @{ $pl_cb_debit_entry->transactions } > 1;
+ $pl_cb_credit_entry->save if scalar @{ $pl_cb_credit_entry->transactions } > 1;
+
+ ######### profit-loss transfer #########
+ # and finally transfer the new balance of the profit-loss account via the carry-over account
+ # we want to use profit_loss_sum with cb!
+
+ my $carry_over_cb_entry = SL::DB::GLTransaction->new(
+ employee_id => $employee_id,
+ transdate => $cb_date,
+ reference => 'SB ' . $cb_date->year,
+ description => sprintf('Automatische SB-Buchung für %s %s',
+ $profit_loss_sum >= 0 ? 'Gewinnvortrag' : 'Verlustvortrag',
+ $cb_date->year,
+ ),
+ ob_transaction => 0,
+ cb_transaction => 1,
+ );
+ my $carry_over_ob_entry = SL::DB::GLTransaction->new(
+ employee_id => $employee_id,
+ transdate => $ob_date,
+ reference => 'EB ' . $ob_date->year,
+ description => sprintf('Automatische EB-Buchung für %s %s',
+ $profit_loss_sum >= 0 ? 'Gewinnvortrag' : 'Verlustvortrag',
+ $ob_date->year,
+ ),
+ ob_transaction => 1,
+ cb_transaction => 0,
+ );
+ $carry_over_cb_entry->transactions([]);
+ $carry_over_ob_entry->transactions([]);
+
+ my $carry_over_cb_acc_co = SL::DB::AccTransaction->new(
+ transdate => $cb_date,
+ ob_transaction => 0,
+ cb_transaction => 1,
+ chart_id => $carry_over_chart->id,
+ chart_link => $carry_over_chart->link,
+ tax_id => 0,
+ taxkey => 0,
+ amount => $profit_loss_sum,
+ );
+ my $carry_over_cb_acc_pl = SL::DB::AccTransaction->new(
+ transdate => $cb_date,
+ ob_transaction => 0,
+ cb_transaction => 1,
+ chart_id => $pl_chart->id,
+ chart_link => $pl_chart->link,
+ tax_id => 0,
+ taxkey => 0,
+ amount => - $profit_loss_sum,
+ );