1 #=====================================================================
4 # Based on SQL-Ledger Version 2.1.9
5 # Web http://www.lx-office.org
7 #=====================================================================
8 # SQL-Ledger Accounting
11 # Author: Dieter Simader
12 # Email: dsimader@sql-ledger.org
13 # Web: http://www.sql-ledger.org
16 # This program is free software; you can redistribute it and/or modify
17 # it under the terms of the GNU General Public License as published by
18 # the Free Software Foundation; either version 2 of the License, or
19 # (at your option) any later version.
21 # This program is distributed in the hope that it will be useful,
22 # but WITHOUT ANY WARRANTY; without even the implied warranty of
23 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 # GNU General Public License for more details.
25 # You should have received a copy of the GNU General Public License
26 # along with this program; if not, write to the Free Software
27 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #======================================================================
30 # common routines for gl, ar, ap, is, ir, oe
37 # any custom scripts for this one
38 if (-f "bin/mozilla/custom_arap.pl") {
39 eval { require "bin/mozilla/custom_arap.pl"; };
41 if (-f "bin/mozilla/$main::form->{login}_arap.pl") {
42 eval { require "bin/mozilla/$main::form->{login}_arap.pl"; };
47 require "bin/mozilla/common.pl";
52 $main::lxdebug->enter_sub();
54 my $form = $main::form;
55 my %myconfig = %main::myconfig;
56 my $locale = $main::locale;
58 $main::auth->assert('general_ledger | vendor_invoice_edit | sales_order_edit | invoice_edit |' .
59 'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash |' .
60 'purchase_delivery_order_edit | sales_delivery_order_edit');
62 my ($name, %params) = @_;
64 $name = $name eq "customer" ? "customer" : "vendor";
66 my ($new_name, $new_id) = split /--/, $form->{$name};
68 # if we use a selection
69 if ($form->{"select$name"}) {
70 if ($form->{"old$name"} ne $form->{$name}) {
72 # this is needed for is, ir and oe
74 # for credit calculations
75 $form->{oldinvtotal} = 0;
76 $form->{oldtotalpaid} = 0;
79 $form->{"${name}_id"} = $new_id;
81 IS->get_customer(\%myconfig, \%$form) if ($name eq 'customer');
82 IR->get_vendor(\%myconfig, \%$form) if ($name eq 'vendor');
84 $form->{$name} = $form->{"old$name"} = "$new_name--$new_id";
90 # check name, combine name and id
91 if ($form->{"old$name"} ne qq|$form->{$name}--$form->{"${name}_id"}|) {
93 # this is needed for is, ir and oe
96 # for credit calculations
97 $form->{oldinvtotal} = 0;
98 $form->{oldtotalpaid} = 0;
101 # return one name or a list of names in $form->{name_list}
102 $i = $form->get_name(\%myconfig, $name);
105 if ($params{no_select}) {
106 # $locale->text('Customer')
107 # $locale->text('Vendor')
108 $form->error($locale->text("More than one #1 found matching, please be more specific.", $locale->text(ucfirst $name)));
118 $form->{"${name}_id"} = $form->{name_list}[0]->{id};
119 $form->{$name} = $form->{name_list}[0]->{name};
120 $form->{"old$name"} = qq|$form->{$name}--$form->{"${name}_id"}|;
122 IS->get_customer(\%myconfig, \%$form) if ($name eq 'customer');
123 IR->get_vendor(\%myconfig, \%$form) if ($name eq 'vendor');
127 # name is not on file
128 # $locale->text('Customer not on file or locked!')
129 # $locale->text('Vendor not on file or locked!')
130 my $msg = ucfirst $name . " not on file or locked!";
131 $form->error($locale->text($msg));
135 $form->language_payment(\%myconfig);
137 $main::lxdebug->leave_sub();
142 # $locale->text('Customer not on file!')
143 # $locale->text('Vendor not on file!')
146 $main::lxdebug->enter_sub();
148 my $form = $main::form;
149 my $locale = $main::locale;
151 $main::auth->assert('general_ledger | vendor_invoice_edit | sales_order_edit | invoice_edit |' .
152 'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash');
156 my @column_index = qw(ndx name address);
158 my $label = ucfirst $table;
160 $column_data{ndx} = qq|<th> </th>|;
162 qq|<th class=listheading>| . $locale->text($label) . qq|</th>|;
163 $column_data{address} =
164 qq|<th class=listheading>| . $locale->text('Address') . qq|</th>|;
166 # list items with radio button on a form
169 my $title = $locale->text('Select from one of the names below');
174 <form method=post action=$form->{script}>
178 <th class=listtop>$title</th>
184 <tr class=listheading>|;
186 map { print "\n$column_data{$_}" } @column_index;
194 foreach my $ref (@{ $form->{name_list} }) {
195 my $checked = ($i++) ? "" : "checked";
197 $ref->{name} =~ s/\"/"/g;
200 qq|<td><input name=ndx class=radio type=radio value=$i $checked></td>|;
202 qq|<td><input name="new_name_$i" type=hidden value="$ref->{name}">$ref->{name}</td>|;
203 $column_data{address} = qq|<td>$ref->{address} </td>|;
208 <tr class=listrow$j>|;
210 map { print "\n$column_data{$_}" } @column_index;
215 <input name="new_id_$i" type=hidden value=$ref->{id}>
226 <td><hr size=3 noshade></td>
230 <input name=lastndx type=hidden value=$i>
235 map { delete $form->{$_} } qw(action name_list header);
237 # save all other form variables
238 foreach my $key (keys %${form}) {
239 next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
240 $form->{$key} =~ s/\"/"/g;
241 print qq|<input name=$key type=hidden value="$form->{$key}">\n|;
245 <input type=hidden name=nextsub value=name_selected>
247 <input type=hidden name=vc value=$table>
249 <input class=submit type=submit name=action value="|
250 . $locale->text('Continue') . qq|">
257 $main::lxdebug->leave_sub();
261 $main::lxdebug->enter_sub();
263 my $form = $main::form;
264 my %myconfig = %main::myconfig;
266 $main::auth->assert('general_ledger | vendor_invoice_edit | sales_order_edit | invoice_edit |' .
267 'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash');
269 # replace the variable with the one checked
272 my $i = $form->{ndx};
274 $form->{ $form->{vc} } = $form->{"new_name_$i"};
275 $form->{"$form->{vc}_id"} = $form->{"new_id_$i"};
276 $form->{"old$form->{vc}"} =
277 qq|$form->{$form->{vc}}--$form->{"$form->{vc}_id"}|;
279 # delete all the new_ variables
280 for $i (1 .. $form->{lastndx}) {
281 map { delete $form->{"new_${_}_$i"} } qw(id name);
284 map { delete $form->{$_} } qw(ndx lastndx nextsub);
286 IS->get_customer(\%myconfig, \%$form) if ($form->{vc} eq 'customer');
287 IR->get_vendor(\%myconfig, \%$form) if ($form->{vc} eq 'vendor');
291 $main::lxdebug->leave_sub();
295 $main::lxdebug->enter_sub();
297 my $form = $main::form;
298 my $locale = $main::locale;
300 $main::auth->assert('general_ledger | vendor_invoice_edit | sales_order_edit | invoice_edit |' .
301 'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash | report');
303 my $nextsub = shift || 'update';
305 for my $i (1 .. $form->{rowcount}) {
306 my $suffix = $i ? "_$i" : "";
307 my $prefix = $i ? "" : "global";
308 $form->{"${prefix}project_id${suffix}"} = "" unless $form->{"${prefix}projectnumber$suffix"};
309 if ($form->{"${prefix}projectnumber${suffix}"} ne $form->{"old${prefix}projectnumber${suffix}"}) {
310 if ($form->{"${prefix}projectnumber${suffix}"}) {
313 $form->{projectnumber} = $form->{"${prefix}projectnumber${suffix}"};
314 my %params = map { $_ => $form->{$_} } qw(projectnumber description active);
316 if (($rows = Projects->search_projects(%params)) > 1) {
318 # check form->{project_list} how many there are
319 $form->{rownumber} = $i;
320 &select_project($i ? undef : 1, $nextsub);
325 $form->{"${prefix}project_id${suffix}"} = $form->{project_list}->[0]->{id};
326 $form->{"${prefix}projectnumber${suffix}"} = $form->{project_list}->[0]->{projectnumber};
327 $form->{"old${prefix}projectnumber${suffix}"} = $form->{project_list}->[0]->{projectnumber};
331 $form->error($locale->text('Project not on file!'));
334 $form->{"old${prefix}projectnumber${suffix}"} = "";
339 $main::lxdebug->leave_sub();
343 $main::lxdebug->enter_sub();
345 my $form = $main::form;
346 my $locale = $main::locale;
347 my $cgi = $main::cgi;
349 $main::auth->assert('general_ledger | vendor_invoice_edit | sales_order_edit | invoice_edit |' .
350 'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash | report');
352 my ($is_global, $nextsub) = @_;
354 my @column_index = qw(ndx projectnumber description);
357 $column_data{ndx} = qq|<th> </th>|;
358 $column_data{projectnumber} = qq|<th>| . $locale->text('Number') . qq|</th>|;
359 $column_data{description} =
360 qq|<th>| . $locale->text('Description') . qq|</th>|;
362 # list items with radio button on a form
365 my $title = $locale->text('Select from one of the projects below');
370 <form method=post action=$form->{script}>
372 <input type=hidden name=rownumber value=$form->{rownumber}>
376 <th class=listtop>$title</th>
382 <tr class=listheading>|;
384 map { print "\n$column_data{$_}" } @column_index;
392 foreach my $ref (@{ $form->{project_list} }) {
393 my $checked = ($i++) ? "" : "checked";
395 $ref->{name} =~ s/\"/"/g;
398 qq|<td><input name=ndx class=radio type=radio value=$i $checked></td>|;
399 $column_data{projectnumber} =
400 qq|<td><input name="new_projectnumber_$i" type=hidden value="$ref->{projectnumber}">$ref->{projectnumber}</td>|;
401 $column_data{description} = qq|<td>$ref->{description}</td>|;
406 <tr class=listrow$j>|;
408 map { print "\n$column_data{$_}" } @column_index;
413 <input name="new_id_$i" type=hidden value=$ref->{id}>
424 <td><hr size=3 noshade></td>
428 <input name=lastndx type=hidden value=$i>
432 # delete action variable
433 map { delete $form->{$_} } qw(action project_list header update);
435 # save all other form variables
436 foreach my $key (keys %${form}) {
437 next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
438 $form->{$key} =~ s/\"/"/g;
439 print qq|<input name=$key type=hidden value="$form->{$key}">\n|;
443 $cgi->hidden('-name' => 'is_global', '-default' => [$is_global])
444 . $cgi->hidden('-name' => 'project_selected_nextsub', '-default' => [$nextsub])
445 . qq|<input type=hidden name=nextsub value=project_selected>
448 <input class=submit type=submit name=action value="|
449 . $locale->text('Continue') . qq|">
456 $main::lxdebug->leave_sub();
459 sub project_selected {
460 $main::lxdebug->enter_sub();
462 my $form = $main::form;
464 $main::auth->assert('general_ledger | vendor_invoice_edit | sales_order_edit | invoice_edit |' .
465 'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash | report');
467 # replace the variable with the one checked
470 my $i = $form->{ndx};
472 my $prefix = $form->{"is_global"} ? "global" : "";
473 my $suffix = $form->{"is_global"} ? "" : "_$form->{rownumber}";
475 $form->{"${prefix}projectnumber${suffix}"} =
476 $form->{"new_projectnumber_$i"};
477 $form->{"old${prefix}projectnumber${suffix}"} =
478 $form->{"new_projectnumber_$i"};
479 $form->{"${prefix}project_id${suffix}"} = $form->{"new_id_$i"};
481 # delete all the new_ variables
482 for $i (1 .. $form->{lastndx}) {
483 map { delete $form->{"new_${_}_$i"} } qw(id projectnumber description);
486 my $nextsub = $form->{project_selected_nextsub} || 'update';
488 map { delete $form->{$_} } qw(ndx lastndx nextsub is_global project_selected_nextsub);
492 $main::lxdebug->leave_sub();
495 sub continue { call_sub($main::form->{"nextsub"}); }
503 <<<<<<< HEAD:bin/mozilla/arap.pl
504 bin/mozilla/arap.pl - helper routines for invoiceing frontend.
514 arap.pl - helper functions or customer/vendor retrieval
523 Don't use anyting in this file without extreme care, and even then be prepared for massive headaches.
525 It's a collection of helper routines that wrap the customer/vendor dropdown/textfield duality into something even complexer.
526 >>>>>>> 88f5a78... check_name erweitert um ein no_select flag. siehe perldoc bin/mozilla/arap.pl:bin/mozilla/arap.pl
530 =head2 check_name customer|vendor
532 <<<<<<< HEAD:bin/mozilla/arap.pl
533 check_name was originally meant to update the selected customer or vendor. The
534 way it does that has generted more hate than almost any other part of this
543 It checks if a vendor or customer is given. No failsafe, vendor fallback if
544 $_[0] is something fancy.
548 It assumes, that there is a field named customer or vendor in $form.
552 It assumes, that this field is filled with name--id, and tries to split that.
553 sql ledger uses that combination to get ids into the select keys.
557 It looks for a field selectcustomer or selectvendor in $form. sql ledger used
558 to store a copy of the html select in there. (again, don't ask)
562 If this field exists, it looks for a field called oldcustomer or oldvendor, in
563 which the old name--id string was stored in sql ledger, and compares those.
567 if they don't match, it will set customer_id or vendor_id in $form, load the
568 entry (which will clobber everything in $form named like a column in customer
569 oder vendor) and return.
573 If there was no select* entry, it assumes that vclimit was lower than the
574 number of entries, and that an input field was generated. In that case the
575 splitting is omitted (since users don't generally include ids in entered names)
579 It looks for a *_id field, and combines it with the given input into a name--id
580 entry and compares it to the old* entry. (Missing any of these will instantly
585 If those do not match, $form->get_name is called to get matching results.
586 get_name only matches by *number and name, not by id, don't try to get it to do
591 The results are stored in $form>{name_list} but a count is returned, and
596 If only one result was found, *_id, * and old* are copied into $form, the entry
597 is loaded (like above, clobbering)
601 If there is more than one, a selection dialog is rendered
605 If none is found, an error is generated.
609 =head3 I built a customer/vendor box somewhere and it doesn't work, what's wrong?
611 Make sure a select* field is given if and only if you render a select box. The
612 actual contents are ignored, but recognition fails if not present.
614 Make sure old* and *_id fields are set correctly (name--id form for old*). They
615 are necessary in all steps and branches.
617 Since get_customer and get_vendor clobber a lot of fields, make sure what
620 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.
622 This mostly works great, except for the case when there is more than one match.
623 In that case check_name will display a select form, that will redirect to the
624 original C<nextsub>. Unfortunately any hidden vars or input fields will be lost
625 in the process unless saved before in a callback.
627 If you still want to use it, you can disable this feature, like this:
629 check_name('customer', no_select => 1)
631 In that case multiple matches will trigger an error.
636 >>>>>>> 88f5a78... check_name erweitert um ein no_select flag. siehe perldoc bin/mozilla/arap.pl:bin/mozilla/arap.pl