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);
use SL::DB::Default;
use SL::DB::PaymentTerm;
require "bin/mozilla/io.pl";
-require "bin/mozilla/invoice_io.pl";
require "bin/mozilla/arap.pl";
require "bin/mozilla/drafts.pl";
return $main::lxdebug->leave_sub() if (load_draft_maybe());
+ $form->{show_details} = $::myconfig{show_form_details};
+
if ($form->{type} eq "credit_note") {
$form->{title} = $locale->text('Add Credit Note');
$main::auth->assert('invoice_edit');
+ $form->{show_details} = $::myconfig{show_form_details};
$form->{taxincluded_changed_by_user} = 1;
# show history button
$form->{javascript} = qq|<script type="text/javascript" src="js/show_history.js"></script>|;
- #/show hhistory button
my ($language_id, $printer_id);
if ($form->{print_and_post}) {
$form->{vc} = 'customer';
# create links
- $form->{webdav} = $::instance_conf->get_webdav;
-
$form->create_links("AR", \%myconfig, "customer");
if ($form->{all_customer}) {
$form->restore_vars(qw(salesman_id)) if $editing;
- # build vendor/customer drop down comatibility... don't ask
+ # build vendor/customer drop down compatibility... don't ask
if (@{ $form->{"all_customer"} }) {
$form->{"selectcustomer"} = 1;
$form->{customer} = qq|$form->{customer}--$form->{"customer_id"}|;
my %TMPL_VAR = ();
my @custom_hiddens;
+ if ($form->{id}) {
+ require SL::DB::Invoice;
+ $TMPL_VAR{invoice_obj} = SL::DB::Invoice->new(id => $form->{id})->load;
+ }
$form->{employee_id} = $form->{old_employee_id} if $form->{old_employee_id};
$form->{salesman_id} = $form->{old_salesman_id} if $form->{old_salesman_id};
]);
$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 => [
$TMPL_VAR{HIDDENS} = [qw(
id action 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
- shiptoname shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact shiptophone shiptofax
+ 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
$::request->{layout}->use_javascript(map { "${_}.js" } qw(kivi.SalesPurchase ckeditor/ckeditor ckeditor/adapters/jquery kivi.io autocomplete_customer autocomplete_part client_js));
$TMPL_VAR{payment_terms_obj} = get_payment_terms_for_invoice();
- $form->{duedate} = $TMPL_VAR{payment_terms_obj}->calc_date(reference_date => $form->{invdate}, due_date => $form->{due_due})->to_kivitendo if $TMPL_VAR{payment_terms_obj};
+ $form->{duedate} = $TMPL_VAR{payment_terms_obj}->calc_date(reference_date => $form->{invdate}, due_date => $form->{duedate})->to_kivitendo if $TMPL_VAR{payment_terms_obj};
$form->header();
$main::lxdebug->leave_sub();
}
+sub _sort_payments {
+ my @fields = qw(acc_trans_id gldate datepaid source memo paid AR_paid);
+ my @payments =
+ grep { $_->{paid} != 0 }
+ map {
+ my $idx = $_;
+ +{ map { ($_ => delete($::form->{"${_}_${idx}"})) } @fields }
+ } (1..$::form->{paidaccounts});
+
+ @payments = sort_by { DateTime->from_kivitendo($_->{datepaid}) } @payments;
+
+ $::form->{paidaccounts} = max scalar(@payments), 1;
+
+ foreach my $idx (1 .. scalar(@payments)) {
+ my $payment = $payments[$idx - 1];
+ $::form->{"${_}_${idx}"} = $payment->{$_} for @fields;
+ }
+}
+
sub form_footer {
$main::lxdebug->enter_sub();
}
}
+ $form->{rounding} = $form->round_amount(
+ $form->round_amount($form->{invtotal}, 2, 1) - $form->round_amount($form->{invtotal}, 2), 2
+ );
+ $form->{invtotal} = $form->round_amount( $form->{invtotal}, 2, 1 );
+
# follow ups
if ($form->{id}) {
$form->{follow_ups} = FU->follow_ups('trans_id' => $form->{id}) || [];
}
# payments
+ _sort_payments();
+
my $totalpaid = 0;
$form->{paidaccounts}++ if ($form->{"paid_$form->{paidaccounts}"});
$form->{paid_indices} = [ 1 .. $form->{paidaccounts} ];
show_delete => ($::instance_conf->get_is_changeable == 2)
? ($form->current_date(\%myconfig) eq $form->{gldate})
: ($::instance_conf->get_is_changeable == 1),
+ today => DateTime->today,
});
##print $form->parse_html_template('is/_payments'); # parser
##print $form->parse_html_template('webdav/_list'); # parser
$main::auth->assert('invoice_edit');
+ $form->mtime_ischanged('ar') ;
my $invdate = $form->datetonum($form->{invdate}, \%myconfig);
$form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
relink_accounts();
if ( IS->post_payment(\%myconfig, \%$form) ) {
$form->{snumbers} = qq|invnumber_| . $form->{invnumber};
- $form->{what_done} = $form->{type};
+ $form->{what_done} = 'invoice';
$form->{addition} = "PAYMENT POSTED";
$form->save_history;
$form->redirect($locale->text('Payment posted!'))
my $locale = $main::locale;
$main::auth->assert('invoice_edit');
+ $form->mtime_ischanged('ar');
$form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
$form->isblank("invdate", $locale->text('Invoice Date missing!'));
remove_draft() if $form->{remove_draft};
if(!exists $form->{addition}) {
- $form->{snumbers} = 'invnumber' .'_'. $form->{invnumber}; # ($form->{type} eq 'credit_note' ? 'cnnumber' : 'invnumber') .'_'. $form->{invnumber};
- $form->{addition} = $form->{print_and_post} ? "PRINTED AND POSTED" :
- $form->{storno} ? "STORNO" :
- "POSTED";
+ $form->{snumbers} = 'invnumber' .'_'. $form->{invnumber}; # ($form->{type} eq 'credit_note' ? 'cnnumber' : 'invnumber') .'_'. $form->{invnumber};
+ $form->{what_done} = 'invoice';
+ $form->{addition} = $form->{print_and_post} ? "PRINTED AND POSTED" :
+ $form->{storno} ? "STORNO" :
+ "POSTED";
$form->save_history;
}
$form->{action} = 'edit';
$form->{script} = 'is.pl';
$form->{saved_message} = $form->{label} . " $form->{invnumber} " . $locale->text('posted!');
- $form->{callback} = build_std_url(qw(action edit id saved_message));
+ $form->{callback} = build_std_url(qw(action edit id callback saved_message));
$form->redirect;
}
}
# save the history of invoice being stornoed
- $form->{snumbers} = qq|invnumber_| . $form->{invnumber};
- $form->{addition} = "STORNO";
+ $form->{snumbers} = qq|invnumber_| . $form->{invnumber};
+ $form->{what_done} = 'invoice';
+ $form->{addition} = "STORNO";
$form->save_history;
map({ my $key = $_; delete($form->{$key}) unless (grep({ $key eq $_ } qw(id login password type))); } keys(%{ $form }));
$main::lxdebug->leave_sub();
}
+sub display_form {
+ $::lxdebug->enter_sub;
+
+ $::auth->assert('invoice_edit');
+
+ relink_accounts();
+
+ my $new_rowcount = $::form->{"rowcount"} * 1 + 1;
+ $::form->{"project_id_${new_rowcount}"} = $::form->{"globalproject_id"};
+
+ $::form->language_payment(\%::myconfig);
+
+ Common::webdav_folder($::form);
+
+ form_header();
+ display_row(++$::form->{rowcount});
+ form_footer();
+
+ $::lxdebug->leave_sub;
+}
+
sub yes {
$main::lxdebug->enter_sub();
if (IS->delete_invoice(\%myconfig, \%$form)) {
# saving the history
if(!exists $form->{addition}) {
- $form->{snumbers} = 'invnumber' .'_'. $form->{invnumber}; # ($form->{type} eq 'credit_note' ? 'cnnumber' : 'invnumber') .'_'. $form->{invnumber};
- $form->{addition} = "DELETED";
+ $form->{snumbers} = 'invnumber' .'_'. $form->{invnumber}; # ($form->{type} eq 'credit_note' ? 'cnnumber' : 'invnumber') .'_'. $form->{invnumber};
+ $form->{what_done} = 'invoice';
+ $form->{addition} = "DELETED";
$form->save_history;
}
# /saving the history