X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/0560b39eef592a150913baf51cd198a407b31a7a..4345da58fbb6bc8f2491922de5a8567d0d97f019:/SL/IS.pm diff --git a/SL/IS.pm b/SL/IS.pm index 9ae430761..a6445a31d 100644 --- a/SL/IS.pm +++ b/SL/IS.pm @@ -144,18 +144,21 @@ sub invoice_details { $form->{discount} = []; - IC->prepare_parts_for_printing(myconfig => $myconfig, form => $form); + # get some values of parts from db on store them in extra array, + # so that they can be sorted in later + my %prepared_template_arrays = IC->prepare_parts_for_printing(myconfig => $myconfig, form => $form); + my @prepared_arrays = keys %prepared_template_arrays; my $ic_cvar_configs = CVar->get_configs(module => 'IC'); my $project_cvar_configs = CVar->get_configs(module => 'Projects'); my @arrays = - qw(runningnumber number description longdescription qty ship unit bin - deliverydate_oe ordnumber_oe donumber_do transdate_oe validuntil - partnotes serialnumber reqdate sellprice listprice netprice - discount p_discount discount_sub nodiscount_sub - linetotal nodiscount_linetotal tax_rate projectnumber projectdescription - price_factor price_factor_name partsgroup weight lineweight); + qw(runningnumber number description longdescription qty qty_nofmt unit bin + deliverydate_oe ordnumber_oe donumber_do transdate_oe invnumber invdate + partnotes serialnumber reqdate sellprice sellprice_nofmt listprice listprice_nofmt netprice netprice_nofmt + discount discount_nofmt p_discount discount_sub discount_sub_nofmt nodiscount_sub nodiscount_sub_nofmt + linetotal linetotal_nofmt nodiscount_linetotal nodiscount_linetotal_nofmt tax_rate projectnumber projectdescription + price_factor price_factor_name partsgroup weight weight_nofmt lineweight lineweight_nofmt); push @arrays, map { "ic_cvar_$_->{name}" } @{ $ic_cvar_configs }; push @arrays, map { "project_cvar_$_->{name}" } @{ $project_cvar_configs }; @@ -164,17 +167,18 @@ sub invoice_details { my @payment_arrays = qw(payment paymentaccount paymentdate paymentsource paymentmemo); - map { $form->{TEMPLATE_ARRAYS}->{$_} = [] } (@arrays, @tax_arrays, @payment_arrays); + map { $form->{TEMPLATE_ARRAYS}->{$_} = [] } (@arrays, @tax_arrays, @payment_arrays, @prepared_arrays); my $totalweight = 0; foreach $item (sort { $a->[1] cmp $b->[1] } @partsgroup) { $i = $item->[0]; if ($item->[1] ne $sameitem) { + push(@{ $form->{TEMPLATE_ARRAYS}->{entry_type} }, 'partsgroup'); push(@{ $form->{TEMPLATE_ARRAYS}->{description} }, qq|$item->[1]|); $sameitem = $item->[1]; - map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" } @arrays)); + map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" } (@arrays, @prepared_arrays))); } $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"}); @@ -198,6 +202,9 @@ sub invoice_details { my $price_factor = $price_factors{$form->{"price_factor_id_$i"}} || { 'factor' => 1 }; + push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, $prepared_template_arrays{$_}[$i - 1]) for @prepared_arrays; + + push @{ $form->{TEMPLATE_ARRAYS}->{entry_type} }, 'normal'; push @{ $form->{TEMPLATE_ARRAYS}->{runningnumber} }, $position; push @{ $form->{TEMPLATE_ARRAYS}->{number} }, $form->{"partnumber_$i"}; push @{ $form->{TEMPLATE_ARRAYS}->{serialnumber} }, $form->{"serialnumber_$i"}; @@ -220,7 +227,8 @@ sub invoice_details { push @{ $form->{TEMPLATE_ARRAYS}->{price_factor_name} }, $price_factor->{description}; push @{ $form->{TEMPLATE_ARRAYS}->{partsgroup} }, $form->{"partsgroup_$i"}; push @{ $form->{TEMPLATE_ARRAYS}->{reqdate} }, $form->{"reqdate_$i"}; - push(@{ $form->{TEMPLATE_ARRAYS}->{listprice} }, $form->{"listprice_$i"}); + push @{ $form->{TEMPLATE_ARRAYS}->{listprice} }, $form->format_amount($myconfig, $form->{"listprice_$i"}, 2); + push(@{ $form->{TEMPLATE_ARRAYS}->{listprice_nofmt} }, $form->{"listprice_$i"}); my $sellprice = $form->parse_amount($myconfig, $form->{"sellprice_$i"}); my ($dec) = ($sellprice =~ /\.(\d+)/); @@ -356,18 +364,20 @@ sub invoice_details { while (my $ref = $sth->fetchrow_hashref('NAME_lc')) { if ($form->{groupitems} && $ref->{partsgroup} ne $sameitem) { - map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" } @arrays)); + map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" } (@arrays, @prepared_arrays))); $sameitem = ($ref->{partsgroup}) ? $ref->{partsgroup} : "--"; + push(@{ $form->{TEMPLATE_ARRAYS}->{entry_type} }, 'assembly-item-partsgroup'); push(@{ $form->{TEMPLATE_ARRAYS}->{description} }, $sameitem); } map { $form->{"a_$_"} = $ref->{$_} } qw(partnumber description); + push(@{ $form->{TEMPLATE_ARRAYS}->{entry_type} }, 'assembly-item'); push(@{ $form->{TEMPLATE_ARRAYS}->{description} }, $form->format_amount($myconfig, $ref->{qty} * $form->{"qty_$i"} ) . qq| -- $form->{"a_partnumber"}, $form->{"a_description"}|); - map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" } @arrays)); + map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" } (@arrays, @prepared_arrays))); } $sth->finish; @@ -375,7 +385,7 @@ sub invoice_details { CVar->get_non_editable_ic_cvars(form => $form, dbh => $dbh, - row => $i, + row => $i, sub_module => 'invoice', may_converted_from => ['delivery_order_items', 'orderitems', 'invoice']); @@ -761,7 +771,7 @@ sub post_invoice { CVar->get_non_editable_ic_cvars(form => $form, dbh => $dbh, - row => $i, + row => $i, sub_module => 'invoice', may_converted_from => ['delivery_order_items', 'orderitems', 'invoice']); @@ -1274,8 +1284,6 @@ SQL exporttype => DATEV_ET_BUCHUNGEN, format => DATEV_FORMAT_KNE, dbh => $dbh, - from => $transdate, - to => $transdate, trans_id => $form->{id}, ); @@ -1298,15 +1306,25 @@ SQL sub transfer_out { $::lxdebug->enter_sub; - my ($self, $form) = @_; + my ($self, $form, $dbh) = @_; + + my (@errors, @transfers); - my @transfers; + # do nothing, if transfer default is not requeseted at all + if (!$::instance_conf->get_transfer_default) { + $::lxdebug->leave_sub; + return \@errors; + } + + require SL::WH; foreach my $i (1 .. $form->{rowcount}) { next if !$form->{"id_$i"}; - my ($wh_id, $bin_id) = _determine_wh_and_bin($::instance_conf, $form->{"id_$i"}); - - if ($wh_id && $bin_id) { + my ($err, $wh_id, $bin_id) = _determine_wh_and_bin($dbh, $::instance_conf, + $form->{"id_$i"}, + $form->{"qty_$i"}, + $form->{"unit_$i"}); + if (!@{ $err } && $wh_id && $bin_id) { push @transfers, { 'parts_id' => $form->{"id_$i"}, 'qty' => $form->{"qty_$i"}, @@ -1316,40 +1334,89 @@ sub transfer_out { 'src_bin_id' => $bin_id, 'project_id' => $form->{"project_id_$i"}, 'invoice_id' => $form->{"invoice_id_$i"}, + 'comment' => $::locale->text("Default transfer invoice"), }; } + + push @errors, @{ $err }; } - require SL::WH; - WH->transfer(@transfers); + if (!@errors) { + WH->transfer(@transfers); + } $::lxdebug->leave_sub; - return 1; + return \@errors; } sub _determine_wh_and_bin { $::lxdebug->enter_sub(2); - my ($conf, $part_id) = @_; + my ($dbh, $conf, $part_id, $qty, $unit) = @_; + my @errors; my $part = SL::DB::Part->new(id => $part_id)->load; + # ignore service if they are not configured to be transfered if ($part->is_service && !$conf->get_transfer_default_services) { $::lxdebug->leave_sub(2); - return; + return (\@errors); } - - my $wh_id = $part->warehouse_id; - my $bin_id = $part->bin_id; + # test negative qty + if ($qty < 0) { + push @errors, $::locale->text("Cannot transfer negative quantities."); + return (\@errors); + } - if (!$wh_id && !$bin_id && $conf->get_transfer_default_ignore_onhand) { + # get/test default bin + my ($default_wh_id, $default_bin_id); + if ($conf->get_transfer_default_use_master_default_bin) { + $default_wh_id = $conf->get_warehouse_id if $conf->get_warehouse_id; + $default_bin_id = $conf->get_bin_id if $conf->get_bin_id; + } + my $wh_id = $part->warehouse_id || $default_wh_id; + my $bin_id = $part->bin_id || $default_bin_id; + + # check qty and bin + if ($bin_id) { + my ($max_qty, $error) = WH->get_max_qty_parts_bin(dbh => $dbh, + parts_id => $part->id, + bin_id => $bin_id); + if ($error == 1) { + push @errors, $::locale->text('Part "#1" has chargenumber or best before date set. So it cannot be transfered automaticaly.', + $part->description); + } + my $form_unit_obj = SL::DB::Unit->new(name => $unit)->load; + my $part_unit_qty = $form_unit_obj->convert_to($qty, $part->unit_obj); + my $diff_qty = $max_qty - $part_unit_qty; + if (!@errors && $diff_qty < 0) { + push @errors, $::locale->text('For part "#1" there are missing #2 #3 in the default warehouse/bin "#4/#5".', + $part->description, + $::form->format_amount(\%::myconfig, -1*$diff_qty), + $part->unit_obj->name, + SL::DB::Warehouse->new(id => $wh_id)->load->description, + SL::DB::Bin->new( id => $bin_id)->load->description); + } + } else { + push @errors, $::locale->text('For part "#1" there is no default warehouse and bin defined.', + $part->description); + } + + # transfer to special "ignore onhand" bin if requested and default bin does not work + if (@errors && $conf->get_transfer_default_ignore_onhand && $conf->get_bin_id_ignore_onhand) { $wh_id = $conf->get_warehouse_id_ignore_onhand; $bin_id = $conf->get_bin_id_ignore_onhand; + if ($wh_id && $bin_id) { + @errors = (); + } else { + push @errors, $::locale->text('For part "#1" there is no default warehouse and bin for ignoring onhand defined.', + $part->description); + } } $::lxdebug->leave_sub(2); - return ($wh_id, $bin_id); + return (\@errors, $wh_id, $bin_id); } sub _delete_transfers {