X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/bc40bcabc425b99f3b79a5544684a6fe8674adfe..3a13039a9d18b1a07cccbf6c4628671c38816150:/SL/IC.pm diff --git a/SL/IC.pm b/SL/IC.pm index 8f265029f..e455d38e1 100644 --- a/SL/IC.pm +++ b/SL/IC.pm @@ -43,6 +43,8 @@ use SL::DBUtils; use SL::HTML::Restrict; use SL::TransNumber; use SL::Util qw(trim); +use SL::DB; +use Carp; use strict; @@ -78,13 +80,12 @@ sub get_part { $form->{onhand} *= 1; # part or service item - $form->{item} = ($form->{inventory_accno}) ? 'part' : 'service'; - if ($form->{assembly}) { - $form->{item} = 'assembly'; + if ($form->{part_type} eq 'assembly') { # retrieve assembly items $query = qq|SELECT p.id, p.partnumber, p.description, + p.classification_id, p.sellprice, p.lastcost, p.weight, a.qty, a.bom, p.unit, pg.partsgroup, p.price_factor_id, pfac.factor AS price_factor FROM parts p @@ -101,6 +102,8 @@ sub get_part { foreach my $key (keys %{$ref}) { $form->{"${key}_$form->{assembly_rows}"} = $ref->{$key}; } + $form->{"type_and_classific_$form->{assembly_rows}"} = $::request->presenter->type_abbreviation($ref->{part_type}). + $::request->presenter->classification_abbreviation($ref->{classification_id}); } $sth->finish; @@ -193,8 +196,7 @@ sub get_pricegroups { my $i = 1; foreach my $pg (@{ $pricegroups }) { - $form->{"klass_$i"} = "$pg->{id}"; - $form->{"price_$i"} = $form->format_amount($myconfig, $form->{"price_$i"}, -2); + $form->{"price_$i"} = $form->format_amount($myconfig, $form->{"price_$i"}, -2); $form->{"pricegroup_id_$i"} = "$pg->{id}"; $form->{"pricegroup_$i"} = "$pg->{pricegroup}"; $i++; @@ -225,12 +227,20 @@ sub retrieve_buchungsgruppen { } sub save { + my ($self, $myconfig, $form) = @_; $main::lxdebug->enter_sub(); + my $rc = SL::DB->client->with_transaction(\&_save, $self, $myconfig, $form); + + $main::lxdebug->leave_sub(); + return $rc; +} + +sub _save { my ($self, $myconfig, $form) = @_; my @values; - # connect to database, turn off AutoCommit - my $dbh = $form->get_standard_dbh; + + my $dbh = SL::DB->client->dbh; my $restricter = SL::HTML::Restrict->create; # save the part @@ -248,35 +258,26 @@ sub save { my $makemodel = ($form->{make_1} || $form->{model_1} || ($form->{makemodel_rows} > 1)) ? 1 : 0; - $form->{assembly} = ($form->{item} eq 'assembly') ? 1 : 0; my ($query, $sth); my $priceupdate = ', priceupdate = current_date'; if ($form->{id}) { - my $trans_number = SL::TransNumber->new(type => $form->{item}, dbh => $dbh, number => $form->{partnumber}, id => $form->{id}); + my $trans_number = SL::TransNumber->new(type => $form->{part_type}, dbh => $dbh, number => $form->{partnumber}, id => $form->{id}); if (!$trans_number->is_unique) { $::lxdebug->leave_sub; return 3; } # get old price - $query = qq|SELECT sellprice, weight FROM parts WHERE id = ?|; - my ($sellprice, $weight) = selectrow_query($form, $dbh, $query, conv_i($form->{id})); - - # if item is part of an assembly adjust all assemblies - $query = qq|SELECT id, qty FROM assembly WHERE parts_id = ?|; - $sth = prepare_execute_query($form, $dbh, $query, conv_i($form->{id})); - while (my ($id, $qty) = $sth->fetchrow_array) { - &update_assembly($dbh, $form, $id, $qty, $sellprice * 1, $weight * 1); - } - $sth->finish; + $query = qq|SELECT sellprice FROM parts WHERE id = ?|; + my ($sellprice) = selectrow_query($form, $dbh, $query, conv_i($form->{id})); # delete makemodel records do_query($form, $dbh, qq|DELETE FROM makemodel WHERE parts_id = ?|, conv_i($form->{id})); - if ($form->{item} eq 'assembly') { + if ($form->{part_type} eq 'assembly') { # delete assembly records do_query($form, $dbh, qq|DELETE FROM assembly WHERE id = ?|, conv_i($form->{id})); } @@ -290,7 +291,7 @@ sub save { $priceupdate = '' if (all { $previous_values->{$_} == $form->{$_} } qw(sellprice lastcost listprice)); } else { - my $trans_number = SL::TransNumber->new(type => $form->{item}, dbh => $dbh, number => $form->{partnumber}, save => 1); + my $trans_number = SL::TransNumber->new(type => $form->{part_type}, dbh => $dbh, number => $form->{partnumber}, save => 1); if ($form->{partnumber} && !$trans_number->is_unique) { $::lxdebug->leave_sub; @@ -300,7 +301,7 @@ sub save { $form->{partnumber} ||= $trans_number->create_unique; ($form->{id}) = selectrow_query($form, $dbh, qq|SELECT nextval('id')|); - do_query($form, $dbh, qq|INSERT INTO parts (id, partnumber, unit) VALUES (?, ?, ?)|, $form->{id}, $form->{partnumber}, $form->{unit}); + do_query($form, $dbh, qq|INSERT INTO parts (id, partnumber, unit, part_type) VALUES (?, ?, ?, ?)|, $form->{id}, $form->{partnumber}, $form->{unit}, $form->{part_type}); $form->{orphaned} = 1; } @@ -311,7 +312,7 @@ sub save { } my ($subq_inventory, $subq_expense, $subq_income); - if ($form->{"item"} eq "part") { + if ($form->{part_type} eq "part") { $subq_inventory = qq|(SELECT bg.inventory_accno_id FROM buchungsgruppen bg @@ -320,7 +321,7 @@ sub save { $subq_inventory = "NULL"; } - if ($form->{"item"} ne "assembly") { + if ($form->{part_type} ne "assembly") { $subq_expense = qq|(SELECT tc.expense_accno_id FROM taxzone_charts tc @@ -336,8 +337,7 @@ sub save { partnumber = ?, description = ?, makemodel = ?, - alternate = 'f', - assembly = ?, + classification_id = ?, listprice = ?, sellprice = ?, lastcost = ?, @@ -363,6 +363,7 @@ sub save { has_sernumber = ?, not_discountable = ?, microfiche = ?, + part_type = ?, partsgroup_id = ?, price_factor_id = ? $priceupdate @@ -370,7 +371,7 @@ sub save { @values = ($form->{partnumber}, $form->{description}, $makemodel ? 't' : 'f', - $form->{assembly} ? 't' : 'f', + $form->{classification_id}, $form->{listprice}, $form->{sellprice}, $form->{lastcost}, @@ -394,6 +395,7 @@ sub save { $form->{has_sernumber} ? 't' : 'f', $form->{not_discountable} ? 't' : 'f', $form->{microfiche}, + $form->{part_type}, conv_i($partsgroup_id), conv_i($form->{price_factor_id}), conv_i($form->{id}) @@ -460,7 +462,7 @@ sub save { } # add assembly records - if ($form->{item} eq 'assembly') { + if ($form->{part_type} eq 'assembly') { # check additional assembly row my $i = $form->{assembly_rows}; # if last row is not empty add them @@ -545,37 +547,7 @@ sub save { SQL do_query($form, $dbh, $query, ($form->{id}) x 2); - # commit - my $rc = $dbh->commit; - - $main::lxdebug->leave_sub(); - - return $rc; -} - -sub update_assembly { - $main::lxdebug->enter_sub(); - - my ($dbh, $form, $id, $qty, $sellprice, $weight) = @_; - - my $query = qq|SELECT id, qty FROM assembly WHERE parts_id = ?|; - my $sth = prepare_execute_query($form, $dbh, $query, conv_i($id)); - - while (my ($pid, $aqty) = $sth->fetchrow_array) { - &update_assembly($dbh, $form, $pid, $aqty * $qty, $sellprice, $weight); - } - $sth->finish; - - $query = - qq|UPDATE parts SET sellprice = sellprice + ?, weight = weight + ? - WHERE id = ?|; - my @values = ($qty * ($form->{sellprice} - $sellprice), - $qty * ($form->{weight} - $weight), conv_i($id)); - do_query($form, $dbh, $query, @values); - - $form->new_lastmtime('parts') if $id == $form->{id}; - - $main::lxdebug->leave_sub(); + return 1; } sub retrieve_assemblies { @@ -607,7 +579,7 @@ sub retrieve_assemblies { FROM parts p2, assembly a WHERE (p2.id = a.parts_id) AND (a.id = p.id)) AS inventory FROM parts p - WHERE NOT p.obsolete AND p.assembly $where|; + WHERE NOT p.obsolete AND p.part_type = 'assembly' $where|; $form->{assembly_items} = selectall_hashref_query($form, $dbh, $query, @values); @@ -615,26 +587,27 @@ sub retrieve_assemblies { } sub delete { + my ($self, $myconfig, $form) = @_; $main::lxdebug->enter_sub(); + my $rc = SL::DB->client->with_transaction(\&_delete, $self, $myconfig, $form); + + $main::lxdebug->leave_sub(); + return $rc; +} + +sub _delete { my ($self, $myconfig, $form) = @_; my @values = (conv_i($form->{id})); - # connect to database, turn off AutoCommit - my $dbh = $form->get_standard_dbh; my %columns = ( "assembly" => "id", "parts" => "id" ); for my $table (qw(prices makemodel inventory assembly translation parts)) { my $column = defined($columns{$table}) ? $columns{$table} : "parts_id"; - do_query($form, $dbh, qq|DELETE FROM $table WHERE $column = ?|, @values); + do_query($form, SL::DB->client->dbh, qq|DELETE FROM $table WHERE $column = ?|, @values); } - # commit - my $rc = $dbh->commit; - - $main::lxdebug->leave_sub(); - - return $rc; + return 1; } sub assembly_item { @@ -672,18 +645,16 @@ sub assembly_item { $where .= qq| ORDER BY p.description|; } - # connect to database - my $dbh = $form->get_standard_dbh; - my $query = qq|SELECT p.id, p.partnumber, p.description, p.sellprice, + p.classification_id, p.weight, p.onhand, p.unit, pg.partsgroup, p.lastcost, p.price_factor_id, pfac.factor AS price_factor, p.notes as longdescription FROM parts p LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) LEFT JOIN price_factors pfac ON pfac.id = p.price_factor_id WHERE $where|; - $form->{item_list} = selectall_hashref_query($form, $dbh, $query, @values); + $form->{item_list} = selectall_hashref_query($form, SL::DB->client->dbh, $query, @values); $main::lxdebug->leave_sub(); } @@ -758,7 +729,7 @@ sub all_parts { # my @other_flags = qw(onhand); # ToDO: implement these # my @inactive_flags = qw(l_subtotal short l_linetotal); - my @select_tokens = qw(id factor); + my @select_tokens = qw(id factor part_type classification_id); my @where_tokens = qw(1=1); my @group_tokens = (); my @bind_vars = (); @@ -835,7 +806,7 @@ sub all_parts { insertdate => 'itime::DATE', ); - if (($form->{searchitems} eq 'assembly') && $form->{l_lastcost}) { + if ($form->{l_assembly} && $form->{l_lastcost}) { @simple_l_switches = grep { $_ ne 'lastcost' } @simple_l_switches; } @@ -925,11 +896,23 @@ sub all_parts { push @select_tokens, $_; } - for ($form->{searchitems}) { - push @where_tokens, 'p.inventory_accno_id > 0' if /part/; - push @where_tokens, 'p.inventory_accno_id IS NULL' if /service/; - push @where_tokens, 'NOT p.assembly' if /service/; - push @where_tokens, ' p.assembly' if /assembly/; + # Oder Bedingungen fuer Ware Dienstleistung Erzeugnis: + if ($form->{l_part} || $form->{l_assembly} || $form->{l_service} || $form->{l_assortment}) { + my @or_tokens = (); + push @or_tokens, "p.part_type = 'service'" if $form->{l_service}; + push @or_tokens, "p.part_type = 'assembly'" if $form->{l_assembly}; + push @or_tokens, "p.part_type = 'part'" if $form->{l_part}; + push @or_tokens, "p.part_type = 'assortment'" if $form->{l_assortment}; + push @where_tokens, join ' OR ', map { "($_)" } @or_tokens; + } + else { + # gar keine Teile + push @where_tokens, q|'F' = 'T'|; + } + + if ( $form->{classification_id} > 0 ) { + push @where_tokens, "p.classification_id = ?"; + push @bind_vars, $form->{classification_id}; } for ($form->{itemstatus}) { @@ -987,7 +970,7 @@ sub all_parts { push @select_tokens, @qsooqr_flags, 'quotation', 'cv', 'ioi.id', 'ioi.ioi' if $bsooqr; push @select_tokens, @deliverydate_flags if $bsooqr && $form->{l_deliverydate}; - push @select_tokens, $q_assembly_lastcost if ($form->{searchitems} eq 'assembly') && $form->{l_lastcost}; + push @select_tokens, $q_assembly_lastcost if $form->{l_assembly} && $form->{l_lastcost}; push @bsooqr_tokens, q|module = 'ir' AND NOT ioi.assemblyitem| if $form->{bought}; push @bsooqr_tokens, q|module = 'is' AND NOT ioi.assemblyitem| if $form->{sold}; push @bsooqr_tokens, q|module = 'oe' AND NOT quotation AND cv = 'customer'| if $form->{ordered}; @@ -1085,7 +1068,7 @@ sub all_parts { # post processing for assembly parts lists (bom) # for each part get the assembly parts and add them into the partlist. my @assemblies; - if ($form->{searchitems} eq 'assembly' && $form->{bom}) { + if ($form->{l_assembly} && $form->{bom}) { $query = qq|SELECT p.id, p.partnumber, p.description, a.qty AS onhand, p.unit, p.notes, p.itime::DATE as insertdate, @@ -1115,7 +1098,7 @@ sub all_parts { $form->{parts} = \@assemblies; } - if ($form->{l_pricegroups} ) { + if ($form->{l_pricegroups} && SL::DB::Manager::Price->get_all_count() > 0 ) { my $query = <finish; } - }; - + } $main::lxdebug->leave_sub(); @@ -1259,15 +1241,23 @@ sub get_num_matches_for_priceupdate { } sub update_prices { + my ($self, $myconfig, $form) = @_; $main::lxdebug->enter_sub(); + my $num_updated = SL::DB->client->with_transaction(\&_update_prices, $self, $myconfig, $form); + + $main::lxdebug->leave_sub(); + return $num_updated; +} + +sub _update_prices { my ($self, $myconfig, $form) = @_; my ($where, @where_values) = $self->_create_filter_for_priceupdate(); my $num_updated = 0; # connect to database - my $dbh = $form->get_standard_dbh; + my $dbh = SL::DB->client->dbh; for my $column (qw(sellprice listprice)) { next if ($form->{$column} eq ""); @@ -1327,10 +1317,6 @@ sub update_prices { $sth_add->finish(); $sth_multiply->finish(); - my $rc= $dbh->commit; - - $main::lxdebug->leave_sub(); - return $num_updated; } @@ -1425,7 +1411,8 @@ sub get_parts { } my $query = - qq|SELECT id, partnumber, description, unit, sellprice + qq|SELECT id, partnumber, description, unit, sellprice, + classification_id FROM parts WHERE $where ORDER BY $order|; @@ -1438,6 +1425,8 @@ sub get_parts { } $j++; + $form->{"type_and_classific_$j"} = $::request->presenter->type_abbreviation($ref->{part_type}). + $::request->presenter->classification_abbreviation($ref->{classification_id}); $form->{"id_$j"} = $ref->{id}; $form->{"partnumber_$j"} = $ref->{partnumber}; $form->{"description_$j"} = $ref->{description}; @@ -1595,7 +1584,7 @@ sub retrieve_accounts { my %accno_by_part = map { $_->{id} => $_ } selectall_hashref_query($form, $dbh, < $part_id) = each %args) { my $ref = $accno_by_part{$part_id} or next; - $ref->{"inventory_accno_id"} = undef unless $ref->{"is_part"}; + $ref->{"inventory_accno_id"} = undef unless $ref->{"part_type"} eq 'part'; my %accounts; for my $type (qw(inventory income expense)) { @@ -1765,12 +1754,15 @@ sub prepare_parts_for_printing { for my $i (1..$rowcount) { my $id = $form->{"${prefix}${i}"}; next unless $id; - - push @{ $template_arrays{part_type} }, $parts_by_id{$id}->type; + my $prt = $parts_by_id{$id}; + my $type_abbr = $::request->presenter->type_abbreviation($prt->part_type); + push @{ $template_arrays{part_type} }, $type_abbr; + push @{ $template_arrays{type_and_classific}}, $type_abbr.$::request->presenter->classification_abbreviation($prt->classification_id); + push @{ $template_arrays{separate} }, $::request->presenter->separate_abbreviation($prt->classification_id); } - return %template_arrays; $main::lxdebug->leave_sub(); + return %template_arrays; } sub normalize_text_blocks { @@ -1792,5 +1784,4 @@ sub normalize_text_blocks { $main::lxdebug->leave_sub(); } - 1;