Beim Speichern von Angeboten etc den Bearbeiter nicht aus $form->{employee} ableiten...
[kivitendo-erp.git] / bin / mozilla / ar.pl
index e05fdef..eb34436 100644 (file)
@@ -36,7 +36,7 @@ use SL::IS;
 use SL::PE;
 use Data::Dumper;
 
-require "$form->{path}/arap.pl";
+require "bin/mozilla/arap.pl";
 require "bin/mozilla/common.pl";
 require "bin/mozilla/drafts.pl";
 
@@ -79,6 +79,7 @@ sub add {
 
   # saving the history
   if(!exists $form->{addition} && ($form->{id} ne "")) {
+    $form->{snumbers} = qq|invnumber_| . $form->{invnumber};
        $form->{addition} = "ADDED";
        $form->save_history($form->dbconnect(\%myconfig));
   }
@@ -86,7 +87,7 @@ sub add {
   
   $form->{title}    = "Add";
   $form->{callback} =
-    "$form->{script}?action=add&path=$form->{path}&login=$form->{login}&password=$form->{password}"
+    "$form->{script}?action=add&login=$form->{login}&password=$form->{password}"
     unless $form->{callback};
 
   AR->get_transdate(\%myconfig, $form);
@@ -102,7 +103,7 @@ sub edit {
   # show history button
   $form->{javascript} = qq|<script type="text/javascript" src="js/show_history.js"></script>|;
   #/show hhistory button
-
+  $form->{javascript} .= qq|<script type="text/javascript" src="js/common.js"></script>|;
   $form->{title} = "Edit";
 
   &create_links;
@@ -322,7 +323,7 @@ sub form_header {
   # show history button js
   $form->{javascript} .= qq|<script type="text/javascript" src="js/show_history.js"></script>|;
   #/show history button js
-
+  $form->{javascript} .= qq|<script type="text/javascript" src="js/common.js"></script>|;
   $readonly = ($form->{id}) ? "readonly" : "";
 
   $form->{radier} =
@@ -388,7 +389,9 @@ sub form_header {
 
   $customer =
     ($form->{selectcustomer})
-    ? qq|<select name="customer" onclick="document.getElementById('update_button').click();">$form->{selectcustomer}</select>|
+    ? qq|<select name="customer"
+onchange="document.getElementById('update_button').click();">$form->{
+selectcustomer}</select>|
     : qq|<input name=customer value="$form->{customer}" size=35>|;
 
   $employee = qq|
@@ -468,18 +471,18 @@ sub form_header {
   $form->{fokus} = "arledger.customer";
 
   # use JavaScript Calendar or not
-  $form->{jsscript} = $jscalendar;
+  $form->{jsscript} = 1;
   $jsscript = "";
   if ($form->{jsscript}) {
 
     # with JavaScript Calendar
     $button1 = qq|
-       <td><input name=transdate id=transdate size=11 title="$myconfig{dateformat}" value=$form->{transdate}></td>
+       <td><input name=transdate id=transdate size=11 title="$myconfig{dateformat}" value="$form->{transdate}" onBlur=\"check_right_date_format(this)\"></td>
        <td><input type=button name=transdate id="trigger1" value=|
       . $locale->text('button') . qq|></td>
        |;
     $button2 = qq|
-       <td><input name=duedate id=duedate size=11 title="$myconfig{dateformat}" value=$form->{duedate}></td>
+       <td><input name=duedate id=duedate size=11 title="$myconfig{dateformat}" value="$form->{duedate}" onBlur=\"check_right_date_format(this)\"></td>
        <td><input type=button name=duedate id="trigger2" value=|
       . $locale->text('button') . qq|></td></td>
      |;
@@ -492,15 +495,21 @@ sub form_header {
 
     # without JavaScript Calendar
     $button1 =
-      qq|<td><input name=transdate id=transdate size=11 title="$myconfig{dateformat}" value=$form->{transdate}></td>|;
+      qq|<td><input name=transdate id=transdate size=11 title="$myconfig{dateformat}" value="$form->{transdate}" onBlur=\"check_right_date_format(this)\"></td>|;
     $button2 =
-      qq|<td><input name=duedate id=duedate size=11 title="$myconfig{dateformat}" value=$form->{duedate}></td>|;
+      qq|<td><input name=duedate id=duedate size=11 title="$myconfig{dateformat}" value="$form->{duedate}" onBlur=\"check_right_date_format(this)\"></td>|;
   }
 
-  $form->header;
+  $form->{javascript} .=
+    qq|<script type="text/javascript" src="js/common.js"></script>| .
+    qq|<script type="text/javascript" src="js/show_vc_details.js"></script>|;
 
+  $form->header;
+  $onload = qq|focus()|;
+  $onload .= qq|;setupDateFormat('|. $myconfig{dateformat} .qq|', '|. $locale->text("Falsches Datumsformat!") .qq|')|;
+  $onload .= qq|;setupPoints('|. $myconfig{numberformat} .qq|', '|. $locale->text("wrongformat") .qq|')|;
   print qq|
-<body onLoad="fokus()">
+<body onLoad="$onload">
 
 <form method=post name="arledger" action=$form->{script}>
 
@@ -525,7 +534,7 @@ sub form_header {
            <table>
              <tr>
                <th align="right" nowrap>| . $locale->text('Customer') . qq|</th>
-               <td colspan=3>$customer</td>
+               <td colspan=3>$customer <input type="button" value="?" onclick="show_vc_details('customer')"></td>
                <input type=hidden name=selectcustomer value="$form->{selectcustomer}">
                <input type=hidden name=oldcustomer value="$form->{oldcustomer}">
                <input type=hidden name=customer_id value="$form->{customer_id}">
@@ -785,12 +794,12 @@ $jsscript
 |;
 
     $column_data{paid} =
-      qq|<td align=center><input name="paid_$i" size=11 value=$form->{"paid_$i"}></td>|;
+      qq|<td align=center><input name="paid_$i" size=11 value="$form->{"paid_$i"}" onBlur=\"check_right_number_format(this)\"></td>|;
     $column_data{AR_paid} =
       qq|<td align=center>${selectAR_paid}</td>|;
     $column_data{exchangerate} = qq|<td align=center>$exchangerate</td>|;
     $column_data{datepaid}     =
-      qq|<td align=center><input name="datepaid_$i" id="datepaid_$i" size=11 value=$form->{"datepaid_$i"}>
+      qq|<td align=center><input name="datepaid_$i" id="datepaid_$i" size=11 value="$form->{"datepaid_$i"}" onBlur=\"check_right_date_format(this)\">
          <input type="button" name="datepaid_$i" id="trigger_datepaid_$i" value="?"></td>|;
     $column_data{source} =
       qq|<td align=center><input name="source_$i" size=11 value="$form->{"source_$i"}"></td>|;
@@ -838,7 +847,6 @@ sub form_footer {
 
 <input name=callback type=hidden value="$form->{callback}">
 
-<input type=hidden name=path value=$form->{path}>
 <input type=hidden name=login value=$form->{login}>
 <input type=hidden name=password value=$form->{password}>
 |
@@ -861,50 +869,38 @@ sub form_footer {
   $transdate = $form->datetonum($form->{transdate}, \%myconfig);
   $closedto  = $form->datetonum($form->{closedto},  \%myconfig);
 
-  print qq|<input class="submit" type="submit" name="action" id="update_button" value="|
-    . $locale->text('Update') . qq|">
-|;
+  # ToDO: - insert a global check for stornos, so that a storno is only possible a limited time after saving it
+  print qq|<input class=submit type=submit name=action value="| . $locale->text('Storno') . qq|">|
+    if ($form->{id} && !IS->has_storno(\%myconfig, $form, 'ar') && !IS->is_storno(\%myconfig, $form, 'ar') && !$form->{paid_1});
+
+  print qq|<input class="submit" type="submit" name="action" id="update_button" value="| . $locale->text('Update') . qq|">\n|;
   if ($form->{id}) {
     if ($form->{radier}) {
       print qq|
-          <input class=submit type=submit name=action value="|
-            . $locale->text('Post') . qq|">
-          <input class=submit type=submit name=action value="|
-            . $locale->text('Delete') . qq|">
-  |;
+        <input class=submit type=submit name=action value="| . $locale->text('Post') .            qq|">
+        <input class=submit type=submit name=action value="| . $locale->text('Delete') .          qq|"> |;
     }
     if ($transdate > $closedto) {
       print qq|
-  <input class=submit type=submit name=action value="|
-          . $locale->text('Use As Template') . qq|">
-  |;
+        <input class=submit type=submit name=action value="| . $locale->text('Use As Template') . qq|"> |;
     }
     print qq|
-  <input class=submit type=submit name=action value="|
-    . $locale->text('Post Payment') . qq|">
-  |;
+        <input class=submit type=submit name=action value="| . $locale->text('Post Payment') .    qq|"> |;
 
   } else {
     if ($transdate > $closedto) {
-      print qq|<input class=submit type=submit name=action value="|
-        . $locale->text('Post') . qq|"> | .
-        NTI($cgi->submit('-name' => 'action', '-value' => $locale->text('Save draft'),
-                         '-class' => 'submit'));
+      print qq|<input class=submit type=submit name=action value="| . $locale->text('Post') .     qq|"> | .
+        NTI($cgi->submit('-name' => 'action', '-value' => $locale->text('Save draft'), '-class' => 'submit'));
     }
   }
 
   if ($form->{menubar}) {
-    require "$form->{path}/menu.pl";
+    require "bin/mozilla/menu.pl";
     &menubar;
   }
   # button for saving history
   if($form->{id} ne "") {
-    print qq|
-         <input type=button class=submit onclick=set_history_window(|
-         . $form->{id} 
-         . qq|); name=history id=history value=|
-         . $locale->text('history') 
-         . qq|>|;
+    print qq|<input type=button class=submit onclick=set_history_window($form->{id}); name=history id=history value=| . $locale->text('history') . qq|>|;
   }
   # /button for saving history
   print "
@@ -1011,7 +1007,7 @@ sub update {
 sub post_payment {
   $lxdebug->enter_sub();
   for $i (1 .. $form->{paidaccounts}) {
-    if ($form->{"paid_$i"}) {
+    if ($form->parse_amount(\%myconfig, $form->{"paid_$i"})) {
       $datepaid = $form->datetonum($form->{"datepaid_$i"}, \%myconfig);
 
       $form->isblank("datepaid_$i", $locale->text('Payment date missing!'));
@@ -1048,9 +1044,10 @@ sub post {
 
   $closedto  = $form->datetonum($form->{closedto},  \%myconfig);
   $transdate = $form->datetonum($form->{transdate}, \%myconfig);
+  $form->error($locale->text('Cannot post transaction for a closed period!')) if ($transdate <= $closedto);
 
-  $form->error($locale->text('Cannot post transaction for a closed period!'))
-    if ($transdate <= $closedto);
+  $form->error($locale->text('Zero amount posting!')) 
+    unless grep $_*1, map $form->parse_amount(\%myconfig, $form->{"amount_$_"}), 1..$form->{rowcount};
 
   $form->isblank("exchangerate", $locale->text('Exchangerate missing!'))
     if ($form->{currency} ne $form->{defaultcurrency});
@@ -1067,10 +1064,8 @@ sub post {
         if ($datepaid <= $closedto);
 
       if ($form->{currency} ne $form->{defaultcurrency}) {
-        $form->{"exchangerate_$i"} = $form->{exchangerate}
-          if ($transdate == $datepaid);
-        $form->isblank("exchangerate_$i",
-                       $locale->text('Exchangerate for payment missing!'));
+        $form->{"exchangerate_$i"} = $form->{exchangerate} if ($transdate == $datepaid);
+        $form->isblank("exchangerate_$i", $locale->text('Exchangerate for payment missing!'));
       }
     }
   }
@@ -1088,8 +1083,9 @@ sub post {
   if (AR->post_transaction(\%myconfig, \%$form)) {
     # saving the history
     if(!exists $form->{addition} && $form->{id} ne "") {
-         $form->{addition} = "POSTED";
-         $form->save_history($form->dbconnect(\%myconfig));
+      $form->{snumbers} = "invnumber_$form->{invnumber}";
+      $form->{addition} = "POSTED";
+      $form->save_history($form->dbconnect(\%myconfig));
     }
     # /saving the history 
     remove_draft() if $form->{remove_draft};
@@ -1106,6 +1102,7 @@ sub post_as_new {
   $form->{postasnew} = 1;
   # saving the history
   if(!exists $form->{addition} && $form->{id} ne "") {
+    $form->{snumbers} = qq|invnumber_| . $form->{invnumber};
        $form->{addition} = "POSTED AS NEW";
        $form->save_history($form->dbconnect(\%myconfig));
   }
@@ -1170,6 +1167,7 @@ sub yes {
   if (AR->delete_transaction(\%myconfig, \%$form, $spool)) {
     # saving the history
     if(!exists $form->{addition}) {
+      $form->{snumbers} = qq|invnumber_| . $form->{invnumber};
          $form->{addition} = "DELETED";
          $form->save_history($form->dbconnect(\%myconfig));
     }
@@ -1213,20 +1211,22 @@ sub search {
 | if $form->{selectdepartment};
 
   $form->{title} = $locale->text('AR Transactions');
-
+  
+  $form->{javascript} .= qq|<script type="text/javascript" src="js/common.js"></script>|;
+  
   # use JavaScript Calendar or not
-  $form->{jsscript} = $jscalendar;
+  $form->{jsscript} = 1;
   $jsscript = "";
   if ($form->{jsscript}) {
 
     # with JavaScript Calendar
     $button1 = qq|
-       <td><input name=transdatefrom id=transdatefrom size=11 title="$myconfig{dateformat}">
+       <td><input name=transdatefrom id=transdatefrom size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\">
        <input type=button name=transdatefrom id="trigger1" value=|
       . $locale->text('button') . qq|></td>
       |;
     $button2 = qq|
-       <td><input name=transdateto id=transdateto size=11 title="$myconfig{dateformat}">
+       <td><input name=transdateto id=transdateto size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\">
        <input type=button name=transdateto name=transdateto id="trigger2" value=|
       . $locale->text('button') . qq|></td>
      |;
@@ -1239,9 +1239,9 @@ sub search {
 
     # without JavaScript Calendar
     $button1 = qq|
-                              <td><input name=transdatefrom id=transdatefrom size=11 title="$myconfig{dateformat}"></td>|;
+                              <td><input name=transdatefrom id=transdatefrom size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\"></td>|;
     $button2 = qq|
-                              <td><input name=transdateto id=transdateto size=11 title="$myconfig{dateformat}"></td>|;
+                              <td><input name=transdateto id=transdateto size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\"></td>|;
   }
 
   $form->get_lists("projects" => { "key" => "ALL_PROJECTS",
@@ -1259,9 +1259,11 @@ sub search {
 
   $form->{fokus} = "search.customer";
   $form->header;
-
+  $onload = qq|focus()|;
+  $onload .= qq|;setupDateFormat('|. $myconfig{dateformat} .qq|', '|. $locale->text("Falsches Datumsformat!") .qq|')|;
+  $onload .= qq|;setupPoints('|. $myconfig{numberformat} .qq|', '|. $locale->text("wrongformat") .qq|')|;
   print qq|
-<body onLoad="fokus()">
+<body onLoad="$onload">
 
 <form method=post name="search" action=$form->{script}>
 
@@ -1284,6 +1286,10 @@ sub search {
          <th align=right nowrap>| . $locale->text('Order Number') . qq|</th>
          <td colspan=3><input name=ordnumber size=20></td>
        </tr>
+       <tr>
+         <th align=right nowrap>| . $locale->text('Transaction description') . qq|</th>
+         <td colspan=3><input name=transaction_description size=40></td>
+       </tr>
        <tr>
          <th align=right nowrap>| . $locale->text('Notes') . qq|</th>
          <td colspan=3><input name=notes size=40></td>
@@ -1360,6 +1366,8 @@ sub search {
                <td nowrap>| . $locale->text('Subtotal') . qq|</td>
                <td align=right><input name="l_globalprojectnumber" class=checkbox type=checkbox value=Y></td>
                <td nowrap>| . $locale->text('Project Number') . qq|</td>
+               <td align=right><input name="l_transaction_description" class=checkbox type=checkbox value=Y></td>
+               <td nowrap>| . $locale->text('Transaction description') . qq|</td>
              </tr>
            </table>
          </td>
@@ -1374,7 +1382,6 @@ sub search {
 
 <input type=hidden name=nextsub value=$form->{nextsub}>
 
-<input type=hidden name=path value=$form->{path}>
 <input type=hidden name=login value=$form->{login}>
 <input type=hidden name=password value=$form->{password}>
 
@@ -1403,7 +1410,7 @@ sub ar_transactions {
   AR->ar_transactions(\%myconfig, \%$form);
 
   $callback =
-    "$form->{script}?action=ar_transactions&path=$form->{path}&login=$form->{login}&password=$form->{password}";
+    "$form->{script}?action=ar_transactions&login=$form->{login}&password=$form->{password}";
   $href = $callback;
 
   if ($form->{customer}) {
@@ -1436,6 +1443,12 @@ sub ar_transactions {
     $option .= "\n<br>" if $option;
     $option .= $locale->text('Notes') . " : $form->{notes}";
   }
+  if ($form->{transaction_description}) {
+    $callback .= "&transaction_description=" . $form->escape($form->{transaction_description}, 1);
+    $href .= "&transaction_description=" . $form->escape($form->{transaction_description});
+    $option .= "\n<br>" if $option;
+    $option .= $locale->text('Transaction description') . " : $form->{transaction_description}";
+  }
 
   if ($form->{transdatefrom}) {
     $callback .= "&transdatefrom=$form->{transdatefrom}";
@@ -1472,7 +1485,7 @@ sub ar_transactions {
 
   @columns =
     qw(transdate id type invnumber ordnumber name netamount tax amount paid
-       datepaid due duedate notes employee shippingpoint shipvia
+       datepaid due duedate transaction_description notes employee shippingpoint shipvia
        globalprojectnumber);
 
   $form->{"l_type"} = "Y";
@@ -1548,6 +1561,8 @@ sub ar_transactions {
     . "</a></th>";
   $column_header{globalprojectnumber} =
     qq|<th class="listheading">| . $locale->text('Project Number') . qq|</th>|;
+  $column_header{transaction_description} =
+    "<th class=listheading>" . $locale->text('Transaction description') . "</th>";
 
   $form->{title} = $locale->text('AR Transactions');
 
@@ -1633,12 +1648,18 @@ sub ar_transactions {
     $module = ($ar->{invoice}) ? "is.pl" : $form->{script};
 
     $column_data{invnumber} =
-      "<td><a href=$module?action=edit&id=$ar->{id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ar->{invnumber}</a></td>";
+      "<td><a href=$module?action=edit&id=$ar->{id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ar->{invnumber}</a></td>";
+
+    my $is_storno  = $ar->{storno} && IS->is_storno(\%myconfig, $form, 'ar');
+    my $has_storno = $ar->{storno} && !$is_storno;
+
     $column_data{type} = "<td>" .
-      ($ar->{storno} ? $locale->text("Storno (one letter abbreviation)") :
-       $ar->{amount} < 0 ?
-       $locale->text("Credit note (one letter abbreviation)") :
-       $locale->text("Invoice (one letter abbreviation)")) . "</td>";
+      ($has_storno       ? $locale->text("Invoice with Storno (abbreviation)") :
+       $is_storno        ? $locale->text("Storno (one letter abbreviation)") :
+       $ar->{amount} < 0 ? $locale->text("Credit note (one letter abbreviation)") :
+       $ar->{invoice}    ? $locale->text("Invoice (one letter abbreviation)") :
+                           $locale->text("AR Transaction (abbreviation)"))
+        . "</td>";
     $column_data{ordnumber} = "<td>$ar->{ordnumber}&nbsp;</td>";
     $column_data{name}      = "<td>$ar->{name}</td>";
     $ar->{notes} =~ s/\r\n/<br>/g;
@@ -1648,6 +1669,8 @@ sub ar_transactions {
     $column_data{employee}      = "<td>$ar->{employee}&nbsp;</td>";
     $column_data{globalprojectnumber}  =
       "<td>" . H($ar->{globalprojectnumber}) . "</td>";
+    $column_data{transaction_description}  =
+      "<td>" . H($ar->{transaction_description}) . "</td>";
 
     $i++;
     $i %= 2;
@@ -1708,7 +1731,6 @@ sub ar_transactions {
 
 <input name=callback type=hidden value="$form->{callback}">
 
-<input type=hidden name=path value=$form->{path}>
 <input type=hidden name=login value=$form->{login}>
 <input type=hidden name=password value=$form->{password}>
 
@@ -1762,3 +1784,44 @@ sub ar_subtotal {
 
   $lxdebug->leave_sub();
 }
+
+
+sub storno {
+  $lxdebug->enter_sub();
+
+  if (IS->has_storno(\%myconfig, $form, 'ar')) {
+    $form->{title} = $locale->text("Cancel Accounts Receivables Transaction");
+    $form->error($locale->text("Transaction has already been cancelled!"));
+  }
+
+  # negate amount/taxes
+  for my $i (1 .. $form->{rowcount}) {
+    $form->{"amount_$i"} *= -1;
+    $form->{"tax_$i"}    *= -1; 
+  }
+
+  # format things
+  for my $i (1 .. $form->{rowcount}) {
+    for (qw(amount tax)) {
+      $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}, 2) if $form->{"${_}_$i"};
+    }
+  }
+
+  $form->{storno}      = 1;
+  $form->{storno_id}   = $form->{id};
+  $form->{id}          = 0;
+
+  $form->{invnumber}   = "Storno-" . $form->{invnumber};
+
+  post();
+
+  # saving the history
+  if(!exists $form->{addition} && $form->{id} ne "") {
+    $form->{snumbers} = "ordnumber_$form->{ordnumber}";
+    $form->{addition} = "STORNO";
+    $form->save_history($form->dbconnect(\%myconfig));
+  }
+  # /saving the history 
+
+  $lxdebug->leave_sub();
+}