X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FIC.pm;h=36520b97dab608dc199210c50ae4efcba6864fa9;hb=a8b18c65bfd47c845e641fb0fff9587f4122bf9d;hp=74cfe17023fa683234f52db6ad368d424a4ece55;hpb=c5651754689f5072d6f9896af9c85312128d6e18;p=kivitendo-erp.git diff --git a/SL/IC.pm b/SL/IC.pm index 74cfe1702..36520b97d 100644 --- a/SL/IC.pm +++ b/SL/IC.pm @@ -40,6 +40,7 @@ use YAML; use SL::CVar; use SL::DBUtils; +use SL::HTML::Restrict; use SL::TransNumber; use strict; @@ -50,7 +51,7 @@ sub get_part { my ($self, $myconfig, $form) = @_; # connect to db - my $dbh = $form->dbconnect($myconfig); + my $dbh = $form->get_standard_dbh; my $sth; @@ -146,15 +147,10 @@ SQL } # get translations - $form->{language_values} = ""; $query = qq|SELECT language_id, translation, longdescription FROM translation WHERE parts_id = ?|; - my $trq = prepare_execute_query($form, $dbh, $query, conv_i($form->{id})); - while (my $tr = $trq->fetchrow_hashref("NAME_lc")) { - $form->{language_values} .= "---+++---" . join('--++--', @{$tr}{qw(language_id translation longdescription)}); - } - $trq->finish; + $form->{translations} = selectall_hashref_query($form, $dbh, $query, conv_i($form->{id})); # is it an orphan my @referencing_tables = qw(invoice orderitems inventory); @@ -176,7 +172,7 @@ SQL $form->{"unit_changeable"} = $form->{orphaned}; - $dbh->disconnect; + Common::webdav_folder($form) if $::lx_office_conf{features}{webdav}; $main::lxdebug->leave_sub(); } @@ -186,7 +182,7 @@ sub get_pricegroups { my ($self, $myconfig, $form) = @_; - my $dbh = $form->dbconnect($myconfig); + my $dbh = $form->get_standard_dbh; # get pricegroups my $query = qq|SELECT id, pricegroup FROM pricegroup ORDER BY lower(pricegroup)|; @@ -204,8 +200,6 @@ sub get_pricegroups { #correct rows $form->{price_rows} = $i - 1; - $dbh->disconnect; - $main::lxdebug->leave_sub(); return $pricegroups; @@ -218,7 +212,7 @@ sub retrieve_buchungsgruppen { my ($query, $sth); - my $dbh = $form->dbconnect($myconfig); + my $dbh = $form->get_standard_dbh; # get buchungsgruppen $query = qq|SELECT id, description FROM buchungsgruppen ORDER BY sortkey|; @@ -234,6 +228,7 @@ sub save { my @values; # connect to database, turn off AutoCommit my $dbh = $form->get_standard_dbh; + my $restricter = SL::HTML::Restrict->create; # save the part # make up a unique handle and store in partnumber field @@ -248,7 +243,7 @@ sub save { map { $form->{$_} = $form->parse_amount($myconfig, $form->{$_}) } qw(rop weight listprice sellprice gv lastcost); - my $makemodel = (($form->{make_1}) || ($form->{model_1})) ? 1 : 0; + my $makemodel = ($form->{make_1} || $form->{model_1} || ($form->{makemodel_rows} > 1)) ? 1 : 0; $form->{assembly} = ($form->{item} eq 'assembly') ? 1 : 0; @@ -324,13 +319,15 @@ sub save { if ($form->{"item"} ne "assembly") { $subq_expense = - qq|(SELECT bg.expense_accno_id_0 - FROM buchungsgruppen bg - WHERE bg.id = | . conv_i($form->{"buchungsgruppen_id"}, 'NULL') . qq|)|; + qq|(SELECT tc.expense_accno_id + FROM taxzone_charts tc + WHERE tc.buchungsgruppen_id = | . conv_i($form->{"buchungsgruppen_id"}, 'NULL') . qq| and tc.taxzone_id = 0)|; } else { $subq_expense = "NULL"; } + normalize_text_blocks(); + $query = qq|UPDATE parts SET partnumber = ?, @@ -346,11 +343,12 @@ sub save { notes = ?, formel = ?, rop = ?, - bin = ?, + warehouse_id = ?, + bin_id = ?, buchungsgruppen_id = ?, payment_id = ?, inventory_accno_id = $subq_inventory, - income_accno_id = (SELECT bg.income_accno_id_0 FROM buchungsgruppen bg WHERE bg.id = ?), + income_accno_id = (SELECT tc.income_accno_id FROM taxzone_charts tc WHERE tc.taxzone_id = 0 and tc.buchungsgruppen_id = ?), expense_accno_id = $subq_expense, obsolete = ?, image = ?, @@ -375,10 +373,11 @@ sub save { $form->{lastcost}, $form->{weight}, $form->{unit}, - $form->{notes}, + $restricter->process($form->{notes}), $form->{formel}, $form->{rop}, - $form->{bin}, + conv_i($form->{warehouse_id}), + conv_i($form->{bin_id}), conv_i($form->{buchungsgruppen_id}), conv_i($form->{payment_id}), conv_i($form->{buchungsgruppen_id}), @@ -401,16 +400,17 @@ sub save { # delete translation records do_query($form, $dbh, qq|DELETE FROM translation WHERE parts_id = ?|, conv_i($form->{id})); - if ($form->{language_values} ne "") { - foreach my $item (split(/---\+\+\+---/, $form->{language_values})) { - my ($language_id, $translation, $longdescription) = split(/--\+\+--/, $item); - if ($translation ne "") { - $query = qq|INSERT into translation (parts_id, language_id, translation, longdescription) - VALUES ( ?, ?, ?, ? )|; - @values = (conv_i($form->{id}), conv_i($language_id), $translation, $longdescription); - do_query($form, $dbh, $query, @values); - } + my @translations = grep { $_->{language_id} && $_->{translation} } @{ $form->{translations} || [] }; + if (@translations) { + $query = qq|INSERT into translation (parts_id, language_id, translation, longdescription) + VALUES ( ?, ?, ?, ? )|; + $sth = $dbh->prepare($query); + + foreach my $translation (@translations) { + do_statement($form, $sth, $query, conv_i($form->{id}), conv_i($translation->{language_id}), $translation->{translation}, $restricter->process($translation->{longdescription})); } + + $sth->finish(); } # delete price records @@ -419,10 +419,9 @@ sub save { $query = qq|INSERT INTO prices (parts_id, pricegroup_id, price) VALUES(?, ?, ?)|; $sth = prepare_query($form, $dbh, $query); - # insert price records only if different to sellprice for my $i (1 .. $form->{price_rows}) { my $price = $form->parse_amount($myconfig, $form->{"price_$i"}); - next unless $price && ($price != $form->{sellprice}); + next unless $price; @values = (conv_i($form->{id}), conv_i($form->{"pricegroup_id_$i"}), $price); do_statement($form, $sth, $query, @values); @@ -457,6 +456,22 @@ sub save { # add assembly records if ($form->{item} eq 'assembly') { + # check additional assembly row + my $i = $form->{assembly_rows}; + # if last row is not empty add them + if ($form->{"partnumber_$i"} ne "") { + $query = qq|SELECT id FROM parts WHERE partnumber = ?|; + my ($partid) = selectrow_query($form, $dbh, $query,$form->{"partnumber_$i"} ); + if ( $partid ) { + $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"}); + $form->{"id_$i"} = $partid; + $form->{"bom_$i"} = 0; + $form->{assembly_rows}++; + } + else { + $::form->error($::locale->text("uncorrect partnumber ").$form->{"partnumber_$i"}); + } + } for my $i (1 .. $form->{assembly_rows}) { $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"}); @@ -469,7 +484,6 @@ sub save { do_query($form, $dbh, $query, @values); } } - my @a = localtime; $a[5] += 1900; $a[4]++; @@ -512,6 +526,20 @@ sub save { variables => $form, save_validity => 1); + # Delete saved custom variable values for configs that have been + # marked invalid for this part. + $query = <{id}) x 2); + # commit my $rc = $dbh->commit; @@ -549,7 +577,7 @@ sub retrieve_assemblies { my ($self, $myconfig, $form) = @_; # connect to database - my $dbh = $form->dbconnect($myconfig); + my $dbh = $form->get_standard_dbh; my $where = qq|NOT p.obsolete|; my @values; @@ -567,7 +595,7 @@ sub retrieve_assemblies { # retrieve assembly items my $query = qq|SELECT p.id, p.partnumber, p.description, - p.bin, p.onhand, p.rop, + p.onhand, p.rop, (SELECT sum(p2.inventory_accno_id) FROM parts p2, assembly a WHERE (p2.id = a.parts_id) AND (a.id = p.id)) AS inventory @@ -576,8 +604,6 @@ sub retrieve_assemblies { $form->{assembly_items} = selectall_hashref_query($form, $dbh, $query, @values); - $dbh->disconnect; - $main::lxdebug->leave_sub(); } @@ -587,7 +613,7 @@ sub delete { my ($self, $myconfig, $form) = @_; my @values = (conv_i($form->{id})); # connect to database, turn off AutoCommit - my $dbh = $form->dbconnect_noauto($myconfig); + my $dbh = $form->get_standard_dbh; my %columns = ( "assembly" => "id", "parts" => "id" ); @@ -598,7 +624,6 @@ sub delete { # commit my $rc = $dbh->commit; - $dbh->disconnect; $main::lxdebug->leave_sub(); @@ -641,7 +666,7 @@ sub assembly_item { } # connect to database - my $dbh = $form->dbconnect($myconfig); + my $dbh = $form->get_standard_dbh; my $query = qq|SELECT p.id, p.partnumber, p.description, p.sellprice, @@ -653,8 +678,6 @@ sub assembly_item { WHERE $where|; $form->{item_list} = selectall_hashref_query($form, $dbh, $query, @values); - $dbh->disconnect; - $main::lxdebug->leave_sub(); } @@ -671,7 +694,7 @@ sub assembly_item { # partnumber ean description partsgroup microfiche drawing # # column flags: -# l_partnumber l_description l_listprice l_sellprice l_lastcost l_priceupdate l_weight l_unit l_bin l_rop l_image l_drawing l_microfiche l_partsgroup +# l_partnumber l_description l_listprice l_sellprice l_lastcost l_priceupdate l_weight l_unit l_rop l_image l_drawing l_microfiche l_partsgroup # # exclusives: # itemstatus = active | onhand | short | obsolete | orphaned @@ -721,7 +744,7 @@ sub all_parts { my @apoe_filters = qw(transdate); my @like_filters = (@simple_filters, @invoice_oi_filters); my @all_columns = (@simple_filters, @makemodel_filters, @apoe_filters, @project_filters, qw(serialnumber)); - my @simple_l_switches = (@all_columns, qw(notes listprice sellprice lastcost priceupdate weight unit bin rop image)); + my @simple_l_switches = (@all_columns, qw(notes listprice sellprice lastcost priceupdate weight unit rop image shop insertdate)); my @oe_flags = qw(bought sold onorder ordered rfq quoted); my @qsooqr_flags = qw(invnumber ordnumber quonumber trans_id name module qty); my @deliverydate_flags = qw(deliverydate); @@ -797,10 +820,12 @@ sub all_parts { 'ioi.id' => 'ioi_id', 'ioi.ioi' => 'ioi', 'projectdescription' => 'projectdescription', + 'insertdate' => 'insertdate', ); my %real_column = ( projectdescription => 'description', + insertdate => 'itime::DATE', ); if (($form->{searchitems} eq 'assembly') && $form->{l_lastcost}) { @@ -841,12 +866,37 @@ sub all_parts { } } + # special case insertdate + if (grep { $form->{$_} } qw(insertdatefrom insertdateto)) { + $form->{"l_insertdate"} = 1; + push @select_tokens, 'insertdate'; + + my $token_builder = $make_token_builder->(); + my $token = $token_builder->('insertdate'); + + for (qw(insertdatefrom insertdateto)) { + next unless $form->{$_}; + push @where_tokens, sprintf "$token %s ?", /from$/ ? '>=' : '<='; + push @bind_vars, $form->{$_}; + } + } + if ($form->{"partsgroup_id"}) { $form->{"l_partsgroup"} = '1'; # show the column push @where_tokens, "pg.id = ?"; push @bind_vars, $form->{"partsgroup_id"}; } + if ($form->{shop} ne '') { + $form->{l_shop} = '1'; # show the column + if ($form->{shop} eq '0' || $form->{shop} eq 'f') { + push @where_tokens, 'NOT p.shop'; + $form->{shop} = 'f'; + } else { + push @where_tokens, 'p.shop'; + } + } + foreach (@like_filters) { next unless $form->{$_}; $form->{"l_$_"} = '1'; # show the column @@ -964,7 +1014,7 @@ sub all_parts { my $token_builder = $make_token_builder->(\%joins_needed); - my @sort_cols = (@simple_filters, qw(id bin priceupdate onhand invnumber ordnumber quonumber name serialnumber soldtotal deliverydate)); + my @sort_cols = (@simple_filters, qw(id priceupdate onhand invnumber ordnumber quonumber name serialnumber soldtotal deliverydate insertdate shop)); $form->{sort} = 'id' unless grep { $form->{"l_$_"} } grep { $form->{sort} eq $_ } @sort_cols; # sort by id if unknown or invisible column my $sort_order = ($form->{revers} ? ' DESC' : ' ASC'); my $order_clause = " ORDER BY " . $token_builder->($form->{sort}) . ($form->{revers} ? ' DESC' : ' ASC'); @@ -1022,7 +1072,7 @@ sub all_parts { 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.notes, + p.unit, p.notes, p.itime::DATE as insertdate, p.sellprice, p.listprice, p.lastcost, p.rop, p.weight, p.priceupdate, p.image, p.drawing, p.microfiche, @@ -1071,7 +1121,7 @@ SQL $main::lxdebug->leave_sub(); - return wantarray ? @{ $form->{parts} } : $form->{parts}; + return @{ $form->{parts} }; } sub _create_filter_for_priceupdate { @@ -1201,7 +1251,7 @@ sub update_prices { my $num_updated = 0; # connect to database - my $dbh = $form->dbconnect_noauto($myconfig); + my $dbh = $form->get_standard_dbh; for my $column (qw(sellprice listprice)) { next if ($form->{$column} eq ""); @@ -1262,7 +1312,6 @@ sub update_prices { $sth_multiply->finish(); my $rc= $dbh->commit; - $dbh->disconnect; $main::lxdebug->leave_sub(); @@ -1275,7 +1324,7 @@ sub create_links { my ($self, $module, $myconfig, $form) = @_; # connect to database - my $dbh = $form->dbconnect($myconfig); + my $dbh = $form->get_standard_dbh; my @values = ('%' . $module . '%'); my $query; @@ -1331,7 +1380,6 @@ sub create_links { ($form->{priceupdate}) = selectrow_query($form, $dbh, qq|SELECT current_date|); } - $dbh->disconnect; $main::lxdebug->leave_sub(); } @@ -1340,7 +1388,7 @@ sub get_parts { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form, $sortorder) = @_; - my $dbh = $form->dbconnect($myconfig); + my $dbh = $form->get_standard_dbh; my $order = qq| p.partnumber|; my $where = qq|1 = 1|; my @values; @@ -1383,7 +1431,6 @@ sub get_parts { } #while $form->{rows} = $j; $sth->finish; - $dbh->disconnect; $main::lxdebug->leave_sub(); @@ -1411,7 +1458,7 @@ sub retrieve_languages { my ($self, $myconfig, $form) = @_; # connect to database - my $dbh = $form->dbconnect($myconfig); + my $dbh = $form->get_standard_dbh; my @values; my $where; @@ -1433,8 +1480,6 @@ sub retrieve_languages { my $languages = selectall_hashref_query($form, $dbh, $query, @values); - $dbh->disconnect; - $main::lxdebug->leave_sub(); return $languages; @@ -1496,7 +1541,7 @@ sub retrieve_accounts { $transdate = $form->{deliverydate}; } } elsif ($form->{script} eq 'ir.pl') { - # when a purchase invoice is opened from the report of purchase invoices + # when a purchase invoice is opened from the report of purchase invoices # $form->{type} isn't set, but $form->{script} is, not sure why this is or # whether this distinction matters in some other scenario. Otherwise one # could probably take out this elsif and add a @@ -1536,17 +1581,21 @@ sub retrieve_accounts { SELECT p.id, p.inventory_accno_id AS is_part, bg.inventory_accno_id, - bg.income_accno_id_$form->{taxzone_id} AS income_accno_id, - bg.expense_accno_id_$form->{taxzone_id} AS expense_accno_id, + tc.income_accno_id AS income_accno_id, + tc.expense_accno_id AS expense_accno_id, c1.accno AS inventory_accno, c2.accno AS income_accno, c3.accno AS expense_accno FROM parts p LEFT JOIN buchungsgruppen bg ON p.buchungsgruppen_id = bg.id + LEFT JOIN taxzone_charts tc on bg.id = tc.buchungsgruppen_id LEFT JOIN chart c1 ON bg.inventory_accno_id = c1.id - LEFT JOIN chart c2 ON bg.income_accno_id_$form->{taxzone_id} = c2.id - LEFT JOIN chart c3 ON bg.expense_accno_id_$form->{taxzone_id} = c3.id - WHERE p.id IN ($in) + LEFT JOIN chart c2 ON tc.income_accno_id = c2.id + LEFT JOIN chart c3 ON tc.expense_accno_id = c3.id + WHERE + tc.taxzone_id = '$form->{taxzone_id}' + and + p.id IN ($in) SQL my $sth_tax = prepare_query($::form, $dbh, <finish(); - my @columns = qw(ean image microfiche drawing weight); + my @columns = qw(ean image microfiche drawing); $query = qq|SELECT id, | . join(', ', @columns) . qq| FROM parts @@ -1672,7 +1721,8 @@ sub prepare_parts_for_printing { my %data = selectall_as_map($form, $dbh, $query, 'id', \@columns, @part_ids); - map { $form->{TEMPLATE_ARRAYS}{$_} = [] } (qw(make model), @columns); + my %template_arrays; + map { $template_arrays{$_} = [] } (qw(make model), @columns); foreach my $i (1 .. $rowcount) { my $id = $form->{"${prefix}${i}"}; @@ -1680,21 +1730,51 @@ sub prepare_parts_for_printing { next if (!$id); foreach (@columns) { - push @{ $form->{TEMPLATE_ARRAYS}{$_} }, $data{$id}->{$_}; + push @{ $template_arrays{$_} }, $data{$id}->{$_}; } - push @{ $form->{TEMPLATE_ARRAYS}{make} }, []; - push @{ $form->{TEMPLATE_ARRAYS}{model} }, []; + push @{ $template_arrays{make} }, []; + push @{ $template_arrays{model} }, []; next if (!$makemodel{$id}); foreach my $ref (@{ $makemodel{$id} }) { - map { push @{ $form->{TEMPLATE_ARRAYS}{$_}->[-1] }, $ref->{$_} } qw(make model); + map { push @{ $template_arrays{$_}->[-1] }, $ref->{$_} } qw(make model); } } + my $parts = SL::DB::Manager::Part->get_all(query => [ id => \@part_ids ]); + my %parts_by_id = map { $_->id => $_ } @$parts; + + for my $i (1..$rowcount) { + my $id = $form->{"${prefix}${i}"}; + next unless $id; + + push @{ $template_arrays{part_type} }, $parts_by_id{$id}->type; + } + + return %template_arrays; $main::lxdebug->leave_sub(); } +sub normalize_text_blocks { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + my $form = $params{form} || $main::form; + + # check if feature is enabled (select normalize_part_descriptions from defaults) + return unless ($::instance_conf->get_normalize_part_descriptions); + + foreach (qw(description notes)) { + $form->{$_} =~ s/\s+$//s; + $form->{$_} =~ s/^\s+//s; + $form->{$_} =~ s/ {2,}/ /g; + } + $main::lxdebug->leave_sub(); +} + 1;