epic-ts
[kivitendo-erp.git] / bin / mozilla / arap.pl
index 8c49dc2..75764a4 100644 (file)
 # common routines for gl, ar, ap, is, ir, oe
 #
 
-use SL::Projects;
-
 use strict;
 
 # any custom scripts for this one
 if (-f "bin/mozilla/custom_arap.pl") {
   eval { require "bin/mozilla/custom_arap.pl"; };
 }
-if (-f "bin/mozilla/$main::form->{login}_arap.pl") {
-  eval { require "bin/mozilla/$main::form->{login}_arap.pl"; };
+if (-f "bin/mozilla/$::myconfig{login}_arap.pl") {
+  eval { require "bin/mozilla/$::myconfig{login}_arap.pl"; };
 }
 
 1;
@@ -63,7 +61,7 @@ sub check_name {
 
   $name = $name eq "customer" ? "customer" : "vendor";
 
-  my ($new_name, $new_id) = split /--/, $form->{$name};
+  my ($new_name,$new_id) = $form->{$name} =~ /^(.*?)--(\d+)$/;
   my $i = 0;
   # if we use a selection
   if ($form->{"select$name"}) {
@@ -78,6 +76,9 @@ sub check_name {
 
       $form->{"${name}_id"} = $new_id;
 
+      _reset_salesman_id();
+      delete @{ $form }{qw(payment_id)};
+
       IS->get_customer(\%myconfig, \%$form) if ($name eq 'customer');
       IR->get_vendor(\%myconfig, \%$form) if ($name eq 'vendor');
 
@@ -108,7 +109,7 @@ sub check_name {
           $form->error($locale->text("More than one #1 found matching, please be more specific.", $locale->text(ucfirst $name)));
         } else {
           &select_name($name);
-          exit;
+          ::end_of_request();
         }
       }
 
@@ -119,6 +120,9 @@ sub check_name {
         $form->{$name}        = $form->{name_list}[0]->{name};
         $form->{"old$name"}   = qq|$form->{$name}--$form->{"${name}_id"}|;
 
+        _reset_salesman_id();
+        delete @{ $form }{qw(payment_id)};
+
         IS->get_customer(\%myconfig, \%$form) if ($name eq 'customer');
         IR->get_vendor(\%myconfig, \%$form) if ($name eq 'vendor');
 
@@ -148,7 +152,7 @@ sub select_name {
   my $form     = $main::form;
   my $locale   = $main::locale;
 
-  $main::auth->assert('general_ledger         | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+  $main::auth->assert('general_ledger         | vendor_invoice_edit  | sales_order_edit    | invoice_edit | sales_delivery_order_edit |' .
                 'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash');
 
   my ($table) = @_;
@@ -169,15 +173,11 @@ sub select_name {
   my $title = $locale->text('Select from one of the names below');
 
   print qq|
-<body>
+    <h1>$title</h1>
 
 <form method=post action=$form->{script}>
 
 <table width=100%>
-  <tr>
-    <th class=listtop>$title</th>
-  </tr>
-  <tr space=5></tr>
   <tr>
     <td>
       <table width=100%>
@@ -249,9 +249,6 @@ sub select_name {
 <input class=submit type=submit name=action value="|
     . $locale->text('Continue') . qq|">
 </form>
-
-</body>
-</html>
 |;
 
   $main::lxdebug->leave_sub();
@@ -263,7 +260,7 @@ sub name_selected {
   my $form     = $main::form;
   my %myconfig = %main::myconfig;
 
-  $main::auth->assert('general_ledger         | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+  $main::auth->assert('general_ledger         | vendor_invoice_edit  | sales_order_edit    | invoice_edit | sales_delivery_order_edit | ' .
                 'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash');
 
   # replace the variable with the one checked
@@ -271,6 +268,8 @@ sub name_selected {
   # index for new item
   my $i = $form->{ndx};
 
+  _reset_salesman_id();
+
   $form->{ $form->{vc} }    = $form->{"new_name_$i"};
   $form->{"$form->{vc}_id"} = $form->{"new_id_$i"};
   $form->{"old$form->{vc}"} =
@@ -291,169 +290,37 @@ sub name_selected {
   $main::lxdebug->leave_sub();
 }
 
-sub check_project {
-  $main::lxdebug->enter_sub();
-
-  my $form     = $main::form;
-  my $locale   = $main::locale;
-
-  $main::auth->assert('general_ledger         | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
-                'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash         | report');
-
-  my $nextsub = shift || 'update';
-
-  for my $i (1 .. $form->{rowcount}) {
-    my $suffix = $i ? "_$i" : "";
-    my $prefix = $i ? "" : "global";
-    $form->{"${prefix}project_id${suffix}"} = "" unless $form->{"${prefix}projectnumber$suffix"};
-    if ($form->{"${prefix}projectnumber${suffix}"} ne $form->{"old${prefix}projectnumber${suffix}"}) {
-      if ($form->{"${prefix}projectnumber${suffix}"}) {
-
-        # get new project
-        $form->{projectnumber} = $form->{"${prefix}projectnumber${suffix}"};
-        my %params             = map { $_ => $form->{$_} } qw(projectnumber description active);
-        my $rows;
-        if (($rows = Projects->search_projects(%params)) > 1) {
-
-          # check form->{project_list} how many there are
-          $form->{rownumber} = $i;
-          &select_project($i ? undef : 1, $nextsub);
-          exit;
-        }
-
-        if ($rows == 1) {
-          $form->{"${prefix}project_id${suffix}"}       = $form->{project_list}->[0]->{id};
-          $form->{"${prefix}projectnumber${suffix}"}    = $form->{project_list}->[0]->{projectnumber};
-          $form->{"old${prefix}projectnumber${suffix}"} = $form->{project_list}->[0]->{projectnumber};
-        } else {
-
-          # not on file
-          $form->error($locale->text('Project not on file!'));
-        }
-      } else {
-        $form->{"old${prefix}projectnumber${suffix}"} = "";
-      }
-    }
-  }
-
-  $main::lxdebug->leave_sub();
+# Reset the $::form field 'salesman_id' to the ID of the currently
+# logged in user. Useful when changing to a customer/vendor that has
+# no salesman listed in their master data.
+sub _reset_salesman_id {
+  my $current_employee   = SL::DB::Manager::Employee->current;
+  $::form->{salesman_id} = $current_employee->id if $current_employee && exists $::form->{salesman_id};
 }
 
 sub select_project {
-  $main::lxdebug->enter_sub();
-
-  my $form     = $main::form;
-  my $locale   = $main::locale;
-  my $cgi      = $main::cgi;
+  $::lxdebug->enter_sub;
 
-  $main::auth->assert('general_ledger         | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
-                'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash         | report');
+  $::auth->assert('general_ledger         | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                  'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash         | report');
 
   my ($is_global, $nextsub) = @_;
+  my $project_list = delete $::form->{project_list};
 
-  my @column_index = qw(ndx projectnumber description);
-
-  my %column_data;
-  $column_data{ndx}           = qq|<th>&nbsp;</th>|;
-  $column_data{projectnumber} = qq|<th>| . $locale->text('Number') . qq|</th>|;
-  $column_data{description}   =
-    qq|<th>| . $locale->text('Description') . qq|</th>|;
-
-  # list items with radio button on a form
-  $form->header;
-
-  my $title = $locale->text('Select from one of the projects below');
-
-  print qq|
-<body>
-
-<form method=post action=$form->{script}>
-
-<input type=hidden name=rownumber value=$form->{rownumber}>
-
-<table width=100%>
-  <tr>
-    <th class=listtop>$title</th>
-  </tr>
-  <tr space=5></tr>
-  <tr>
-    <td>
-      <table width=100%>
-        <tr class=listheading>|;
-
-  map { print "\n$column_data{$_}" } @column_index;
-
-  print qq|
-        </tr>
-|;
-
-  my $i = 0;
-  my $j;
-  foreach my $ref (@{ $form->{project_list} }) {
-    my $checked = ($i++) ? "" : "checked";
-
-    $ref->{name} =~ s/\"/&quot;/g;
-
-    $column_data{ndx} =
-      qq|<td><input name=ndx class=radio type=radio value=$i $checked></td>|;
-    $column_data{projectnumber} =
-      qq|<td><input name="new_projectnumber_$i" type=hidden value="$ref->{projectnumber}">$ref->{projectnumber}</td>|;
-    $column_data{description} = qq|<td>$ref->{description}</td>|;
-
-    $j++;
-    $j %= 2;
-    print qq|
-        <tr class=listrow$j>|;
-
-    map { print "\n$column_data{$_}" } @column_index;
-
-    print qq|
-        </tr>
-
-<input name="new_id_$i" type=hidden value=$ref->{id}>
-
-|;
+  map { delete $::form->{$_} } qw(action header update);
 
+  my @hiddens;
+  for my $key (keys %$::form) {
+    next if $key eq 'login' || $key eq 'password' || '' ne ref $::form->{$key};
+    push @hiddens, { key => $key, value => $::form->{$key} };
   }
+  push @hiddens, { key => 'is_global',                value => $is_global },
+                 { key => 'project_selected_nextsub', value => $nextsub };
 
-  print qq|
-      </table>
-    </td>
-  </tr>
-  <tr>
-    <td><hr size=3 noshade></td>
-  </tr>
-</table>
+  $::form->header;
+  print $::form->parse_html_template('arap/select_project', { hiddens => \@hiddens, project_list => $project_list });
 
-<input name=lastndx type=hidden value=$i>
-
-|;
-
-  # delete action variable
-  map { delete $form->{$_} } qw(action project_list header update);
-
-  # save all other form variables
-  foreach my $key (keys %${form}) {
-    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
-    $form->{$key} =~ s/\"/&quot;/g;
-    print qq|<input name=$key type=hidden value="$form->{$key}">\n|;
-  }
-
-  print
-      $cgi->hidden('-name' => 'is_global',                '-default' => [$is_global])
-    . $cgi->hidden('-name' => 'project_selected_nextsub', '-default' => [$nextsub])
-    . qq|<input type=hidden name=nextsub value=project_selected>
-
-<br>
-<input class=submit type=submit name=action value="|
-    . $locale->text('Continue') . qq|">
-</form>
-
-</body>
-</html>
-|;
-
-  $main::lxdebug->leave_sub();
+  $::lxdebug->leave_sub;
 }
 
 sub project_selected {
@@ -500,36 +367,22 @@ __END__
 
 =head1 NAME
 
-<<<<<<< HEAD:bin/mozilla/arap.pl
-bin/mozilla/arap.pl - helper routines for invoiceing frontend.
-
-=head1 SYNOPSIS
-
-nothing yet
-
-=head1 DESCRIPTION
-
-nothing yet
-=======
 arap.pl - helper functions or customer/vendor retrieval
 
 =head1 SYNOPSIS
 
  check_name('vendor')
- check_project();
 
 =head1 DESCRIPTION
 
 Don't use anyting in this file without extreme care, and even then be prepared for massive headaches.
 
 It's a collection of helper routines that wrap the customer/vendor dropdown/textfield duality into something even complexer.
->>>>>>> 88f5a78... check_name erweitert um ein no_select flag. siehe perldoc bin/mozilla/arap.pl:bin/mozilla/arap.pl
 
 =head1 FUNCTIONS
 
 =head2 check_name customer|vendor
 
-<<<<<<< HEAD:bin/mozilla/arap.pl
 check_name was originally meant to update the selected customer or vendor. The
 way it does that has generted more hate than almost any other part of this
 software.
@@ -538,69 +391,69 @@ What it does is:
 
 =over 4
 
-=item
+=item *
 
 It checks if a vendor or customer is given. No failsafe, vendor fallback if
 $_[0] is something fancy.
 
-=item
+=item *
 
 It assumes, that there is a field named customer or vendor in $form.
 
-=item
+=item *
 
 It assumes, that this field is filled with name--id, and tries to split that.
 sql ledger uses that combination to get ids into the select keys.
 
-=item
+=item *
 
 It looks for a field selectcustomer or selectvendor in $form. sql ledger used
 to store a copy of the html select in there. (again, don't ask)
 
-=item
+=item *
 
 If this field exists, it looks for a field called oldcustomer or oldvendor, in
 which the old name--id string was stored in sql ledger, and compares those.
 
-=item
+=item *
 
 if they don't match, it will set customer_id or vendor_id in $form, load the
 entry (which will clobber everything in $form named like a column in customer
 oder vendor) and return.
 
-=item
+=item *
 
 If there was no select* entry, it assumes that vclimit was lower than the
 number of entries, and that an input field was generated. In that case the
 splitting is omitted (since users don't generally include ids in entered names)
 
-=item
+=item *
 
 It looks for a *_id field, and combines it with the given input into a name--id
 entry and compares it to the old* entry. (Missing any of these will instantly
 break check_namea.
 
-=item
+=item *
 
 If those do not match, $form->get_name is called to get matching results.
 get_name only matches by *number and name, not by id, don't try to get it to do
 so.
 
-=item
+=item *
 
 The results are stored in $form>{name_list} but a count is returned, and
 checked.
 
-=item
+=item *
 
 If only one result was found, *_id, * and old* are copied into $form, the entry
 is loaded (like above, clobbering)
 
-=item
+=item *
 
 If there is more than one, a selection dialog is rendered
 
-=item
+=item *
 
 If none is found, an error is generated.
 
@@ -616,13 +469,12 @@ are necessary in all steps and branches.
 
 Since get_customer and get_vendor clobber a lot of fields, make sure what
 changes exactly.
-=======
-This function will take the contents of $form->{vendor} or $form->{customer}, try to guess if there was a selectbox or not, and search for matching customer/vendors.
 
-This mostly works great, except for the case when there is more than one match.
-In that case check_name will display a select form, that will redirect to the
-original C<nextsub>. Unfortunately any hidden vars or input fields will be lost
-in the process unless saved before in a callback.
+=head3 select- version works fine, but things go awry when I use a textbox, any idea?
+
+If there is more than one match, check_name will display a select form, that
+will redirect to the original C<nextsub>. Unfortunately any hidden vars or
+input fields will be lost in the process unless saved before in a callback.
 
 If you still want to use it, you can disable this feature, like this:
 
@@ -630,9 +482,6 @@ If you still want to use it, you can disable this feature, like this:
 
 In that case multiple matches will trigger an error.
 
-=head1 BUGS
-
-=head1 AUTHOR
->>>>>>> 88f5a78... check_name erweitert um ein no_select flag. siehe perldoc bin/mozilla/arap.pl:bin/mozilla/arap.pl
+Otherwise you'll have to care to include a complete state in callback.
 
 =cut