X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDO.pm;h=d0086fcd721a85728869bdff03eeef401386a44e;hb=1b9c915f724d784318ad4f065294703828ed5a4e;hp=04d5e84dd4311d72953588441ba3df3fc91a4ba3;hpb=82053b457be3de2ee5285dc13633222f4d30802c;p=kivitendo-erp.git diff --git a/SL/DO.pm b/SL/DO.pm index 04d5e84dd..d0086fcd7 100644 --- a/SL/DO.pm +++ b/SL/DO.pm @@ -39,6 +39,8 @@ use YAML; use SL::AM; use SL::Common; use SL::CVar; +use SL::DB::DeliveryOrder; +use SL::DB::Status; use SL::DBUtils; use SL::RecordLinks; use SL::IC; @@ -128,6 +130,11 @@ sub transactions { push @where, ($form->{delivered} ? "" : "NOT ") . "COALESCE(dord.delivered, FALSE)"; } + if ($form->{serialnumber}) { + push @where, 'dord.id IN (SELECT doi.delivery_order_id FROM delivery_order_items doi WHERE doi.serialnumber LIKE ?)'; + push @values, '%' . $form->{serialnumber} . '%'; + } + if($form->{transdatefrom}) { push @where, qq|dord.transdate >= ?|; push @values, conv_date($form->{transdatefrom}); @@ -138,6 +145,16 @@ sub transactions { push @values, conv_date($form->{transdateto}); } + if($form->{reqdatefrom}) { + push @where, qq|dord.reqdate >= ?|; + push @values, conv_date($form->{reqdatefrom}); + } + + if($form->{reqdateto}) { + push @where, qq|dord.reqdate <= ?|; + push @values, conv_date($form->{reqdateto}); + } + if (@where) { $query .= " WHERE " . join(" AND ", map { "($_)" } @where); } @@ -350,7 +367,8 @@ sub save { shippingpoint = ?, shipvia = ?, notes = ?, intnotes = ?, closed = ?, delivered = ?, department_id = ?, language_id = ?, shipto_id = ?, globalproject_id = ?, employee_id = ?, salesman_id = ?, cp_id = ?, transaction_description = ?, - is_sales = ?, taxzone_id = ?, taxincluded = ?, terms = ?, currency_id = (SELECT id FROM currencies WHERE name = ?) + is_sales = ?, taxzone_id = ?, taxincluded = ?, terms = ?, currency_id = (SELECT id FROM currencies WHERE name = ?), + delivery_term_id = ? WHERE id = ?|; @values = ($form->{donumber}, $form->{ordnumber}, @@ -365,6 +383,7 @@ sub save { $form->{transaction_description}, $form->{type} =~ /^sales/ ? 't' : 'f', conv_i($form->{taxzone_id}), $form->{taxincluded} ? 't' : 'f', conv_i($form->{terms}), $form->{currency}, + conv_i($form->{delivery_term_id}), conv_i($form->{id})); do_query($form, $dbh, $query, @values); @@ -507,59 +526,16 @@ sub delete { my $form = $main::form; my $spool = $::lx_office_conf{paths}->{spool}; - # connect to database - my $dbh = $form->get_standard_dbh($myconfig); - - # delete spool files - my $query = qq|SELECT s.spoolfile FROM status s WHERE s.trans_id = ?|; - my $sth = prepare_execute_query($form, $dbh, $query, conv_i($form->{id})); - - my $spoolfile; - my @spoolfiles = (); - my @values; - - while (($spoolfile) = $sth->fetchrow_array) { - push @spoolfiles, $spoolfile; - } - $sth->finish(); - - # delete-values - @values = (conv_i($form->{id})); - - # delete status entries - $query = qq|DELETE FROM status - WHERE trans_id = ?|; - do_query($form, $dbh, $query, @values); - - # delete individual entries - $query = qq|DELETE FROM delivery_order_items_stock - WHERE delivery_order_item_id IN ( - SELECT id FROM delivery_order_items - WHERE delivery_order_id = ? - )|; - do_query($form, $dbh, $query, @values); - - # delete individual entries - $query = qq|DELETE FROM delivery_order_items - WHERE delivery_order_id = ?|; - do_query($form, $dbh, $query, @values); - - # delete DO record - $query = qq|DELETE FROM delivery_orders - WHERE id = ?|; - do_query($form, $dbh, $query, @values); + my $rc = SL::DB::Order->new->db->with_transaction(sub { + my @spoolfiles = grep { $_ } map { $_->spoolfile } @{ SL::DB::Manager::Status->get_all(where => [ trans_id => $form->{id} ]) }; - $query = qq|DELETE FROM shipto - WHERE trans_id = ? AND module = 'DO'|; - do_query($form, $dbh, $query, @values); + SL::DB::DeliveryOrder->new(id => $form->{id})->delete; - my $rc = $dbh->commit(); + my $spool = $::lx_office_conf{paths}->{spool}; + unlink map { "$spool/$_" } @spoolfiles if $spool; - if ($rc) { - foreach $spoolfile (@spoolfiles) { - unlink "$spool/$spoolfile" if $spoolfile; - } - } + 1; + }); $main::lxdebug->leave_sub(); @@ -618,7 +594,8 @@ sub retrieve { d.description AS department, dord.language_id, dord.shipto_id, dord.globalproject_id, dord.delivered, dord.transaction_description, - dord.taxzone_id, dord.taxincluded, dord.terms, (SELECT cu.name FROM currencies cu WHERE cu.id=dord.currency_id) AS currency + dord.taxzone_id, dord.taxincluded, dord.terms, (SELECT cu.name FROM currencies cu WHERE cu.id=dord.currency_id) AS currency, + dord.delivery_term_id FROM delivery_orders dord JOIN ${vc} cv ON (dord.${vc}_id = cv.id) LEFT JOIN employee e ON (dord.employee_id = e.id) @@ -672,9 +649,6 @@ sub retrieve { delete $form->{id}; } - 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. @@ -693,7 +667,7 @@ sub retrieve { LEFT JOIN project pr ON (doi.project_id = pr.id) LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) WHERE doi.delivery_order_id IN ($do_ids_placeholders) - ORDER BY doi.$oid{$myconfig->{dbdriver}}|; + ORDER BY doi.oid|; $form->{form_details} = selectall_hashref_query($form, $dbh, $query, @do_ids); @@ -751,11 +725,10 @@ sub order_details { my @partsgroup = (); my $partsgroup; my $position = 0; + my $subtotal_header = 0; + my $subposition = 0; - my %oid = ('Pg' => 'oid', - 'Oracle' => 'rowid'); - - my (@project_ids, %projectnumbers, %projectdescriptions); + my (@project_ids); push(@project_ids, $form->{"globalproject_id"}) if ($form->{"globalproject_id"}); @@ -769,21 +742,21 @@ sub order_details { push(@project_ids, $form->{"project_id_$i"}) if ($form->{"project_id_$i"}); } + my $projects = []; + my %projects_by_id; if (@project_ids) { - $query = "SELECT id, projectnumber, description FROM project WHERE id IN (" . - join(", ", map("?", @project_ids)) . ")"; - $sth = prepare_execute_query($form, $dbh, $query, @project_ids); - while (my $ref = $sth->fetchrow_hashref()) { - $projectnumbers{$ref->{id}} = $ref->{projectnumber}; - $projectdescriptions{$ref->{id}} = $ref->{description}; - } - $sth->finish(); + $projects = SL::DB::Manager::Project->get_all(query => [ id => \@project_ids ]); + %projects_by_id = map { $_->id => $_ } @$projects; } - $form->{"globalprojectnumber"} = - $projectnumbers{$form->{"globalproject_id"}}; - $form->{"globalprojectdescription"} = - $projectdescriptions{$form->{"globalproject_id"}}; + $form->{globalprojectnumber} = $projects_by_id{$form->{"globalproject_id"}}->projectnumber; + $form->{globalprojectdescription} = $projects_by_id{$form->{"globalproject_id"}}->description; + + if ($projects_by_id{$form->{"globalproject_id"}}) { + for (@{ $projects_by_id{$form->{"globalproject_id"}}->cvars_by_config }) { + $form->{"project_cvar_" . $_->config->name} = $_->value_as_text; + } + } my $q_pg = qq|SELECT p.partnumber, p.description, p.unit, a.qty, pg.partsgroup FROM assembly a @@ -802,6 +775,7 @@ sub order_details { my $num_si = 0; my $ic_cvar_configs = CVar->get_configs(module => 'IC'); + my $project_cvar_configs = CVar->get_configs(module => 'Projects'); $form->{TEMPLATE_ARRAYS} = { }; IC->prepare_parts_for_printing(myconfig => $myconfig, form => $form); @@ -810,23 +784,23 @@ sub order_details { qw(runningnumber number description longdescription qty unit partnotes serialnumber reqdate projectnumber projectdescription si_runningnumber si_number si_description - si_warehouse si_bin si_chargenumber si_bestbefore si_qty si_unit); + si_warehouse si_bin si_chargenumber si_bestbefore si_qty si_unit weight lineweight); map { $form->{TEMPLATE_ARRAYS}->{$_} = [] } (@arrays); push @arrays, map { "ic_cvar_$_->{name}" } @{ $ic_cvar_configs }; + push @arrays, map { "project_cvar_$_->{name}" } @{ $project_cvar_configs }; $form->get_lists('price_factors' => 'ALL_PRICE_FACTORS'); my %price_factors = map { $_->{id} => $_->{factor} } @{ $form->{ALL_PRICE_FACTORS} }; + my $totalweight = 0; my $sameitem = ""; foreach $item (sort { $a->[1] cmp $b->[1] } @partsgroup) { $i = $item->[0]; next if (!$form->{"id_$i"}); - $position++; - if ($item->[1] ne $sameitem) { push(@{ $form->{description} }, qq|$item->[1]|); $sameitem = $item->[1]; @@ -837,8 +811,22 @@ sub order_details { $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"}); # add number, description and qty to $form->{number}, .... + if ($form->{"subtotal_$i"} && !$subtotal_header) { + $subtotal_header = $i; + $position = int($position); + $subposition = 0; + $position++; + } elsif ($subtotal_header) { + $subposition += 1; + $position = int($position); + $position = $position.".".$subposition; + } else { + $position = int($position); + $position++; + } my $price_factor = $price_factors{$form->{"price_factor_id_$i"}} || { 'factor' => 1 }; + my $project = $projects_by_id{$form->{"project_id_$i"}} || SL::DB::Project->new; push @{ $form->{TEMPLATE_ARRAYS}{runningnumber} }, $position; push @{ $form->{TEMPLATE_ARRAYS}{number} }, $form->{"partnumber_$i"}; @@ -850,9 +838,19 @@ sub order_details { push @{ $form->{TEMPLATE_ARRAYS}{partnotes} }, $form->{"partnotes_$i"}; push @{ $form->{TEMPLATE_ARRAYS}{serialnumber} }, $form->{"serialnumber_$i"}; push @{ $form->{TEMPLATE_ARRAYS}{reqdate} }, $form->{"reqdate_$i"}; - push @{ $form->{TEMPLATE_ARRAYS}{projectnumber} }, $projectnumbers{$form->{"project_id_$i"}}; - push @{ $form->{TEMPLATE_ARRAYS}{projectdescription} }, - $projectdescriptions{$form->{"project_id_$i"}}; + push @{ $form->{TEMPLATE_ARRAYS}{projectnumber} }, $project->projectnumber; + push @{ $form->{TEMPLATE_ARRAYS}{projectdescription} }, $project->description; + + if ($form->{"subtotal_$i"} && $subtotal_header && ($subtotal_header != $i)) { + $subtotal_header = 0; + } + + my $lineweight = $form->{"qty_$i"} * $form->{"weight_$i"}; + $totalweight += $lineweight; + push @{ $form->{TEMPLATE_ARRAYS}->{weight} }, $form->format_amount($myconfig, $form->{"weight_$i"}, 3); + push @{ $form->{TEMPLATE_ARRAYS}->{weight_nofmt} }, $form->{"weight_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}->{lineweight} }, $form->format_amount($myconfig, $lineweight, 3); + push @{ $form->{TEMPLATE_ARRAYS}->{lineweight_nofmt} }, $lineweight; if ($form->{"assembly_$i"}) { $sameitem = ""; @@ -861,9 +859,9 @@ sub order_details { my $sortorder = ""; if ($form->{groupitems}) { $sortorder = - qq|ORDER BY pg.partsgroup, a.$oid{$myconfig->{dbdriver}}|; + qq|ORDER BY pg.partsgroup, a.oid|; } else { - $sortorder = qq|ORDER BY a.$oid{$myconfig->{dbdriver}}|; + $sortorder = qq|ORDER BY a.oid|; } do_statement($form, $h_pg, $q_pg, conv_i($form->{"id_$i"})); @@ -905,11 +903,21 @@ sub order_details { push @{ $form->{TEMPLATE_ARRAYS}->{"ic_cvar_$_->{name}"} }, CVar->format_to_template(CVar->parse($form->{"ic_cvar_$_->{name}_$i"}, $_), $_) for @{ $ic_cvar_configs }; + + push @{ $form->{TEMPLATE_ARRAYS}->{"project_cvar_" . $_->config->name} }, $_->value_as_text for @{ $project->cvars_by_config }; } + $form->{totalweight} = $form->format_amount($myconfig, $totalweight, 3); + $form->{totalweight_nofmt} = $totalweight; + my $defaults = AM->get_defaults(); + $form->{weightunit} = $defaults->{weightunit}; + $h_pg->finish(); $h_bin_wh->finish(); + $form->{delivery_term} = SL::DB::Manager::DeliveryTerm->find_by(id => $form->{delivery_term_id} || undef); + $form->{delivery_term}->description_long($form->{delivery_term}->translated_attribute('description_long', $form->{language_id})) if $form->{delivery_term} && $form->{language_id}; + $form->{username} = $myconfig->{name}; $main::lxdebug->leave_sub();