X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FIC.pm;h=5548d19dfa3d29eeab75fbe07059af292946db27;hb=602e46bca5192e4df0d2fa9d3564f61a8f82496c;hp=bc13d36781443f1295193fef9a649b4c8cae5fef;hpb=b5a417317ac5bb88c54cd598416a7ce652ee2599;p=kivitendo-erp.git diff --git a/SL/IC.pm b/SL/IC.pm index bc13d3678..5548d19df 100644 --- a/SL/IC.pm +++ b/SL/IC.pm @@ -127,8 +127,6 @@ sub get_part { while (($form->{"klass_$i"}, $form->{"pricegroup_id_$i"}, $form->{"price_$i"}, $form->{"pricegroup_$i"}) = $sth->fetchrow_array()) { - $form->{"price_$i"} = $form->round_amount($form->{"price_$i"}, 5); - $form->{"price_$i"} = $form->format_amount($myconfig, $form->{"price_$i"}, -2); push @pricegroups, $form->{"pricegroup_id_$i"}; $i++; } @@ -156,8 +154,6 @@ sub get_part { foreach $name (@pricegroups_not_used) { $form->{"klass_$i"} = "$name->{id}"; - $form->{"price_$i"} = $form->round_amount($form->{sellprice}, 5); - $form->{"price_$i"} = $form->format_amount($myconfig, $form->{"price_$i"}, -2); $form->{"pricegroup_id_$i"} = "$name->{id}"; $form->{"pricegroup_$i"} = "$name->{pricegroup}"; $i++; @@ -475,22 +471,20 @@ sub save { # insert price records only if different to sellprice for my $i (1 .. $form->{price_rows}) { - if ($form->{"price_$i"} eq "0") { + my $price = $form->parse_amount($myconfig, $form->{"price_$i"}); + if ($price == 0) { $form->{"price_$i"} = $form->{sellprice}; } if ( - ( $form->{"price_$i"} + ( $price || $form->{"klass_$i"} || $form->{"pricegroup_id_$i"}) - and $form->{"price_$i"} != $form->{sellprice} + and $price != $form->{sellprice} ) { #$klass = $form->parse_amount($myconfig, $form->{"klass_$i"}); - $price = $form->parse_amount($myconfig, $form->{"price_$i"}); - $pricegroup_id = - $form->parse_amount($myconfig, $form->{"pricegroup_id_$i"}); $query = qq|INSERT INTO prices (parts_id, pricegroup_id, price) | . qq|VALUES(?, ?, ?)|; - @values = (conv_i($form->{id}), conv_i($pricegroup_id), $price); + @values = (conv_i($form->{id}), conv_i($form->{"pricegroup_id_$i"}), $price); do_query($form, $dbh, $query, @values); } } @@ -872,14 +866,18 @@ sub all_parts { my $sort_order = ($form->{revers} ? ' DESC' : ' ASC'); + my $order_clause = " ORDER BY $form->{sort} " . ($form->{revers} ? 'DESC' : 'ASC'); + # special case: sorting by partnumber # since partnumbers are expected to be prefixed integers, a special sorting is implemented sorting first lexically by prefix and then by suffix. # and yes, that expression is designed to hold that array of regexes only once, so the map is kinda messy, sorry about that. # ToDO: implement proper functional sorting - $form->{sort} = join ', ', map { push @select_tokens, $_; ($table_prefix{$_} = "substring(partnumber,'[") . $_ } qw|^[:digit:]]+') [:digit:]]+')::INTEGER| - if $form->{sort} eq 'partnumber'; + # Nette Idee von Sven, gibt aber Probleme wenn die Artikelnummern groesser als 32bit sind. Korrekt waere es, dass Sort-Natural-Modul zu nehmen + # Ich lass das mal hier drin, damit die Idee erhalten bleibt jb 28.5.2009 bug 1018 + #$form->{sort} = join ', ', map { push @select_tokens, $_; ($table_prefix{$_} = "substring(partnumber,'[") . $_ } qw|^[:digit:]]+') [:digit:]]+')::INTEGER| + # if $form->{sort} eq 'partnumber'; - my $order_clause = " ORDER BY $form->{sort} $sort_order"; + #my $order_clause = " ORDER BY $form->{sort} $sort_order"; my $limit_clause = " LIMIT 100" if $form->{top100}; @@ -965,17 +963,21 @@ sub all_parts { map { $_->{onhand} *= 1 } @{ $form->{parts} }; + # post processing for assembly parts lists (bom) + # for each part get the assembly parts and add them into the partlist. my @assemblies; - # include individual items for assemblies if ($form->{searchitems} eq 'assembly' && $form->{bom}) { $query = qq|SELECT p.id, p.partnumber, p.description, a.qty AS onhand, p.unit, p.bin, p.sellprice, p.listprice, p.lastcost, p.rop, p.weight, p.priceupdate, - p.image, p.drawing, p.microfiche - FROM parts p, assembly a - WHERE (p.id = a.parts_id) AND (a.id = ?)|; + p.image, p.drawing, p.microfiche, + pfac.factor + FROM parts p + INNER JOIN assembly a ON (p.id = a.parts_id) + $joins{pfac} + WHERE a.id = ?|; $sth = prepare_query($form, $dbh, $query); foreach $item (@{ $form->{parts} }) { @@ -984,6 +986,7 @@ sub all_parts { while ($ref = $sth->fetchrow_hashref(NAME_lc)) { $ref->{assemblyitem} = 1; + map { $ref->{$_} /= $ref->{factor} || 1 } qw(sellprice listprice lastcost); push(@assemblies, $ref); } $sth->finish; @@ -996,51 +999,35 @@ sub all_parts { $main::lxdebug->leave_sub(); } -sub update_prices { +sub _create_filter_for_priceupdate { $main::lxdebug->enter_sub(); - my ($self, $myconfig, $form) = @_; + my $self = shift; + my $myconfig = \%main::myconfig; + my $form = $main::form; + my @where_values; my $where = '1 = 1'; - my $var; - my $group; - my $limit; + foreach my $item (qw(partnumber drawing microfiche make model pg.partsgroup)) { + my $column = $item; + $column =~ s/.*\.//; + next unless ($form->{$column}); - if ($item ne 'make') { - foreach my $item (qw(partnumber drawing microfiche make model pg.partsgroup)) { - my $column = $item; - $column =~ s/.*\.//; - next unless ($form->{$column}); - $where .= qq| AND $item ILIKE ?|; - push(@where_values, '%' . $form->{$column} . '%'); - } + $where .= qq| AND $item ILIKE ?|; + push(@where_values, '%' . $form->{$column} . '%'); } - # special case for description - if ($form->{description} - && !( $form->{bought} || $form->{sold} || $form->{onorder} - || $form->{ordered} || $form->{rfq} || $form->{quoted})) { - $where .= qq| AND (p.description ILIKE ?)|; - push(@where_values, '%' . $form->{description} . '%'); - } + foreach my $item (qw(description serialnumber)) { + next unless ($form->{$item}); - # special case for serialnumber - if ($form->{l_serialnumber} && $form->{serialnumber}) { - $where .= qq| AND serialnumber ILIKE ?|; - push(@where_values, '%' . $form->{serialnumber} . '%'); + $where .= qq| AND (${item} ILIKE ?)|; + push(@where_values, '%' . $form->{$item} . '%'); } # items which were never bought, sold or on an order if ($form->{itemstatus} eq 'orphaned') { - $form->{onhand} = $form->{short} = 0; - $form->{bought} = $form->{sold} = 0; - $form->{onorder} = $form->{ordered} = 0; - $form->{rfq} = $form->{quoted} = 0; - - $form->{transdatefrom} = $form->{transdateto} = ""; - $where .= qq| AND (p.onhand = 0) AND p.id NOT IN @@ -1051,23 +1038,19 @@ sub update_prices { UNION SELECT DISTINCT parts_id FROM orderitems )|; - } - if ($form->{itemstatus} eq 'active') { + } elsif ($form->{itemstatus} eq 'active') { $where .= qq| AND p.obsolete = '0'|; - } - if ($form->{itemstatus} eq 'obsolete') { + } elsif ($form->{itemstatus} eq 'obsolete') { $where .= qq| AND p.obsolete = '1'|; - $form->{onhand} = $form->{short} = 0; - } - if ($form->{itemstatus} eq 'onhand') { + } elsif ($form->{itemstatus} eq 'onhand') { $where .= qq| AND p.onhand > 0|; - } - if ($form->{itemstatus} eq 'short') { + } elsif ($form->{itemstatus} eq 'short') { $where .= qq| AND p.onhand < p.rop|; + } foreach my $column (qw(make model)) { @@ -1076,6 +1059,72 @@ sub update_prices { push(@where_values, '%' . $form->{$column} . '%'); } + $main::lxdebug->leave_sub(); + + return ($where, @where_values); +} + +sub get_num_matches_for_priceupdate { + $main::lxdebug->enter_sub(); + + my $self = shift; + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + + my ($where, @where_values) = $self->_create_filter_for_priceupdate(); + + my $num_updated = 0; + my $query; + + for my $column (qw(sellprice listprice)) { + next if ($form->{$column} eq ""); + + $query = + qq|SELECT COUNT(*) + FROM parts + WHERE id IN + (SELECT p.id + FROM parts p + LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) + WHERE $where)|; + my ($result) = selectfirst_array_query($from, $dbh, $query, @where_values); + $num_updated += $result if (0 <= $result); + } + + $query = + qq|SELECT COUNT(*) + FROM prices + WHERE parts_id IN + (SELECT p.id + FROM parts p + LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) + WHERE $where) AND (pricegroup_id = ?)|; + my $sth = prepare_query($form, $dbh, $query); + + for my $i (1 .. $form->{price_rows}) { + next if ($form->{"price_$i"} eq ""); + + my ($result) = do_statement($form, $sth, $query, @where_values, conv_i($form->{"pricegroup_id_$i"})); + $num_updated += $result if (0 <= $result); + } + $sth->finish(); + + $main::lxdebug->leave_sub(); + + return $num_updated; +} + +sub update_prices { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig, $form) = @_; + + my ($where, @where_values) = $self->_create_filter_for_priceupdate(); + my $num_updated = 0; + # connect to database my $dbh = $form->dbconnect_noauto($myconfig); @@ -1097,7 +1146,8 @@ sub update_prices { FROM parts p LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) WHERE $where)|; - do_query($from, $dbh, $query, $value, @where_values); + my $result = do_query($from, $dbh, $query, $value, @where_values); + $num_updated += $result if (0 <= $result); } my $q_add = @@ -1122,12 +1172,15 @@ sub update_prices { next if ($form->{"price_$i"} eq ""); my $value = $form->parse_amount($myconfig, $form->{"price_$i"}); + my $result; if ($form->{"pricegroup_type_$i"} eq "percent") { - do_statement($form, $sth_multiply, $q_multiply, ($value / 100) + 1, @where_values, conv_i($form->{"pricegroup_id_$i"})); + $result = do_statement($form, $sth_multiply, $q_multiply, ($value / 100) + 1, @where_values, conv_i($form->{"pricegroup_id_$i"})); } else { - do_statement($form, $sth_add, $q_add, $value, @where_values, conv_i($form->{"pricegroup_id_$i"})); + $result = do_statement($form, $sth_add, $q_add, $value, @where_values, conv_i($form->{"pricegroup_id_$i"})); } + + $num_updated += $result if (0 <= $result); } $sth_add->finish(); @@ -1138,7 +1191,7 @@ sub update_prices { $main::lxdebug->leave_sub(); - return $rc; + return $num_updated; } sub create_links {