X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Foe.pl;h=f7f337561fcb672398165aabb6711ff808d1ba8a;hb=56f7991d4910ae12c7d16aab025a2ab242ca5eeb;hp=39ec0eb2f34a5ea19c55fd1994b4fe9b3e84ec38;hpb=dc39f671740dc3ab2292c604e8605dd69fb33eac;p=kivitendo-erp.git diff --git a/bin/mozilla/oe.pl b/bin/mozilla/oe.pl index 39ec0eb2f..f7f337561 100644 --- a/bin/mozilla/oe.pl +++ b/bin/mozilla/oe.pl @@ -31,6 +31,8 @@ # Quotation module #====================================================================== + +use Carp; use POSIX qw(strftime); use SL::DO; @@ -42,7 +44,7 @@ use SL::MoreCommon qw(ary_diff); use SL::PE; use SL::ReportGenerator; use List::MoreUtils qw(any none); -use List::Util qw(max reduce sum); +use List::Util qw(min max reduce sum); use Data::Dumper; require "bin/mozilla/io.pl"; @@ -153,6 +155,8 @@ sub edit { check_oe_access(); + $form->{taxincluded_changed_by_user} = 1; + # show history button $form->{javascript} = qq||; #/show hhistory button @@ -339,10 +343,11 @@ sub form_header { "price_factors" => "ALL_PRICE_FACTORS"); # label subs - $TMPL_VAR{ALL_EMPLOYEES} = SL::DB::Manager::Employee->get_all(query => [ or => [ id => $::form->{employee_id}, deleted => 0 ] ]); - $TMPL_VAR{ALL_SALESMEN} = SL::DB::Manager::Employee->get_all(query => [ or => [ id => $::form->{salesman_id}, deleted => 0 ] ]); + my $employee_list_query_gen = sub { $::form->{$_[0]} ? [ or => [ id => $::form->{$_[0]}, deleted => 0 ] ] : [ deleted => 0 ] }; + $TMPL_VAR{ALL_EMPLOYEES} = SL::DB::Manager::Employee->get_all(query => $employee_list_query_gen->('employee_id')); + $TMPL_VAR{ALL_SALESMEN} = SL::DB::Manager::Employee->get_all(query => $employee_list_query_gen->('salesman_id')); $TMPL_VAR{ALL_SHIPTO} = SL::DB::Manager::Shipto->get_all(query => [ - or => [ trans_id => $::form->{"$::form->{vc}_id"} * 1, shipto_id => $::form->{shipto_id} * 1 ] + or => [ trans_id => $::form->{"$::form->{vc}_id"} * 1, and => [ shipto_id => $::form->{shipto_id} * 1, trans_id => undef ] ] ]); $TMPL_VAR{ALL_CONTACTS} = SL::DB::Manager::Contact->get_all(query => [ or => [ @@ -400,19 +405,18 @@ sub form_header { } } - my $onload = ""; + my $dispatch_to_popup = ''; if ($form->{resubmit} && ($form->{format} eq "html")) { - $onload = "window.open('about:blank','Beleg'); document.oe.target = 'Beleg';"; - $onload .= "document.do.submit();"; + $dispatch_to_popup = "window.open('about:blank','Beleg'); document.oe.target = 'Beleg';"; + $dispatch_to_popup .= "document.do.submit();"; } elsif ($form->{resubmit}) { # emulate click for resubmitting actions - $onload = "document.oe.${_}.click(); " for grep { /^action_/ } keys %$form; - $onload .= "document.oe.submit();"; + $dispatch_to_popup = "document.oe.${_}.click(); " for grep { /^action_/ } keys %$form; } elsif ($creditwarning) { - $onload = "alert('$credittext')"; + $::request->{layout}->add_javascripts_inline("alert('$credittext');"); } - $TMPL_VAR{onload} = $onload; + $::request->{layout}->add_javascripts_inline("\$(function(){$dispatch_to_popup})"); $TMPL_VAR{dateformat} = $myconfig{dateformat}; $TMPL_VAR{numberformat} = $myconfig{numberformat}; @@ -430,6 +434,8 @@ sub form_header { $form->{javascript} .= qq||; $form->{javascript} .= qq||; + $::request->layout->use_stylesheet('presenter/record/record_list.css'); + $form->header; $TMPL_VAR{HIDDENS} = [ map { name => $_, value => $form->{$_} }, @@ -475,6 +481,14 @@ sub form_footer { $TMPL_VAR{notes} = qq||; $TMPL_VAR{intnotes} = qq||; + my $paymet_id = $::form->{payment_id}; + IS->get_customer(\%myconfig, $::form) if $form->{type} =~ /sales_(order|quotation)/; + $::form->{payment_id} = $paymet_id; + + if ( $form->{vc} eq 'customer' && !$form->{taxincluded_changed_by_user} ) { + $form->{taxincluded} = defined($form->{taxincluded_checked}) ? $form->{taxincluded_checked} : $myconfig{taxincluded_checked}; + } + if (!$form->{taxincluded}) { foreach my $item (split / /, $form->{taxaccounts}) { @@ -771,6 +785,7 @@ sub orders { my @columns = ( "transdate", "reqdate", "id", $ordnumber, + "customernumber", "name", "netamount", "tax", "amount", "curr", "employee", @@ -830,6 +845,7 @@ sub orders { 'ordnumber' => { 'text' => $locale->text('Order'), }, 'quonumber' => { 'text' => $form->{type} eq "request_quotation" ? $locale->text('RFQ') : $locale->text('Quotation'), }, 'name' => { 'text' => $form->{vc} eq 'customer' ? $locale->text('Customer') : $locale->text('Vendor'), }, + 'customernumber' => { 'text' => $locale->text('Customer Number'), }, 'netamount' => { 'text' => $locale->text('Amount'), }, 'tax' => { 'text' => $locale->text('Tax'), }, 'amount' => { 'text' => $locale->text('Total'), }, @@ -911,7 +927,7 @@ sub orders { my %totals = map { $_ => 0 } @subtotal_columns; my %subtotals = map { $_ => 0 } @subtotal_columns; - my $idx = 0; + my $idx = 1; my $edit_url = build_std_url('action=edit', 'type', 'vc'); @@ -953,8 +969,8 @@ sub orders { my $row_set = [ $row ]; if (($form->{l_subtotal} eq 'Y') - && (($idx == (scalar @{ $form->{OE} } - 1)) - || ($oe->{ $form->{sort} } ne $form->{OE}->[$idx + 1]->{ $form->{sort} }))) { + && (($idx == (scalar @{ $form->{OE} })) + || ($oe->{ $form->{sort} } ne $form->{OE}->[$idx]->{ $form->{sort} }))) { push @{ $row_set }, create_subtotal_row(\%subtotals, \@columns, \%column_alignment, \@subtotal_columns, 'listsubtotal'); } @@ -1213,7 +1229,7 @@ sub save { $form->{simple_save} = 1; if(!$form->{print_and_save}) { - delete @{$form}{ary_diff([keys %{ $form }], [qw(login stylesheet id script type cursor_fokus)])}; + delete @{$form}{ary_diff([keys %{ $form }], [qw(login id script type cursor_fokus)])}; edit(); ::end_of_request(); } @@ -1323,6 +1339,8 @@ sub invoice { ::end_of_request(); } + _oe_remove_delivered_or_billed_rows(id => $form->{id}, type => 'billed'); + $form->{cp_id} *= 1; for my $i (1 .. $form->{rowcount}) { @@ -1447,8 +1465,6 @@ sub backorder_exchangerate { $form->header; print qq| - -
{script}> |; @@ -1500,9 +1516,6 @@ sub backorder_exchangerate { . $locale->text('Continue') . qq|">
- - - |; $main::lxdebug->leave_sub(); @@ -1607,7 +1620,7 @@ sub save_as_new { $form->{saveasnew} = 1; map { delete $form->{$_} } qw(printed emailed queued delivered closed); - # Let Lx-Office assign a new order number if the user hasn't changed the + # Let kivitendo assign a new order number if the user hasn't changed the # previous one. If it has been changed manually then use it as-is. my $idx = $form->{type} =~ /_quotation$/ ? "quonumber" : "ordnumber"; $form->{$idx} =~ s/^\s*//g; @@ -1617,11 +1630,25 @@ sub save_as_new { delete($form->{$idx}); } - # clear reqdate unless changed - if ($form->{reqdate} && $form->{id}) { + # clear reqdate and transdate unless changed + if ( $form->{reqdate} && $form->{id} ) { my $saved_order = OE->retrieve_simple(id => $form->{id}); - if ($saved_order && $saved_order->{reqdate} eq $form->{reqdate}) { - delete $form->{reqdate}; + if ( $saved_order && $saved_order->{reqdate} eq $form->{reqdate} && $saved_order->{transdate} eq $form->{transdate} ) { + + my $dbh = $form->get_standard_dbh; + + my $wday = (localtime(time))[6]; + my $next_workday = $wday == 5 ? 3 : $wday == 6 ? 2 : 1; + + my $query = 'SELECT + date(current_date + interval \''. $next_workday .' days\') AS reqdate, + date(current_date) AS transdate'; + my $ref = selectfirst_hashref_query($form, $dbh, $query); + + map( + { $form->{$_} = $ref->{$_} } + keys %{$ref} + ); } } @@ -1715,13 +1742,14 @@ sub purchase_order { $form->{cp_id} *= 1; + my $source_type = $form->{type}; $form->{title} = $locale->text('Add Purchase Order'); $form->{vc} = "vendor"; $form->{type} = "purchase_order"; $form->get_employee(); - &poso; + poso(source_type => $form->{type}); delete $form->{sales_order_to_purchase_order}; @@ -1743,13 +1771,14 @@ sub sales_order { $form->{cp_id} *= 1; + my $source_type = $form->{type}; $form->{title} = $locale->text('Add Sales Order'); $form->{vc} = "customer"; $form->{type} = "sales_order"; $form->get_employee(); - &poso; + poso(source_type => $source_type); $main::lxdebug->leave_sub(); } @@ -1757,6 +1786,7 @@ sub sales_order { sub poso { $main::lxdebug->enter_sub(); + my %param = @_; my $form = $main::form; my %myconfig = %main::myconfig; @@ -1766,6 +1796,11 @@ sub poso { $form->{transdate} = $form->current_date(\%myconfig); delete $form->{duedate}; + # "reqdate" is the validity date for a quotation and the delivery + # date for an order. Therefore it makes no sense to keep the value + # when converting from one into the other. + delete $form->{reqdate} if ($param{source_type} =~ /_quotation$/) == ($form->{type} =~ /_quotation$/); + $form->{convert_from_oe_ids} = $form->{id}; $form->{closed} = 0; @@ -1841,6 +1876,8 @@ sub delivery_order { $form->{old_employee_id} = $form->{employee_id}; $form->{old_salesman_id} = $form->{salesman_id}; + _oe_remove_delivered_or_billed_rows(id => $form->{id}, type => 'delivered'); + # reset delete @{$form}{qw(id subject message cc bcc printed emailed queued creditlimit creditremaining discount tradediscount oldinvtotal closed delivered)}; @@ -1978,7 +2015,7 @@ sub edit_periodic_invoices_config { $::form->{AR} = [ grep { $_->{link} =~ m/(?:^|:)AR(?::|$)/ } @{ $::form->{ALL_CHARTS} } ]; $::form->{title} = $::locale->text('Edit the configuration for periodic invoices'); - $::form->header(); + $::form->header(no_layout => 1); print $::form->parse_html_template('oe/edit_periodic_invoices_config', $config); $::lxdebug->leave_sub(); @@ -2014,6 +2051,32 @@ sub save_periodic_invoices_config { $::lxdebug->leave_sub(); } +sub _oe_remove_delivered_or_billed_rows { + my (%params) = @_; + + return if !$params{id} || !$params{type}; + + my $ord_quot = SL::DB::Order->new(id => $params{id})->load; + return if !$ord_quot; + + my %args = ( + direction => 'to', + to => $params{type} eq 'delivered' ? 'DeliveryOrder' : 'Invoice', + via => [ $params{type} eq 'delivered' ? qw(Order) : qw(Order DeliveryOrder) ], + ); + + my %handled_base_qtys; + foreach my $record (@{ $ord_quot->linked_records(%args) }) { + next if $ord_quot->is_sales != $record->is_sales; + + foreach my $item (@{ $record->items }) { + $handled_base_qtys{ $item->parts_id } += $item->qty * $item->unit_obj->base_factor; + } + } + + _remove_billed_or_delivered_rows(quantities => \%handled_base_qtys); +} + sub dispatcher { foreach my $action (qw(delete delivery_order e_mail invoice print purchase_order purchase_order quotation request_for_quotation sales_order sales_order save save_and_close save_as_new ship_to update)) {