Verletzung von NOT NULL Constraints
[kivitendo-erp.git] / SL / MoreCommon.pm
index 0d5413b..dfc5a7d 100644 (file)
@@ -4,8 +4,9 @@ require Exporter;
 our @ISA = qw(Exporter);
 
 our @EXPORT    = qw(save_form restore_form compare_numbers any cross);
 our @ISA = qw(Exporter);
 
 our @EXPORT    = qw(save_form restore_form compare_numbers any cross);
-our @EXPORT_OK = qw(ary_union ary_intersect ary_diff listify);
+our @EXPORT_OK = qw(ary_union ary_intersect ary_diff listify ary_to_hash uri_encode uri_decode);
 
 
+use List::MoreUtils qw(zip);
 use YAML;
 
 use SL::AM;
 use YAML;
 
 use SL::AM;
@@ -58,13 +59,9 @@ sub restore_form {
 sub compare_numbers {
   $main::lxdebug->enter_sub();
 
 sub compare_numbers {
   $main::lxdebug->enter_sub();
 
-  my $a      = shift;
-  my $a_unit = shift;
-  my $b      = shift;
-  my $b_unit = shift;
+  my ($a, $a_unit, $b, $b_unit) = @_;
 
 
-  $main::all_units ||= AM->retrieve_units(\%main::myconfig, $main::form);
-  my $units          = $main::all_units;
+  my $units          = AM->retrieve_all_units;
 
   if (!$units->{$a_unit} || !$units->{$b_unit} || ($units->{$a_unit}->{base_unit} ne $units->{$b_unit}->{base_unit})) {
     $main::lxdebug->leave_sub();
 
   if (!$units->{$a_unit} || !$units->{$b_unit} || ($units->{$a_unit}->{base_unit} ne $units->{$b_unit}->{base_unit})) {
     $main::lxdebug->leave_sub();
@@ -148,6 +145,43 @@ sub listify {
   return wantarray ? @ary : scalar @ary;
 }
 
   return wantarray ? @ary : scalar @ary;
 }
 
+sub ary_to_hash {
+  my $idx_key   = shift;
+  my $value_key = shift;
+
+  return map { ($_, 1) } @_ if !defined($idx_key);
+
+  my @indexes = map { ref $_ eq 'HASH' ? $_->{ $idx_key } : $_->$idx_key(); } @_;
+  my @values  = map {
+      !defined($value_key) ? $_
+    : ref $_ eq 'HASH'     ? $_->{ $value_key }
+    :                        $_->$value_key()
+  } @_;
+
+  return zip(@indexes, @values);
+}
+
+sub uri_encode {
+  my ($str) = @_;
+
+  $str =  Encode::encode('utf-8-strict', $str) if $::locale->is_utf8;
+  $str =~ s/([^a-zA-Z0-9_.:-])/sprintf("%%%02x", ord($1))/ge;
+
+  return $str;
+}
+
+sub uri_decode {
+  my $str = $_[0] // '';
+
+  $str =~ tr/+/ /;
+  $str =~ s/\\$//;
+
+  $str =~ s/%([0-9a-fA-Z]{2})/pack("C",hex($1))/eg;
+  $str =  Encode::decode('utf-8-strict', $str) if $::locale->is_utf8;
+
+  return $str;
+}
+
 1;
 
 __END__
 1;
 
 __END__
@@ -158,7 +192,7 @@ SL::MoreCommon.pm - helper functions
 
 =head1 DESCRIPTION
 
 
 =head1 DESCRIPTION
 
-this is a collection of helper functions used in Lx-Office.
+this is a collection of helper functions used in kivitendo.
 Most of them are either obvious or too obscure to care about unless you really have to.
 The exceptions are documented here.
 
 Most of them are either obvious or too obscure to care about unless you really have to.
 The exceptions are documented here.
 
@@ -167,6 +201,7 @@ The exceptions are documented here.
 =over 4
 
 =item save_form
 =over 4
 
 =item save_form
+
 =item restore_form
 
 A lot of the old sql-ledger routines are strictly procedural. They search for params in the $form object, do stuff with it, and return a status code.
 =item restore_form
 
 A lot of the old sql-ledger routines are strictly procedural. They search for params in the $form object, do stuff with it, and return a status code.
@@ -190,6 +225,27 @@ will modify the input arrays.
 As cross expects an array but returns a list it is not directly chainable
 at the moment. This will be corrected in the future.
 
 As cross expects an array but returns a list it is not directly chainable
 at the moment. This will be corrected in the future.
 
+=item ary_to_hash INDEX_KEY, VALUE_KEY, ARRAY
+
+Returns a hash with the content of ARRAY based on the values of
+INDEX_KEY and VALUE_KEY.
+
+If INDEX_KEY is undefined then the elements of ARRAY are the keys and
+'1' is the value for each of them.
+
+If INDEX_KEY is defined then each element of ARRAY is checked whether
+or not it is a hash. If it is then its element at the position
+INDEX_KEY will be the resulting hash element's key. Otherwise the
+element is assumed to be a blessed reference, and its INDEX_KEY
+function will be called.
+
+The values of the resulting hash follow a similar pattern. If
+VALUE_KEY is undefined then the current element itself is the new hash
+element's value. If the current element is a hash then its element at
+the position VALUE_KEY will be the resulting hash element's
+key. Otherwise the element is assumed to be a blessed reference, and
+its VALUE_KEY function will be called.
+
 =back
 
 =cut
 =back
 
 =cut