X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/443e237ff0dbd22131349e65e4a86c3f3c73c7c9..edff34950b489a16a8d49d7d583479e23cb5d6c7:/SL/DN.pm diff --git a/SL/DN.pm b/SL/DN.pm index 46ab23a5b..9016aaad4 100644 --- a/SL/DN.pm +++ b/SL/DN.pm @@ -40,6 +40,7 @@ use SL::DBUtils; use SL::DB::AuthUser; use SL::DB::Default; use SL::DB::Employee; +use SL::File; use SL::GenericTranslations; use SL::IS; use SL::Mailer; @@ -50,6 +51,7 @@ use SL::DB::Language; use SL::TransNumber; use SL::Util qw(trim); use SL::DB; +use SL::Webdav; use File::Copy; @@ -192,7 +194,8 @@ sub create_invoice_for_fees { AND (d_interest.dunning_id <> ?) AND NOT (d_interest.fee_interest_ar_id ISNULL) ), 0) - AS max_previous_interest + AS max_previous_interest, + d.id AS link_id FROM dunning d WHERE dunning_id = ?|; @values = ($dunning_id, $dunning_id, $dunning_id); @@ -201,6 +204,8 @@ sub create_invoice_for_fees { my ($fee_remaining, $interest_remaining) = (0, 0); my ($fee_total, $interest_total) = (0, 0); + my @link_ids; + while (my $ref = $sth->fetchrow_hashref()) { $fee_remaining += $form->round_amount($ref->{fee}, 2); $fee_remaining -= $form->round_amount($ref->{max_previous_fee}, 2); @@ -208,6 +213,7 @@ sub create_invoice_for_fees { $interest_remaining += $form->round_amount($ref->{interest}, 2); $interest_remaining -= $form->round_amount($ref->{max_previous_interest}, 2); $interest_total += $form->round_amount($ref->{interest}, 2); + push @link_ids, $ref->{link_id}; } $sth->finish(); @@ -271,6 +277,15 @@ sub create_invoice_for_fees { $::myconfig{login}); # employee_id do_query($form, $dbh, $query, @values); + RecordLinks->create_links( + 'dbh' => $dbh, + 'mode' => 'ids', + 'from_table' => 'dunning', + 'from_ids' => \@link_ids, + 'to_table' => 'ar', + 'to_id' => $ar_id, + ); + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, gldate, taxkey, tax_id, chart_link) VALUES (?, ?, ?, current_date, current_date, 0, @@ -326,9 +341,9 @@ sub _save_dunning { my $h_update_ar = prepare_query($form, $dbh, $q_update_ar); my $q_insert_dunning = - qq|INSERT INTO dunning (dunning_id, dunning_config_id, dunning_level, trans_id, - fee, interest, transdate, duedate) - VALUES (?, ?, + qq|INSERT INTO dunning (id, dunning_id, dunning_config_id, dunning_level, trans_id, + fee, interest, transdate, duedate, original_invoice_printed) + VALUES (?, ?, ?, (SELECT dunning_level FROM dunning_config WHERE id = ?), ?, (SELECT SUM(fee) @@ -338,7 +353,8 @@ sub _save_dunning { * (SELECT interest_rate FROM dunning_config WHERE id = ?) / 360, current_date, - current_date + (SELECT payment_terms FROM dunning_config WHERE id = ?))|; + current_date + (SELECT payment_terms FROM dunning_config WHERE id = ?), + ?)|; my $h_insert_dunning = prepare_query($form, $dbh, $q_insert_dunning); my @invoice_ids; @@ -366,13 +382,24 @@ sub _save_dunning { $send_email |= $row->{email}; $print_invoice |= $row->{print_invoice}; + my ($row_id) = selectrow_query($form, $dbh, qq|SELECT nextval('id')|); my $next_config_id = conv_i($row->{next_dunning_config_id}); my $invoice_id = conv_i($row->{invoice_id}); - @values = ($dunning_id, $next_config_id, $next_config_id, - $invoice_id, $next_config_id, $invoice_id, - $next_config_id, $next_config_id); + @values = ($row_id, $dunning_id, $next_config_id, + $next_config_id, $invoice_id, $next_config_id, + $invoice_id, $next_config_id, $next_config_id, + $print_invoice); do_statement($form, $h_insert_dunning, $q_insert_dunning, @values); + + RecordLinks->create_links( + 'dbh' => $dbh, + 'mode' => 'ids', + 'from_table' => 'ar', + 'from_ids' => $invoice_id, + 'to_table' => 'dunning', + 'to_id' => $row_id, + ); } # die this transaction, because for this customer only credit notes are # selected ... @@ -391,7 +418,7 @@ sub _save_dunning { $self->print_dunning($myconfig, $form, $dunning_id, $dbh); if ($print_invoice) { - $self->print_original_invoices($myconfig, $form, $_, $dbh) for @invoice_ids; + $self->print_original_invoice($myconfig, $form, $_) for @invoice_ids; } if ($send_email) { @@ -755,12 +782,12 @@ sub get_dunning { my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC'; my $sortkey = $sort_columns{$form->{sort}} ? $form->{sort} : 'customername'; - my $sortorder = join ', ', map { "$_ $sortdir" } @{ $sort_columns{$sortkey} }; + my $sortorder = join ', ', map { "$_ $sortdir" } (@{ $sort_columns{$sortkey} }, 'da.dunning_id'); my $query = qq|SELECT a.id, a.ordnumber, a.invoice, a.transdate, a.invnumber, a.amount, a.language_id, ct.name AS customername, ct.id AS customer_id, a.duedate, da.fee, - da.interest, dn.dunning_description, da.transdate AS dunning_date, + da.interest, dn.dunning_description, dn.dunning_level, da.transdate AS dunning_date, da.duedate AS dunning_duedate, da.dunning_id, da.dunning_config_id, e2.name AS salesman FROM ar a @@ -835,7 +862,7 @@ sub print_dunning { $dunning_id =~ s|[^\d]||g; - my ($language_tc, $output_numberformat, $output_dateformat, $output_longdates); + my ($language_tc, $output_numberformat, $output_dateformat, $output_longdates, @dunned_invoices); if ($form->{"language_id"}) { ($language_tc, $output_numberformat, $output_dateformat, $output_longdates) = AM->get_language_details($myconfig, $form, $form->{language_id}); @@ -857,7 +884,7 @@ sub print_dunning { ar.transdate, ar.duedate, ar.customer_id, ar.invnumber, ar.ordnumber, ar.cp_id, ar.amount, ar.netamount, ar.paid, - ar.employee_id, ar.salesman_id, + ar.employee_id, ar.salesman_id, ar.id AS dunned_invoice_id, (SELECT cu.name FROM currencies cu WHERE cu.id = ar.currency_id) AS curr, (SELECT description from department WHERE id = ar.department_id) AS department, ar.amount - ar.paid AS open_amount, @@ -879,6 +906,7 @@ sub print_dunning { map { $ref->{$_} = $form->format_amount($myconfig, $ref->{$_}, 2) } qw(amount netamount paid open_amount fee interest linetotal); map { $form->{$_} = $ref->{$_} } keys %$ref; map { push @{ $form->{TEMPLATE_ARRAYS}->{"dn_$_"} }, $ref->{$_} } keys %$ref; + push @dunned_invoices, {id => $ref->{dunned_invoice_id}, invnumber => $ref->{invnumber}}; } $sth->finish(); @@ -988,8 +1016,37 @@ sub print_dunning { } $form->{attachment_filename} = $form->get_formname_translation($form->{attachment_type}) . "_${dunning_id}.pdf"; $form->{attachment_id} = $form->{invoice_id}; + + # this generates the file in the spool directory $form->parse_template($myconfig); + # save dunning pdf in filemanagement/webdav for each invoice + foreach my $dunned_invoice (@dunned_invoices) { + if ($::instance_conf->get_doc_storage) { + SL::File->save( + object_id => $dunned_invoice->{id}, + object_type => $form->{attachment_type}, + mime_type => 'application/pdf', + source => 'created', + file_type => 'document', + file_name => $form->{attachment_filename}, + file_path => "${spool}/$filename", + ); + } + + if ($::instance_conf->get_webdav_documents) { + my $webdav = SL::Webdav->new( + type => 'invoice', + number => $dunned_invoice->{invnumber}, + ); + my $webdav_file = SL::Webdav::File->new( + webdav => $webdav, + filename => $form->{attachment_filename}, + ); + $webdav_file->store(file => "${spool}/$filename"); + } + } + $main::lxdebug->leave_sub(); } @@ -1079,16 +1136,49 @@ sub print_invoice_for_fees { map { delete $form->{$_} } grep /^[a-z_]+_\d+$/, keys %{ $form }; - $form->{attachment_filename} = $form->get_formname_translation('dunning_invoice') . "_${dunning_id}.pdf"; + my $attachment_filename = $form->get_formname_translation('dunning_invoice') . "_${dunning_id}.pdf"; + $form->{attachment_filename} = $attachment_filename; $form->{attachment_type} = "dunning"; - $form->{attachment_id} = $form->{invoice_id}; + $form->{attachment_id} = $invoice_id; $form->parse_template($myconfig); restore_form($saved_form); push @{ $form->{DUNNING_PDFS} }, $filename; - push @{ $form->{DUNNING_PDFS_EMAIL} }, { 'filename' => "${spool}/$filename", - 'name' => "dunning_invoice_${dunning_id}.pdf" }; + push @{ $form->{DUNNING_PDFS_EMAIL} }, { 'path' => "${spool}/$filename", + 'name' => $attachment_filename }; + + # save dunning fee pdf in filemanagement/webdav for each dunned invoice + if ($::instance_conf->get_doc_storage || $::instance_conf->get_webdav_documents) { + $query = qq|SELECT trans_id, invnumber FROM dunning LEFT JOIN ar ON (ar.id = trans_id) WHERE dunning_id = ?|; + my $dunned_invoices = selectall_hashref_query($form, $dbh, $query, $dunning_id); + + foreach my $dunned_invoice (@$dunned_invoices) { + if ($::instance_conf->get_doc_storage) { + SL::File->save( + object_id => $dunned_invoice->{trans_id}, + object_type => 'dunning', + mime_type => 'application/pdf', + source => 'created', + file_type => 'document', + file_name => $attachment_filename, + file_path => "${spool}/$filename", + ); + } + + if ($::instance_conf->get_webdav_documents) { + my $webdav = SL::Webdav->new( + type => 'invoice', + number => $dunned_invoice->{invnumber}, + ); + my $webdav_file = SL::Webdav::File->new( + webdav => $webdav, + filename => $attachment_filename, + ); + $webdav_file->store(file => "${spool}/$filename"); + } + } + } $main::lxdebug->leave_sub(); } @@ -1114,7 +1204,7 @@ sub set_customer_cvars { } -sub print_original_invoices { +sub print_original_invoice { my ($self, $myconfig, $form, $invoice_id) = @_; # get one invoice as object and print to pdf my $invoice = SL::DB::Invoice->new(id => $invoice_id)->load; @@ -1154,11 +1244,38 @@ sub print_original_invoices { my $saved_reicpient_locale = $form->{recipient_locale}; $form->{recipient_locale} = $invoice->language; + my $attachment_filename = $form->get_formname_translation('invoice') . "_" . $invoice->invnumber . ".pdf"; + push @{ $form->{DUNNING_PDFS} }, $file_name; push @{ $form->{DUNNING_PDFS_EMAIL} }, { 'path' => "${spool}/$file_name", - 'name' => $form->get_formname_translation('invoice') . "_" . $invoice->invnumber . ".pdf" }; + 'name' => $attachment_filename }; $form->{recipient_locale} = $saved_reicpient_locale; + + # save original invoice pdf in filemanagement/webdav for dunned invoice + if ($::instance_conf->get_doc_storage) { + SL::File->save( + object_id => $invoice_id, + object_type => 'dunning_orig_invoice', + mime_type => 'application/pdf', + source => 'created', + file_type => 'document', + file_name => $attachment_filename, + file_path => "${spool}/$file_name", + ); + } + if ($::instance_conf->get_webdav_documents) { + my $webdav = SL::Webdav->new( + type => 'invoice', + number => $invoice->invnumber, + ); + my $webdav_file = SL::Webdav::File->new( + webdav => $webdav, + filename => $attachment_filename, + ); + $webdav_file->store(file => "${spool}/$file_name"); + } + } 1;