X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fgl.pl;h=0d39d47ea65e403c3b1818cec19839d95659c82e;hb=5c8a0b36440e012cd0a54e6b68eb3d1411243b1a;hp=0c7f7350c5fe98e1e741d104ebfe140ee83e1402;hpb=bed583a0d8035afabcf7fdf276e0b5cee5f62e04;p=kivitendo-erp.git diff --git a/bin/mozilla/gl.pl b/bin/mozilla/gl.pl index 0c7f7350c..0d39d47ea 100644 --- a/bin/mozilla/gl.pl +++ b/bin/mozilla/gl.pl @@ -24,21 +24,36 @@ # 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::GL; -use SL::PE; - -require "$form->{path}/arap.pl"; +use utf8; +use strict; -1; +use POSIX qw(strftime); +use List::Util qw(first sum); -# end of main +use SL::DB::RecordTemplate; +use SL::DB::BankTransactionAccTrans; +use SL::DB::Tax; +use SL::FU; +use SL::GL; +use SL::Helper::Flash qw(flash flash_later); +use SL::IS; +use SL::ReportGenerator; +use SL::DBUtils qw(selectrow_query selectall_hashref_query); +use SL::Webdav; +use SL::Locale::String qw(t8); +use SL::Helper::GlAttachments qw(count_gl_attachments); +use SL::Presenter::Tag; +use SL::Presenter::Chart; +require "bin/mozilla/common.pl"; +require "bin/mozilla/reportgenerator.pl"; # this is for our long dates # $locale->text('January') @@ -68,100 +83,198 @@ require "$form->{path}/arap.pl"; # $locale->text('Nov') # $locale->text('Dec') +sub load_record_template { + $::auth->assert('gl_transactions'); + + # Load existing template and verify that its one for this module. + my $template = SL::DB::RecordTemplate + ->new(id => $::form->{id}) + ->load( + with_object => [ qw(customer payment currency record_items record_items.chart) ], + ); + + die "invalid template type" unless $template->template_type eq 'gl_transaction'; + + $template->substitute_variables; + my $payment_suggestion = $::form->{form_defaults}->{amount_1}; + + # Clean the current $::form before rebuilding it from the template. + my $form_defaults = delete $::form->{form_defaults}; + delete @{ $::form }{ grep { !m{^(?:script|login)$}i } keys %{ $::form } }; + + my $dummy_form = {}; + GL->transaction(\%::myconfig, $dummy_form); + + # Fill $::form from the template. + my $today = DateTime->today_local; + $::form->{title} = "Add"; + $::form->{transdate} = $today->to_kivitendo; + $::form->{duedate} = $today->to_kivitendo; + $::form->{rowcount} = @{ $template->items }; + $::form->{paidaccounts} = 1; + $::form->{$_} = $template->$_ for qw(department_id taxincluded ob_transaction cb_transaction reference description show_details); + $::form->{$_} = $dummy_form->{$_} for qw(closedto revtrans previous_id previous_gldate); + + my $row = 0; + foreach my $item (@{ $template->items }) { + $row++; + + my $active_taxkey = $item->chart->get_active_taxkey; + my $taxes = SL::DB::Manager::Tax->get_all( + where => [ chart_categories => { like => '%' . $item->chart->category . '%' }], + sort_by => 'taxkey, rate', + ); + + my $tax = first { $item->tax_id == $_->id } @{ $taxes }; + $tax //= first { $active_taxkey->tax_id == $_->id } @{ $taxes }; + $tax //= $taxes->[0]; + + if (!$tax) { + $row--; + next; + } + + $::form->{"accno_id_${row}"} = $item->chart_id; + $::form->{"previous_accno_id_${row}"} = $item->chart_id; + $::form->{"debit_${row}"} = $::form->format_amount(\%::myconfig, ($payment_suggestion ? $payment_suggestion : $item->amount1), 2) if $item->amount1 * 1; + $::form->{"credit_${row}"} = $::form->format_amount(\%::myconfig, ($payment_suggestion ? $payment_suggestion : $item->amount2), 2) if $item->amount2 * 1; + $::form->{"taxchart_${row}"} = $item->tax_id . '--' . $tax->rate; + $::form->{"${_}_${row}"} = $item->$_ for qw(source memo project_id); + } + + $::form->{$_} = $form_defaults->{$_} for keys %{ $form_defaults // {} }; + + flash('info', $::locale->text("The record template '#1' has been loaded.", $template->template_name)); + + update( + keep_rows_without_amount => 1, + dont_add_new_row => 1, + ); +} + +sub save_record_template { + $::auth->assert('gl_transactions'); + + my $template = $::form->{record_template_id} ? SL::DB::RecordTemplate->new(id => $::form->{record_template_id})->load : SL::DB::RecordTemplate->new; + my $js = SL::ClientJS->new(controller => SL::Controller::Base->new); + my $new_name = $template->template_name_to_use($::form->{record_template_new_template_name}); + $js->dialog->close('#record_template_dialog'); + + + # bank transactions need amounts for assignment + my $can_save = 0; + $can_save = 1 if ($::form->{credit_1} > 0 && $::form->{debit_2} > 0 && $::form->{credit_2} == 0 && $::form->{debit_1} == 0); + $can_save = 1 if ($::form->{credit_2} > 0 && $::form->{debit_1} > 0 && $::form->{credit_1} == 0 && $::form->{debit_2} == 0); + return $js->flash('error', t8('Can only save template if amounts,i.e. 1 for debit and credit are set.'))->render unless $can_save; + + my @items = grep { + $_->{chart_id} && (($_->{tax_id} // '') ne '') + } map { + +{ chart_id => $::form->{"accno_id_${_}"}, + amount1 => $::form->parse_amount(\%::myconfig, $::form->{"debit_${_}"}), + amount2 => $::form->parse_amount(\%::myconfig, $::form->{"credit_${_}"}), + tax_id => (split m{--}, $::form->{"taxchart_${_}"})[0], + project_id => $::form->{"project_id_${_}"} || undef, + source => $::form->{"source_${_}"}, + memo => $::form->{"memo_${_}"}, + } + } (1..($::form->{rowcount} || 1)); + + $template->assign_attributes( + template_type => 'gl_transaction', + template_name => $new_name, + + currency_id => $::instance_conf->get_currency_id, + department_id => $::form->{department_id} || undef, + project_id => $::form->{globalproject_id} || undef, + taxincluded => $::form->{taxincluded} ? 1 : 0, + ob_transaction => $::form->{ob_transaction} ? 1 : 0, + cb_transaction => $::form->{cb_transaction} ? 1 : 0, + reference => $::form->{reference}, + description => $::form->{description}, + show_details => $::form->{show_details}, + + items => \@items, + ); + + eval { + $template->save; + 1; + } or do { + return $js + ->flash('error', $::locale->text("Saving the record template '#1' failed.", $new_name)) + ->render; + }; + + return $js + ->flash('info', $::locale->text("The record template '#1' has been saved.", $new_name)) + ->render; +} + sub add { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + $main::auth->assert('gl_transactions'); + + my $form = $main::form; + my %myconfig = %main::myconfig; $form->{title} = "Add"; - $form->{callback} = - "$form->{script}?action=add&path=$form->{path}&login=$form->{login}&password=$form->{password}" - unless $form->{callback}; + $form->{callback} = "gl.pl?action=add" unless $form->{callback}; # we use this only to set a default date + # yep. aber er holt hier auch schon ALL_CHARTS. Aufwand / Nutzen? jb GL->transaction(\%myconfig, \%$form); - map { - $chart .= - "{accno}--$_->{taxkey_id}\">$_->{accno}--$_->{description}" - } @{ $form->{chart} }; - map { - $tax .= - qq|$_->{taxdescription} | - . ($_->{rate} * 100) . qq| %| - } @{ $form->{TAX} }; - - $form->{chart} = $chart; - $form->{chartinit} = $chart; $form->{rowcount} = 2; - $form->{debitchart} = $chart; - $form->{creditchart} = $chart; - $form->{taxchart} = $tax; - $form->{debit} = 0; $form->{credit} = 0; $form->{tax} = 0; - # departments - $form->all_departments(\%myconfig); - if (@{ $form->{all_departments} }) { - $form->{selectdepartment} = "\n"; + $::form->{ALL_DEPARTMENTS} = SL::DB::Manager::Department->get_all_sorted; - map { - $form->{selectdepartment} .= - "$_->{description}--$_->{id}\n" - } (@{ $form->{all_departments} }); - } + $form->{show_details} = $myconfig{show_form_details} unless defined $form->{show_details}; &display_form(1); - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } -sub edit { - $lxdebug->enter_sub(); - - GL->transaction(\%myconfig, \%$form); - map { - $chart .= - "{accno}--$_->{taxkey_id}\">$_->{accno}--$_->{description}" - } @{ $form->{chart} }; +sub prepare_transaction { + $main::lxdebug->enter_sub(); - map { - $tax .= - qq|$_->{taxdescription} | - . ($_->{rate} * 100) . qq| %| - } @{ $form->{TAX} }; + $main::auth->assert('gl_transactions'); - $form->{chart} = $chart; + my $form = $main::form; + my %myconfig = %main::myconfig; - $form->{taxchart} = $tax; + GL->transaction(\%myconfig, \%$form); $form->{amount} = $form->format_amount(\%myconfig, $form->{amount}, 2); - # departments - $form->all_departments(\%myconfig); - if (@{ $form->{all_departments} }) { - $form->{selectdepartment} = "\n"; - - map { - $form->{selectdepartment} .= - "$_->{description}--$_->{id}\n" - } (@{ $form->{all_departments} }); - } + $::form->{ALL_DEPARTMENTS} = SL::DB::Manager::Department->get_all_sorted; my $i = 1; my $tax = 0; my $taxaccno = ""; - foreach $ref (@{ $form->{GL} }) { - $form->{"projectnumber_$i"} = "$ref->{projectnumber}--$ref->{project_id}"; - - $j = $i - 1; + foreach my $ref (@{ $form->{GL} }) { + my $j = $i - 1; if ($tax && ($ref->{accno} eq $taxaccno)) { $form->{"tax_$j"} = abs($ref->{amount}); - $form->{"taxchart_$j"} = $ref->{taxkey} . "--" . $ref->{taxrate}; + $form->{"taxchart_$j"} = $ref->{id} . "--" . $ref->{taxrate}; + if ($form->{taxincluded}) { + if ($ref->{amount} < 0) { + $form->{"debit_$j"} += $form->{"tax_$j"}; + } else { + $form->{"credit_$j"} += $form->{"tax_$j"}; + } + } + $form->{"project_id_$j"} = $ref->{project_id}; + } else { - $form->{"accno_$i"} = "$ref->{accno}--$ref->{accnotaxkey}"; + $form->{"accno_id_$i"} = $ref->{chart_id}; for (qw(fx_transaction source memo)) { $form->{"${_}_$i"} = $ref->{$_} } if ($ref->{amount} < 0) { $form->{totaldebit} -= $ref->{amount}; @@ -170,6 +283,8 @@ sub edit { $form->{totalcredit} += $ref->{amount}; $form->{"credit_$i"} = $ref->{amount}; } + $form->{"taxchart_$i"} = $ref->{id}."--0.00000"; + $form->{"project_id_$i"} = $ref->{project_id}; $i++; } if ($ref->{taxaccno} && !$tax) { @@ -179,7 +294,6 @@ sub edit { $taxaccno = ""; $tax = 0; } - } $form->{rowcount} = $i; @@ -187,717 +301,372 @@ sub edit { ($form->datetonum($form->{transdate}, \%myconfig) <= $form->datetonum($form->{closedto}, \%myconfig)); - $form->{title} = "Edit"; - - &form_header; - &display_rows; - &form_footer; - $lxdebug->leave_sub(); - + $main::lxdebug->leave_sub(); } -sub search { - $lxdebug->enter_sub(); +sub edit { + $main::lxdebug->enter_sub(); - $form->{title} = $locale->text('Buchungsjournal'); + $main::auth->assert('gl_transactions'); - $form->all_departments(\%myconfig); + my $form = $main::form; + my %myconfig = %main::myconfig; - # departments - if (@{ $form->{all_departments} }) { - $form->{selectdepartment} = "\n"; + prepare_transaction(); - map { - $form->{selectdepartment} .= - "$_->{description}--$_->{id}\n" - } (@{ $form->{all_departments} }); + $form->{title} = "Edit"; + + $form->{show_details} = $myconfig{show_form_details} unless defined $form->{show_details}; + + if ($form->{id} && $::instance_conf->get_webdav) { + my $webdav = SL::Webdav->new( + type => 'general_ledger', + number => $form->{id}, + ); + 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(); - $department = qq| - - | . $locale->text('Department') . qq| - $form->{selectdepartment} - -| if $form->{selectdepartment}; - - # use JavaScript Calendar or not - $form->{jsscript} = $jscalendar; - $jsscript = ""; - if ($form->{jsscript}) { - - # with JavaScript Calendar - $button1 = qq| - - text('button') . qq|> - |; - $button2 = qq| - - text('button') . qq|> - |; - - #write Trigger - $jsscript = - Form->write_trigger(\%myconfig, "2", "datefrom", "BR", "trigger1", - "dateto", "BL", "trigger2"); - } else { + $main::lxdebug->leave_sub(); +} - # without JavaScript Calendar - $button1 = - qq||; - $button2 = - qq||; - } - $form->header; +sub search { + $::lxdebug->enter_sub; + $::auth->assert('general_ledger | gl_transactions'); - print qq| - + $::form->get_lists( + projects => { key => "ALL_PROJECTS", all => 1 }, + ); + $::form->{ALL_EMPLOYEES} = SL::DB::Manager::Employee->get_all_sorted(query => [ deleted => 0 ]); + $::form->{ALL_DEPARTMENTS} = SL::DB::Manager::Department->get_all_sorted; -{script}> + setup_gl_search_action_bar(); - + $::form->header; + print $::form->parse_html_template('gl/search', { + employee_label => sub { "$_[0]{id}--$_[0]{name}" }, + }); - - - $form->{title} - - - - - - - | . $locale->text('Reference') . qq| - - | . $locale->text('Source') . qq| - - - $department - - | . $locale->text('Description') . qq| - - - - | . $locale->text('Notes') . qq| - - - - | . $locale->text('From') . qq| - $button1 - $button2 - - - | . $locale->text('Include in Report') . qq| - - - - - | - . $locale->text('All') . qq| - | - . $locale->text('Asset') . qq| - | - . $locale->text('Contra') . qq| - | - . $locale->text('Liability') . qq| - | - . $locale->text('Equity') . qq| - | - . $locale->text('Revenue') . qq| - | - . $locale->text('Expense') . qq| - - - - - - - | . $locale->text('ID') . qq| - - | . $locale->text('Date') . qq| - - | . $locale->text('Reference') . qq| - - | . $locale->text('Description') . qq| - - | . $locale->text('Notes') . qq| - - - - | . $locale->text('Debit') . qq| - - | . $locale->text('Credit') . qq| - - | . $locale->text('Source') . qq| - - | . $locale->text('Account') . qq| - - | . $locale->text('GIFI') . qq| - - - - | . $locale->text('Subtotal') . qq| - - - - - - - - - - - - + $::lxdebug->leave_sub; +} -$jsscript +sub create_subtotal_row { + $main::lxdebug->enter_sub(); - + my ($totals, $columns, $column_alignment, $subtotal_columns, $class) = @_; -{path}> -{login}> -{password}> + my $form = $main::form; + my %myconfig = %main::myconfig; - - - + my $row = { map { $_ => { 'data' => '', 'class' => $class, 'align' => $column_alignment->{$_}, } } @{ $columns } }; - -