X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=sidebyside;f=SL%2FAM.pm;h=3f34e18c7c0d02cff7cba6d4fa56dd546e07e6fd;hb=9dc9cfefd45e66cb4298dd572e3582613ae547a6;hp=a2b6ff9bc0fe48e30aa9fe01e2321dbd5f442bfd;hpb=468e86a69732eb57bd0a358ddecb6f80b8fb6b31;p=kivitendo-erp.git diff --git a/SL/AM.pm b/SL/AM.pm index a2b6ff9bc..3f34e18c7 100644 --- a/SL/AM.pm +++ b/SL/AM.pm @@ -37,6 +37,7 @@ package AM; +use Carp; use Data::Dumper; use SL::DBUtils; @@ -1528,7 +1529,7 @@ sub save_defaults { sub save_preferences { $main::lxdebug->enter_sub(); - my ($self, $myconfig, $form, $memberfile, $userspath, $webdav) = @_; + my ($self, $myconfig, $form, $webdav) = @_; my $dbh = $form->get_standard_dbh($myconfig); @@ -1546,13 +1547,25 @@ sub save_preferences { $form->{businessnumber} = $businessnumber; - $myconfig = new User "$memberfile", "$form->{login}"; + my $myconfig = new User($form->{login}); foreach my $item (keys %$form) { $myconfig->{$item} = $form->{$item}; } - $myconfig->save_member($memberfile, $userspath); + $myconfig->save_member($memberfile); + + my $auth = $main::auth; + + if ($auth->can_change_password() + && defined $form->{new_password} + && ($form->{new_password} ne '********')) { + $auth->change_password($form->{login}, $form->{new_password}); + + $form->{password} = $form->{new_password}; + $auth->set_session_value('password', $form->{password}); + $auth->create_or_refresh_session(); + } if ($webdav) { @webdavdirs = @@ -1820,6 +1833,21 @@ sub retrieve_units { return $units; } +sub retrieve_all_units { + $main::lxdebug->enter_sub(); + + my $self = shift; + + if (!$main::all_units) { + $main::all_units = $self->retrieve_units(\%main::myconfig, $main::form); + } + + $main::lxdebug->leave_sub(); + + return $main::all_units; +} + + sub translate_units { $main::lxdebug->enter_sub(); @@ -1889,6 +1917,34 @@ sub units_in_use { $main::lxdebug->leave_sub(); } +sub convertible_units { + $main::lxdebug->enter_sub(); + + my $self = shift; + my $units = shift; + my $filter_unit = shift; + my $not_smaller = shift; + + my $conv_units = []; + + $filter_unit = $units->{$filter_unit}; + + foreach my $name (sort { lc $a cmp lc $b } keys %{ $units }) { + my $unit = $units->{$name}; + + if (($unit->{base_unit} eq $filter_unit->{base_unit}) && + (!$not_smaller || ($unit->{factor} >= $filter_unit->{factor}))) { + push @{$conv_units}, $unit; + } + } + + my @sorted = sort { $b->{factor} <=> $a->{factor} } @{ $conv_units }; + + $main::lxdebug->leave_sub(); + + return \@sorted; +} + # if $a is translatable to $b, return the factor between them. # else return 1 sub convert_unit { @@ -1903,7 +1959,7 @@ sub convert_unit { sub unit_select_data { $main::lxdebug->enter_sub(); - my ($self, $units, $selected, $empty_entry) = @_; + my ($self, $units, $selected, $empty_entry, $convertible_into) = @_; my $select = []; @@ -1912,10 +1968,14 @@ sub unit_select_data { } foreach my $unit (sort({ $units->{$a}->{"sortkey"} <=> $units->{$b}->{"sortkey"} } keys(%{$units}))) { - push(@{$select}, { "name" => $unit, - "base_unit" => $units->{$unit}->{"base_unit"}, - "factor" => $units->{$unit}->{"factor"}, - "selected" => ($unit eq $selected) ? "selected" : "" }); + if (!$convertible_into || + ($units->{$convertible_into} && + ($units->{$convertible_into}->{base_unit} eq $units->{$unit}->{base_unit}))) { + push @{$select}, { "name" => $unit, + "base_unit" => $units->{$unit}->{"base_unit"}, + "factor" => $units->{$unit}->{"factor"}, + "selected" => ($unit eq $selected) ? "selected" : "" }; + } } $main::lxdebug->leave_sub(); @@ -1944,6 +2004,36 @@ sub unit_select_html { return $select; } +sub sum_with_unit { + $main::lxdebug->enter_sub(); + + my $self = shift; + + my $units = $self->retrieve_all_units(); + + my $sum = 0; + my $base_unit; + + while (2 <= scalar(@_)) { + my $qty = shift(@_); + my $unit = $units->{shift(@_)}; + + croak "No unit defined with name $unit" if (!defined $unit); + + if (!$base_unit) { + $base_unit = $unit->{base_unit}; + } elsif ($base_unit ne $unit->{base_unit}) { + croak "Adding values with incompatible base units $base_unit/$unit->{base_unit}"; + } + + $sum += $qty * $unit->{factor}; + } + + $main::lxdebug->leave_sub(); + + return wantarray ? ($sum, $baseunit) : $sum; +} + sub add_unit { $main::lxdebug->enter_sub(); @@ -2317,5 +2407,155 @@ sub delete_price_factor { $main::lxdebug->leave_sub(); } +sub save_warehouse { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form) = @_; + + # connect to database + my $dbh = $form->get_standard_dbh($myconfig); + + my ($query, @values, $sth); + + if (!$form->{id}) { + $query = qq|SELECT nextval('id')|; + ($form->{id}) = selectrow_query($form, $dbh, $query); + + $query = qq|INSERT INTO warehouse (id, sortkey) VALUES (?, (SELECT COALESCE(MAX(sortkey), 0) + 1 FROM warehouse))|; + do_query($form, $dbh, $query, $form->{id}); + } + + do_query($form, $dbh, qq|UPDATE warehouse SET description = ?, invalid = ? WHERE id = ?|, + $form->{description}, $form->{invalid} ? 't' : 'f', conv_i($form->{id})); + + if (0 < $form->{number_of_new_bins}) { + $query = qq|INSERT INTO bin (warehouse_id, description) VALUES (?, ?)|; + $sth = prepare_query($form, $dbh, $query); + + foreach my $i (1..$form->{number_of_new_bins}) { + do_statement($form, $sth, $query, conv_i($form->{id}), "$form->{prefix}${i}"); + } + + $sth->finish(); + } + + $dbh->commit(); + + $main::lxdebug->leave_sub(); +} + +sub save_bins { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form) = @_; + + # connect to database + my $dbh = $form->get_standard_dbh($myconfig); + + my ($query, @values, $commit_necessary, $sth); + + @values = map { $form->{"id_${_}"} } grep { $form->{"delete_${_}"} } (1..$form->{rowcount}); + + if (@values) { + $query = qq|DELETE FROM bin WHERE id IN (| . join(', ', ('?') x scalar(@values)) . qq|)|; + do_query($form, $dbh, $query, @values); + + $commit_necessary = 1; + } + + $query = qq|UPDATE bin SET description = ? WHERE id = ?|; + $sth = prepare_query($form, $dbh, $query); + + foreach my $row (1..$form->{rowcount}) { + next if ($form->{"delete_${row}"}); + + do_statement($form, $sth, $query, $form->{"description_${row}"}, conv_i($form->{"id_${row}"})); + + $commit_necessary = 1; + } + + $sth->finish(); + + $dbh->commit() if ($commit_necessary); + + $main::lxdebug->leave_sub(); +} + +sub delete_warehouse { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form) = @_; + + # connect to database + my $dbh = $form->get_standard_dbh($myconfig); + + my $id = conv_i($form->{id}); + my $query = qq|SELECT i.bin_id FROM inventory i WHERE i.bin_id IN (SELECT b.id FROM bin b WHERE b.warehouse_id = ?) LIMIT 1|; + my ($count) = selectrow_query($form, $dbh, $query, $id); + + if ($count) { + $main::lxdebug->leave_sub(); + return 0; + } + + do_query($form, $dbh, qq|DELETE FROM warehouse_access WHERE warehouse_id = ?|, conv_i($form->{id})); + do_query($form, $dbh, qq|DELETE FROM bin WHERE warehouse_id = ?|, conv_i($form->{id})); + do_query($form, $dbh, qq|DELETE FROM warehouse WHERE id = ?|, conv_i($form->{id})); + + $dbh->commit(); + + $main::lxdebug->leave_sub(); + + return 1; +} + +sub get_all_warehouses { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form) = @_; + + # connect to database + my $dbh = $form->get_standard_dbh($myconfig); + + my $query = qq|SELECT w.id, w.description, w.invalid, + (SELECT COUNT(b.description) FROM bin b WHERE b.warehouse_id = w.id) AS number_of_bins + FROM warehouse w + ORDER BY w.sortkey|; + + $form->{WAREHOUSES} = selectall_hashref_query($form, $dbh, $query); + + $main::lxdebug->leave_sub(); +} + +sub get_warehouse { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form) = @_; + + # connect to database + my $dbh = $form->get_standard_dbh($myconfig); + + my $id = conv_i($form->{id}); + my $query = qq|SELECT w.description, w.invalid + FROM warehouse w + WHERE w.id = ?|; + + my $ref = selectfirst_hashref_query($form, $dbh, $query, $id); + + map { $form->{$_} = $ref->{$_} } keys %{ $ref }; + + $query = qq|SELECT b.*, EXISTS + (SELECT i.warehouse_id + FROM inventory i + WHERE i.bin_id = b.id + LIMIT 1) + AS in_use + FROM bin b + WHERE b.warehouse_id = ?|; + + $form->{BINS} = selectall_hashref_query($form, $dbh, $query, conv_i($form->{id})); + + $main::lxdebug->leave_sub(); +} 1;