X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDO.pm;h=49dbb9f4ddd8ea5ef98d3b9569f065268caceb4b;hb=1c603341fc02e3a5a7b5126cd7df6478d2e34700;hp=c844b83e8903e63cc62df11a12e00d0452cae1bc;hpb=3c1ceacd69653915e0b44f1700b198d96681f546;p=kivitendo-erp.git diff --git a/SL/DO.pm b/SL/DO.pm index c844b83e8..49dbb9f4d 100644 --- a/SL/DO.pm +++ b/SL/DO.pm @@ -38,7 +38,10 @@ use YAML; use SL::AM; use SL::Common; +use SL::CVar; use SL::DBUtils; +use SL::RecordLinks; +use SL::IC; sub transactions { $main::lxdebug->enter_sub(); @@ -78,10 +81,10 @@ sub transactions { } if ($form->{project_id}) { - $query .= + push @where, qq|(dord.globalproject_id = ?) OR EXISTS (SELECT * FROM delivery_order_items doi - WHERE (doi.project_id = ?) AND (oi.delivery_order_id = dord.id))|; + WHERE (doi.project_id = ?) AND (doi.delivery_order_id = dord.id))|; push @values, conv_i($form->{project_id}), conv_i($form->{project_id}); } @@ -106,7 +109,8 @@ sub transactions { push @values, '%' . $form->{$item} . '%'; } - if (!($form->{open} && $form->{closed})) { + if (($form->{open} || $form->{closed}) && + ($form->{open} ne $form->{closed})) { push @where, ($form->{open} ? "NOT " : "") . "COALESCE(dord.closed, FALSE)"; } @@ -141,12 +145,13 @@ sub transactions { "transaction_description" => "dord.transaction_description" ); - my $sortoder = "dord.id"; + my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC'; + my $sortorder = "dord.id"; if ($form->{sort} && grep($form->{sort}, keys(%allowed_sort_columns))) { $sortorder = $allowed_sort_columns{$form->{sort}}; } - $query .= qq| ORDER by | . $sortorder; + $query .= qq| ORDER by | . $sortorder . " $sortdir"; $form->{DO} = selectall_hashref_query($form, $dbh, $query, @values); @@ -188,6 +193,9 @@ sub save { my $all_units = AM->retrieve_units($myconfig, $form); $form->{all_units} = $all_units; + my $ic_cvar_configs = CVar->get_configs(module => 'IC', + dbh => $dbh); + $form->{donumber} = $form->update_defaults($myconfig, $form->{type} eq 'sales_delivery_order' ? 'sdonumber' : 'pdonumber', $dbh) unless $form->{donumber}; $form->{employee_id} = (split /--/, $form->{employee})[1] if !$form->{employee_id}; $form->get_employee($dbh) unless ($form->{employee_id}); @@ -298,6 +306,15 @@ sub save { conv_i($sinfo->{bin_id}), $sinfo->{chargenumber}); do_statement($form, $h_item_stock, $q_item_stock, @values); } + + CVar->save_custom_variables(module => 'IC', + sub_module => 'delivery_order_items', + trans_id => $item_id, + configs => $ic_cvar_configs, + variables => $form, + name_prefix => 'ic_', + name_postfix => "_$i", + dbh => $dbh); } $h_item_id->finish(); @@ -314,7 +331,7 @@ 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 = ? + is_sales = ?, taxzone_id = ?, taxincluded = ?, terms = ?, curr = ? WHERE id = ?|; @values = ($form->{donumber}, $form->{ordnumber}, @@ -328,6 +345,7 @@ sub save { conv_i($form->{salesman_id}), conv_i($form->{cp_id}), $form->{transaction_description}, $form->{type} =~ /^sales/ ? 't' : 'f', + conv_i($form->{taxzone_id}), $form->{taxincluded} ? 't' : 'f', conv_i($form->{terms}), $form->{curr}, conv_i($form->{id})); do_query($form, $dbh, $query, @values); @@ -342,9 +360,19 @@ sub save { # save printed, emailed, queued $form->save_status($dbh); - $self->mark_order_if_delivered('do_id' => $form->{id}, - 'type' => $form->{type} eq 'sales_delivery_order' ? 'sales' : 'purchase', - 'dbh' => $dbh,); + # Link this delivery order to the quotations it was created from. + RecordLinks->create_links('dbh' => $dbh, + 'mode' => 'ids', + 'from_table' => 'oe', + 'from_ids' => $form->{convert_from_oe_ids}, + 'to_table' => 'delivery_orders', + 'to_id' => $form->{id}, + ); + delete $form->{convert_from_oe_ids}; + + $self->mark_orders_if_delivered('do_id' => $form->{id}, + 'type' => $form->{type} eq 'sales_delivery_order' ? 'sales' : 'purchase', + 'dbh' => $dbh,); my $rc = $dbh->commit(); @@ -357,7 +385,7 @@ sub save { return $rc; } -sub mark_order_if_delivered { +sub mark_orders_if_delivered { $main::lxdebug->enter_sub(); my $self = shift; @@ -365,41 +393,32 @@ sub mark_order_if_delivered { Common::check_params(\%params, qw(do_id type)); - my $myconfig = \%main::myconfig; - my $form = $main::form; - - my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); - - my $query = qq|SELECT ordnumber FROM delivery_orders WHERE id = ?|; - my ($ordnumber) = selectfirst_array_query($form, $dbh, $query, conv_i($params{do_id})); + my $myconfig = \%main::myconfig; + my $form = $main::form; - return $main::lxdebug->leave_sub() if (!$ordnumber); + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); - my $vc = $params{type} eq 'purchase' ? 'vendor' : 'customer'; - $query = qq|SELECT id - FROM oe - WHERE NOT COALESCE(quotation, FALSE) - AND (COALESCE(${vc}_id, 0) > 0) - AND (ordnumber = ?) - ORDER BY id - LIMIT 1|; + my @links = RecordLinks->get_links('dbh' => $dbh, + 'from_table' => 'oe', + 'to_table' => 'delivery_orders', + 'to_id' => $params{do_id}); - my ($oe_id) = selectfirst_array_query($form, $dbh, $query, $ordnumber); + my ($oe_id) = $links[0]->{from_id} if (scalar @links); return $main::lxdebug->leave_sub() if (!$oe_id); my $all_units = AM->retrieve_all_units(); - my %shipped = $self->get_shipped_qty('type' => $params{type}, - 'ordnumber' => $ordnumber,); - my %ordered = (); - - $query = qq|SELECT oi.parts_id, oi.qty, oi.unit, p.unit AS partunit + my $query = qq|SELECT oi.parts_id, oi.qty, oi.unit, p.unit AS partunit FROM orderitems oi LEFT JOIN parts p ON (oi.parts_id = p.id) WHERE (oi.trans_id = ?)|; my $sth = prepare_execute_query($form, $dbh, $query, $oe_id); + my %shipped = $self->get_shipped_qty('type' => $params{type}, + 'oe_id' => $oe_id,); + my %ordered = (); + while (my $ref = $sth->fetchrow_hashref()) { $ref->{baseqty} = $ref->{qty} * $all_units->{$ref->{unit}}->{factor} / $all_units->{$ref->{partunit}}->{factor}; @@ -424,10 +443,9 @@ sub mark_order_if_delivered { if ($delivered) { $query = qq|UPDATE oe - SET delivered = TRUE, closed = TRUE + SET delivered = TRUE WHERE id = ?|; do_query($form, $dbh, $query, $oe_id); - $dbh->commit() if (!$params{dbh}); } @@ -542,6 +560,9 @@ sub retrieve { my ($query, $query_add, @values, $sth, $ref); + my $ic_cvar_configs = CVar->get_configs(module => 'IC', + dbh => $dbh); + my $vc = $params{vc} eq 'customer' ? 'customer' : 'vendor'; my $mode = !$params{ids} ? 'default' : ref $params{ids} eq 'ARRAY' ? 'multi' : 'single'; @@ -573,7 +594,8 @@ sub retrieve { dord.closed, dord.reqdate, dord.department_id, dord.cusordnumber, d.description AS department, dord.language_id, dord.shipto_id, - dord.globalproject_id, dord.delivered, dord.transaction_description + dord.globalproject_id, dord.delivered, dord.transaction_description, + dord.taxzone_id, dord.taxincluded, dord.terms, dord.curr FROM delivery_orders dord JOIN ${vc} cv ON (dord.${vc}_id = cv.id) LEFT JOIN employee e ON (dord.employee_id = e.id) @@ -591,6 +613,7 @@ sub retrieve { } map { $form->{$_} = $ref->{$_} } keys %$ref if ($ref); + $form->{donumber_array} .= $form->{donumber} . ' '; } $sth->finish(); @@ -637,7 +660,7 @@ sub retrieve { doi.reqdate, doi.project_id, doi.serialnumber, doi.lastcost, doi.ordnumber, doi.transdate, doi.cusordnumber, doi.longdescription, doi.price_factor_id, doi.price_factor, doi.marge_price_factor, - pr.projectnumber, + pr.projectnumber, dord.transdate AS dord_transdate, pg.partsgroup FROM delivery_order_items doi JOIN parts p ON (doi.parts_id = p.id) @@ -649,6 +672,16 @@ sub retrieve { $form->{form_details} = selectall_hashref_query($form, $dbh, $query, @do_ids); + # Retrieve custom variables. + foreach my $doi (@{ $form->{form_details} }) { + my $cvars = CVar->get_custom_variables(dbh => $dbh, + module => 'IC', + sub_module => 'delivery_order_items', + trans_id => $doi->{delivery_order_items_id}, + ); + map { $doi->{"ic_cvar_$_->{name}"} = $_->{value} } @{ $cvars }; + } + if ($mode eq 'single') { my $in_out = $form->{type} =~ /^sales/ ? 'out' : 'in'; @@ -743,12 +776,21 @@ sub order_details { my $num_si = 0; + my $ic_cvar_configs = CVar->get_configs(module => 'IC'); + + $form->{TEMPLATE_ARRAYS} = { }; + IC->prepare_parts_for_printing(); + my @arrays = qw(runningnumber number description longdescription qty unit partnotes serialnumber reqdate projectnumber si_runningnumber si_number si_description si_warehouse si_bin si_chargenumber si_qty si_unit); + map { $form->{TEMPLATE_ARRAYS}->{$_} = [] } (@arrays, @tax_arrays); + + push @arrays, map { "ic_cvar_$_->{name}" } @{ $ic_cvar_configs }; + my $sameitem = ""; foreach $item (sort { $a->[1] cmp $b->[1] } @partsgroup) { $i = $item->[0]; @@ -770,16 +812,16 @@ sub order_details { my $price_factor = $price_factors{$form->{"price_factor_id_$i"}} || { 'factor' => 1 }; - push @{ $form->{runningnumber} }, $position; - push @{ $form->{number} }, $form->{"partnumber_$i"}; - push @{ $form->{description} }, $form->{"description_$i"}; - push @{ $form->{longdescription} }, $form->{"longdescription_$i"}; - push @{ $form->{qty} }, $form->format_amount($myconfig, $form->{"qty_$i"}); - push @{ $form->{unit} }, $form->{"unit_$i"}; - push @{ $form->{partnotes} }, $form->{"partnotes_$i"}; - push @{ $form->{serialnumber} }, $form->{"serialnumber_$i"}; - push @{ $form->{reqdate} }, $form->{"reqdate_$i"}; - push @{ $form->{projectnumber} }, $projectnumbers{$form->{"project_id_$i"}}; + push @{ $form->{TEMPLATE_ARRAYS}{runningnumber} }, $position; + push @{ $form->{TEMPLATE_ARRAYS}{number} }, $form->{"partnumber_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}{description} }, $form->{"description_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}{longdescription} }, $form->{"longdescription_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}{qty} }, $form->format_amount($myconfig, $form->{"qty_$i"}); + push @{ $form->{TEMPLATE_ARRAYS}{unit} }, $form->{"unit_$i"}; + 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"}}; if ($form->{"assembly_$i"}) { $sameitem = ""; @@ -817,16 +859,18 @@ sub order_details { do_statement($form, $h_bin_wh, $q_bin_wh, conv_i($si->{bin_id}), conv_i($si->{warehouse_id})); my $bin_wh = $h_bin_wh->fetchrow_hashref(); - push @{ $form->{si_runningnumber} }, $num_si; - push @{ $form->{si_number} }, $form->{"partnumber_$i"}; - push @{ $form->{si_description} }, $form->{"description_$i"}; - push @{ $form->{si_warehouse} }, $bin_wh->{warehouse}; - push @{ $form->{si_bin} }, $bin_wh->{bin}; - push @{ $form->{si_chargenumber} }, $si->{chargenumber}; - push @{ $form->{si_qty} }, $form->format_amount($myconfig, $si->{qty} * 1); - push @{ $form->{si_unit} }, $si->{unit}; + push @{ $form->{TEMPLATE_ARRAYS}{si_runningnumber}[$position-1] }, $num_si; + push @{ $form->{TEMPLATE_ARRAYS}{si_number}[$position-1] }, $form->{"partnumber_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}{si_description}[$position-1] }, $form->{"description_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}{si_warehouse}[$position-1] }, $bin_wh->{warehouse}; + push @{ $form->{TEMPLATE_ARRAYS}{si_bin}[$position-1] }, $bin_wh->{bin}; + push @{ $form->{TEMPLATE_ARRAYS}{si_chargenumber}[$position-1] }, $si->{chargenumber}; + push @{ $form->{TEMPLATE_ARRAYS}{si_qty}[$position-1] }, $form->format_amount($myconfig, $si->{qty} * 1); + push @{ $form->{TEMPLATE_ARRAYS}{si_unit}[$position-1] }, $si->{unit}; } } + + map { push @{ $form->{TEMPLATE_ARRAYS}->{"ic_cvar_$_->{name}"} }, $form->{"ic_cvar_$_->{name}_$i"} } @{ $ic_cvar_configs }; } $h_pg->finish(); @@ -894,10 +938,10 @@ sub get_item_availability { LEFT JOIN warehouse w ON (i.warehouse_id = w.id) LEFT JOIN bin b ON (i.bin_id = b.id) WHERE (i.parts_id IN (| . join(', ', ('?') x scalar(@parts_ids)) . qq|)) - AND qty > 0 GROUP BY i.warehouse_id, i.bin_id, i.chargenumber, i.parts_id, w.description, b.description - ORDER BY LOWER(w.description), LOWER(b.description), LOWER(i.chargenumber)|; - + HAVING SUM(qty) > 0 + ORDER BY LOWER(w.description), LOWER(b.description), LOWER(i.chargenumber) +|; my $contents = selectall_hashref_query($form, $form->get_standard_dbh($myconfig), $query, @parts_ids); $main::lxdebug->leave_sub(); @@ -1001,25 +1045,33 @@ sub get_shipped_qty { my $self = shift; my %params = @_; - Common::check_params(\%params, qw(type ordnumber)); + Common::check_params(\%params, qw(type oe_id)); my $myconfig = \%main::myconfig; my $form = $main::form; my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); - my $notsales = $params{type} eq 'sales' ? '' : 'NOT'; + my @links = RecordLinks->get_links('dbh' => $dbh, + 'from_table' => 'oe', + 'from_id' => $params{oe_id}, + 'to_table' => 'delivery_orders'); + my @values = map { $_->{to_id} } @links; + + if (!scalar @values) { + $main::lxdebug->leave_sub(); + return (); + } - my $query = + my $query = qq|SELECT doi.parts_id, doi.qty, doi.unit, p.unit AS partunit FROM delivery_order_items doi LEFT JOIN delivery_orders o ON (doi.delivery_order_id = o.id) LEFT JOIN parts p ON (doi.parts_id = p.id) - WHERE ($notsales o.is_sales) - AND (o.ordnumber = ?)|; + WHERE o.id IN (| . join(', ', ('?') x scalar @values) . qq|)|; my %ship = (); - my $entries = selectall_hashref_query($form, $dbh, $query, $params{ordnumber}); + my $entries = selectall_hashref_query($form, $dbh, $query, @values); my $all_units = AM->retrieve_all_units(); foreach my $entry (@{ $entries }) {