X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDO.pm;h=89f2d92b60d26cc7a7f06769813efac5f3a3ec37;hb=2acbe8c6c3c8a988e712deb438adf0dc40c3daaf;hp=bc651c8ed6b896b49a276cae16114d6a4753a164;hpb=08e4ce1ef5caa3f7007d8c97e9e97ef83378b19a;p=kivitendo-erp.git diff --git a/SL/DO.pm b/SL/DO.pm index bc651c8ed..89f2d92b6 100644 --- a/SL/DO.pm +++ b/SL/DO.pm @@ -42,8 +42,10 @@ use SL::CVar; use SL::DB::DeliveryOrder; use SL::DB::Status; use SL::DBUtils; +use SL::HTML::Restrict; use SL::RecordLinks; use SL::IC; +use SL::TransNumber; use strict; @@ -63,7 +65,7 @@ sub transactions { my $vc = $form->{vc} eq "customer" ? "customer" : "vendor"; my $query = - qq|SELECT dord.id, dord.donumber, dord.ordnumber, + qq|SELECT dord.id, dord.donumber, dord.ordnumber, dord.cusordnumber, dord.transdate, dord.reqdate, ct.${vc}number, ct.name, dord.${vc}_id, dord.globalproject_id, dord.closed, dord.delivered, dord.shippingpoint, dord.shipvia, @@ -74,6 +76,7 @@ sub transactions { sm.name AS salesman FROM delivery_orders dord LEFT JOIN $vc ct ON (dord.${vc}_id = ct.id) + LEFT JOIN contacts cp ON (dord.cp_id = cp.cp_id) LEFT JOIN employee e ON (dord.employee_id = e.id) LEFT JOIN employee sm ON (dord.salesman_id = sm.id) LEFT JOIN project pr ON (dord.globalproject_id = pr.id) @@ -104,6 +107,11 @@ sub transactions { push @values, '%' . $form->{$vc} . '%'; } + if ($form->{"cp_name"}) { + push @where, "(cp.cp_name ILIKE ? OR cp.cp_givenname ILIKE ?)"; + push @values, ('%' . $form->{"cp_name"} . '%')x2; + } + foreach my $item (qw(employee_id salesman_id)) { next unless ($form->{$item}); push @where, "dord.$item = ?"; @@ -215,6 +223,7 @@ sub save { # connect to database, turn off autocommit my $dbh = $form->get_standard_dbh($myconfig); + my $restricter = SL::HTML::Restrict->create; my ($query, @values, $sth, $null); @@ -224,7 +233,8 @@ sub save { 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}; + my $trans_number = SL::TransNumber->new(type => $form->{type}, dbh => $dbh, number => $form->{donumber}, id => $form->{id}); + $form->{donumber} ||= $trans_number->create_unique; $form->{employee_id} = (split /--/, $form->{employee})[1] if !$form->{employee_id}; $form->get_employee($dbh) unless ($form->{employee_id}); @@ -246,8 +256,8 @@ sub save { $query = qq|SELECT nextval('id')|; ($form->{id}) = selectrow_query($form, $dbh, $query); - $query = qq|INSERT INTO delivery_orders (id, donumber, employee_id, currency_id) VALUES (?, '', ?, (SELECT currency_id FROM defaults LIMIT 1))|; - do_query($form, $dbh, $query, $form->{id}, conv_i($form->{employee_id})); + $query = qq|INSERT INTO delivery_orders (id, donumber, employee_id, currency_id, taxzone_id) VALUES (?, '', ?, (SELECT currency_id FROM defaults LIMIT 1), ?)|; + do_query($form, $dbh, $query, $form->{id}, conv_i($form->{employee_id}), $form->{taxzone_id}); } my $project_id; @@ -321,7 +331,7 @@ sub save { # save detail record in delivery_order_items table @values = (conv_i($item_id), conv_i($form->{id}), conv_i($form->{"id_$i"}), - $form->{"description_$i"}, $form->{"longdescription_$i"}, + $form->{"description_$i"}, $restricter->process($form->{"longdescription_$i"}), $form->{"qty_$i"}, $baseqty, $form->{"sellprice_$i"}, $form->{"discount_$i"} / 100, $form->{"unit_$i"}, conv_date($items_reqdate), conv_i($form->{"project_id_$i"}), @@ -387,10 +397,10 @@ sub save { conv_i($form->{id})); do_query($form, $dbh, $query, @values); - # add shipto $form->{name} = $form->{ $form->{vc} }; $form->{name} =~ s/--$form->{"$form->{vc}_id"}//; + # add shipto if (!$form->{shipto_id}) { $form->add_shipto($dbh, $form->{id}, "DO"); } @@ -415,6 +425,8 @@ sub save { my $rc = $dbh->commit(); $form->{saved_donumber} = $form->{donumber}; + $form->{saved_ordnumber} = $form->{ordnumber}; + $form->{saved_cusordnumber} = $form->{cusordnumber}; Common::webdav_folder($form); @@ -604,6 +616,9 @@ sub retrieve { $sth = prepare_execute_query($form, $dbh, $query, @do_ids); delete $form->{"${vc}_id"}; + my $pos = 0; + $form->{ordnumber_array} = ' '; + $form->{cusordnumber_array} = ' '; while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { if ($form->{"${vc}_id"} && ($ref->{"${vc}_id"} != $form->{"${vc}_id"})) { $sth->finish(); @@ -614,12 +629,26 @@ sub retrieve { map { $form->{$_} = $ref->{$_} } keys %$ref if ($ref); $form->{donumber_array} .= $form->{donumber} . ' '; + $pos = index($form->{ordnumber_array},' ' . $form->{ordnumber} . ' '); + if ($pos == -1) { + $form->{ordnumber_array} .= $form->{ordnumber} . ' '; + } + $pos = index($form->{cusordnumber_array},' ' . $form->{cusordnumber} . ' '); + if ($pos == -1) { + $form->{cusordnumber_array} .= $form->{cusordnumber} . ' '; + } } $sth->finish(); $form->{donumber_array} =~ s/\s*$//g; + $form->{ordnumber_array} =~ s/ //; + $form->{ordnumber_array} =~ s/\s*$//g; + $form->{cusordnumber_array} =~ s/ //; + $form->{cusordnumber_array} =~ s/\s*$//g; $form->{saved_donumber} = $form->{donumber}; + $form->{saved_ordnumber} = $form->{ordnumber}; + $form->{saved_cusordnumber} = $form->{cusordnumber}; # if not given, fill transdate with current_date $form->{transdate} = $form->current_date($myconfig) unless $form->{transdate}; @@ -659,7 +688,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, doi.pricegroup_id, - pr.projectnumber, dord.transdate AS dord_transdate, + pr.projectnumber, dord.transdate AS dord_transdate, dord.donumber, pg.partsgroup FROM delivery_order_items doi JOIN parts p ON (doi.parts_id = p.id) @@ -727,8 +756,9 @@ sub order_details { my $position = 0; my $subtotal_header = 0; my $subposition = 0; + my $si_position = 0; - my (@project_ids, %projectnumbers, %projectdescriptions); + my (@project_ids); push(@project_ids, $form->{"globalproject_id"}) if ($form->{"globalproject_id"}); @@ -742,21 +772,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"}}; + if ($projects_by_id{$form->{"globalproject_id"}}) { + $form->{globalprojectnumber} = $projects_by_id{$form->{"globalproject_id"}}->projectnumber; + $form->{globalprojectdescription} = $projects_by_id{$form->{"globalproject_id"}}->description; + + 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 @@ -775,6 +805,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); @@ -782,12 +813,15 @@ sub order_details { my @arrays = qw(runningnumber number description longdescription qty unit partnotes serialnumber reqdate projectnumber projectdescription + weight lineweight si_runningnumber si_number si_description - si_warehouse si_bin si_chargenumber si_bestbefore si_qty si_unit weight lineweight); + si_warehouse si_bin si_chargenumber si_bestbefore + si_qty si_qty_nofmt si_unit); 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} }; @@ -823,7 +857,10 @@ sub order_details { $position++; } + $si_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"}; @@ -835,9 +872,8 @@ 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; @@ -850,6 +886,26 @@ sub order_details { push @{ $form->{TEMPLATE_ARRAYS}->{lineweight} }, $form->format_amount($myconfig, $lineweight, 3); push @{ $form->{TEMPLATE_ARRAYS}->{lineweight_nofmt} }, $lineweight; + my $stock_info = DO->unpack_stock_information('packed' => $form->{"stock_${in_out}_$i"}); + + foreach my $si (@{ $stock_info }) { + $num_si++; + + 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->{TEMPLATE_ARRAYS}{si_runningnumber}[$si_position-1] }, $num_si; + push @{ $form->{TEMPLATE_ARRAYS}{si_number}[$si_position-1] }, $form->{"partnumber_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}{si_description}[$si_position-1] }, $form->{"description_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}{si_warehouse}[$si_position-1] }, $bin_wh->{warehouse}; + push @{ $form->{TEMPLATE_ARRAYS}{si_bin}[$si_position-1] }, $bin_wh->{bin}; + push @{ $form->{TEMPLATE_ARRAYS}{si_chargenumber}[$si_position-1] }, $si->{chargenumber}; + push @{ $form->{TEMPLATE_ARRAYS}{si_bestbefore}[$si_position-1] }, $si->{bestbefore}; + push @{ $form->{TEMPLATE_ARRAYS}{si_qty}[$si_position-1] }, $form->format_amount($myconfig, $si->{qty} * 1); + push @{ $form->{TEMPLATE_ARRAYS}{si_qty_nofmt}[$si_position-1] }, $si->{qty} * 1; + push @{ $form->{TEMPLATE_ARRAYS}{si_unit}[$si_position-1] }, $si->{unit}; + } + if ($form->{"assembly_$i"}) { $sameitem = ""; @@ -866,41 +922,25 @@ sub order_details { while (my $ref = $h_pg->fetchrow_hashref("NAME_lc")) { if ($form->{groupitems} && $ref->{partsgroup} ne $sameitem) { - map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" } @arrays)); + map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" && $_ !~ /^si_/} @arrays)); + map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, []) } grep({ $_ =~ /^si_/} @arrays)); $sameitem = ($ref->{partsgroup}) ? $ref->{partsgroup} : "--"; push(@{ $form->{TEMPLATE_ARRAYS}->{description} }, $sameitem); + $si_position++; } - push(@{ $form->{TEMPLATE_ARRAYS}->{"description"} }, $form->format_amount($myconfig, $ref->{qty} * $form->{"qty_$i"}) . qq| -- $ref->{partnumber}, $ref->{description}|); - map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" } @arrays)); - } - } - - if ($form->{"inventory_accno_$i"} && !$form->{"assembly_$i"}) { - my $stock_info = DO->unpack_stock_information('packed' => $form->{"stock_${in_out}_$i"}); - - foreach my $si (@{ $stock_info }) { - $num_si++; - - 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->{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_bestbefore}[$position-1] }, $si->{bestbefore}; - push @{ $form->{TEMPLATE_ARRAYS}{si_qty}[$position-1] }, $form->format_amount($myconfig, $si->{qty} * 1); - push @{ $form->{TEMPLATE_ARRAYS}{si_qty_nofmt}[$position-1] }, $si->{qty} * 1; - push @{ $form->{TEMPLATE_ARRAYS}{si_unit}[$position-1] }, $si->{unit}; + push(@{ $form->{TEMPLATE_ARRAYS}->{"description"} }, $form->format_amount($myconfig, $ref->{qty} * $form->{"qty_$i"}) . qq| -- $ref->{partnumber}, $ref->{description}|); + map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" && $_ !~ /^si_/} @arrays)); + map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, []) } grep({ $_ =~ /^si_/} @arrays)); + $si_position++; } } 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);