X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/kivitendo-erp.git/blobdiff_plain/f5a3d9b00be0fedf3b5a88cd18d19a258ef87c59..626e02403cbcee241b2be41f3c2d827663864523:/SL/OE.pm diff --git a/SL/OE.pm b/SL/OE.pm index cf20a1b07..4c65c0545 100644 --- a/SL/OE.pm +++ b/SL/OE.pm @@ -1,4 +1,4 @@ -#===================================================================== +#==================================================================== # LX-Office ERP # Copyright (C) 2004 # Based on SQL-Ledger Version 2.1.9 @@ -459,6 +459,27 @@ Message: $form->{message}\r| if $form->{message}; return $rc; } +# this function closes multiple orders given in $form->{ordnumber_#}. +# use this for multiple orders that don't have to be saved back +# single orders should use OE::save instead. +sub close_orders { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig ,$form) = @_; + + # get ids from $form + map { push @ids, $form->{"ordnumber_$_"} if $form->{"ordnumber_$_"} } (1 .. $form->{rowcount}); + + my $dbh = $form->dbconnect($myconfig); + $query = qq|UPDATE oe SET + closed = TRUE + WHERE ordnumber IN (|.join(', ', map{ $dbh->quote($_) }@ids).qq|)|; + $dbh->do($query) || $form->dberror($query); + $dbh->disconnect; + + $main::lxdebug->leave_sub(); +} + sub delete { $main::lxdebug->enter_sub(); @@ -539,6 +560,15 @@ sub retrieve { my $query; + # translate the ids (given by id_# and trans_id_#) into one array of ids, so we can join them later + map { push @ids, $form->{"trans_id_$_"} if ($form->{"id_$_"}) } (1 .. $form->{"rowcount"}); + + # if called in multi id mode, and still only got one id, switch back to single id + if ($form->{"rowcount"} and $#ids == 0) { + $form->{"id"} = $ids[0]; + undef @ids; + } + if ($form->{id}) { # get default accounts and last order number @@ -578,10 +608,13 @@ sub retrieve { ($form->{currency}) = split /:/, $form->{currencies}; - if ($form->{id}) { + if ($form->{id} or @ids) { - # retrieve order - $query = qq|SELECT o.cp_id,o.ordnumber, o.transdate, o.reqdate, + # retrieve order for single id + # NOTE: this query is intended to fetch all information only ONCE. + # so if any of these infos is important (or even different) for any item, + # it will be killed out and then has to be fetched from the item scope query further down + $query = qq|SELECT o.cp_id, o.ordnumber, o.transdate, o.reqdate, o.taxincluded, o.shippingpoint, o.shipvia, o.notes, o.intnotes, o.curr AS currency, e.name AS employee, o.employee_id, o.$form->{vc}_id, cv.name AS $form->{vc}, o.amount AS invtotal, @@ -591,47 +624,67 @@ sub retrieve { JOIN $form->{vc} cv ON (o.$form->{vc}_id = cv.id) LEFT JOIN employee e ON (o.employee_id = e.id) LEFT JOIN department d ON (o.department_id = d.id) - WHERE o.id = $form->{id}|; - $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); + |. ($form->{id} + ? qq|WHERE o.id = $form->{id}| + : qq|WHERE o.id IN (|.join(', ', @ids).qq|)| + ); - $ref = $sth->fetchrow_hashref(NAME_lc); - map { $form->{$_} = $ref->{$_} } keys %$ref; - $sth->finish; +#$main::lxdebug->message(0, $query); - $query = qq|SELECT s.* FROM shipto s - WHERE s.trans_id = $form->{id}|; $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); $ref = $sth->fetchrow_hashref(NAME_lc); map { $form->{$_} = $ref->{$_} } keys %$ref; - $sth->finish; - - # get printed, emailed and queued - $query = qq|SELECT s.printed, s.emailed, s.spoolfile, s.formname - FROM status s - WHERE s.trans_id = $form->{id}|; - $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); + # destroy all entries for multiple ids that yield different information while ($ref = $sth->fetchrow_hashref(NAME_lc)) { - $form->{printed} .= "$ref->{formname} " if $ref->{printed}; - $form->{emailed} .= "$ref->{formname} " if $ref->{emailed}; - $form->{queued} .= "$ref->{formname} $ref->{spoolfile} " - if $ref->{spoolfile}; + map { undef $form->{$_} if ($ref->{$_} ne $form->{$_}) } keys %$ref; } + + # if not given, fill transdate with current_date + $form->{transdate} = $form->current_date($myconfig) unless $form->{transdate}; + $sth->finish; - map { $form->{$_} =~ s/ +$//g } qw(printed emailed queued); + + # shipto and pinted/mailed/queued status makes only sense for single id retrieve + if (!@ids) { + $query = qq|SELECT s.* FROM shipto s + WHERE s.trans_id = $form->{id}|; + $sth = $dbh->prepare($query); + $sth->execute || $form->dberror($query); + + $ref = $sth->fetchrow_hashref(NAME_lc); + map { $form->{$_} = $ref->{$_} } keys %$ref; + $sth->finish; + + # get printed, emailed and queued + $query = qq|SELECT s.printed, s.emailed, s.spoolfile, s.formname + FROM status s + WHERE s.trans_id = $form->{id}|; + $sth = $dbh->prepare($query); + $sth->execute || $form->dberror($query); + + while ($ref = $sth->fetchrow_hashref(NAME_lc)) { + $form->{printed} .= "$ref->{formname} " if $ref->{printed}; + $form->{emailed} .= "$ref->{formname} " if $ref->{emailed}; + $form->{queued} .= "$ref->{formname} $ref->{spoolfile} " if $ref->{spoolfile}; + } + $sth->finish; + map { $form->{$_} =~ s/ +$//g } qw(printed emailed queued); + } # if !@ids my %oid = ('Pg' => 'oid', 'Oracle' => 'rowid'); # retrieve individual items + # this query looks up all information about the items + # stuff different from the whole will not be overwritten, but saved with a suffix. $query = qq|SELECT o.id AS orderitems_id, c1.accno AS inventory_accno, c2.accno AS income_accno, c3.accno AS expense_accno, + oe.ordnumber, oe.transdate, oe.cusordnumber, p.partnumber, p.assembly, o.description, o.qty, o.sellprice, o.parts_id AS id, o.unit, o.discount, p.bin, p.notes AS partnotes, o.reqdate, o.project_id, o.serialnumber, o.ship, @@ -639,13 +692,18 @@ sub retrieve { pg.partsgroup, o.pricegroup_id, (SELECT pricegroup FROM pricegroup WHERE id=o.pricegroup_id) as pricegroup FROM orderitems o JOIN parts p ON (o.parts_id = p.id) + JOIN oe ON (o.trans_id = oe.id) LEFT JOIN chart c1 ON (p.inventory_accno_id = c1.id) LEFT JOIN chart c2 ON (p.income_accno_id = c2.id) LEFT JOIN chart c3 ON (p.expense_accno_id = c3.id) LEFT JOIN project pr ON (o.project_id = pr.id) LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) - WHERE o.trans_id = $form->{id} + |. ($form->{id} + ? qq|WHERE o.trans_id = $form->{id}| + : qq|WHERE o.trans_id IN (|.join(", ", @ids).qq|)| + ).qq| ORDER BY o.$oid{$myconfig->{dbdriver}}|; + $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query);