Index: openacs-4/packages/invoices/invoices.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/invoices/invoices.info,v diff -u -N -r1.24 -r1.25 --- openacs-4/packages/invoices/invoices.info 2 May 2006 12:07:11 -0000 1.24 +++ openacs-4/packages/invoices/invoices.info 3 May 2006 05:52:35 -0000 1.25 @@ -7,15 +7,15 @@ f t - + Timo Hentschel Invoices package that will collect costs to invoice items in invoices and store data about received payment. 2005-11-15 Cognovis Collect costs to invoice items and invoices, store payment information. 0 - + Index: openacs-4/packages/invoices/lib/invoice-list.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/invoices/lib/invoice-list.tcl,v diff -u -N -r1.14 -r1.15 --- openacs-4/packages/invoices/lib/invoice-list.tcl 2 May 2006 12:07:11 -0000 1.14 +++ openacs-4/packages/invoices/lib/invoice-list.tcl 3 May 2006 05:52:35 -0000 1.15 @@ -49,7 +49,7 @@ set user_id [ad_conn user_id] set timestamp_format "YYYY-MM-DD HH24:MI:SS" -set bulk_actions [list "[_ invoices.iv_invoice_send]" "${base_url}invoices-view" "[_ invoices.iv_invoice_send]" "[_ invoices.iv_invoice_pay]" "${base_url}invoice-pay" "[_ invoices.iv_invoice_pay]"] +set bulk_actions [list "[_ invoices.iv_invoice_pay]" "${base_url}invoice-pay" "[_ invoices.iv_invoice_pay]"] set invoice_cancel_p [permission::permission_p -party_id $user_id -object_id $package_id -privilege invoice_cancel] set return_url [ad_return_url] @@ -67,7 +67,7 @@ lappend actions "[_ invoices.iv_invoice_url]" $base_url "[_ invoices.iv_invoice_url2]" if {$invoice_cancel_p} { - lappend actions "[_ invoices.iv_journal_check]" "${base_url}journal-check" "[_ invoices.iv_journal_check]" + lappend actions "[_ invoices.iv_journal_check]" "${base_url}journal-check" "[_ invoices.iv_journal_check]" "[_ invoices.iv_join_invoice]" "${base_url}invoice-join" "[_ invoices.iv_join_invoice]" } # If the sum was paid, the total_amount should appear green. Index: openacs-4/packages/invoices/sql/postgresql/invoices-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/invoices/sql/postgresql/invoices-create.sql,v diff -u -N -r1.11 -r1.12 --- openacs-4/packages/invoices/sql/postgresql/invoices-create.sql 2 Apr 2006 22:08:02 -0000 1.11 +++ openacs-4/packages/invoices/sql/postgresql/invoices-create.sql 3 May 2006 05:52:35 -0000 1.12 @@ -207,8 +207,13 @@ -- new, sent, cancelled, billed, paid cancelled_p char(1) default 'f' constraint iv_invoices_cancelled_p - check (cancelled_p in ('t','f')) + check (cancelled_p in ('t','f')), -- is this invoice already cancelled? + pdf_status varchar(10) default 'new', + -- new, created, sent + pdf_file_id integer + constraint iv_invoices_pdf_file_fk + references cr_items ); create index iv_invoices_parent_idx on iv_invoices(parent_invoice_id); @@ -327,6 +332,17 @@ not null ); +create table iv_joined_invoices ( + file_id integer + constraint iv_joined_invoices_pk + primary key, + creation_date timestamptz + constraint iv_joined_invoices_date_nn + not null +); + +insert into iv_joined_invoices (file_id, creation_date) values (0, now()); + create table iv_journal_country_codes ( iso_code char(2) constraint iv_journal_country_codes_pk Index: openacs-4/packages/invoices/sql/postgresql/invoices-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/invoices/sql/postgresql/invoices-drop.sql,v diff -u -N -r1.2 -r1.3 --- openacs-4/packages/invoices/sql/postgresql/invoices-drop.sql 15 Mar 2006 17:05:06 -0000 1.2 +++ openacs-4/packages/invoices/sql/postgresql/invoices-drop.sql 3 May 2006 05:52:35 -0000 1.3 @@ -6,6 +6,7 @@ -- +drop table iv_joined_invoices; drop table iv_journal_country_codes; drop table iv_journals; drop table iv_default_objects; Index: openacs-4/packages/invoices/tcl/invoice-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/invoices/tcl/invoice-procs.tcl,v diff -u -N -r1.22 -r1.23 --- openacs-4/packages/invoices/tcl/invoice-procs.tcl 2 May 2006 12:07:11 -0000 1.22 +++ openacs-4/packages/invoices/tcl/invoice-procs.tcl 3 May 2006 05:52:35 -0000 1.23 @@ -64,6 +64,7 @@ [list vat_percent $vat_percent] \ [list vat $vat] \ [list status new] \ + [list pdf_status new] \ [list cancelled_p f] ] ] } @@ -116,6 +117,7 @@ [list vat_percent $vat_percent] \ [list vat $vat] \ [list status new] \ + [list pdf_status new] \ [list cancelled_p f] ] ] } @@ -134,6 +136,19 @@ db_dml update_status {} } +ad_proc -public iv::invoice::set_pdf_status { + -invoice_id:required + {-status "created"} + {-file_id ""} +} { + @author Timo Hentschel (timo@timohentschel.de) + @creation-date 2006-05-02 + + Edit Invoice pdf status +} { + db_dml update_status {} +} + ad_proc -public iv::invoice::data { -invoice_id:required -invoice_array:required Index: openacs-4/packages/invoices/tcl/invoice-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/invoices/tcl/invoice-procs.xql,v diff -u -N -r1.11 -r1.12 --- openacs-4/packages/invoices/tcl/invoice-procs.xql 2 Apr 2006 22:08:02 -0000 1.11 +++ openacs-4/packages/invoices/tcl/invoice-procs.xql 3 May 2006 05:52:35 -0000 1.12 @@ -13,6 +13,20 @@ + + + + update iv_invoices + set pdf_status = :status, + pdf_file_id = :file_id + where invoice_id = (select latest_revision + from cr_items + where item_id = :invoice_id) + and pdf_status in ('new', 'created') + + + + Index: openacs-4/packages/invoices/tcl/iv-install-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/invoices/tcl/iv-install-procs.tcl,v diff -u -N -r1.11 -r1.12 --- openacs-4/packages/invoices/tcl/iv-install-procs.tcl 2 Apr 2006 22:08:02 -0000 1.11 +++ openacs-4/packages/invoices/tcl/iv-install-procs.tcl 3 May 2006 05:52:35 -0000 1.12 @@ -88,6 +88,8 @@ content::type::attribute::new -content_type {iv_invoice} -attribute_name {vat} -datatype {number} -pretty_name {[_ invoices.VAT_amount]} -column_spec {numeric(12,2)} content::type::attribute::new -content_type {iv_invoice} -attribute_name {status} -datatype {string} -pretty_name {[_ invoices.Status]} -column_spec {varchar(10)} content::type::attribute::new -content_type {iv_invoice} -attribute_name {cancelled_p} -datatype {boolean} -pretty_name {[_ invoices.Cancelled]} -column_spec {char(1)} + content::type::attribute::new -content_type {iv_invoice} -attribute_name {pdf_status} -datatype {string} -pretty_name {[_ invoices.PDF_Status]} -column_spec {varchar(10)} + content::type::attribute::new -content_type {iv_invoice} -attribute_name {pdf_file_id} -datatype {number} -pretty_name {[_ invoices.PDF_File]} -column_spec {integer} # Invoice Item content::type::attribute::new -content_type {iv_invoice_item} -attribute_name {item_nr} -datatype {string} -pretty_name {[_ invoices.Invoice_item_number]} -column_spec {varchar(200)} @@ -268,6 +270,10 @@ 1.0d2 1.0d3 { content::type::attribute::new -content_type {iv_offer} -attribute_name {reservation} -datatype {text} -pretty_name {[_ invoices.Reservation]} -column_spec {text} } + 1.0d6 1.0d7 { + content::type::attribute::new -content_type {iv_invoice} -attribute_name {pdf_status} -datatype {string} -pretty_name {[_ invoices.PDF_Status]} -column_spec {varchar(10)} + content::type::attribute::new -content_type {iv_invoice} -attribute_name {pdf_file_id} -datatype {number} -pretty_name {[_ invoices.PDF_File]} -column_spec {integer} + } } } Index: openacs-4/packages/invoices/www/invoice-documents.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/invoices/www/invoice-documents.tcl,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/invoices/www/invoice-documents.tcl 2 Apr 2006 22:08:02 -0000 1.1 +++ openacs-4/packages/invoices/www/invoice-documents.tcl 3 May 2006 05:52:35 -0000 1.2 @@ -10,6 +10,7 @@ {copy_p 0} {file_ids ""} {return_url:optional ""} + {display_p 1} } -properties { context:onevalue page_title:onevalue @@ -65,7 +66,7 @@ set documents [iv::invoice::parse_data -invoice_id $invoice_id -types $document_types -email_text ""] multirow create documents file_id file_title file_url -set file_ids {} +set files {} set documents [lreplace $documents 0 0] foreach document_file $documents type $document_types { switch $type { @@ -80,13 +81,20 @@ if {![empty_string_p $document_file]} { set file_size [file size $document_file] - set file_id [contact::oo::import_oo_pdf -oo_file $document_file -printer_name "pdfconv" -title $file_title -parent_id $invoice_id] + util_unlist [contact::oo::import_oo_pdf -oo_file $document_file -printer_name "pdfconv" -title $file_title -parent_id $invoice_id -no_import] file_mime_type file_name - multirow append documents $file_id $file_title [export_vars -base "/tracking/download/$file_title" {file_id}] - lappend file_ids $file_id + lappend files $file_name } } +set file_id [contact::oo::join_pdf -filenames $files -title $invoice_title -parent_id $invoice_id] +multirow append documents $file_id $invoice_title [export_vars -base "/tracking/download/$invoice_title" {file_id}] + +# delete old files +foreach one_file $files { + ns_unlink $one_file +} + if {[multirow size documents] > 0} { # an invoice has been generated. @@ -101,11 +109,10 @@ db_transaction { # move files to invoice_folder - foreach one_file $file_ids { - application_data_link::new -this_object_id $invoice_id -target_object_id $one_file - db_dml set_publish_status_and_parent {} - db_dml set_context_id {} - } + application_data_link::new -this_object_id $invoice_id -target_object_id $file_id + db_dml set_publish_status_and_parent {} + db_dml set_context_id {} + if {$status == "new" || [empty_string_p $status]} { iv::invoice::set_status -invoice_id $invoice_id -status "billed" } @@ -116,6 +123,19 @@ set return_url [export_vars -base invoice-list {organization_id}] } +if {$display_p} { + # mark displayed pdf as sent + iv::invoice::set_pdf_status -invoice_id $invoice_id -status "sent" +} else { + # if no display requested, mark pdf-file for joining + # and redirect to return_url + iv::invoice::set_pdf_status -invoice_id $invoice_id -status "created" -file_id $file_id + + ad_returnredirect $return_url + ad_script_abort +} + + set actions [list "[_ invoices.ok]" $return_url "[_ invoices.ok]"] template::list::create \ Index: openacs-4/packages/invoices/www/invoice-documents.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/invoices/www/invoice-documents.xql,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/invoices/www/invoice-documents.xql 2 Apr 2006 22:08:02 -0000 1.1 +++ openacs-4/packages/invoices/www/invoice-documents.xql 3 May 2006 05:52:35 -0000 1.2 @@ -30,7 +30,7 @@ update cr_items set publish_status = 'live', parent_id = :invoice_folder_id - where item_id = :one_file + where item_id = :file_id @@ -40,7 +40,7 @@ update acs_objects set context_id = :invoice_folder_id - where object_id = :one_file + where object_id = :file_id Index: openacs-4/packages/invoices/www/invoice-join.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/invoices/www/invoice-join.tcl,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/invoices/www/invoice-join.tcl 3 May 2006 05:52:35 -0000 1.1 @@ -0,0 +1,48 @@ +ad_page_contract { + Joins all invoice-pdfs since last join and returns big pdf. + + @author Timo Hentschel (timo@timohentschel.de) + @creation-date 2006-05-02 +} { +} -properties { + context:onevalue + page_title:onevalue +} + +set package_id [ad_conn package_id] +set user_id [auth::require_login] + +set page_title "[_ invoices.iv_invoice_join]" +set context [list [list [export_vars -base invoice-list {organization_id}] "[_ invoices.iv_invoice_2]"] $page_title] + +db_1row today {} + +set root_dir [cr_fs_path] +set root_folder_id [content::folder::get_folder_from_package -package_id $package_id] +set invoice_title [lang::util::localize "#invoices.file_joined_invoice#_${today}.pdf"] + +db_transaction { + db_1row last_checkout {} + + set tmpdir [ns_tmpnam] + ns_mkdir $tmpdir + set files {} + db_foreach pdfs_to_join {} { + ns_cp "${root_dir}$content" "${tmpdir}/[file tail $content].pdf" + lappend files "${tmpdir}/[file tail $content].pdf" + } + + set file_id [contact::oo::join_pdf -filenames $files -title $invoice_title -parent_id $root_folder_id] + db_1row get_file_location {} + + db_dml mark_join_creation {} + db_dml mark_invoices_billed {} + + # delete old files + foreach one_file $files { + ns_unlink $one_file + } + ns_rmdir $tmpdir +} + +ns_returnfile 200 "application/pdf" "${root_dir}$file_location" Index: openacs-4/packages/invoices/www/invoice-join.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/invoices/www/invoice-join.xql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/invoices/www/invoice-join.xql 3 May 2006 05:52:35 -0000 1.1 @@ -0,0 +1,73 @@ + + + + + + + select max(to_char(creation_date, 'YYYY-MM-DD HH24:MI:SS')) as last_checkout + from iv_joined_invoices + + + + + + + + select to_char(now(), 'YYYYMMDD_HH24MI') as today + + + + + + + + select fr.content + from iv_invoices i, cr_items ci, cr_items fi, cr_revisions fr, acs_objects fo + where ci.latest_revision = i.invoice_id + and i.pdf_status = 'created' + and fi.item_id = i.pdf_file_id + and fr.revision_id = fi.latest_revision + and fo.object_id = fr.revision_id + and fo.creation_date > to_timestamp(:last_checkout, 'YYYY-MM-DD HH24:MI:SS') + order by i.organization_id, i.invoice_nr + + + + + + + + select r.content as file_location + from cr_items i, cr_revisions r + where i.latest_revision = r.revision_id + and i.item_id = :file_id + + + + + + + + insert into iv_joined_invoices (file_id, creation_date) + values (:file_id, now()) + + + + + + + + update iv_invoices + set pdf_status = 'sent' + where invoice_id in (select i.invoice_id + from iv_invoices i, cr_items ci, cr_items fi, acs_objects fo + where ci.latest_revision = i.invoice_id + and i.pdf_status = 'created' + and fi.item_id = i.pdf_file_id + and fo.object_id = fi.latest_revision + and fo.creation_date > to_timestamp(:last_checkout, 'YYYY-MM-DD HH24:MI:SS')) + + + + + Index: openacs-4/packages/invoices/www/invoice-send-1.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/invoices/www/invoice-send-1.tcl,v diff -u -N -r1.4 -r1.5 --- openacs-4/packages/invoices/www/invoice-send-1.tcl 2 Apr 2006 22:08:02 -0000 1.4 +++ openacs-4/packages/invoices/www/invoice-send-1.tcl 3 May 2006 05:52:35 -0000 1.5 @@ -34,7 +34,12 @@ set invoice_copy [ams::value -attribute_name "invoice_copy" -object_id $rec_orga_revision_id] set boolean_options [list [list "[_ invoices.yes]" 1] [list "[_ invoices.no]" 0]] +set email_options [list [list "[_ invoices.invoice_email]" t] [list "[_ invoices.invoice_display]" f]] +if {$pdf_status != "sent"} { + lappend email_options [list "[_ invoices.invoice_for_join]" j] +} + ad_form -name invoice_send -action invoice-send-1 -export {return_url} -form { {invoice_id:key} } @@ -48,11 +53,17 @@ ad_form -extend -name invoice_send -form { {invoice_p:text(radio) {label "[_ invoices.iv_invoice_p]"} {options $boolean_options}} {copy_p:text(radio) {label "[_ invoices.iv_invoice_copy_p]"} {options $boolean_options}} - {email_p:text(radio) {label "[_ invoices.iv_invoice_email_p]"} {options $boolean_options}} + {email_p:text(radio) {label "[_ invoices.iv_invoice_email_p]"} {options $email_options}} } -edit_request { set opening_p 0 set invoice_p 1 - set email_p 0 + + if {$pdf_status != "sent"} { + set email_p j + } else { + set email_p f + } + set copy_p [ad_decode $invoice_copy t 1 0] if {[empty_string_p $copy_p]} { set copy_p 0 @@ -63,11 +74,12 @@ set copy_p 1 } } -after_submit { - if {$email_p} { - ad_returnredirect [export_vars -base "invoice-send" {invoice_id opening_p invoice_p copy_p return_url}] - } else { - ad_returnredirect [export_vars -base "invoice-documents" {invoice_id opening_p invoice_p copy_p return_url}] + switch $email_p { + t { ad_returnredirect [export_vars -base "invoice-send" {invoice_id opening_p invoice_p copy_p return_url}] } + f { ad_returnredirect [export_vars -base "invoice-documents" {invoice_id opening_p invoice_p copy_p return_url}] } + j { ad_returnredirect [export_vars -base "invoice-documents" {invoice_id opening_p invoice_p copy_p {display_p 0} return_url}] } } + ad_script_abort } Index: openacs-4/packages/invoices/www/invoice-send-1.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/invoices/www/invoice-send-1.xql,v diff -u -N -r1.2 -r1.3 --- openacs-4/packages/invoices/www/invoice-send-1.xql 4 Jan 2006 08:06:48 -0000 1.2 +++ openacs-4/packages/invoices/www/invoice-send-1.xql 3 May 2006 05:52:35 -0000 1.3 @@ -5,7 +5,7 @@ select i.invoice_nr, i.organization_id, i.parent_invoice_id, i.invoice_nr, - i.total_amount, i.recipient_id, i.contact_id + i.total_amount, i.recipient_id, i.contact_id, i.pdf_status from iv_invoices i, cr_items ii where ii.latest_revision = i.invoice_id and ii.item_id = :invoice_id