}
$main::lxdebug->leave_sub();
}
+
+sub erfolgsrechnung {
+ $main::lxdebug->enter_sub();
+
+ my ($self, $myconfig, $form) = @_;
+ $form->{company} = $::instance_conf->get_company;
+ $form->{address} = $::instance_conf->get_address;
+ #injection-filter
+ $form->{fromdate} =~ s/[^0-9\.]//g;
+ $form->{todate} =~ s/[^0-9\.]//g;
+ #input validation
+ $form->{fromdate} = "01.01.2000" if $form->{fromdate} !~ m/[0-9]*\.[0-9]*\.[0-9]*/;
+ $form->{todate} = $form->current_date(%{$myconfig}) if $form->{todate} !~ m/[0-9]*\.[0-9]*\.[0-9]*/;
+
+ my %categories = (I => "ERTRAG", E => "AUFWAND");
+ my $fromdate = conv_dateq($form->{fromdate});
+ my $todate = conv_dateq($form->{todate});
+
+ $form->{total} = 0;
+
+ foreach my $category ('I', 'E') {
+ my %category = (
+ name => $categories{$category},
+ total => 0,
+ accounts => get_accounts_ch($category),
+ );
+ foreach my $account (@{$category{accounts}}) {
+ $account->{total} += ($account->{category} eq $category ? 1 : -1) * get_total_ch($account->{id}, $fromdate, $todate);
+ $category{total} += $account->{total};
+ $account->{total} = $form->format_amount($myconfig, $form->parse_amount($myconfig, $account->{total}), 2);
+ }
+ $form->{total} += $category{total};
+ $category{total} = $form->format_amount($myconfig, $form->parse_amount($myconfig, $category{total}), 2);
+ push(@{$form->{categories}}, \%category);
+ }
+ $form->{total} = $form->format_amount($myconfig, $form->parse_amount($myconfig, $form->{total}), 2);
+
+ $main::lxdebug->leave_sub();
+ return {};
+}
+
+sub get_accounts_ch {
+ $main::lxdebug->enter_sub();
+
+ my ($category) = @_;
+ my ($inclusion);
+
+ if ($category eq 'I') {
+ $inclusion = "AND pos_er = NULL OR pos_er > '0' AND pos_er <= '5'";
+ } elsif ($category eq 'E') {
+ $inclusion = "AND pos_er = NULL OR pos_er >= '6' AND pos_er < '100'";
+ } else {
+ $inclusion = "";
+ }
+
+ my $query = qq|
+ SELECT id, accno, description, category
+ FROM chart
+ WHERE category = '$category' $inclusion
+ ORDER BY accno
+ |;
+ my $accounts = _query($query);
+
+ $main::lxdebug->leave_sub();
+ return $accounts;
+}
+
+sub get_total_ch {
+ $main::lxdebug->enter_sub();
+
+ my ($chart_id, $fromdate, $todate) = @_;
+ my $total = 0;
+ my $query = qq|
+ SELECT SUM(amount)
+ FROM acc_trans
+ WHERE chart_id = '$chart_id'
+ AND transdate >= $fromdate
+ AND transdate <= $todate
+ |;
+ $total += _query($query)->[0]->{sum};
+
+ $main::lxdebug->leave_sub();
+ return $total;
+}
+
+sub _query {return selectall_hashref_query($::form, $::form->get_standard_dbh, @_);}
+
1;
# $form->parse_html_template('rp/html_report_susa')
my $rp_access_map = {
- 'projects' => 'report',
- 'ar_aging' => 'general_ledger',
- 'ap_aging' => 'general_ledger',
- 'receipts' => 'cash',
- 'payments' => 'cash',
- 'trial_balance' => 'report',
- 'income_statement' => 'report',
- 'bwa' => 'report',
- 'balance_sheet' => 'report',
+ 'projects' => 'report',
+ 'ar_aging' => 'general_ledger',
+ 'ap_aging' => 'general_ledger',
+ 'receipts' => 'cash',
+ 'payments' => 'cash',
+ 'trial_balance' => 'report',
+ 'income_statement' => 'report',
+ 'erfolgsrechnung' => 'report',
+ 'bwa' => 'report',
+ 'balance_sheet' => 'report',
};
sub check_rp_access {
my %title = (
balance_sheet => $::locale->text('Balance Sheet'),
income_statement => $::locale->text('Income Statement'),
+ erfolgsrechnung => $::locale->text('Erfolgsrechnung'),
trial_balance => $::locale->text('Trial Balance'),
ar_aging => $::locale->text('Search AR Aging'),
ap_aging => $::locale->text('Search AP Aging'),
$::form->{title} = $title{$::form->{report}};
$::request->{layout}->add_javascripts('autocomplete_customer.js');
+ $::form->{fromdate} = DateTime->today->truncate(to => 'year')->to_kivitendo;
+ $::form->{todate} = DateTime->today->truncate(to => 'year')->add(years => 1)->add(days => -1)->to_kivitendo;
# get departments
$::form->all_departments(\%::myconfig);
$::form->get_lists("projects" => { "key" => "ALL_PROJECTS", "all" => 1 });
- my $is_projects = $::form->{report} eq "projects";
- my $is_income_statement = $::form->{report} eq "income_statement";
- my $is_bwa = $::form->{report} eq "bwa";
- my $is_balance_sheet = $::form->{report} eq "balance_sheet";
- my $is_trial_balance = $::form->{report} eq "trial_balance";
- my $is_aging = $::form->{report} =~ /^a[rp]_aging$/;
- my $is_payments = $::form->{report} =~ /(receipts|payments)$/;
+ my $is_projects = $::form->{report} eq "projects";
+ my $is_income_statement = $::form->{report} eq "income_statement";
+ my $is_erfolgsrechnung = $::form->{report} eq "erfolgsrechnung";
+ my $is_bwa = $::form->{report} eq "bwa";
+ my $is_balance_sheet = $::form->{report} eq "balance_sheet";
+ my $is_trial_balance = $::form->{report} eq "trial_balance";
+ my $is_aging = $::form->{report} =~ /^a[rp]_aging$/;
+ my $is_payments = $::form->{report} =~ /(receipts|payments)$/;
my ($label, $nextsub, $vc);
if ($is_aging) {
$::form->header;
print $::form->parse_html_template('rp/report', {
- paymentaccounts => $paymentaccounts,
- selection => $selection,
- is_aging => $is_aging,
- vc => $vc,
- label => $label,
- year => DateTime->today->year,
- today => DateTime->today,
- nextsub => $nextsub,
- is_payments => $is_payments,
- is_trial_balance => $is_trial_balance,
- is_balance_sheet => $is_balance_sheet,
- is_bwa => $is_bwa,
- is_income_statement => $is_income_statement,
- is_projects => $is_projects,
+ paymentaccounts => $paymentaccounts,
+ selection => $selection,
+ is_aging => $is_aging,
+ vc => $vc,
+ label => $label,
+ year => DateTime->today->year,
+ today => DateTime->today,
+ nextsub => $nextsub,
+ is_payments => $is_payments,
+ is_trial_balance => $is_trial_balance,
+ is_balance_sheet => $is_balance_sheet,
+ is_bwa => $is_bwa,
+ is_income_statement => $is_income_statement,
+ is_erfolgsrechnung => $is_erfolgsrechnung,
+ is_projects => $is_projects,
});
$::lxdebug->leave_sub;
$main::lxdebug->leave_sub();
}
+sub generate_erfolgsrechnung {
+ $::lxdebug->enter_sub;
+ $::auth->assert('report');
+
+ $::form->{decimalplaces} = $::form->{decimalplaces} * 1 || 2;
+ $::form->{padding} = " ";
+ $::form->{bold} = "<b>";
+ $::form->{endbold} = "</b>";
+ $::form->{br} = "<br>";
+
+ my $data = RP->erfolgsrechnung(\%::myconfig, $::form);
+
+ $::form->header();
+ print $::form->parse_html_template('rp/erfolgsrechnung', $data);
+
+ $::lxdebug->leave_sub;
+}
+
+
sub generate_balance_sheet {
$::lxdebug->enter_sub;
$::auth->assert('report');
-- @may_fail: 1
ALTER TABLE chart ADD COLUMN pos_er INTEGER;
+UPDATE chart SET pos_er = pos_eur;
-- Korrigiert: November 2015
-- Grundlage: Revision OR Stand 1.1.2013, insbesondere Art. 957a Abs. 2
-ALTER TABLE chart ADD COLUMN pos_er INTEGER;
-
DELETE FROM chart;
-INSERT INTO chart (accno, description, charttype, category, link, gifi_accno, taxkey_id, pos_ustva, pos_bwa, pos_bilanz, pos_er, datevautomatik, valid_from) VALUES
+INSERT INTO chart (accno, description, charttype, category, link, gifi_accno, taxkey_id, pos_ustva, pos_bwa, pos_bilanz, pos_eur, datevautomatik, valid_from) VALUES
('1', 'AKTIVEN','H','','','1',0,NULL,NULL,NULL,NULL,FALSE,'2011-01-01 00:00:00.000000'),
('10', 'UMLAUFSVERMÖGEN','H','','','10',0,NULL,NULL,NULL,NULL,FALSE,'2011-01-01 00:00:00.000000'),
('100', 'Flüssige Mittel','H','','','100',0,NULL,NULL,NULL,NULL,FALSE,'2011-01-01 00:00:00.000000'),
-- Korrigiert: November 2015
-- Grundlage: Revision OR Stand 1.1.2013, insbesondere Art. 957a Abs. 2
-ALTER TABLE chart ADD COLUMN pos_er INTEGER;
-
DELETE FROM chart;
-INSERT INTO chart (accno, description, charttype, category, link, gifi_accno, taxkey_id, pos_ustva, pos_bwa, pos_bilanz, pos_er, datevautomatik, valid_from) VALUES
+INSERT INTO chart (accno, description, charttype, category, link, gifi_accno, taxkey_id, pos_ustva, pos_bwa, pos_bilanz, pos_eur, datevautomatik, valid_from) VALUES
('1', 'AKTIVEN','H','','','1',0,NULL,NULL,NULL,NULL,FALSE,'2011-01-01 00:00:00.000000'),
('10', 'UMLAUFSVERMÖGEN','H','','','10',0,NULL,NULL,NULL,NULL,FALSE,'2011-01-01 00:00:00.000000'),
('100', 'Flüssige Mittel','H','','','100',0,NULL,NULL,NULL,NULL,FALSE,'2011-01-01 00:00:00.000000'),
--- /dev/null
+[%- USE T8 %]
+[%- USE HTML %]
+[%- USE LxERP %]
+
+<h2 align="center">
+ <br>[% company %]
+ <br>[% address %]
+ <p>[% 'ERFOLGSRECHNUNG' %]
+ <br>[% fromdate %] bis [% todate %]
+</h2>
+<table border="0">
+ <tr>
+ <th align="left" width="400" colspan="2"><br></th>
+ </tr>
+ [%- FOREACH category = categories %]
+ <tr valign="top">
+ <th align="left" colspan="4">[% category.name %]<b><hr align="left" width="250" size="5" noshade></th>
+ </tr>
+ [%- FOREACH row = category.accounts %]
+ <tr>
+ <td align="left">[% row.accno %]</td>
+ <td align="left">[% row.description %]</td>
+ <td align="right">[% row.total %]</td>
+ </tr>
+ [%- END %]
+ <tr>
+ <td colspan="2"> </td>
+ <td><hr noshade size="1"></td>
+ <td><hr noshade size="1"></td>
+ </tr>
+ <tr valign="top">
+ <th align="left" colspan="2">TOTAL</th>
+ <td align="right">[% category.total %]<hr noshade size="2"></td>
+ </tr>
+ [%- END %]
+ <tr valign="top">
+ <th align="left" colspan="2">GEWINN/VERLUST</th>
+ <td align="right">[% total %]<br><hr noshade size="2"></td>
+ </tr>
+</table>
</tr>
<tr>
<th colspan=1>[% 'Year' | $T8 %]</th>
- <td><input name=year size=11 title="[% 'YYYY' | $T8 %]" value="[% year %]" class="initial_focus"></td>
+ <td>
+ <input name=year size=11 title="[% 'YYYY' | $T8 %]" value="[% year %]" class="initial_focus" oninput='set_from_to(duetyp.value, this.value)'>
+ </td>
</tr>
<tr>
<td align=right> <b>[% 'Yearly' | $T8 %]</b> </td>
<th align=left colspan=3>[% 'Monthly' | $T8 %]</th>
</tr>
<tr>
- <td align=right> <input name=duetyp class=radio type=radio value="13"></td>
- <td><input name=duetyp class=radio type=radio value="A"> 1. [% 'Quarter' | $T8 %]</td>
- <td><input name=duetyp class=radio type=radio value="1" checked> [% 'January' | $T8 %]</td>
- <td><input name=duetyp class=radio type=radio value="5"> [% 'May' | $T8 %]</td>
- <td><input name=duetyp class=radio type=radio value="9"> [% 'September' | $T8 %]</td>
+ <td align=right>
+ <input name=duetyp class=radio type=radio value="13" checked onchange='set_from_to(this.value, year.value)'>
+ </td>
+ <td><input name=duetyp class=radio type=radio value="A" onchange='set_from_to(this.value, year.value)'>
+ 1. [% 'Quarter' | $T8 %]
+ </td>
+ <td><input name=duetyp class=radio type=radio value="1" onchange='set_from_to(this.value, year.value)'>
+ [% 'January' | $T8 %]
+ </td>
+ <td><input name=duetyp class=radio type=radio value="5" onchange='set_from_to(this.value, year.value)'>
+ [% 'May' | $T8 %]
+ </td>
+ <td><input name=duetyp class=radio type=radio value="9" onchange='set_from_to(this.value, year.value)'>
+ [% 'September' | $T8 %]
+ </td>
</tr>
<tr>
<td align= right> </td>
- <td><input name=duetyp class=radio type=radio value="B"> 2. [% 'Quarter' | $T8 %]</td>
- <td><input name=duetyp class=radio type=radio value="2"> [% 'February' | $T8 %]</td>
- <td><input name=duetyp class=radio type=radio value="6"> [% 'June' | $T8 %]</td>
- <td><input name=duetyp class=radio type=radio value="10"> [% 'October' | $T8 %]</td>
+ <td><input name=duetyp class=radio type=radio value="B" onchange='set_from_to(this.value, year.value)'>
+ 2. [% 'Quarter' | $T8 %]
+ </td>
+ <td><input name=duetyp class=radio type=radio value="2" onchange='set_from_to(this.value, year.value)'>
+ [% 'February' | $T8 %]
+ </td>
+ <td><input name=duetyp class=radio type=radio value="6" onchange='set_from_to(this.value, year.value)'>
+ [% 'June' | $T8 %]
+ </td>
+ <td><input name=duetyp class=radio type=radio value="10" onchange='set_from_to(this.value, year.value)'>
+ [% 'October' | $T8 %]
+ </td>
</tr>
<tr>
<td> </td>
- <td><input name=duetyp class=radio type=radio value="C"> 3. [% 'Quarter' | $T8 %]</td>
- <td><input name=duetyp class=radio type=radio value="3"> [% 'March' | $T8 %]</td>
- <td><input name=duetyp class=radio type=radio value="7"> [% 'July' | $T8 %]</td>
- <td><input name=duetyp class=radio type=radio value="11"> [% 'November' | $T8 %]</td>
+ <td><input name=duetyp class=radio type=radio value="C" onchange='set_from_to(this.value, year.value)'>
+ 3. [% 'Quarter' | $T8 %]
+ </td>
+ <td><input name=duetyp class=radio type=radio value="3" onchange='set_from_to(this.value, year.value)'>
+ [% 'March' | $T8 %]
+ </td>
+ <td><input name=duetyp class=radio type=radio value="7" onchange='set_from_to(this.value, year.value)'>
+ [% 'July' | $T8 %]
+ </td>
+ <td><input name=duetyp class=radio type=radio value="11" onchange='set_from_to(this.value, year.value)'>
+ [% 'November' | $T8 %]
+ </td>
</tr>
<tr>
<td> </td>
- <td><input name=duetyp class=radio type=radio value="D"> 4. [% 'Quarter' | $T8 %]</td>
- <td><input name=duetyp class=radio type=radio value="4"> [% 'April' | $T8 %]</td>
- <td><input name=duetyp class=radio type=radio value="8"> [% 'August' | $T8 %]</td>
- <td><input name=duetyp class=radio type=radio value="12"> [% 'December' | $T8 %]</td>
+ <td><input name=duetyp class=radio type=radio value="D" onchange='set_from_to(this.value, year.value)'>
+ 4. [% 'Quarter' | $T8 %]
+ </td>
+ <td><input name=duetyp class=radio type=radio value="4" onchange='set_from_to(this.value, year.value)'>
+ [% 'April' | $T8 %]
+ </td>
+ <td><input name=duetyp class=radio type=radio value="8" onchange='set_from_to(this.value, year.value)'>
+ [% 'August' | $T8 %]
+ </td>
+ <td><input name=duetyp class=radio type=radio value="12" onchange='set_from_to(this.value, year.value)'>
+ [% 'December' | $T8 %]
+ </td>
</tr>
<tr>
<td colspan=5><hr size=3 noshade></td>
<th align=left><input name=reporttype class=radio type=radio value="free">[% 'Free report period' | $T8 %]</th>
<td align=left colspan=4>
[% 'From' | $T8 %] [% L.date_tag('fromdate', fromdate) %]
- [% 'Bis' | $T8 %] [% L.date_tag('todate') %]
+ [% 'Bis' | $T8 %] [% L.date_tag('todate', todate) %]
</td>
</tr>
<tr>
</tr>
[%- END %]
+
[%- IF is_bwa %]
[%- PROCESS projectnumber %]
<input type=hidden name=nextsub value=generate_bwa>
</tr>
[%- END %]
+
+[%- IF is_erfolgsrechnung %]
+ <input type=hidden name=nextsub value=generate_erfolgsrechnung>
+</table>
+<table>
+[%- PROCESS customized_report %]
+[%- END %]
+
+
[%- IF is_balance_sheet %]
<input type=hidden name=nextsub value=generate_balance_sheet>
<tr>
<input type=submit class=submit name=action value="[% 'Continue' | $T8 %]">
</form>
+
+<script type="text/javascript">
+function set_from_to(duetyp, year) {
+ var date = {
+ 1: [ 1, 1, 1, 31 ],
+ 2: [ 2, 1, 2, new Date(year, 1, 29).getMonth() == 1 ? 29 : 28 ],
+ 3: [ 3, 1, 3, 31 ],
+ 4: [ 4, 1, 4, 30 ],
+ 5: [ 5, 1, 5, 31 ],
+ 6: [ 6, 1, 6, 30 ],
+ 7: [ 7, 1, 7, 31 ],
+ 8: [ 8, 1, 8, 31 ],
+ 9: [ 9, 1, 9, 30 ],
+ 10: [ 10, 1, 10, 31 ],
+ 11: [ 11, 1, 11, 30 ],
+ 12: [ 12, 1, 12, 31 ],
+ 13: [ 1, 1, 12, 31 ],
+ 'A': [ 1, 1, 3, 31 ],
+ 'B': [ 4, 1, 6, 30 ],
+ 'C': [ 7, 1, 9, 30 ],
+ 'D': [ 10, 1, 12, 31 ]
+ }[duetyp];
+
+ $('#fromdate').val(kivi.format_date(new Date(year, date[0]-1, date[1])));
+ $('#todate').val(kivi.format_date(new Date(year, date[2]-1, date[3])));
+
+ return true;
+}
+</script>
+