X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FForm.pm;h=35b21d5a291cace26da7d823eb8456324b74882d;hb=bf19eeda5d339c95bde5334727bd9a6802375a8d;hp=171b5fff41abd038470074bf5f89ca6fd0a1ba90;hpb=3270e88361efc8ceff21314b489732229f0f98f7;p=kivitendo-erp.git
diff --git a/SL/Form.pm b/SL/Form.pm
index 171b5fff4..35b21d5a2 100644
--- a/SL/Form.pm
+++ b/SL/Form.pm
@@ -66,6 +66,7 @@ use SL::IC;
use SL::IS;
use SL::Layout::Dispatcher;
use SL::Locale;
+use SL::Locale::String;
use SL::Mailer;
use SL::Menu;
use SL::MoreCommon qw(uri_encode uri_decode);
@@ -91,7 +92,8 @@ END {
sub disconnect_standard_dbh {
return unless $standard_dbh;
- $standard_dbh->disconnect();
+
+ $standard_dbh->rollback();
undef $standard_dbh;
}
@@ -467,16 +469,18 @@ sub header {
# standard css for all
# this should gradually move to the layouts that need it
$layout->use_stylesheet("$_.css") for qw(
- main menu list_accounts jquery.autocomplete
+ main menu common list_accounts jquery.autocomplete
jquery.multiselect2side
ui-lightness/jquery-ui
jquery-ui.custom
+ tooltipster themes/tooltipster-light
);
$layout->use_javascript("$_.js") for (qw(
jquery jquery-ui jquery.cookie jquery.checkall jquery.download
jquery/jquery.form jquery/fixes client_js
- common part_selection switchmenuframe autocomplete_part
+ jquery/jquery.tooltipster.min
+ common part_selection switchmenuframe
), "jquery/ui/i18n/jquery.ui.datepicker-$::myconfig{countrycode}");
$self->{favicon} ||= "favicon.ico";
@@ -536,7 +540,7 @@ sub footer {
print $::request->{layout}->post_content;
if (my @inline_scripts = $::request->{layout}->javascripts_inline) {
- print "\n";
+ print "\n";
}
print <leave_sub;
}
+sub prepare_global_vars {
+ my ($self) = @_;
+
+ $self->{AUTH} = $::auth;
+ $self->{INSTANCE_CONF} = $::instance_conf;
+ $self->{LOCALE} = $::locale;
+ $self->{LXCONFIG} = $::lx_office_conf;
+ $self->{LXDEBUG} = $::lxdebug;
+ $self->{MYCONFIG} = \%::myconfig;
+}
+
sub _prepare_html_template {
$main::lxdebug->enter_sub();
@@ -807,6 +822,7 @@ sub format_amount {
my $force_places = defined $places && $places >= 0;
$amount = $self->round_amount($amount, abs $places) if $force_places;
+ $neg = 0 if $amount == 0; # don't show negative zero
$amount = sprintf "%.*f", ($force_places ? $places : 10), abs $amount; # 6 is default for %fa
# before the sprintf amount was a number, afterwards it's a string. because of the dynamic nature of perl
@@ -947,12 +963,18 @@ sub parse_amount {
# Make sure no code wich is not a math expression ends up in eval().
return 0 unless $amount =~ /^ [\s \d \( \) \- \+ \* \/ \. ]* $/x;
+
+ # Prevent numbers from being parsed as octals;
+ $amount =~ s{ (?{media} eq 'email') {
- my $mail = new Mailer;
+ my $mail = Mailer->new;
map { $mail->{$_} = $self->{$_} }
qw(cc bcc subject message version format);
@@ -1235,6 +1257,7 @@ sub get_formname_translation {
sales_delivery_order => $main::locale->text('Delivery Order'),
purchase_delivery_order => $main::locale->text('Delivery Order'),
dunning => $main::locale->text('Dunning'),
+ letter => $main::locale->text('Letter')
);
$main::lxdebug->leave_sub();
@@ -1249,8 +1272,13 @@ sub get_number_prefix_for_type {
(first { $self->{type} eq $_ } qw(invoice credit_note)) ? 'inv'
: ($self->{type} =~ /_quotation$/) ? 'quo'
: ($self->{type} =~ /_delivery_order$/) ? 'do'
+ : ($self->{type} =~ /letter/) ? 'letter'
: 'ord';
+ # better default like this?
+ # : ($self->{type} =~ /(sales|purcharse)_order/ : 'ord';
+ # : 'prefix_undefined';
+
$main::lxdebug->leave_sub();
return $prefix;
}
@@ -1286,6 +1314,9 @@ sub generate_attachment_filename {
} elsif ($attachment_filename && $self->{"${prefix}number"}) {
$attachment_filename .= "_" . $self->{"${prefix}number"} . $self->get_extension_for_format();
+ } elsif ($attachment_filename) {
+ $attachment_filename .= $self->get_extension_for_format();
+
} else {
$attachment_filename = "";
}
@@ -1690,36 +1721,19 @@ sub get_default_currency {
}
sub set_payment_options {
- $main::lxdebug->enter_sub();
-
my ($self, $myconfig, $transdate) = @_;
- return $main::lxdebug->leave_sub() unless ($self->{payment_id});
-
- my $dbh = $self->get_standard_dbh($myconfig);
-
- my $query =
- qq|SELECT p.terms_netto, p.terms_skonto, p.percent_skonto, p.description_long , p.description | .
- qq|FROM payment_terms p | .
- qq|WHERE p.id = ?|;
+ my $terms = $self->{payment_id} ? SL::DB::PaymentTerm->new(id => $self->{payment_id})->load : undef;
+ return if !$terms;
- ($self->{terms_netto}, $self->{terms_skonto}, $self->{percent_skonto},
- $self->{payment_terms}, $self->{payment_description}) =
- selectrow_query($self, $dbh, $query, $self->{payment_id});
-
- if ($transdate eq "") {
- if ($self->{invdate}) {
- $transdate = $self->{invdate};
- } else {
- $transdate = $self->{transdate};
- }
- }
+ $transdate ||= $self->{invdate} || $self->{transdate};
+ my $due_date = $self->{duedate} || $self->{reqdate};
- $query =
- qq|SELECT ?::date + ?::integer AS netto_date, ?::date + ?::integer AS skonto_date | .
- qq|FROM payment_terms|;
- ($self->{netto_date}, $self->{skonto_date}) =
- selectrow_query($self, $dbh, $query, $transdate, $self->{terms_netto}, $transdate, $self->{terms_skonto});
+ $self->{$_} = $terms->$_ for qw(terms_netto terms_skonto percent_skonto);
+ $self->{payment_terms} = $terms->description_long;
+ $self->{payment_description} = $terms->description;
+ $self->{netto_date} = $terms->calc_date(reference_date => $transdate, due_date => $due_date, terms => 'net')->to_kivitendo;
+ $self->{skonto_date} = $terms->calc_date(reference_date => $transdate, due_date => $due_date, terms => 'discount')->to_kivitendo;
my ($invtotal, $total);
my (%amounts, %formatted_amounts);
@@ -1749,7 +1763,8 @@ sub set_payment_options {
}
if ($self->{"language_id"}) {
- $query =
+ my $dbh = $self->get_standard_dbh($myconfig);
+ my $query =
qq|SELECT t.translation, l.output_numberformat, l.output_dateformat, l.output_longdates | .
qq|FROM generic_translations t | .
qq|LEFT JOIN language l ON t.language_id = l.id | .
@@ -1788,13 +1803,15 @@ sub set_payment_options {
$self->{payment_terms} =~ s/<%account_number%>/$self->{account_number}/g;
$self->{payment_terms} =~ s/<%bank%>/$self->{bank}/g;
$self->{payment_terms} =~ s/<%bank_code%>/$self->{bank_code}/g;
+ $self->{payment_terms} =~ s/<\%bic\%>/$self->{bic}/g;
+ $self->{payment_terms} =~ s/<\%iban\%>/$self->{iban}/g;
+ $self->{payment_terms} =~ s/<\%mandate_date_of_signature\%>/$self->{mandate_date_of_signature}/g;
+ $self->{payment_terms} =~ s/<\%mandator_id\%>/$self->{mandator_id}/g;
map { $self->{payment_terms} =~ s/<%${_}%>/$formatted_amounts{$_}/g; } keys %formatted_amounts;
$self->{skonto_in_percent} = $formatted_amounts{skonto_in_percent};
- $main::lxdebug->leave_sub();
-
}
sub get_template_language {
@@ -1967,23 +1984,6 @@ sub get_employee_data {
$main::lxdebug->leave_sub();
}
-sub get_duedate {
- $main::lxdebug->enter_sub();
-
- my ($self, $myconfig, $reference_date) = @_;
-
- my $terms = $self->{payment_id} ? SL::DB::PaymentTerm->new(id => $self->{payment_id}) ->load
- : $self->{customer_id} ? SL::DB::Customer ->new(id => $self->{customer_id})->load->payment
- : $self->{vendor_id} ? SL::DB::Vendor ->new(id => $self->{vendor_id}) ->load->payment
- : $self->{invdate} ? undef # no payment terms, therefore invdate == duedate
- : croak("Missing field in \$::form: payment_id, customer_id, vendor_id or invdate");
- my $duedate = $terms ? $terms->calc_date(reference_date => $reference_date)->to_kivitendo : undef;
-
- $main::lxdebug->leave_sub();
-
- return $duedate;
-}
-
sub _get_contacts {
$main::lxdebug->enter_sub();
@@ -2387,7 +2387,7 @@ sub get_lists {
if ($params{contacts} || $params{shipto}) {
$vc = 'customer' if $self->{"vc"} eq "customer";
$vc = 'vendor' if $self->{"vc"} eq "vendor";
- die "invalid use of get_lists, need 'vc'";
+ die "invalid use of get_lists, need 'vc'" unless $vc;
$vc_id = $self->{"${vc}_id"};
}
@@ -2430,7 +2430,7 @@ sub get_lists {
}
if ($params{"salesmen"}) {
- $self->_get_employees($dbh, "all_salesmen", $params{"salesmen"});
+ $self->_get_employees($dbh, $params{"salesmen"});
}
if ($params{"business_types"}) {
@@ -2605,6 +2605,25 @@ sub all_vc {
$main::lxdebug->leave_sub();
}
+sub mtime_ischanged {
+ my ($self, $table, $option) = @_;
+
+ return unless $self->{id};
+ croak ("wrong call, no valid table defined") unless $table =~ /^(oe|ar|ap|delivery_orders|parts)$/;
+
+ my $query = "SELECT mtime, itime FROM " . $table . " WHERE id = ?";
+ my $ref = selectfirst_hashref_query($self, $self->get_standard_dbh, $query, $self->{id});
+ $ref->{mtime} ||= $ref->{itime};
+
+ if ($self->{lastmtime} && $self->{lastmtime} ne $ref->{mtime} ) {
+ $self->error(($option eq 'mail') ?
+ t8("The document has been changed by another user. No mail was sent. Please reopen it in another window and copy the changes to the new window") :
+ t8("The document has been changed by another user. Please reopen it in another window and copy the changes to the new window")
+ );
+ ::end_of_request();
+ }
+}
+
sub language_payment {
$main::lxdebug->enter_sub();
@@ -2756,6 +2775,7 @@ sub create_links {
qq|SELECT
a.cp_id, a.invnumber, a.transdate, a.${table}_id, a.datepaid,
a.duedate, a.ordnumber, a.taxincluded, (SELECT cu.name FROM currencies cu WHERE cu.id=a.currency_id) AS currency, a.notes,
+ a.mtime, a.itime,
a.intnotes, a.department_id, a.amount AS oldinvtotal,
a.paid AS oldtotalpaid, a.employee_id, a.gldate, a.type,
a.globalproject_id, ${extra_columns}
@@ -2772,7 +2792,8 @@ sub create_links {
foreach my $key (keys %$ref) {
$self->{$key} = $ref->{$key};
}
-
+ $self->{mtime} ||= $self->{itime};
+ $self->{lastmtime} = $self->{mtime};
my $transdate = "current_date";
if ($self->{transdate}) {
$transdate = $dbh->quote($self->{transdate});
@@ -2906,7 +2927,6 @@ sub lastname_used {
"d.description" => "department",
"ct.name" => $table,
"cu.name" => "currency",
- "current_date + ct.terms" => "duedate",
);
if ($self->{type} =~ /delivery_order/) {
@@ -3495,9 +3515,9 @@ sub calculate_arap {
if ( $selected_tax ) {
if ( $buysell eq 'sell' ) {
- $self->{AR_amounts}{"tax_$i"} = $selected_tax->chart->accno unless $selected_tax->taxkey == 0;
+ $self->{AR_amounts}{"tax_$i"} = $selected_tax->chart->accno if defined $selected_tax->chart;
} else {
- $self->{AP_amounts}{"tax_$i"} = $selected_tax->chart->accno unless $selected_tax->taxkey == 0;
+ $self->{AP_amounts}{"tax_$i"} = $selected_tax->chart->accno if defined $selected_tax->chart;
};
$self->{"taxkey_$i"} = $selected_tax->taxkey;
@@ -3739,6 +3759,17 @@ Used to override the default favicon.
A html page title will be generated from this
+=item mtime_ischanged
+
+Tries to avoid concurrent write operations to records by checking the database mtime with a fetched one.
+
+Can be used / called with any table, that has itime and mtime attributes.
+Valid C names are: oe, ar, ap, delivery_orders, parts.
+Can be called wit C