X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fir.pl;h=c5f137f99f7606d29c1483ff0e52cd5e0be41d0a;hb=4c6e9282cff83ba335a03e39536df3fa7b3b2101;hp=ee0e813a403a08624f937078a26721ea854e1d5a;hpb=7933b6bd762c5bac0f0a6bc401ede33c30ece67b;p=kivitendo-erp.git diff --git a/bin/mozilla/ir.pl b/bin/mozilla/ir.pl index ee0e813a4..c5f137f99 100644 --- a/bin/mozilla/ir.pl +++ b/bin/mozilla/ir.pl @@ -31,30 +31,61 @@ # #====================================================================== +use SL::FU; use SL::IR; +use SL::IS; use SL::PE; +use SL::DB::Default; +use SL::DB::PurchaseInvoice; +use List::Util qw(max sum); +use List::UtilsBy qw(sort_by); -require "$form->{path}/io.pl"; -require "$form->{path}/arap.pl"; +require "bin/mozilla/io.pl"; +require "bin/mozilla/arap.pl"; +require "bin/mozilla/common.pl"; + +use strict; 1; # end of main sub add { - $lxdebug->enter_sub(); -print STDERR "ir.pl-add\n"; - $form->{title} = $locale->text('Add Vendor Invoice'); + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my $locale = $main::locale; + + $main::auth->assert('vendor_invoice_edit'); + + if (!$::instance_conf->get_allow_new_purchase_invoice) { + $::form->show_generic_error($::locale->text("You do not have the permissions to access this function.")); + } + + $form->{show_details} = $::myconfig{show_form_details}; + + $form->{title} = $locale->text('Record Vendor Invoice'); &invoice_links; &prepare_invoice; &display_form; - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub edit { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my $locale = $main::locale; + + $main::auth->assert('vendor_invoice_edit'); + + $form->{show_details} = $::myconfig{show_form_details}; + + # show history button + $form->{javascript} = qq||; + #/show hhistory button $form->{title} = $locale->text('Edit Vendor Invoice'); @@ -62,45 +93,51 @@ sub edit { &prepare_invoice; &display_form; - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub invoice_links { - $lxdebug->enter_sub(); -print STDERR "ir.pl-invoice_links\n"; - # create links - $form->{webdav} = $webdav; + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my %myconfig = %main::myconfig; - # set jscalendar - $form->{jscalendar} = $jscalendar; + $main::auth->assert('vendor_invoice_edit'); + $form->{vc} = 'vendor'; + + # create links $form->create_links("AP", \%myconfig, "vendor"); + #quote all_vendor Bug 133 + foreach my $ref (@{ $form->{all_vendor} }) { + $ref->{name} = $form->quote($ref->{name}); + } + if ($form->{all_vendor}) { unless ($form->{vendor_id}) { $form->{vendor_id} = $form->{all_vendor}->[0]->{id}; } } - $cp_id = $form->{cp_id}; + $form->backup_vars(qw(payment_id language_id taxzone_id + currency delivery_term_id intnotes cp_id)); + IR->get_vendor(\%myconfig, \%$form); IR->retrieve_invoice(\%myconfig, \%$form); - $form->{cp_id} = $cp_id; - # currencies - @curr = split /:/, $form->{currencies}; - chomp $curr[0]; - $form->{defaultcurrency} = $curr[0]; + $form->restore_vars(qw(payment_id language_id taxzone_id + currency delivery_term_id intnotes cp_id)); + my @curr = $form->get_all_currencies(); map { $form->{selectcurrency} .= "$_\n" } @curr; $form->{oldvendor} = "$form->{vendor}--$form->{vendor_id}"; - # vendors - if ($form->{all_vendor}) { - $form->{vendor} = "$form->{vendor}--$form->{vendor_id}"; - map { $form->{selectvendor} .= "$_->{name}--$_->{id}\n" } - (@{ $form->{all_vendor} }); + # build vendor/customer drop down comatibility... don't ask + if (@{ $form->{"all_vendor"} || [] }) { + $form->{"selectvendor"} = 1; + $form->{vendor} = qq|$form->{vendor}--$form->{vendor_id}|; } # departments @@ -111,28 +148,32 @@ print STDERR "ir.pl-invoice_links\n"; map { $form->{selectdepartment} .= "$_->{description}--$_->{id}\n" - } (@{ $form->{all_departments} }); + } (@{ $form->{all_departments} || [] }); } # forex $form->{forex} = $form->{exchangerate}; - $exchangerate = ($form->{exchangerate}) ? $form->{exchangerate} : 1; + my $exchangerate = ($form->{exchangerate}) ? $form->{exchangerate} : 1; - foreach $key (keys %{ $form->{AP_links} }) { + foreach my $key (keys %{ $form->{AP_links} }) { - foreach $ref (@{ $form->{AP_links}{$key} }) { - $form->{"select$key"} .= "$ref->{accno}--$ref->{description}\n"; + foreach my $ref (@{ $form->{AP_links}{$key} }) { + $form->{"select$key"} .= "$ref->{accno}--$ref->{description}"; } + next unless $form->{acc_trans}{$key}; + if ($key eq "AP_paid") { - for $i (1 .. scalar @{ $form->{acc_trans}{$key} }) { + for my $i (1 .. scalar @{ $form->{acc_trans}{$key} }) { $form->{"AP_paid_$i"} = "$form->{acc_trans}{$key}->[$i-1]->{accno}--$form->{acc_trans}{$key}->[$i-1]->{description}"; + $form->{"acc_trans_id_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{acc_trans_id}; # reverse paid $form->{"paid_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{amount}; $form->{"datepaid_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{transdate}; + $form->{"gldate_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{gldate}; $form->{"forex_$i"} = $form->{"exchangerate_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{exchangerate}; $form->{"source_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{source}; @@ -155,31 +196,45 @@ print STDERR "ir.pl-invoice_links\n"; ($form->datetonum($form->{invdate}, \%myconfig) <= $form->datetonum($form->{closedto}, \%myconfig)); - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub prepare_invoice { - $lxdebug->enter_sub(); -print STDERR "ir.pl-prepare_invoice\n"; + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my %myconfig = %main::myconfig; + + $main::auth->assert('vendor_invoice_edit'); + + $form->{type} = "purchase_invoice"; + if ($form->{id}) { map { $form->{$_} =~ s/\"/"/g } qw(invnumber ordnumber quonumber); - foreach $ref (@{ $form->{invoice_details} }) { + my $i = 0; + foreach my $ref (@{ $form->{invoice_details} }) { $i++; map { $form->{"${_}_$i"} = $ref->{$_} } keys %{$ref}; - - ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/); + # übernommen aus is.pl Fix für Bug 1642. Nebenwirkungen? jb 12.5.2011 + # getestet: Lieferantenauftrag -> Rechnung i.O. + # Lieferantenauftrag -> Lieferschein -> Rechnung i.O. + # Werte: 20% (Lieferantenrabatt), 12,4% individuell und 0,4 individuell s.a. + # Screenshot zu Bug 1642 + $form->{"discount_$i"} = $form->format_amount(\%myconfig, $form->{"discount_$i"} * 100); + + my ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/); $dec = length $dec; - $decimalplaces = ($dec > 2) ? $dec : 2; + my $decimalplaces = ($dec > 2) ? $dec : 2; $form->{"sellprice_$i"} = $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces); - + (my $dec_qty) = ($form->{"qty_$i"} =~ /\.(\d+)/); - $dec_qty = length $dec_qty; - + $dec_qty = length $dec_qty; + $form->{"qty_$i"} = $form->format_amount(\%myconfig, ($form->{"qty_$i"} * -1), $dec_qty); @@ -187,592 +242,269 @@ print STDERR "ir.pl-prepare_invoice\n"; } } - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub form_header { - $lxdebug->enter_sub(); -print STDERR "ir.pl-form_header\n"; - # set option selected - foreach $item (qw(AP vendor currency department contact)) { + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my %myconfig = %main::myconfig; + my $locale = $main::locale; + my $cgi = $::request->{cgi}; + + $main::auth->assert('vendor_invoice_edit'); + + my %TMPL_VAR = (); + my @custom_hiddens; + + $TMPL_VAR{invoice_obj} = SL::DB::PurchaseInvoice->new(id => $form->{id})->load if $form->{id}; + $form->{employee_id} = $form->{old_employee_id} if $form->{old_employee_id}; + $form->{salesman_id} = $form->{old_salesman_id} if $form->{old_salesman_id}; + + $form->{defaultcurrency} = $form->get_default_currency(\%myconfig); + + my @old_project_ids = ($form->{"globalproject_id"}); + map { push @old_project_ids, $form->{"project_id_$_"} if $form->{"project_id_$_"}; } 1..$form->{"rowcount"}; + + $form->get_lists("projects" => { "key" => "ALL_PROJECTS", + "all" => 0, + "old_id" => \@old_project_ids }, + "taxzones" => "ALL_TAXZONES", + "currencies" => "ALL_CURRENCIES", + "vendors" => "ALL_VENDORS", + "departments" => "all_departments", + "price_factors" => "ALL_PRICE_FACTORS"); + + $TMPL_VAR{ALL_EMPLOYEES} = SL::DB::Manager::Employee->get_all_sorted(query => [ or => [ id => $::form->{employee_id}, deleted => 0 ] ]); + $TMPL_VAR{ALL_CONTACTS} = SL::DB::Manager::Contact->get_all_sorted(query => [ + or => [ + cp_cv_id => $::form->{"$::form->{vc}_id"} * 1, + and => [ + cp_cv_id => undef, + cp_id => $::form->{cp_id} * 1 + ] + ] + ]); + $TMPL_VAR{department_labels} = sub { "$_[0]->{description}--$_[0]->{id}" }; + + # customer + $TMPL_VAR{vc_keys} = sub { "$_[0]->{name}--$_[0]->{id}" }; + $TMPL_VAR{vclimit} = $myconfig{vclimit}; + $TMPL_VAR{vc_select} = "customer_or_vendor_selection_window('vendor', '', 1, 0)"; + push @custom_hiddens, "vendor_id"; + push @custom_hiddens, "oldvendor"; + push @custom_hiddens, "selectvendor"; + + # currencies and exchangerate + my @values = map { $_ } @{ $form->{ALL_CURRENCIES} }; + my %labels = map { $_ => $_ } @{ $form->{ALL_CURRENCIES} }; + $form->{currency} = $form->{defaultcurrency} unless $form->{currency}; + # show_exchangerate is also later needed in another template + $form->{show_exchangerate} = $form->{currency} ne $form->{defaultcurrency}; + $TMPL_VAR{currencies} = NTI($cgi->popup_menu('-name' => 'currency', '-default' => $form->{"currency"}, + '-values' => \@values, '-labels' => \%labels, + '-onchange' => "document.getElementById('update_button').click();" + )) if scalar @values; + push @custom_hiddens, "forex"; + push @custom_hiddens, "exchangerate" if $form->{forex}; + + $TMPL_VAR{creditwarning} = ($form->{creditlimit} != 0) && ($form->{creditremaining} < 0) && !$form->{update}; + $TMPL_VAR{is_credit_remaining_negativ} = $form->{creditremaining} =~ /-/; + + my $follow_up_vc = $form->{vendor}; + $follow_up_vc =~ s/--\d*\s*$//; + $TMPL_VAR{vendor_name} = $follow_up_vc; + +# set option selected + foreach my $item (qw(AP)) { $form->{"select$item"} =~ s/ selected//; - $form->{"select$item"} =~ - s/option>\Q$form->{$item}\E/option selected>$form->{$item}/; + $form->{"select$item"} =~ s/option>\Q$form->{$item}\E/option selected>$form->{$item}/; } - $form->{exchangerate} = - $form->format_amount(\%myconfig, $form->{exchangerate}); + $TMPL_VAR{is_type_credit_note} = $form->{type} eq "credit_note"; + $TMPL_VAR{is_format_html} = $form->{format} eq 'html'; + $TMPL_VAR{dateformat} = $myconfig{dateformat}; + $TMPL_VAR{numberformat} = $myconfig{numberformat}; - $form->{creditlimit} = - $form->format_amount(\%myconfig, $form->{creditlimit}, 0, "0"); - $form->{creditremaining} = - $form->format_amount(\%myconfig, $form->{creditremaining}, 0, "0"); + # hiddens + $TMPL_VAR{HIDDENS} = [qw( + id action type media format queued printed emailed title vc discount + title creditlimit creditremaining tradediscount business closedto locked shipped storno storno_id + max_dunning_level dunning_amount + shiptoname shiptostreet shiptozipcode shiptocity shiptocountry shiptogln shiptocontact shiptophone shiptofax + shiptoemail shiptodepartment_1 shiptodepartment_2 message email subject cc bcc taxaccounts cursor_fokus + convert_from_do_ids convert_from_oe_ids convert_from_ap_ids show_details gldate useasnew + ), @custom_hiddens, + map { $_.'_rate', $_.'_description', $_.'_taxnumber' } split / /, $form->{taxaccounts}]; - #build contacts - if ($form->{all_contacts}) { + $TMPL_VAR{payment_terms_obj} = get_payment_terms_for_invoice(); + $form->{duedate} = $TMPL_VAR{payment_terms_obj}->calc_date(reference_date => $form->{invdate}, due_date => $form->{due_due})->to_kivitendo if $TMPL_VAR{payment_terms_obj}; - $form->{selectcontact} = ""; - foreach $item (@{ $form->{all_contacts} }) { - if ($form->{cp_id} == $item->{cp_id}) { - $form->{selectcontact} .= - "$item->{cp_name}--$item->{cp_id}"; - } else { - $form->{selectcontact} .= "$item->{cp_name}--$item->{cp_id}"; - } - } - } + $::request->{layout}->use_javascript(map { "${_}.js" } qw(kivi.Draft kivi.SalesPurchase ckeditor/ckeditor ckeditor/adapters/jquery kivi.io autocomplete_customer autocomplete_part client_js)); - $exchangerate = ""; - if ($form->{currency} ne $form->{defaultcurrency}) { - if ($form->{forex}) { - $exchangerate .= qq| - | - . $locale->text('Exchangerate') - . qq| - $form->{exchangerate}{exchangerate}> -|; - } else { - $exchangerate .= qq| - | - . $locale->text('Exchangerate') - . qq| - {exchangerate}> -|; - } - } - $exchangerate .= qq| -{forex}> -|; + $form->header(); - $vendor = - ($form->{selectvendor}) - ? qq|$form->{selectvendor}\n| - : qq||; - - $contact = - ($form->{selectcontact}) - ? qq|$form->{selectcontact}\n| - : qq||; - - $department = qq| - - | . $locale->text('Department') . qq| - $form->{selectdepartment} - - - -| if $form->{selectdepartment}; - - $n = ($form->{creditremaining} =~ /-/) ? "0" : "1"; - - # use JavaScript Calendar or not - $form->{jsscript} = $form->{jscalendar}; - $jsscript = ""; - if ($form->{jsscript}) { - - # with JavaScript Calendar - $button1 = qq| - {invdate}> - text('button') - . qq|> - |; - $button2 = qq| - {duedate}> - text('button') - . qq|> - |; - - #write Trigger - $jsscript = - Form->write_trigger(\%myconfig, "2", "invdate", "BL", "trigger1", - "duedate", "BL", "trigger2"); - } else { + print $form->parse_html_template("ir/form_header", \%TMPL_VAR); - # without JavaScript Calendar - $button1 = - qq|{invdate}>|; - $button2 = - qq|{duedate}>|; - } - - $form->header; + $main::lxdebug->leave_sub(); +} - print qq| - +sub _sort_payments { + my @fields = qw(acc_trans_id gldate datepaid source memo paid AP_paid); + my @payments = + grep { $_->{paid} != 0 } + map { + my $idx = $_; + +{ map { ($_ => delete($::form->{"${_}_${idx}"})) } @fields } + } (1..$::form->{paidaccounts}); -{script}> + @payments = sort_by { DateTime->from_kivitendo($_->{datepaid}) } @payments; -{id}> - - -{type}> -{level}> - -{creditlimit}> -{creditremaining}> - -{closedto}> -{locked}> - -{shipped}> - - - - - $form->{title} - - - - - - - - - - | . $locale->text('Vendor') . qq| - $vendor - - | - . $locale->text('Contact Person') - . qq| - $contact - - {vendor_id}> - - - - - - - - - | . $locale->text('Credit Limit') . qq| - $form->{creditlimit} - - | . $locale->text('Remaining') . qq| - $form->{creditremaining} - - - - - | . $locale->text('Record in') . qq| - $form->{selectAP} - - - $department - - | . $locale->text('Currency') . qq| - $form->{selectcurrency} - $exchangerate - - - - - - - | . $locale->text('Invoice Number') . qq| - - - - | . $locale->text('Invoice Date') . qq| - $button1 - - - | . $locale->text('Due Date') . qq| - $button2 - - - | . $locale->text('Order Number') . qq| - - - - - - - - - - -$jsscript - - -{defaultcurrency}> -{fxgain_accno}> -{fxloss_accno}> - - - - - - -|; + $::form->{paidaccounts} = max scalar(@payments), 1; - foreach $item (split / /, $form->{taxaccounts}) { - print qq| -{"${item}_rate"}> - -|; + foreach my $idx (1 .. scalar(@payments)) { + my $payment = $payments[$idx - 1]; + $::form->{"${_}_${idx}"} = $payment->{$_} for @fields; } - - $lxdebug->leave_sub(); } sub form_footer { - $lxdebug->enter_sub(); -print STDERR "ir.pl-form_footer\n"; - $form->{invtotal} = $form->{invsubtotal}; - - if (($rows = $form->numtextrows($form->{notes}, 25, 8)) < 2) { - $rows = 2; - } - if (($introws = $form->numtextrows($form->{intnotes}, 35, 8)) < 2) { - $introws = 2; - } - $rows = ($rows > $introws) ? $rows : $introws; - $notes = - qq|$form->{notes}|; - $intnotes = - qq|$form->{intnotes}|; - - $form->{taxincluded} = ($form->{taxincluded}) ? "checked" : ""; - - $taxincluded = ""; - if ($form->{taxaccounts}) { - $taxincluded = qq| - {taxincluded}> | - . $locale->text('Tax Included') . qq| -|; - } + $main::lxdebug->enter_sub(); - if (!$form->{taxincluded}) { - - foreach $item (split / /, $form->{taxaccounts}) { - if ($form->{"${item}_base"}) { - $form->{invtotal} += $form->{"${item}_total"} = - $form->round_amount( - $form->{"${item}_base"} * $form->{"${item}_rate"}, - 2); - $form->{"${item}_total"} = - $form->format_amount(\%myconfig, $form->{"${item}_total"}, 2); - - $tax .= qq| - - $form->{"${item}_description"} - $form->{"${item}_total"} - -|; - } - } - - $form->{invsubtotal} = - $form->format_amount(\%myconfig, $form->{invsubtotal}, 2, 0); - - $subtotal = qq| - - | . $locale->text('Subtotal') . qq| - $form->{invsubtotal} - -|; - - } - - if ($form->{taxincluded}) { - foreach $item (split / /, $form->{taxaccounts}) { - if ($form->{"${item}_base"}) { - $form->{"${item}_total"} = - $form->round_amount( - ($form->{"${item}_base"} * $form->{"${item}_rate"} / - (1 + $form->{"${item}_rate"}) - ), - 2); - $form->{"${item}_base"} = - $form->round_amount($form->{"${item}_base"}, 2); - $form->{"${item}_netto"} = - $form->round_amount( - ($form->{"${item}_base"} - $form->{"${item}_total"}), - 2); - $form->{"${item}_netto"} = - $form->format_amount(\%myconfig, $form->{"${item}_netto"}, 2); - $form->{"${item}_total"} = - $form->format_amount(\%myconfig, $form->{"${item}_total"}, 2); - - $tax .= qq| - - Enthaltene $form->{"${item}_description"} - $form->{"${item}_total"} - - - Nettobetrag - $form->{"${item}_netto"} - -|; - } - } + my $form = $main::form; + my %myconfig = %main::myconfig; + my $locale = $main::locale; - } + $main::auth->assert('vendor_invoice_edit'); + $form->{invtotal} = $form->{invsubtotal}; $form->{oldinvtotal} = $form->{invtotal}; - $form->{invtotal} = - $form->format_amount(\%myconfig, $form->{invtotal}, 2, 0); - print qq| - - - - - - - - | . $locale->text('Notes') . qq| - | . $locale->text('Internal Notes') . qq| - - - $notes - $intnotes - - - - - $taxincluded - - - $subtotal - $tax - 0 - | . $locale->text('Total') . qq| - $form->{invtotal} - - - - - - - -|; - if ($webdav) { - $webdav_list = qq| - - - - - Dokumente im Webdav-Repository - - - Dateiname - Webdavlink -|; - foreach $file (keys %{ $form->{WEBDAV} }) { - $webdav_list .= qq| - - $file - $form->{WEBDAV}{$file} - -|; - } - $webdav_list .= qq| - - -|; + # note rows + $form->{rows} = max 2, + $form->numtextrows($form->{notes}, 26, 8), + $form->numtextrows($form->{intnotes}, 35, 8); - print $webdav_list; - } - print qq| -{jscalendar}> -|; - print qq| - - - - - | . $locale->text('Payments') . qq| - -|; - if ($form->{currency} eq $form->{defaultcurrency}) { - @column_index = qw(datepaid source memo paid AP_paid); - } else { - @column_index = qw(datepaid source memo paid exchangerate AP_paid); - } - - $column_data{datepaid} = "" . $locale->text('Date') . ""; - $column_data{paid} = "" . $locale->text('Amount') . ""; - $column_data{exchangerate} = "" . $locale->text('Exch') . ""; - $column_data{AP_paid} = "" . $locale->text('Account') . ""; - $column_data{source} = "" . $locale->text('Source') . ""; - $column_data{memo} = "" . $locale->text('Memo') . ""; - - print qq| - -|; - map { print "$column_data{$_}\n" } @column_index; - print qq| - -|; + # tax, total and subtotal calculations + my ($tax, $subtotal); + $form->{taxaccounts_array} = [ split / /, $form->{taxaccounts} ]; - $form->{paidaccounts}++ if ($form->{"paid_$form->{paidaccounts}"}); - for $i (1 .. $form->{paidaccounts}) { - - print qq| - -|; - - $form->{"selectAP_paid_$i"} = $form->{selectAP_paid}; - $form->{"selectAP_paid_$i"} =~ - s/option>\Q$form->{"AP_paid_$i"}\E/option selected>$form->{"AP_paid_$i"}/; - - # format amounts - $form->{"paid_$i"} = - $form->format_amount(\%myconfig, $form->{"paid_$i"}, 2); - $form->{"exchangerate_$i"} = - $form->format_amount(\%myconfig, $form->{"exchangerate_$i"}); - - $exchangerate = qq| |; - if ($form->{currency} ne $form->{defaultcurrency}) { - if ($form->{"forex_$i"}) { - $exchangerate = - qq|{"exchangerate_$i"}>$form->{"exchangerate_$i"}|; + foreach my $item (@{ $form->{taxaccounts_array} }) { + if ($form->{"${item}_base"}) { + if ($form->{taxincluded}) { + $form->{"${item}_total"} = $form->round_amount( ($form->{"${item}_base"} * $form->{"${item}_rate"} + / (1 + $form->{"${item}_rate"})), 2); + $form->{"${item}_netto"} = $form->round_amount( ($form->{"${item}_base"} - $form->{"${item}_total"}), 2); } else { - $exchangerate = - qq|{"exchangerate_$i"}>|; + $form->{"${item}_total"} = $form->round_amount( $form->{"${item}_base"} * $form->{"${item}_rate"}, 2); + $form->{invtotal} += $form->{"${item}_total"}; } } - $exchangerate .= qq| -{"forex_$i"}> -|; - - $column_data{"paid_$i"} = - qq|{"paid_$i"}>|; - $column_data{"exchangerate_$i"} = qq|$exchangerate|; - $column_data{"AP_paid_$i"} = - qq|$form->{"selectAP_paid_$i"}|; - $column_data{"datepaid_$i"} = - qq|{"datepaid_$i"}>|; - $column_data{"source_$i"} = - qq|{"source_$i"}>|; - $column_data{"memo_$i"} = - qq|{"memo_$i"}>|; - - map { print qq|$column_data{"${_}_$i"}\n| } @column_index; - - print qq| - -|; } - print qq| - {oldinvtotal}> - {paidaccounts}> - - - - - - - - - -|; - - $invdate = $form->datetonum($form->{invdate}, \%myconfig); - $closedto = $form->datetonum($form->{closedto}, \%myconfig); - + # follow ups if ($form->{id}) { - print qq| -|; + $form->{follow_ups} = FU->follow_ups('trans_id' => $form->{id}, 'not_done' => 1) || []; + $form->{follow_ups_unfinished} = ( sum map { $_->{due} * 1 } @{ $form->{follow_ups} } ) || 0; + } - if (!$form->{revtrans}) { - if (!$form->{locked}) { - print qq| - - -|; - } + # payments + _sort_payments(); + + my $totalpaid = 0; + $form->{paidaccounts}++ if ($form->{"paid_$form->{paidaccounts}"}); + $form->{paid_indices} = [ 1 .. $form->{paidaccounts} ]; + + # Standard Konto für Umlaufvermögen + my $accno_arap = IS->get_standard_accno_current_assets(\%myconfig, \%$form); + + for my $i (1 .. $form->{paidaccounts}) { + $form->{"changeable_$i"} = 1; + if (SL::DB::Default->get->payments_changeable == 0) { + # never + $form->{"changeable_$i"} = ($form->{"acc_trans_id_$i"})? 0 : 1; + } elsif (SL::DB::Default->get->payments_changeable == 2) { + # on the same day + $form->{"changeable_$i"} = (($form->{"gldate_$i"} eq '') || + ($form->current_date(\%myconfig) eq $form->{"gldate_$i"})); } - if ($invdate > $closedto) { - print qq| - - -|; + $form->error($locale->text('Cannot post transaction above the maximum future booking date!')) + if ($form->date_max_future($form->{"datepaid_$i"}, \%myconfig)); + + #deaktivieren von Zahlungen ausserhalb der Bücherkontrolle + if ($form->date_closed($form->{"gldate_$i"})) { + $form->{"changeable_$i"} = 0; } - } else { - if ($invdate > $closedto) { - print qq| - |; + $form->{"selectAP_paid_$i"} = $form->{selectAP_paid}; + if (!$form->{"AP_paid_$i"}) { + $form->{"selectAP_paid_$i"} =~ s/option>$accno_arap--(.*?)>/option selected>$accno_arap--$1>/; + } else { + $form->{"selectAP_paid_$i"} =~ s/option>\Q$form->{"AP_paid_$i"}\E/option selected>$form->{"AP_paid_$i"}/; } - } - if ($form->{menubar}) { - require "$form->{path}/menu.pl"; - &menubar; + $totalpaid += $form->{"paid_$i"}; } - print qq| - -{rowcount}> + $form->{ALL_DELIVERY_TERMS} = SL::DB::Manager::DeliveryTerm->get_all_sorted(); + + print $form->parse_html_template('ir/form_footer', { + is_type_credit_note => ($form->{type} eq "credit_note"), + totalpaid => $totalpaid, + paid_missing => $form->{invtotal} - $totalpaid, + show_storno => $form->{id} && !$form->{storno} && !IS->has_storno(\%myconfig, $form, "ap") && !$totalpaid, + show_delete => ($::instance_conf->get_ir_changeable == 2) + ? ($form->current_date(\%myconfig) eq $form->{gldate}) + : ($::instance_conf->get_ir_changeable == 1), + today => DateTime->today, + }); +##print $form->parse_html_template('ir/_payments'); # parser +##print $form->parse_html_template('webdav/_list'); # parser + + $main::lxdebug->leave_sub(); +} - +sub mark_as_paid { + $main::lxdebug->enter_sub(); -{path}> -{login}> -{password}> + my $form = $main::form; + my %myconfig = %main::myconfig; - + $main::auth->assert('vendor_invoice_edit'); - -