X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/2ff471a7b78c1085bbc0adff525fbf589127d819..fbcd5580:/bin/mozilla/is.pl diff --git a/bin/mozilla/is.pl b/bin/mozilla/is.pl index bf64bb612..5ac59b27e 100644 --- a/bin/mozilla/is.pl +++ b/bin/mozilla/is.pl @@ -24,29 +24,49 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1335, USA. #====================================================================== # # Inventory invoicing module # #====================================================================== +use SL::FU; use SL::IS; -use SL::PE; +use SL::OE; +use SL::MoreCommon qw(restore_form save_form); use Data::Dumper; +use DateTime; +use List::MoreUtils qw(uniq); +use List::Util qw(max sum); +use List::UtilsBy qw(sort_by); +use English qw(-no_match_vars); -require "$form->{path}/io.pl"; -require "$form->{path}/arap.pl"; -require "bin/mozilla/drafts.pl"; +use SL::DB::Default; +use SL::DB::Customer; +use SL::DB::Department; +use SL::DB::Invoice; +use SL::DB::PaymentTerm; + +require "bin/mozilla/common.pl"; +require "bin/mozilla/io.pl"; + +use strict; 1; # end of main sub add { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my $locale = $main::locale; - return $lxdebug->leave_sub() if (load_draft_maybe()); + $main::auth->assert('invoice_edit'); + + $form->{show_details} = $::myconfig{show_form_details}; if ($form->{type} eq "credit_note") { $form->{title} = $locale->text('Add Credit Note'); @@ -60,42 +80,46 @@ sub add { } - $form->{callback} = - "$form->{script}?action=add&type=$form->{type}&login=$form->{login}&path=$form->{path}&password=$form->{password}" - unless $form->{callback}; - - $form{jsscript} = "date"; + $form->{callback} = "$form->{script}?action=add&type=$form->{type}" unless $form->{callback}; - if ($myconfig{acs} =~ "AR--Add Sales Invoice" || $myconfig{acs} =~ "AR--AR") - { - $form->error("Access Denied"); - } &invoice_links; &prepare_invoice; &display_form; - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub edit { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my $locale = $main::locale; + + $main::auth->assert('invoice_edit'); + + $form->{show_details} = $::myconfig{show_form_details}; + $form->{taxincluded_changed_by_user} = 1; # show history button $form->{javascript} = qq||; - #/show hhistory button - - if ($myconfig{acs} =~ "AR--Add Sales Invoice" || $myconfig{acs} =~ "AR--AR") - { - $form->error("Access Denied"); - } - $edit = 1; + + my ($language_id, $printer_id); if ($form->{print_and_post}) { $form->{action} = "print"; $form->{resubmit} = 1; $language_id = $form->{language_id}; $printer_id = $form->{printer_id}; } + &invoice_links; + if ($form->{type} eq "credit_note") { + $form->{title} = $locale->text('Edit Credit Note'); + $form->{title} = $locale->text('Edit Storno Credit Note') if $form->{storno}; + } else { + $form->{title} = $locale->text('Edit Sales Invoice'); + $form->{title} = $locale->text('Edit Storno Invoice') if $form->{storno}; + } + &prepare_invoice; if ($form->{print_and_post}) { $form->{language_id} = $language_id; @@ -104,153 +128,94 @@ sub edit { &display_form; - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub invoice_links { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my %myconfig = %main::myconfig; + + $main::auth->assert('invoice_edit'); $form->{vc} = 'customer'; # create links - $form->{webdav} = $webdav; - $form->{lizenzen} = $lizenzen; - $form->create_links("AR", \%myconfig, "customer"); - if ($form->{all_customer}) { - unless ($form->{customer_id}) { - $form->{customer_id} = $form->{all_customer}->[0]->{id}; - $form->{salesman_id} = $form->{all_customer}->[0]->{salesman_id}; - } - } + my $editing = $form->{id}; - if ($form->{payment_id}) { - $payment_id = $form->{payment_id}; - } - if ($form->{language_id}) { - $language_id = $form->{language_id}; - } - if ($form->{taxzone_id}) { - $taxzone_id = $form->{taxzone_id}; - } - if ($form->{id}) { - $id = $form->{id}; - } - if ($form->{shipto_id}) { - $shipto_id = $form->{shipto_id}; - } + $form->backup_vars(qw(payment_id language_id taxzone_id salesman_id + taxincluded currency cp_id intnotes id shipto_id + delivery_term_id)); - $cp_id = $form->{cp_id}; IS->get_customer(\%myconfig, \%$form); - #quote all_customer Bug 133 - foreach $ref (@{ $form->{all_customer} }) { - $ref->{name} = $form->quote($ref->{name}); - } - if ($id) { - $form->{id} = $id; - } - IS->retrieve_invoice(\%myconfig, \%$form); - $form->{cp_id} = $cp_id; + $form->restore_vars(qw(id)); - if ($payment_id) { - $form->{payment_id} = $payment_id; - } - if ($language_id) { - $form->{language_id} = $language_id; - } - if ($taxzone_id) { - $form->{taxzone_id} = $taxzone_id; - } - if ($shipto_id) { - $form->{shipto_id} = $shipto_id; - } - - # currencies - @curr = split(/:/, $form->{currencies}); - chomp $curr[0]; - $form->{defaultcurrency} = $curr[0]; - - map { $form->{selectcurrency} .= "\n"; } if ($key eq "AR_paid") { - for $i (1 .. scalar @{ $form->{acc_trans}{$key} }) { - $form->{"AR_paid_$i"} = - "$form->{acc_trans}{$key}->[$i-1]->{accno}--$form->{acc_trans}{$key}->[$i-1]->{description}"; + next unless $form->{acc_trans}{$key}; + for my $i (1 .. scalar @{ $form->{acc_trans}{$key} }) { + $form->{"AR_paid_$i"} = "$form->{acc_trans}{$key}->[$i-1]->{accno}--$form->{acc_trans}{$key}->[$i-1]->{description}"; + $form->{"acc_trans_id_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{acc_trans_id}; # reverse paid - $form->{"paid_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{amount} * -1; - $form->{"datepaid_$i"} = - $form->{acc_trans}{$key}->[$i - 1]->{transdate}; - $form->{"forex_$i"} = $form->{"exchangerate_$i"} = - $form->{acc_trans}{$key}->[$i - 1]->{exchangerate}; - $form->{"source_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{source}; - $form->{"memo_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{memo}; + $form->{"paid_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{amount} * -1; + $form->{"datepaid_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{transdate}; + $form->{"gldate_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{gldate}; + $form->{"exchangerate_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{exchangerate}; + $form->{"forex_$i"} = $form->{"exchangerate_$i"}; + $form->{"source_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{source}; + $form->{"memo_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{memo}; $form->{paidaccounts} = $i; } } else { - $form->{$key} = - "$form->{acc_trans}{$key}->[0]->{accno}--$form->{acc_trans}{$key}->[0]->{description}"; + $form->{$key} = "$form->{acc_trans}{$key}->[0]->{accno}--$form->{acc_trans}{$key}->[0]->{description}"; } - } $form->{paidaccounts} = 1 unless (exists $form->{paidaccounts}); $form->{AR} = $form->{AR_1} unless $form->{id}; - $form->{locked} = - ($form->datetonum($form->{invdate}, \%myconfig) <= - $form->datetonum($form->{closedto}, \%myconfig)); + $form->{locked} = ($form->datetonum($form->{invdate}, \%myconfig) + <= $form->datetonum($form->{closedto}, \%myconfig)); - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub prepare_invoice { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my %myconfig = %main::myconfig; + + $main::auth->assert('invoice_edit'); if ($form->{type} eq "credit_note") { $form->{type} = "credit_note"; $form->{formname} = "credit_note"; + } elsif ($form->{formname} eq "proforma" ) { + $form->{type} = "invoice"; } else { $form->{type} = "invoice"; $form->{formname} = "invoice"; @@ -258,1005 +223,329 @@ sub prepare_invoice { if ($form->{id}) { - map { $form->{$_} =~ s/\"/"/g } - qw(invnumber ordnumber quonumber shippingpoint shipvia notes intnotes); - - # # get pricegroups for parts - # IS->get_pricegroups_for_parts(\%myconfig, \%$form); - my $i = 0; - foreach $ref (@{ $form->{invoice_details} }) { + foreach my $ref (@{ $form->{invoice_details} }) { $i++; map { $form->{"${_}_$i"} = $ref->{$_} } keys %{$ref}; - $form->{"discount_$i"} = - $form->format_amount(\%myconfig, $form->{"discount_$i"} * 100); - ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/); - $dec = length $dec; - $decimalplaces = ($dec > 2) ? $dec : 2; - $form->{"sellprice_$i"} = - $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, - $decimalplaces); + $form->{"discount_$i"} = $form->format_amount(\%myconfig, $form->{"discount_$i"} * 100); + my ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/); + $dec = length $dec; + my $decimalplaces = ($dec > 2) ? $dec : 2; - (my $dec_qty) = ($form->{"qty_$i"} =~ /\.(\d+)/); - $dec_qty = length $dec_qty; + $form->{"sellprice_$i"} = $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces); + (my $dec_qty) = ($form->{"qty_$i"} =~ /\.(\d+)/); + $dec_qty = length $dec_qty; - $form->{"qty_$i"} = - $form->format_amount(\%myconfig, $form->{"qty_$i"}, $dec_qty); + $form->{"lastcost_$i"} = $form->format_amount(\%myconfig, $form->{"lastcost_$i"}, $decimalplaces); - map { $form->{"${_}_$i"} =~ s/\"/"/g } - qw(partnumber description unit partnotes); - $form->{rowcount} = $i; - - } - } - $lxdebug->leave_sub(); -} + $form->{"qty_$i"} = $form->format_amount(\%myconfig, $form->{"qty_$i"}, $dec_qty); -sub form_header { - $lxdebug->enter_sub(); + $form->{"sellprice_pg_$i"} = join ('--', $form->{"sellprice_$i"}, $form->{"pricegroup_id_$i"}); - if ($edit) { + $form->{rowcount} = $i; - if ($form->{type} eq "credit_note") { - $form->{title} = $locale->text('Edit Credit Note'); - - if ($form->{storno}) { - $form->{title} = $locale->text('Edit Storno Credit Note'); - } - } else { - $form->{title} = $locale->text('Edit Sales Invoice'); - - if ($form->{storno}) { - $form->{title} = $locale->text('Edit Storno Invoice'); - } } } + $main::lxdebug->leave_sub(); +} - $form->{radier} = - ($form->current_date(\%myconfig) eq $form->{gldate}) ? 1 : 0; - - $payment = qq||; - foreach $item (@{ $form->{payment_terms} }) { - if ($form->{payment_id} eq $item->{id}) { - $payment .= qq||; - } else { - $payment .= qq||; - } +sub form_header { + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my %myconfig = %main::myconfig; + my $locale = $main::locale; + my $cgi = $::request->{cgi}; + + $main::auth->assert('invoice_edit'); + + my %TMPL_VAR = (); + my @custom_hiddens; + + $TMPL_VAR{customer_obj} = SL::DB::Customer->load_cached($form->{customer_id}) if $form->{customer_id}; + $TMPL_VAR{invoice_obj} = SL::DB::Invoice->load_cached($form->{id}) if $form->{id}; + + $form->{employee_id} = $form->{old_employee_id} if $form->{old_employee_id}; + $form->{salesman_id} = $form->{old_salesman_id} if $form->{old_salesman_id}; + + $form->{defaultcurrency} = $form->get_default_currency(\%myconfig); + + $form->get_lists("taxzones" => ($form->{id} ? "ALL_TAXZONES" : "ALL_ACTIVE_TAXZONES"), + "currencies" => "ALL_CURRENCIES", + "price_factors" => "ALL_PRICE_FACTORS"); + + $form->{ALL_DEPARTMENTS} = SL::DB::Manager::Department->get_all_sorted; + + # Projects + my @old_project_ids = uniq grep { $_ } map { $_ * 1 } ($form->{"globalproject_id"}, map { $form->{"project_id_$_"} } 1..$form->{"rowcount"}); + my @old_ids_cond = @old_project_ids ? (id => \@old_project_ids) : (); + my @customer_cond; + if ($::instance_conf->get_customer_projects_only_in_sales) { + @customer_cond = ( + or => [ + customer_id => $::form->{customer_id}, + billable_customer_id => $::form->{customer_id}, + ]); + } + my @conditions = ( + or => [ + and => [ active => 1, @customer_cond ], + @old_ids_cond, + ]); + + $TMPL_VAR{ALL_PROJECTS} = SL::DB::Manager::Project->get_all_sorted(query => \@conditions); + $form->{ALL_PROJECTS} = $TMPL_VAR{ALL_PROJECTS}; # make projects available for second row drop-down in io.pl + $TMPL_VAR{ALL_EMPLOYEES} = SL::DB::Manager::Employee->get_all_sorted(query => [ or => [ id => $::form->{employee_id}, deleted => 0 ] ]); + $TMPL_VAR{ALL_SALESMEN} = SL::DB::Manager::Employee->get_all_sorted(query => [ or => [ id => $::form->{salesman_id}, deleted => 0 ] ]); + $TMPL_VAR{ALL_SHIPTO} = SL::DB::Manager::Shipto->get_all_sorted(query => [ + 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_sorted(query => [ + or => [ + cp_cv_id => $::form->{"$::form->{vc}_id"} * 1, + and => [ + cp_cv_id => undef, + cp_id => $::form->{cp_id} * 1 + ] + ] + ]); + + # currencies and exchangerate + my @values = map { $_ } @{ $form->{ALL_CURRENCIES} }; + my %labels = map { $_ => $_ } @{ $form->{ALL_CURRENCIES} }; + $form->{currency} = $form->{defaultcurrency} unless $form->{currency}; + $form->{show_exchangerate} = $form->{currency} ne $form->{defaultcurrency}; + $TMPL_VAR{currencies} = NTI($::request->{cgi}->popup_menu('-name' => 'currency', '-default' => $form->{"currency"}, + '-values' => \@values, '-labels' => \%labels, + '-onchange' => "document.getElementById('update_button').click();" + )) if scalar @values; + push @custom_hiddens, "forex"; + push @custom_hiddens, "exchangerate" if $form->{forex}; + + $TMPL_VAR{creditwarning} = ($form->{creditlimit} != 0) && ($form->{creditremaining} < 0) && !$form->{update}; + $TMPL_VAR{is_credit_remaining_negativ} = $form->{creditremaining} =~ /-/; + +# set option selected + foreach my $item (qw(AR)) { + $form->{"select$item"} =~ s/ selected//; + $form->{"select$item"} =~ s/option>\Q$form->{$item}\E/option selected>$form->{$item}/; } - my $set_duedate_url = - "$form->{script}?login=$form->{login}&path=$form->{path}&password=$form->{password}&action=set_duedate"; + $TMPL_VAR{is_type_credit_note} = $form->{type} eq "credit_note"; + $TMPL_VAR{is_format_html} = $form->{format} eq 'html'; + $TMPL_VAR{dateformat} = $myconfig{dateformat}; + $TMPL_VAR{numberformat} = $myconfig{numberformat}; - my $pjx = new CGI::Ajax( 'set_duedate' => $set_duedate_url ); - push(@ { $form->{AJAX} }, $pjx); + push @custom_hiddens, map { "shiptocvar_" . $_->name } @{ SL::DB::Manager::CustomVariableConfig->get_all(where => [ module => 'ShipTo' ]) }; - if (@{ $form->{TAXZONE} }) { - $form->{selecttaxzone} = ""; - foreach $item (@{ $form->{TAXZONE} }) { - if ($item->{id} == $form->{taxzone_id}) { - $form->{selecttaxzone} .= - ""; - } else { - $form->{selecttaxzone} .= - ""; - } + # hiddens + $TMPL_VAR{HIDDENS} = [qw( + id type media format queued printed emailed title vc discount + title creditlimit creditremaining tradediscount business closedto locked shipped storno storno_id + max_dunning_level dunning_amount dunning_description + shiptoname shiptostreet shiptozipcode shiptocity shiptocountry shiptogln shiptocontact shiptophone shiptofax + shiptoemail shiptodepartment_1 shiptodepartment_2 shiptocp_gender message email subject cc bcc taxaccounts cursor_fokus + convert_from_do_ids convert_from_oe_ids convert_from_ar_ids useasnew + invoice_id + show_details + ), @custom_hiddens, + map { $_.'_rate', $_.'_description', $_.'_taxnumber' } split / /, $form->{taxaccounts}]; - } - } else { - $form->{selecttaxzone} =~ s/ selected//g; - if ($form->{taxzone_id} ne "") { - $form->{selecttaxzone} =~ s/value=$form->{taxzone_id}/value=$form->{taxzone_id} selected/; - } - } + $::request->{layout}->use_javascript(map { "${_}.js" } qw(kivi.Draft kivi.SalesPurchase ckeditor/ckeditor ckeditor/adapters/jquery kivi.io autocomplete_customer autocomplete_part client_js)); - $taxzone = qq| -
| | . $locale->text('Max. Dunning Level') . qq|: | -$form->{max_dunning_level} | -| . $locale->text('Dunning Amount') . qq|: | -| - . $form->format_amount(\%myconfig, $form->{dunning_amount},2) - . qq| | -
|---|