This commit was manufactured by cvs2svn to create tag 'freeside_1_9_2'. freeside_1_9_2
authorcvs2git <cvs2git>
Mon, 5 Apr 2010 07:08:57 +0000 (07:08 +0000)
committercvs2git <cvs2git>
Mon, 5 Apr 2010 07:08:57 +0000 (07:08 +0000)
240 files changed:
ChangeLog
FS/FS.pm
FS/FS/AccessRight.pm
FS/FS/ClientAPI/MyAccount.pm
FS/FS/Conf.pm
FS/FS/Mason.pm
FS/FS/Misc.pm
FS/FS/Record.pm
FS/FS/Schema.pm
FS/FS/TicketSystem/RT_External.pm
FS/FS/TicketSystem/RT_Internal.pm
FS/FS/UI/Web.pm
FS/FS/UID.pm
FS/FS/Upgrade.pm
FS/FS/access_user.pm
FS/FS/cust_bill.pm
FS/FS/cust_bill_ApplicationCommon.pm
FS/FS/cust_bill_pkg_detail.pm
FS/FS/cust_credit.pm
FS/FS/cust_event.pm
FS/FS/cust_location.pm
FS/FS/cust_main.pm
FS/FS/cust_pkg.pm
FS/FS/cust_svc.pm
FS/FS/h_svc_mailinglist.pm [new file with mode: 0644]
FS/FS/h_svc_pbx.pm [new file with mode: 0644]
FS/FS/location_Mixin.pm [new file with mode: 0644]
FS/FS/mailinglist.pm [new file with mode: 0644]
FS/FS/mailinglistmember.pm [new file with mode: 0644]
FS/FS/part_event/Action/Mixin/credit_pkg.pm [new file with mode: 0644]
FS/FS/part_event/Action/pkg_agent_credit.pm [new file with mode: 0644]
FS/FS/part_event/Action/pkg_agent_credit_pkg.pm [new file with mode: 0644]
FS/FS/part_event/Action/pkg_employee_credit.pm [new file with mode: 0644]
FS/FS/part_event/Action/pkg_employee_credit_pkg.pm [new file with mode: 0644]
FS/FS/part_event/Action/pkg_referral_credit.pm
FS/FS/part_event/Action/pkg_referral_credit_pkg.pm
FS/FS/part_event/Condition/balance.pm
FS/FS/part_event/Condition/balance_age.pm
FS/FS/part_event/Condition/balance_under.pm
FS/FS/part_event/Condition/cust_bill_has_service.pm
FS/FS/part_event/Condition/cust_bill_owed.pm
FS/FS/part_event/Condition/cust_bill_owed_under.pm
FS/FS/part_event/Condition/every.pm
FS/FS/part_event_condition.pm
FS/FS/part_export.pm
FS/FS/part_export/communigate_pro.pm
FS/FS/part_export/domain_shellcommands.pm
FS/FS/part_export/forward_shellcommands.pm
FS/FS/part_export/grandstream.pm [new file with mode: 0644]
FS/FS/part_export/indosoft.pm [new file with mode: 0644]
FS/FS/part_export/netsapiens.pm
FS/FS/part_export/phone_shellcommands.pm
FS/FS/part_export/shellcommands.pm
FS/FS/part_export/shellcommands_withdomain.pm
FS/FS/part_export/textradius.pm
FS/FS/part_export/thirdlane.pm [new file with mode: 0644]
FS/FS/part_export/vpopmail.pm
FS/FS/part_export/www_shellcommands.pm
FS/FS/part_pkg.pm
FS/FS/part_pkg/flat.pm
FS/FS/part_pkg/sql_external.pm
FS/FS/part_pkg/voip_cdr.pm
FS/FS/part_svc.pm
FS/FS/rate_detail.pm
FS/FS/reason.pm
FS/FS/svc_Common.pm
FS/FS/svc_Domain_Mixin.pm [new file with mode: 0644]
FS/FS/svc_acct.pm
FS/FS/svc_domain.pm
FS/FS/svc_external.pm
FS/FS/svc_mailinglist.pm [new file with mode: 0644]
FS/FS/svc_pbx.pm [new file with mode: 0644]
FS/FS/svc_phone.pm
FS/FS/tax_rate.pm
FS/MANIFEST
FS/bin/freeside-paymentech-upload
FS/bin/freeside-upgrade
FS/t/h_svc_mailinglist.t [new file with mode: 0644]
FS/t/h_svc_pbx.t [new file with mode: 0644]
FS/t/location_Mixin.t [new file with mode: 0644]
FS/t/mailinglist.t [new file with mode: 0644]
FS/t/mailinglistmember.t [new file with mode: 0644]
FS/t/svc_Domain_Mixin.t [new file with mode: 0644]
FS/t/svc_mailinglist.t [new file with mode: 0644]
FS/t/svc_pbx.t [new file with mode: 0644]
Makefile
conf/invoice_from
debian/changelog
debian/control
fs_selfservice/FS-SelfService/SelfService.pm
fs_selfservice/FS-SelfService/cgi/ach_payment_results.html
fs_selfservice/FS-SelfService/cgi/change_bill.html
fs_selfservice/FS-SelfService/cgi/change_password.html
fs_selfservice/FS-SelfService/cgi/change_pay.html
fs_selfservice/FS-SelfService/cgi/change_ship.html
fs_selfservice/FS-SelfService/cgi/customer_change_pkg.html
fs_selfservice/FS-SelfService/cgi/customer_order_pkg.html
fs_selfservice/FS-SelfService/cgi/delete_svc.html
fs_selfservice/FS-SelfService/cgi/header.html
fs_selfservice/FS-SelfService/cgi/image.cgi [new file with mode: 0755]
fs_selfservice/FS-SelfService/cgi/make_ach_payment.html
fs_selfservice/FS-SelfService/cgi/make_payment.html
fs_selfservice/FS-SelfService/cgi/make_thirdparty_payment.html
fs_selfservice/FS-SelfService/cgi/myaccount.html
fs_selfservice/FS-SelfService/cgi/myaccount_menu.html
fs_selfservice/FS-SelfService/cgi/order_pkg.html
fs_selfservice/FS-SelfService/cgi/payment_results.html
fs_selfservice/FS-SelfService/cgi/process_change_bill.html
fs_selfservice/FS-SelfService/cgi/process_change_password.html
fs_selfservice/FS-SelfService/cgi/process_change_pay.html
fs_selfservice/FS-SelfService/cgi/process_change_pkg.html
fs_selfservice/FS-SelfService/cgi/process_change_ship.html
fs_selfservice/FS-SelfService/cgi/process_order_pkg.html
fs_selfservice/FS-SelfService/cgi/process_order_recharge.html
fs_selfservice/FS-SelfService/cgi/process_svc_acct.html
fs_selfservice/FS-SelfService/cgi/process_svc_external.html
fs_selfservice/FS-SelfService/cgi/provision.html
fs_selfservice/FS-SelfService/cgi/provision_svc_acct.html
fs_selfservice/FS-SelfService/cgi/recharge_prepay.html
fs_selfservice/FS-SelfService/cgi/recharge_results.html
fs_selfservice/FS-SelfService/cgi/selfservice.cgi
fs_selfservice/FS-SelfService/cgi/view_cdr_details.html
fs_selfservice/FS-SelfService/cgi/view_invoice.html
fs_selfservice/FS-SelfService/cgi/view_usage.html
fs_selfservice/FS-SelfService/cgi/view_usage_details.html
fs_selfservice/java/freeside_create_ticket_example.java [new file with mode: 0755]
fs_selfservice/perl/xmlrpc-create_ticket.pl [new file with mode: 0755]
httemplate/browse/access_user.html
httemplate/browse/part_pkg_taxclass.html
httemplate/browse/rate_detail.html
httemplate/config/config-view.cgi
httemplate/docs/about.html
httemplate/docs/credits.html
httemplate/docs/man/FS/part_export/.cvs_is_on_crack [deleted file]
httemplate/edit/REAL_cust_pkg.cgi
httemplate/edit/access_user.html
httemplate/edit/cust_credit.cgi
httemplate/edit/cust_main/top_misc.html
httemplate/edit/cust_main_note.cgi
httemplate/edit/cust_pay.cgi
httemplate/edit/cust_refund.cgi
httemplate/edit/elements/ApplicationCommon.html
httemplate/edit/elements/edit.html
httemplate/edit/elements/svc_Common.html
httemplate/edit/mailinglistmember.html [new file with mode: 0644]
httemplate/edit/part_device.html
httemplate/edit/part_pkg.cgi
httemplate/edit/part_svc.cgi
httemplate/edit/process/REAL_cust_pkg.cgi
httemplate/edit/process/mailinglistmember.html [new file with mode: 0644]
httemplate/edit/process/rate_region.cgi
httemplate/edit/process/svc_acct.cgi
httemplate/edit/process/svc_domain.cgi
httemplate/edit/process/svc_external.html [new file with mode: 0644]
httemplate/edit/process/svc_mailinglist.html [new file with mode: 0644]
httemplate/edit/process/svc_phone.html
httemplate/edit/quick-charge.html
httemplate/edit/rate_detail.html
httemplate/edit/rate_region.cgi
httemplate/edit/svc_Common.html
httemplate/edit/svc_acct.cgi
httemplate/edit/svc_broadband.cgi
httemplate/edit/svc_domain.cgi
httemplate/edit/svc_external.cgi
httemplate/edit/svc_forward.cgi
httemplate/edit/svc_mailinglist.cgi [new file with mode: 0644]
httemplate/edit/svc_phone.cgi
httemplate/elements/communigate_pro-accessmodes.html [new file with mode: 0644]
httemplate/elements/header.html
httemplate/elements/location.html
httemplate/elements/menu.html
httemplate/elements/overlibmws.js
httemplate/elements/overlibmws_crossframe.js
httemplate/elements/overlibmws_draggable.js
httemplate/elements/overlibmws_iframe.js
httemplate/elements/phonenumber.html
httemplate/elements/search-cust_main.html
httemplate/elements/select-areacode.html
httemplate/elements/select-did.html
httemplate/elements/select-svc-domain.html [new file with mode: 0644]
httemplate/elements/select-svc_pbx.html [new file with mode: 0644]
httemplate/elements/select-table.html
httemplate/elements/tr-input-beginning_ending.html
httemplate/elements/tr-input-date-field.html
httemplate/elements/tr-search-cust_main.html [new file with mode: 0644]
httemplate/elements/tr-select-cust_location.html
httemplate/elements/tr-select-svc-domain.html [new file with mode: 0644]
httemplate/elements/tr-select-svc_pbx.html [new file with mode: 0644]
httemplate/misc/bulk_pkg_increment_bill.cgi [new file with mode: 0755]
httemplate/misc/cancel_pkg.html
httemplate/misc/delay_susp_pkg.html
httemplate/misc/delete-mailinglistmember.html [new file with mode: 0644]
httemplate/misc/order_pkg.html
httemplate/misc/process/copy-rate_detail.html
httemplate/misc/rate_edit_excel.html
httemplate/pref/pref-process.html
httemplate/pref/pref.html
httemplate/search/cust_bill.html
httemplate/search/cust_bill_pay.html
httemplate/search/cust_bill_pkg.cgi
httemplate/search/cust_main-zip.html
httemplate/search/cust_pkg.cgi
httemplate/search/elements/cust_pay_or_refund.html
httemplate/search/elements/search-html.html
httemplate/search/h_cust_pay.html [new file with mode: 0755]
httemplate/search/inventory_item.html
httemplate/search/mailinglistmember.html [new file with mode: 0644]
httemplate/search/part_pkg.html [new file with mode: 0644]
httemplate/search/report_cust_main-zip.html
httemplate/search/report_employee_commission.html [new file with mode: 0644]
httemplate/search/report_h_cust_pay.html [new file with mode: 0644]
httemplate/search/report_prepaid_income.cgi
httemplate/search/report_prepaid_income.html
httemplate/view/cust_main.cgi
httemplate/view/cust_main/notes.html
httemplate/view/cust_main/payment_history.html
httemplate/view/cust_main/payment_history/credit.html
httemplate/view/cust_main/payment_history/payment.html
httemplate/view/cust_main/payment_history/voided_payment.html
httemplate/view/cust_main/tickets.html
httemplate/view/cust_svc.cgi [new file with mode: 0644]
httemplate/view/elements/svc_export_settings.html [new file with mode: 0644]
httemplate/view/elements/tr.html [new file with mode: 0644]
httemplate/view/svc_acct.cgi
httemplate/view/svc_acct/basics.html [new file with mode: 0644]
httemplate/view/svc_acct/change_svc.html [new file with mode: 0644]
httemplate/view/svc_acct/change_svc_form.html [new file with mode: 0644]
httemplate/view/svc_acct/hosting.html [new file with mode: 0644]
httemplate/view/svc_acct/radius_usage.html [new file with mode: 0644]
httemplate/view/svc_acct/usage.html [new file with mode: 0644]
httemplate/view/svc_domain.cgi
httemplate/view/svc_domain/acct_defaults.html [new file with mode: 0644]
httemplate/view/svc_domain/basics.html [new file with mode: 0644]
httemplate/view/svc_domain/dns.html [new file with mode: 0644]
httemplate/view/svc_forward.cgi
httemplate/view/svc_mailinglist.cgi [new file with mode: 0644]
httemplate/view/svc_phone.cgi
rpm/freeside.spec
rt/etc/rt.spec [deleted file]
rt/lib/RT/URI/freeside.pm

index 4114eed..f7a95ca 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
-2010-01-14 19:59  ivan
+2010-04-04 23:58  ivan
 
-       * httemplate/edit/process/part_pkg.cgi: remove extraneous debugging
+       * conf/invoice_from: company email
 
-2010-01-12 19:14  ivan
+2010-04-04 23:57  ivan
 
-       * FS/FS/tax_rate.pm: if ignore_icalculable_taxes is on, don't call
-         the errors fatal
+       * FS/bin/freeside-upgrade: require DBIx::DBSchema 0.39 for mysql
 
-2010-01-12 09:17  jeff
+2010-04-04 23:50  ivan
 
-       * FS/FS/part_export/prizm.pm: add some debugging
+       * FS/FS/part_export/thirdlane.pm: thirdlane deletion fix
 
-2010-01-12 09:16  jeff
+2010-04-04 22:20  ivan
 
-       * FS/FS/part_export/prizm.pm: eliminate harmless argument isn't
-         numeric messages
+       * FS/FS/part_export/indosoft.pm: initial indosoft export, RT#4068
 
-2010-01-09 02:03  ivan
+2010-04-04 18:23  ivan
 
-       * FS/FS/Record.pm: need DBIx::DBSchema w/quoted_default to make
-         this all work right :/
+       * httemplate/search/part_pkg.html: last fix for employee
+         commisssion report, RT#6991
 
-2010-01-09 00:21  ivan
+2010-04-04 17:59  ivan
 
-       * FS/bin/freeside-upgrade: undo damage from DBIx::DBSchema 0.37_03
+       * httemplate/elements/menu.html: add employee commission report to
+         menu, RT#6991
 
-2010-01-07 01:48  mark
+2010-04-04 16:47  ivan
 
-       * FS/FS/: pay_batch.pm, pay_batch/RBC.pm: Fix problems with RBC
-         batch import (RT#6967)
+       * FS/FS/Schema.pm: fix otaker upgrade
 
-2010-01-05 20:47  ivan
+2010-04-04 16:37  ivan
 
-       * FS/FS/svc_acct.pm: eliminate spurious warnings on usage
-         changes...
+       * FS/FS/cust_pay_void.pm: fix otaker upgrade
 
-2010-01-05 20:43  ivan
+2010-04-04 16:27  ivan
 
-       * FS/FS/cust_main.pm: eliminate ya "use of uninitialized value"
-         warning
+       * FS/FS/: cust_attachment.pm, cust_main_note.pm: fix otaker upgrade
+         for cust_attachment & cust_main_note, hopefully
 
-2010-01-05 20:41  ivan
+2010-04-04 16:18  ivan
 
-       * FS/FS/cust_main.pm: doc
+       * FS/FS/: cust_attachment.pm, cust_main_note.pm: fix otaker upgrade
+         for cust_attachment & cust_main_note, hopefully
 
-2010-01-03 19:23  jeff
+2010-04-04 15:52  ivan
 
-       * bin/monitor: add some debugging
+       * FS/FS/: cust_main.pm: fix otaker upgrade for cust_main
 
-2010-01-02 18:54  ivan
+2010-04-04 15:44  ivan
 
-       * Makefile: fix RT_SiteConfig.pm substitution
+       * FS/FS/cust_main_note.pm: fix note editing of old notes until we
+         can fix the cust_main_note.otaker disaster, RT#7991
 
-2009-12-31 15:03  mark
+2010-04-01 14:30  mark
 
-       * FS/FS/pay_batch/RBC.pm: Add pre-header line
+       * httemplate/search/elements/cust_main_dayranges.html: fix column
+         alignment
 
-2009-12-31 04:56  ivan
+2010-04-01 01:10  ivan
 
-       * rt/: Makefile, lib/RT.pm: rt 3.6.10
+       * FS/FS/part_pkg/: flat.pm, subscription.pm: fix nasty discount
+         fallout (i hope)
 
-2009-12-31 04:44  ivan
+2010-04-01 00:39  ivan
 
-       * rt/: etc/RT_Config.pm.in, html/Admin/Users/Modify.html,
-         html/Elements/Footer, html/Elements/Header, html/Elements/Menu,
-         html/Elements/PageLayout, html/Elements/QuickCreate,
-         html/Elements/SelectDate, html/Elements/SimpleSearch,
-         html/Elements/Tabs, html/Elements/TicketList,
-         html/Elements/TitleBoxStart, html/Elements/CollectionAsTable/Row,
-         html/NoAuth/css/3.5-default/main.css,
-         html/NoAuth/css/3.5-default/misc.css,
-         html/NoAuth/css/3.5-default/titlebox.css,
-         html/NoAuth/css/3.5-default/transactions.css,
-         html/Prefs/SearchOptions.html, html/Search/Bulk.html,
-         html/Ticket/Create.html, html/Ticket/Display.html,
-         html/Ticket/Elements/ShowSummary,
-         html/Ticket/Elements/ShowTransactionAttachments,
-         html/Ticket/Elements/Tabs, html/User/Prefs.html,
-         html/Widgets/TitleBoxStart, lib/RT/Groups_Overlay.pm,
-         lib/RT/Record.pm, lib/RT/SearchBuilder.pm,
-         lib/RT/Ticket_Overlay.pm, lib/RT/Transaction_Overlay.pm,
-         lib/RT/User_Overlay.pm, lib/RT/Users_Overlay.pm,
-         sbin/rt-setup-database.in: rt 3.6.10
+       * FS/FS/part_pkg/flat.pm: fix nasty discount fallout (i hope)
 
-2009-12-31 04:35  ivan
+2010-03-31 21:43  mark
 
-       * rt/FREESIDE_MODIFIED: up-to-date
+       * FS/FS/UI/Web.pm, httemplate/search/report_receivables.cgi,
+         httemplate/search/elements/cust_main_dayranges.html,
+         httemplate/search/elements/search-html.html,
+         httemplate/search/elements/search.html: RT#866: links to process
+         payments from aging report
 
-2009-12-30 23:16  ivan
+2010-03-31 08:48  jeff
 
-       * FS/FS/Schema.pm: fix h_cdr acctid changing from bigint to int
-         with recent DBIx::DBSchema
+       * FS/: MANIFEST, FS/part_export/dashcs_e911.pm: add dash carrier
+         services e911 support RT7103
 
-2009-12-30 21:10  ivan
+2010-03-31 00:41  mark
 
-       * FS/: FS/Cron/bill.pm, bin/freeside-daily: specify multiple
-         agentnums with freeside-daily
+       * httemplate/search/: report_receivables.cgi,
+         report_receivables.html, report_unapplied_cust_pay.html,
+         unapplied_cust_pay.html, elements/cust_main_dayranges.html:
+         RT#7266: aging reports as of a past date
 
-2009-12-30 19:33  ivan
+2010-03-31 00:35  ivan
 
-       * Makefile: goodbye conf dir
+       * httemplate/: edit/process/cust_main_attach.cgi,
+         edit/process/cust_main_note.cgi, view/cust_main/attachments.html,
+         view/cust_main/notes.html: fix customer notes and attachments wrt
+         s/otaker/usernum/ changes; still need to look at the migration,
+         RT#7935
 
-2009-12-30 18:50  jeff
+2010-03-30 23:30  ivan
 
-       * FS/FS/cust_main.pm: really reduce the noise
+       * FS/FS/Misc.pm: eliminate harmless "Use of uninitialized value
+         $enc in string eq" warnings
 
-2009-12-29 22:41  jeff
+2010-03-30 05:12  ivan
 
-       * FS/FS/part_pkg/voip_cdr.pm: define all detail header list
-         elements
+       * httemplate/search/part_pkg.html, FS/FS/Schema.pm: employee
+         commission reporting, RT#6991
 
-2009-12-29 22:05  jeff
+2010-03-30 05:07  ivan
 
-       * FS/FS/cust_main.pm: noise reduction
+       * httemplate/search/report_employee_commission.html,
+         FS/FS/cust_main.pm, FS/FS/cust_credit.pm, FS/FS/cust_event.pm,
+         FS/FS/part_event/Action/pkg_agent_credit.pm,
+         FS/FS/part_event/Action/pkg_employee_credit.pm,
+         FS/FS/part_event/Action/pkg_referral_credit.pm: employee
+         commission reporting, RT#6991
 
-2009-12-29 21:22  jeff
+2010-03-29 20:28  ivan
 
-       * FS/FS/tax_rate.pm: noise reduction
+       * FS/FS/Record.pm: regexp_sql
 
-2009-12-29 18:39  jeff
+2010-03-29 20:10  ivan
 
-       * FS/FS/cust_bill_pkg_detail.pm: use the class used
+       * FS/MANIFEST: employee (otaker / access_user) commissioning,
+         RT#6991
 
-2009-12-29 18:26  jeff
+2010-03-29 19:53  ivan
 
-       * FS/FS/cust_main.pm: noise reduction
+       * httemplate/browse/access_user.html,
+         httemplate/edit/access_user.html, FS/FS/part_pkg.pm,
+         FS/FS/part_event/Action/pkg_agent_credit.pm,
+         FS/FS/part_event/Action/pkg_agent_credit_pkg.pm,
+         FS/FS/part_event/Action/pkg_employee_credit_pkg.pm,
+         FS/FS/part_event/Action/pkg_referral_credit.pm,
+         FS/FS/part_event/Action/pkg_referral_credit_pkg.pm,
+         FS/FS/part_event/Action/Mixin/credit_pkg.pm,
+         httemplate/elements/search-cust_main.html,
+         httemplate/elements/tr-search-cust_main.html: employee (otaker /
+         access_user) commissioning, RT#6991
 
-2009-12-28 20:49  ivan
+2010-03-29 19:52  ivan
 
-       * FS/bin/freeside-upgrade: output SQL statements as we run them
-         (and only the ones we run), not immediately
+       * FS/FS/part_event/Action/pkg_employee_credit.pm: employee
+         commissions, RT#6991
 
-2009-12-28 20:44  ivan
+2010-03-29 19:04  ivan
 
-       * FS/FS/Conf.pm: oops, syntax error adding queued-sleep_time
+       * FS/FS/: part_event_condition.pm, part_event/Condition/balance.pm,
+         part_event/Condition/balance_age.pm,
+         part_event/Condition/balance_under.pm,
+         part_event/Condition/cust_bill_has_service.pm,
+         part_event/Condition/cust_bill_owed.pm,
+         part_event/Condition/cust_bill_owed_under.pm: fixes for MySQL
+         CAST drain bramage
 
-2009-12-28 20:24  ivan
+2010-03-29 02:18  mark
 
-       * FS/bin/: freeside-upgrade: don't change h_queue.job type under
-         non-mysql, takes forever on large dbs, RT#6946
+       * FS/FS/Mason.pm, FS/FS/cust_main.pm,
+         httemplate/elements/select-user.html,
+         httemplate/elements/tr-select-user.html,
+         httemplate/graph/report_signupdate.html,
+         httemplate/graph/signupdate.cgi,
+         httemplate/graph/elements/monthly.html,
+         httemplate/graph/elements/report.html,
+         httemplate/search/cust_main.html: RT#884: search customers by
+         signup time of day
 
-2009-12-28 17:38  ivan
+2010-03-28 17:38  ivan
 
-       * FS/bin/freeside-daily: add -u option for vacuuming, RT#5258
+       * FS/FS/cust_pay.pm: move from otaker to proper usernum FK
 
-2009-12-28 17:00  mark
+2010-03-28 17:23  ivan
 
-       * FS/FS/AccessRight.pm, httemplate/browse/cust_attachment.html,
-         httemplate/elements/menu.html: Add Browse attachments ACL
-         (RT#4964)
+       * FS/FS/: Schema.pm, Upgrade.pm, access_user.pm, banned_pay.pm,
+         cust_attachment.pm, cust_credit.pm, cust_main.pm,
+         cust_main_note.pm, cust_pay_void.pm, cust_pkg.pm,
+         cust_pkg_discount.pm, cust_pkg_reason.pm, cust_refund.pm,
+         otaker_Mixin.pm: move from otaker to proper usernum FK
 
-2009-12-28 16:33  mark
+2010-03-26 23:21  ivan
 
-       * FS/FS/Conf.pm: RT#6358
+       * FS/FS/cust_bill_pkg_detail.pm: fix cust_bill_pkg_detail throwing
+         a fatal error w/MySQL
 
-2009-12-27 21:25  ivan
+2010-03-26 23:09  ivan
 
-       * FS/FS/: part_pkg_taxclass.pm, phone_device.pm: use blessed
+       * httemplate/: view/cust_main.cgi, view/cust_main/notes.html,
+         edit/cust_main_note.cgi: resize customer not add popup, eliminate
+         needless <BR> in popup
 
-2009-12-26 17:00  jeff
+2010-03-26 21:37  ivan
 
-       * FS/FS/: cust_main.pm, cust_location.pm: improve spacing around
-         county
+       * FS/FS/Upgrade.pm: these are now supported in supported in
+         DBIx-DBSchema and friends
 
-2009-12-23 15:32  jeff
+2010-03-26 20:43  ivan
 
-       * bin/monitor: remove debugging
+       * FS/FS/: reason.pm, tax_rate.pm: these are now supported in
+         supported in DBIx-DBSchema and friends
 
-2009-12-23 15:29  jeff
+2010-03-26 15:25  ivan
 
-       * bin/: monitor: add non-forking one machine monitor program
+       * httemplate/elements/: select-areacode.html, select-did.html: fix
+         E911 vs. DID selector on phone provision, RT#7819
 
-2009-12-23 15:29  jeff
+2010-03-26 14:43  ivan
 
-       * bin/monitor: file monitor was added on branch FREESIDE_1_9_BRANCH
-         on 2009-12-23 23:29:54 +0000
+       * FS/FS/cust_pkg.pm: no DISTINCT ON in MySQL makes kittens cry
 
-2009-12-23 15:14  jeff
+2010-03-26 00:52  ivan
 
-       * FS/FS/Yori.pm: teach yori to do some load monitoring
+       * httemplate/elements/: freeside-menu.css, freeside.css: that'll do
+         for now
 
-2009-12-23 13:21  jeff
+2010-03-25 22:02  ivan
 
-       * FS/FS/cust_bill.pm, FS/FS/cust_location.pm, FS/FS/cust_main.pm,
-         FS/FS/cust_pkg.pm,
-         httemplate/view/cust_main/packages/location.html: correct invoice
-         package address display and reduce false laziness
+       * FS/FS/Schema.pm: kludge a fix for the MySQL statustext index
+         problem, fix s/serial/int/ for non-primary keys in
+         part_pkg_taxoverride, and s/TEXT/LONGTEXT/ ourselves until
+         DBIx::DBSchema 0.39
 
-2009-12-22 16:30  mark
+2010-03-25 21:50  ivan
 
-       * FS/FS/svc_acct.pm, httemplate/edit/svc_acct.cgi,
-         httemplate/edit/process/svc_acct.cgi,
-         httemplate/view/svc_acct.cgi: Tweak set_password per RT#6358
+       * FS/FS/UID.pm: don't warn about the configuration table during
+         setup
 
-2009-12-21 06:36  jeff
+2010-03-25 19:19  ivan
 
-       * bin/fetch_and_expand_taxes: file fetch_and_expand_taxes was added
-         on branch FREESIDE_1_9_BRANCH on 2009-12-21 14:37:22 +0000
+       * bin/build_exten.php: adding build_exten.php since FreePBX won't
+         ship it
 
-2009-12-21 06:36  jeff
+2010-03-25 18:06  ivan
 
-       * bin/reassemble_taxes: file reassemble_taxes was added on branch
-         FREESIDE_1_9_BRANCH on 2009-12-21 14:37:22 +0000
+       * rt/lib/RT/: Ticket_Overlay.pm: ticket auto-association in the
+         correct spot.  how the hell did it get merged there?  RT#7882
 
-2009-12-21 06:36  jeff
+2010-03-25 15:30  ivan
 
-       * bin/fetch_and_expand_taxes, bin/reassemble_taxes, FS/FS/Conf.pm,
-         FS/FS/tax_rate.pm: move cch conf into database and add a couple
-         small tools for processing updates more manually
+       * httemplate/elements/header.html: fix new header in RT
 
-2009-12-20 18:56  mark
+2010-03-25 15:21  ivan
 
-       * httemplate/search/elements/search-xls.html: Fix filename for
-         Excel spreadsheet reports
+       * rt/lib/RT/User_Overlay.pm: fix user modification?
 
-2009-12-20 18:00  ivan
+2010-03-25 14:22  ivan
 
-       * FS/FS/cust_main.pm, httemplate/misc/bill.cgi: have 'Bill now'
-         link cancel expired (and suspend adjourned) packages, and catch
-         and return errors in all cases, RT#6627
+       * rt/lib/RT/URI/freeside.pm: generate a stack backtrace for mystery
+         freeside link resolution problems
 
-2009-12-20 13:52  ivan
+2010-03-25 13:21  ivan
 
-       * FS/FS/Conf.pm: late fee package class specified in the event
-         action instead of a global finance_pkgclass config, RT#6617
+       * httemplate/elements/: header.html, searchbar-address2.html,
+         searchbar-cust_bill.html, searchbar-cust_main.html,
+         searchbar-cust_svc.html, searchbar-prospect.html,
+         searchbar-ticket.html: when using a side menubar, put search
+         boxes on the side too
 
-2009-12-20 13:48  ivan
+2010-03-24 18:37  mark
 
-       * FS/FS/part_event/Action/: cust_bill_fee_percent.pm, fee.pm: late
-         fee package class specified in the event action instead of a
-         global finance_pkgclass config, RT#6617
+       * FS/FS/Mason.pm, httemplate/view/cust_main/notes.html: RT#6226:
+         security fix for customer notes
 
-2009-12-20 11:42  ivan
+2010-03-24 01:37  ivan
 
-       * FS/FS/ClientAPI/MyAccount.pm: fix usage details pulling from
-         wrong account for customers who have multiple accounts, RT#6681,
-         fallout from RT#4189
+       * FS/FS/Conf.pm, httemplate/search/cust_bill_pkg.cgi,
+         httemplate/search/report_prepaid_income.cgi: better prepaid
+         income reporting, with line item detail, RT#7776
 
-2009-12-19 22:52  ivan
+2010-03-23 02:13  ivan
 
-       * httemplate/search/cust_pkg.cgi: fix address fields on advanced
-         package search, RT#6609
+       * FS/FS/mailinglist.pm, FS/FS/mailinglistmember.pm,
+         FS/FS/svc_mailinglist.pm, FS/FS/part_export/communigate_pro.pm,
+         httemplate/elements/header.html,
+         httemplate/search/mailinglistmember.html: export svc_mailinglist
+         to CGP groups, RT#7514
 
-2009-12-19 18:51  ivan
+2010-03-23 01:27  ivan
 
-       * FS/FS/cust_pkg.pm: fix bulk package order with one package
-         changing to one new package, RT#6519, fallout from RT#4499
+       * httemplate/images/: black-gray-side.png, gray-black-side.png:
+         goodbye and good riddance
 
-2009-12-19 17:02  ivan
+2010-03-22 20:53  ivan
 
-       * httemplate/view/cust_main/: packages.html, payment_history.html:
-         fix cust_main-packages-years, RT#6798
+       * FS/: FS.pm, FS/h_svc_mailinglist.pm, t/h_svc_mailinglist.t,
+         FS/Mason.pm: adding svc_mailinglist for communigate "groups"
+         (mailing lists), RT#7514
 
-2009-12-19 14:41  ivan
+2010-03-22 20:47  ivan
 
-       * httemplate/edit/cust_credit.cgi: add add'l info field as a
-         customer-editable field, RT#6505
+       * FS/MANIFEST, FS/FS/Schema.pm, FS/FS/mailinglist.pm,
+         FS/FS/mailinglistmember.pm, FS/FS/svc_mailinglist.pm,
+         FS/t/mailinglist.t, FS/t/mailinglistmember.t,
+         FS/t/svc_mailinglist.t, httemplate/edit/mailinglistmember.html,
+         httemplate/edit/part_svc.cgi,
+         httemplate/edit/svc_mailinglist.cgi,
+         httemplate/edit/process/mailinglistmember.html,
+         httemplate/edit/process/svc_mailinglist.html,
+         httemplate/misc/delete-mailinglistmember.html,
+         httemplate/search/mailinglistmember.html,
+         httemplate/view/svc_mailinglist.cgi: adding svc_mailinglist for
+         communigate "groups" (mailing lists), RT#7514
 
-2009-12-19 14:32  ivan
+2010-03-22 20:34  ivan
 
-       * httemplate/view/cust_main/payment_history.html: make room for
-         credit reasons in popup
+       * httemplate/elements/freeside.css: little bit further, just a
+         little bit more
 
-2009-12-19 12:58  mark
+2010-03-22 18:17  ivan
 
-       * FS/: bin/freeside-paymentech-upload, FS/pay_batch/paymentech.pm,
-         bin/freeside-paymentech-download: Fix date format string and
-         quoting of password
+       * httemplate/elements/menubar.html: don't like that <BR> after
+         all... for now
 
-2009-12-19 12:29  ivan
+2010-03-22 18:07  ivan
 
-       * FS/FS/cust_main_Mixin.pm: fix event report w/ a customer status
+       * httemplate/elements/freeside.css: wfm
 
-2009-12-19 11:10  ivan
+2010-03-22 18:04  ivan
 
-       * FS/FS/part_pkg.pm: fix package order to really display only those
-         pacakges available
+       * httemplate/elements/: xmenu.css, xmenu.top.css: purple on pink is
+         WAY too my little pony.  man, its not easy being purple
 
-2009-12-19 11:09  ivan
+2010-03-22 12:46  ivan
 
-       * httemplate/misc/cust-part_pkg.cgi: fix order of packages after
-         class selection changes
+       * httemplate/elements/: freeside.css, menubar.html: 1.9-style
+         menubar was hurting my eyes
 
-2009-12-16 09:35  ivan
+2010-03-22 07:08  jeff
 
-       * httemplate/edit/cust_main_attach.cgi: tweak attachment adding UI:
-         table consistency, input sizes and maxlengths, RT#4964
+       * FS/FS/tax_rate.pm: fix restore of setup and recur taxproducts on
+         tax data replacement
 
-2009-12-16 07:07  jeff
+2010-03-21 23:34  ivan
 
-       * FS/FS/: Conf.pm, Record.pm, cust_bill.pm, cust_location.pm,
-         cust_main.pm, cust_pkg.pm: group invoice line items by location,
-         show location address on invoice, option for due date rather than
-         invoice date on prior unpaid invoice line items, and option for
-         aging on invoice (#6418, #5235, #4648)
+       * httemplate/elements/freeside.css: fix link hover effect so it
+         doesn't underline A NAME tags
 
-2009-12-13 23:52  ivan
+2010-03-21 16:56  ivan
 
-       * FS/FS/svc_acct.pm: use a global config too
+       * httemplate/elements/freeside.css: fix inadvertant button styling
 
-2009-12-13 23:10  ivan
+2010-03-21 16:13  ivan
 
-       * FS/FS/: Conf.pm, svc_acct.pm, part_export/sqlradius.pm: add
-         overlimit_groups agent-specific config, overriding
-         export-specific overlimit_groups, RT#6622
+       * FS/FS/Schema.pm, FS/FS/rate_detail.pm,
+         FS/FS/part_pkg/voip_cdr.pm, httemplate/browse/rate_detail.html,
+         httemplate/edit/rate_detail.html,
+         httemplate/edit/rate_region.cgi,
+         httemplate/edit/process/rate_region.cgi,
+         httemplate/misc/rate_edit_excel.html,
+         httemplate/misc/process/copy-rate_detail.html: connection fee for
+         initial N seconds support, RT#7018
 
-2009-12-13 17:41  mark
+2010-03-21 12:34  ivan
 
-       * FS/FS/AccessRight.pm, httemplate/browse/cust_attachment.html,
-         httemplate/edit/cust_main_attach.cgi,
-         httemplate/elements/menu.html, httemplate/view/cust_main.cgi,
-         httemplate/view/cust_main/attachments.html: Add access right to
-         view attachments
+       * rt/etc/RT_SiteConfig.pm: make the fckeditor taller, way too small
 
-2009-12-12 18:10  ivan
+2010-03-20 22:18  ivan
 
-       * ChangeLog: 1.9.2ish
+       * rt/FREESIDE_MODIFIED: think this fixes the "results box color
+         infects everything else" problem
 
-2009-12-12 14:35  ivan
+2010-03-20 16:30  ivan
 
-       * FS/FS/cust_credit_bill_pkg.pm: doc
+       * httemplate/docs/credits.html: more RT integration / reskin / 2.1,
+         RT#6640
 
-2009-12-12 14:22  ivan
+2010-03-20 16:22  ivan
 
-       * Makefile: sync versioning with branches, sorry jeremy
+       * httemplate/: elements/menu.html,
+         elements/popup_link_onclick.html, images/cvv2.png,
+         images/cvv2_amex.png: more RT integration / reskin / 2.1, RT#6640
 
-2009-12-10 15:03  ivan
+2010-03-20 15:44  ivan
 
-       * FS/FS/cust_main.pm: fully fix bulk customer reports, RT#6778
+       * httemplate/elements/: freeside-menu.css, header.html, xmenu.css,
+         xmenu.js, xmenu.top.css: more RT integration / reskin / 2.1,
+         RT#6640
 
-2009-12-07 22:29  mark
+2010-03-20 15:11  ivan
 
-       * FS/FS/Schema.pm: Fix cust_attachment.disabled type
+       * httemplate/elements/calendar-win2k-2.css,
+         httemplate/elements/freeside-menu.css,
+         httemplate/elements/header.html, httemplate/elements/menu.html,
+         httemplate/elements/xmenu.top.css,
+         httemplate/elements/xmenu.top.js,
+         httemplate/images/arrow.down.black.png,
+         httemplate/images/black-gradient.png,
+         httemplate/images/black-gray-gradient.png, rt/FREESIDE_MODIFIED,
+         httemplate/elements/freeside.css: more RT integration / reskin /
+         2.1, RT#6640
 
-2009-12-06 15:44  ivan
+2010-03-19 01:27  ivan
 
-       * httemplate/edit/part_pkg.cgi: fix initial value of agent types
-         when cloning
+       * httemplate/: docs/cvv2.html, elements/header-minimal.html,
+         elements/header-popup.html, elements/header.html,
+         elements/tr-justtitle.html, elements/tr-title.html,
+         elements/freeside-menu.css, elements/menu.html,
+         elements/menubar.html, elements/xmenu.top.css: skin RT 3.8,
+         slight new look for 2.1, RT#6640
 
-2009-12-06 15:18  ivan
+2010-03-19 01:26  ivan
 
-       * httemplate/elements/header.html: fix search box clearing from
-         within RT, caused by different quoting rules in RT comp_root.
-         grr.
+       * rt/FREESIDE_MODIFIED: skin RT 3.8, RT#6640
 
-2009-12-06 11:19  ivan
+2010-03-19 01:20  mark
 
-       * FS/FS/Schema.pm: more reasonable sizes for filename, mime type
-         and title, RT#6823
+       * httemplate/misc/batch-cust_pay.html: RT#7812: confirm before
+         closing quick payment entry
 
-2009-12-05 15:36  jeff
+2010-03-18 01:02  ivan
 
-       * FS/FS/cust_bill.pm: holy cow! correct sense of skip usage testing
+       * httemplate/edit/cust_main/top_misc.html: signup date fix?
 
-2009-12-03 20:45  ivan
+2010-03-18 00:59  ivan
 
-       * FS/FS/svc_acct.pm, httemplate/search/svc_acct.cgi:
-         customer-specific account report (and some small refactoring of
-         method names to clash less), RT#6180
+       * FS/FS/Schema.pm, FS/FS/cust_bill.pm, FS/FS/cust_main.pm,
+         FS/FS/cust_pkg.pm, FS/FS/part_pkg.pm,
+         httemplate/edit/quick-charge.html,
+         FS/FS/part_event/Condition/cust_bill_has_noauto.pm,
+         FS/FS/part_event/Condition/cust_bill_hasnt_noauto.pm,
+         httemplate/edit/process/quick-charge.cgi,
+         httemplate/edit/process/quick-cust_pkg.cgi,
+         httemplate/misc/order_pkg.html,
+         httemplate/view/cust_main/one_time_charge_link.html,
+         httemplate/view/cust_main/order_pkg_link.html,
+         httemplate/view/cust_main/packages/status.html: disable
+         auto-billing of specific customer packages, RT#6378
+
+2010-03-16 01:05  mark
+
+       * httemplate/edit/cust_main_note.cgi: minor bugfix
+
+2010-03-16 00:49  mark
+
+       * httemplate/elements/fckeditor/: fckconfig.js, fckeditor.js,
+         fckpackager.xml, fckstyles.xml, fcktemplates.xml,
+         editor/fckdebug.html, editor/fckdialog.html,
+         editor/fckeditor.html, editor/fckeditor.original.html,
+         editor/css/fck_editorarea.css, editor/css/fck_internal.css,
+         editor/css/fck_showtableborders_gecko.css,
+         editor/css/images/block_address.png,
+         editor/css/images/block_blockquote.png,
+         editor/css/images/block_div.png, editor/css/images/block_h1.png,
+         editor/css/images/block_h2.png, editor/css/images/block_h3.png,
+         editor/css/images/block_h4.png, editor/css/images/block_h5.png,
+         editor/css/images/block_h6.png, editor/css/images/block_p.png,
+         editor/css/images/block_pre.png,
+         editor/css/images/fck_plugin.gif, editor/dialog/fck_about.html,
+         editor/dialog/fck_anchor.html, editor/dialog/fck_button.html,
+         editor/dialog/fck_checkbox.html,
+         editor/dialog/fck_colorselector.html, editor/dialog/fck_div.html,
+         editor/dialog/fck_docprops.html, editor/dialog/fck_flash.html,
+         editor/dialog/fck_form.html, editor/dialog/fck_hiddenfield.html,
+         editor/dialog/fck_image.html, editor/dialog/fck_link.html,
+         editor/dialog/fck_listprop.html, editor/dialog/fck_paste.html,
+         editor/dialog/fck_radiobutton.html,
+         editor/dialog/fck_replace.html, editor/dialog/fck_scayt.html,
+         editor/dialog/fck_select.html, editor/dialog/fck_smiley.html,
+         editor/dialog/fck_source.html,
+         editor/dialog/fck_specialchar.html,
+         editor/dialog/fck_spellerpages.html,
+         editor/dialog/fck_table.html, editor/dialog/fck_tablecell.html,
+         editor/dialog/fck_template.html, editor/dialog/fck_textarea.html,
+         editor/dialog/fck_textfield.html,
+         editor/dialog/common/fck_dialog_common.css,
+         editor/dialog/common/fck_dialog_common.js,
+         editor/dialog/fck_docprops/fck_document_preview.html,
+         editor/dialog/fck_flash/fck_flash.js,
+         editor/dialog/fck_flash/fck_flash_preview.html,
+         editor/dialog/fck_image/fck_image.js,
+         editor/dialog/fck_image/fck_image_preview.html,
+         editor/dialog/fck_link/fck_link.js,
+         editor/dialog/fck_select/fck_select.js,
+         editor/dialog/fck_spellerpages/spellerpages/spellChecker.js,
+         editor/dialog/fck_spellerpages/spellerpages/spellerStyle.css,
+         editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.pl,
+         editor/filemanager/browser/default/browser.css,
+         editor/filemanager/browser/default/browser.html,
+         editor/filemanager/browser/default/frmactualfolder.html,
+         editor/filemanager/browser/default/frmcreatefolder.html,
+         editor/filemanager/browser/default/frmfolders.html,
+         editor/filemanager/browser/default/frmresourceslist.html,
+         editor/filemanager/browser/default/frmresourcetype.html,
+         editor/filemanager/browser/default/frmupload.html,
+         editor/filemanager/browser/default/js/common.js,
+         editor/filemanager/browser/default/js/fckxml.js,
+         editor/js/fckadobeair.js, editor/js/fckeditorcode_gecko.js,
+         editor/js/fckeditorcode_ie.js,
+         editor/lang/_translationstatus.txt, editor/lang/af.js,
+         editor/lang/ar.js, editor/lang/bg.js, editor/lang/bn.js,
+         editor/lang/bs.js, editor/lang/ca.js, editor/lang/cs.js,
+         editor/lang/da.js, editor/lang/de.js, editor/lang/el.js,
+         editor/lang/en-au.js, editor/lang/en-ca.js, editor/lang/en-uk.js,
+         editor/lang/en.js, editor/lang/eo.js, editor/lang/es.js,
+         editor/lang/et.js, editor/lang/eu.js, editor/lang/fa.js,
+         editor/lang/fi.js, editor/lang/fo.js, editor/lang/fr-ca.js,
+         editor/lang/fr.js, editor/lang/gl.js, editor/lang/gu.js,
+         editor/lang/he.js, editor/lang/hi.js, editor/lang/hr.js,
+         editor/lang/hu.js, editor/lang/is.js, editor/lang/it.js,
+         editor/lang/ja.js, editor/lang/km.js, editor/lang/ko.js,
+         editor/lang/lt.js, editor/lang/lv.js, editor/lang/mn.js,
+         editor/lang/ms.js, editor/lang/nb.js, editor/lang/nl.js,
+         editor/lang/no.js, editor/lang/pl.js, editor/lang/pt-br.js,
+         editor/lang/pt.js, editor/lang/ro.js, editor/lang/ru.js,
+         editor/lang/sk.js, editor/lang/sl.js, editor/lang/sr-latn.js,
+         editor/lang/sr.js, editor/lang/sv.js, editor/lang/th.js,
+         editor/lang/tr.js, editor/lang/uk.js, editor/lang/vi.js,
+         editor/lang/zh-cn.js, editor/lang/zh.js,
+         editor/plugins/autogrow/fckplugin.js,
+         editor/plugins/placeholder/fck_placeholder.html,
+         editor/plugins/placeholder/fckplugin.js,
+         editor/plugins/placeholder/lang/de.js,
+         editor/plugins/placeholder/lang/en.js,
+         editor/plugins/placeholder/lang/es.js,
+         editor/plugins/placeholder/lang/fr.js,
+         editor/plugins/placeholder/lang/it.js,
+         editor/plugins/placeholder/lang/pl.js,
+         editor/plugins/simplecommands/fckplugin.js,
+         editor/plugins/tablecommands/fckplugin.js,
+         editor/skins/_fckviewstrips.html,
+         editor/skins/default/fck_dialog.css,
+         editor/skins/default/fck_dialog_ie6.js,
+         editor/skins/default/fck_editor.css,
+         editor/skins/default/fck_strip.gif,
+         editor/skins/default/images/dialog.sides.gif,
+         editor/skins/default/images/dialog.sides.png,
+         editor/skins/default/images/dialog.sides.rtl.png,
+         editor/skins/default/images/sprites.gif,
+         editor/skins/default/images/sprites.png,
+         editor/skins/office2003/fck_dialog.css,
+         editor/skins/office2003/fck_dialog_ie6.js,
+         editor/skins/office2003/fck_editor.css,
+         editor/skins/office2003/fck_strip.gif,
+         editor/skins/office2003/images/dialog.sides.gif,
+         editor/skins/office2003/images/dialog.sides.png,
+         editor/skins/office2003/images/dialog.sides.rtl.png,
+         editor/skins/office2003/images/sprites.gif,
+         editor/skins/office2003/images/sprites.png,
+         editor/skins/silver/fck_dialog.css,
+         editor/skins/silver/fck_dialog_ie6.js,
+         editor/skins/silver/fck_editor.css,
+         editor/skins/silver/fck_strip.gif,
+         editor/skins/silver/images/dialog.sides.gif,
+         editor/skins/silver/images/dialog.sides.png,
+         editor/skins/silver/images/dialog.sides.rtl.png,
+         editor/skins/silver/images/sprites.gif,
+         editor/skins/silver/images/sprites.png: FCKeditor 2.6.6
+
+2010-03-15 19:51  mark
+
+       * httemplate/: edit/cust_main_note.cgi, view/cust_main/notes.html,
+         elements/htmlarea.html: RT#6226: fckeditor for customer notes
+
+2010-03-15 19:14  ivan
+
+       * rt/etc/rt.spec: remove rt.spec, borking our build somehow
+
+2010-03-15 18:00  ivan
+
+       * httemplate/search/: cust_main-zip.html,
+         report_cust_main-zip.html: w/svc_whatever option on zip code
+         distribution report, RT#7784
+
+2010-03-15 15:31  mark
+
+       * FS/bin/freeside-paymentech-upload: RT#7473: add -p option
+
+2010-03-15 00:13  ivan
+
+       * httemplate/edit/svc_broadband.cgi: fix editing svc_broadband
+         service w/no ip address, RT#7786
+
+2010-03-14 23:18  ivan
+
+       * httemplate/search/elements/cust_pay_or_refund.html: deleted
+         payment report, RT#7694
+
+2010-03-14 23:10  ivan
+
+       * httemplate/search/: h_cust_pay.html, report_h_cust_pay.html,
+         elements/cust_pay_or_refund.html: deleted payment report, RT#7694
+
+2010-03-14 19:06  ivan
+
+       * httemplate/edit/part_pkg.cgi: fix diabled package optional
+         reporting classes still selectable on package def edit, RT#7658
+
+2010-03-13 15:50  ivan
+
+       * FS/FS/cust_pkg.pm: quiet extraneous warnings from
+         expire_months/start_1st stuff, getting in the way of debugging
+         for ncic, RT#7780
+
+2010-03-12 13:56  ivan
+
+       * FS/FS/Conf.pm, FS/FS/svc_phone.pm, httemplate/edit/svc_phone.cgi:
+         add svc_phone-phone_name-max_length config, RT#7047
+
+2010-03-12 13:29  ivan
+
+       * FS/FS/cust_location.pm, FS/FS/cust_main.pm,
+         FS/FS/location_Mixin.pm, FS/FS/svc_phone.pm,
+         httemplate/edit/svc_phone.cgi,
+         httemplate/edit/elements/svc_Common.html,
+         httemplate/edit/process/svc_phone.html,
+         httemplate/elements/tr-select-cust_location.html,
+         httemplate/view/svc_phone.cgi: finishing e911/svc_phone location,
+         RT#7047
 
-2009-12-03 20:40  ivan
+2010-03-12 03:48  mark
 
-       * FS/FS/cust_bill.pm, FS/FS/cust_bill_event.pm,
-         FS/FS/cust_event.pm, FS/FS/cust_main.pm,
-         httemplate/search/477.html, httemplate/search/cust_bill.html,
-         httemplate/search/cust_bill_event.cgi,
-         httemplate/search/cust_event.html,
-         httemplate/search/cust_main.html, httemplate/search/cust_pkg.cgi,
-         httemplate/search/report_svc_acct.html,
-         httemplate/view/cust_main/packages.html, FS/FS/cust_pkg.pm,
-         httemplate/misc/email-customers.html,
-         httemplate/misc/process/bulk_change_pkg.cgi,
-         httemplate/misc/process/email-customers.html: customer-specific
-         account report (and some small refactoring of method names to
-         clash less), RT#6180
+       * httemplate/edit/svc_broadband.cgi: RT#7765: sort broadband router
+         names
 
-2009-12-03 11:22  ivan
+2010-03-11 19:36  ivan
 
-       * httemplate/graph/cust_bill_pkg.cgi: average per cust_pkg option
-         for peter
+       * FS/FS/Schema.pm, FS/FS/cust_pkg.pm, FS/FS/location_Mixin.pm,
+         FS/FS/svc_phone.pm, FS/t/location_Mixin.t,
+         httemplate/edit/svc_phone.cgi,
+         httemplate/edit/elements/edit.html,
+         httemplate/edit/elements/svc_Common.html,
+         httemplate/elements/location.html,
+         httemplate/elements/tr-select-cust_location.html,
+         httemplate/view/svc_phone.cgi: add location to svc_phone, RT#7047
 
-2009-12-03 11:06  ivan
+2010-03-11 19:30  ivan
 
-       * FS/FS/Report/Table/Monthly.pm,
-         httemplate/graph/cust_bill_pkg.cgi,
-         httemplate/graph/report_cust_bill_pkg.html: average per cust_pkg
-         option for peter
+       * FS/MANIFEST: add location to svc_phone, RT#7047
 
-2009-12-02 23:53  ivan
+2010-03-10 19:27  ivan
 
-       * FS/FS/Schema.pm: index cdrbatchnum
+       * FS/FS/TicketSystem/RT_External.pm,
+         httemplate/view/cust_main/tickets.html: add queue selection to
+         customer ticket creation, RT#7656
 
-2009-12-02 23:37  ivan
+2010-03-10 18:15  ivan
 
-       * FS/FS/: Record.pm, cdr/sansay.pm: fix startdate in sansay CDR
-         import (and skip blank lines), RT#6801
+       * httemplate/docs/credits.html: Mark Wells is now a member of the
+         core team.  Kristian Hoffman has been moved to the core emeritus
 
-2009-12-02 23:18  ivan
+2010-03-10 00:20  mark
 
-       * httemplate/search/cdr.html: fix cdr search
+       * httemplate/edit/svc_acct.cgi: fix probably misplaced text field
 
-2009-12-02 20:22  ivan
+2010-03-09 23:50  mark
 
-       * FS/FS/cdr/sansay.pm: no header?
+       * httemplate/edit/svc_domain.cgi: fix probably misplaced text field
 
-2009-12-02 12:58  ivan
+2010-03-09 22:52  ivan
 
-       * FS/FS/Schema.pm: add index to rate_prefix.npa for a performance
-         improvement on CDR billing, RT#6386
+       * FS/FS/cust_pkg.pm: oops, move start_1st and expire_months
+         handling from check to insert, so it doesn't get triggered on
+         edit, RT#7347
 
-2009-12-02 12:51  ivan
+2010-03-09 22:47  ivan
 
-       * httemplate/view/: svc_broadband.cgi, svc_domain.cgi,
-         svc_external.cgi, svc_forward.cgi, svc_www.cgi: fix viewing
-         unlinked forwards, domains, broadband/external/www services,
-         RT#6794
+       * httemplate/edit/process/REAL_cust_pkg.cgi: fix warning about
+         adding a start date to actually check its *added*, RT#7352
 
-2009-12-01 11:16  jeff
+2010-03-09 15:47  ivan
 
-       * FS/FS/cust_bill.pm: want a listref not a list
+       * httemplate/misc/delay_susp_pkg.html: tyop too
 
-2009-11-29 16:38  ivan
+2010-03-09 14:37  mark
 
-       * FS/FS/cust_main.pm, httemplate/misc/email-customers.html: fix
-         bulk sending of customer notices, RT#6778
+       * httemplate/misc/cancel_pkg.html: fix typo
 
-2009-11-29 16:06  ivan
+2010-03-09 13:57  mark
 
-       * httemplate/edit/REAL_cust_pkg.cgi: fix
+       * FS/FS/prepay_credit.pm, httemplate/edit/prepay_credit.cgi,
+         httemplate/edit/process/prepay_credit.cgi: RT#7407, variable
+         length prepaid card codes
 
-2009-11-29 16:04  ivan
+2010-03-09 00:37  ivan
 
-       * httemplate/edit/: REAL_cust_pkg.cgi, process/REAL_cust_pkg.cgi:
-         UI changes to make it impossible to add a start date to a package
-         that already has a setup fee (can still remove an existing start
-         date causing problems), RT#6712
+       * FS/FS/part_pkg/sql_external.pm: move sql_external to use
+         recur_Common, RT#7212
 
-2009-11-29 15:18  ivan
+2010-03-09 00:05  ivan
 
-       * FS/FS/: Conf.pm, cust_pkg.pm: add
-         cust_pkg-change_pkgpart-bill_now option to bill the new package
-         immediately on package changes.  Useful for prepaid situations
-         with RADIUS where an Expiration attribute base don the package
-         must be present at all times.  RT#6692
+       * httemplate/edit/REAL_cust_pkg.cgi: date editing fix, fallout from
+         date_format
 
-2009-11-29 15:15  ivan
+2010-03-08 18:43  ivan
 
-       * FS/FS/cust_main.pm: doc: spelling
+       * FS/FS/: cust_pkg.pm, part_pkg/flat.pm: a package that starts on
+         the 1st and expires after N months, RT#7738
 
-2009-11-25 16:27  ivan
+2010-03-08 18:39  ivan
 
-       * FS/FS/part_pkg/voip_cdr.pm: debugging left on
+       * FS/FS/cust_main.pm: fix ACH refunds w/IPPay.  B:OP 3.01 and IPPay
+         0.05_02 required.  RT#_7673
 
-2009-11-25 11:58  ivan
+2010-03-08 18:12  ivan
 
-       * httemplate/edit/part_pkg.cgi: don't consider disabled report
-         classes, don't load up the whole table just to see if there are
-         any
+       * FS/FS/cust_pkg.pm: init ticket system new-style
 
-2009-11-25 11:32  jeff
+2010-03-08 16:23  jeff
 
-       * FS/FS/: cust_bill.pm, usage_class.pm: improve appearance of cdr
-         records in cdr sections
+       * FS/FS/Setup.pm: tyop broke populate_initial_data
 
-2009-11-25 08:13  jeff
+2010-03-08 16:18  jeff
 
-       * FS/FS/cust_bill.pm: bug fixes, reuse summary_page, eliminate
-         dups, and rearrange
+       * FS/FS/reason_type.pm: and this is not 1.7.x
 
-2009-11-25 08:09  jeff
+2010-03-08 15:07  jeff
 
-       * conf/invoice_latex: really insert a pagebreak
+       * FS/FS/part_export/prizm.pm: try a delete before adding an element
+         to prizm
 
-2009-11-25 08:07  jeff
+2010-03-08 14:13  ivan
 
-       * conf/invoice_latex: oops.. need updated template for new formats
+       * FS/FS/cust_main.pm: fix ACH refunds w/IPPay.  B:OP 3.01 and IPPay
+         0.05_02 required.  RT#_7673
 
-2009-11-24 13:00  ivan
+2010-03-08 02:57  ivan
 
-       * FS/FS/cust_bill.pm: debugging left on
+       * FS/FS/Conf.pm, FS/FS/cust_bill.pm,
+         httemplate/edit/REAL_cust_pkg.cgi,
+         httemplate/edit/cust_credit.cgi, httemplate/edit/cust_pay.cgi,
+         httemplate/edit/cust_refund.cgi,
+         httemplate/edit/quick-charge.html,
+         httemplate/edit/elements/ApplicationCommon.html,
+         httemplate/elements/tr-input-beginning_ending.html,
+         httemplate/elements/tr-input-date-field.html,
+         httemplate/misc/cancel_pkg.html,
+         httemplate/misc/delay_susp_pkg.html,
+         httemplate/misc/order_pkg.html,
+         httemplate/search/report_prepaid_income.html,
+         httemplate/view/cust_main/payment_history.html,
+         httemplate/view/cust_main/payment_history/credit.html,
+         httemplate/view/cust_main/payment_history/payment.html,
+         httemplate/view/cust_main/payment_history/voided_payment.html:
+         proper use of date_format config for international date formats,
+         RT#7009
 
-2009-11-24 09:05  jeff
+2010-03-07 23:02  ivan
 
-       * FS/FS/cust_bill.pm: cope with sections lacking a pkg_category
+       * FS/FS/Conf.pm, FS/FS/Schema.pm, FS/FS/svc_Domain_Mixin.pm,
+         FS/FS/svc_acct.pm, FS/FS/svc_phone.pm, FS/MANIFEST,
+         FS/FS/part_export/netsapiens.pm, FS/t/svc_Domain_Mixin.t,
+         httemplate/edit/svc_phone.cgi,
+         httemplate/edit/elements/svc_Common.html,
+         httemplate/elements/select-svc-domain.html,
+         httemplate/elements/tr-select-svc-domain.html,
+         httemplate/view/svc_phone.cgi: domain names in netsapiens export
+         (domain name association w/svc_phone), RT#5864
 
-2009-11-23 23:42  ivan
+2010-03-07 10:07  jeff
 
-       * httemplate/: misc/timeworked.html, misc/process/timeworked.html,
-         search/timeworked.html: timeworked report: carry the date range
-         through to the success redirect
+       * FS/FS/tax_rate.pm: pass format and correct filenames
 
-2009-11-23 23:23  ivan
+2010-03-05 11:09  ivan
 
-       * httemplate/search/: report_timeworked.html: add date constratint
-         on time worked search
+       * FS/FS/part_export/grandstream.pm: random nits for grandstream
+         provisioning :UI, docs, java path, s/system/IPC::Run/ for better
+         error handling.  RT#7132
 
-2009-11-23 23:23  ivan
+2010-03-05 11:02  ivan
 
-       * httemplate/search/report_timeworked.html: file
-         report_timeworked.html was added on branch FREESIDE_1_9_BRANCH on
-         2009-11-24 07:23:47 +0000
+       * httemplate/edit/part_device.html,
+         FS/FS/part_export/grandstream.pm: random nits for grandstream
+         provisioning :UI, docs, java path, s/system/IPC::Run/ for better
+         error handling.  RT#7132
 
-2009-11-23 22:04  ivan
+2010-03-05 10:25  ivan
 
-       * FS/FS/cust_main.pm: send card number with void transactions for
-         B:OP:IPPay, RT#5690
+       * httemplate/docs/ssh.html: moved to wiki
 
-2009-11-23 17:11  mark
+2010-03-05 10:24  ivan
 
-       * FS/FS/Schema.pm, httemplate/browse/cust_attachment.html,
-         httemplate/edit/cust_main_attach.cgi,
-         httemplate/edit/process/cust_main_attach.cgi,
-         httemplate/elements/menu.html,
-         httemplate/misc/cust_attachment.cgi,
-         httemplate/search/elements/search-html.html,
-         httemplate/view/cust_main/attachments.html: cust_attachment
-         improvement, RT#4964 and #6225
+       * FS/FS/part_export/: domain_shellcommands.pm,
+         forward_shellcommands.pm, phone_shellcommands.pm,
+         shellcommands.pm, shellcommands_withdomain.pm, textradius.pm,
+         vpopmail.pm, www_shellcommands.pm: point to wiki docs
 
-2009-11-20 09:39  jeff
+2010-03-05 10:10  ivan
 
-       * FS/FS/Conf.pm, FS/FS/Schema.pm, FS/FS/cust_bill.pm,
-         FS/FS/cust_bill_pkg.pm, FS/FS/cust_bill_pkg_detail.pm,
-         FS/FS/usage_class.pm, FS/FS/part_pkg/voip_cdr.pm,
-         conf/invoice_html, httemplate/browse/pkg_category.html,
-         httemplate/browse/usage_class.html,
-         httemplate/edit/pkg_category.html,
-         httemplate/edit/usage_class.html: invoice formatting: add
-         sections for usage, add sections per svc_phone, add folding like
-         line items into one #6592
+       * FS/FS/part_export/grandstream.pm,
+         httemplate/edit/part_device.html: random nits for grandstream
+         provisioning :UI, docs, java path, s/system/IPC::Run/ for better
+         error handling.  RT#7132
 
-2009-11-19 01:47  ivan
+2010-03-03 21:31  jeff
 
-       * FS/FS.pm, FS/FS/Record.pm, FS/FS/cdr.pm,
-         FS/bin/freeside-cdr-sftp_and_import, bin/cdr-transnexus.import,
-         bin/cdr.http_and_import, bin/cdr.import,
-         httemplate/elements/select-cdrbatch.html,
-         httemplate/elements/tr-select-cdrbatch.html,
-         httemplate/search/cdr.html, httemplate/search/report_cdr.html,
-         httemplate/view/svc_phone.cgi: proper cdr_batch table, RT#6386
+       * FS/FS/cust_bill.pm: always show the previous section when
+         previous_balance-summary_only is enabled
 
-2009-11-19 01:43  ivan
+2010-03-02 17:39  jeff
 
-       * FS/FS/: Mason.pm, Schema.pm, Upgrade.pm: proper cdr_batch table,
-         RT#6386
+       * FS/FS/tax_rate.pm, httemplate/misc/tax-import.cgi: tweak,
+         rearrange, and avoid the vacuum
 
-2009-11-19 01:39  ivan
+2010-03-02 17:00  jeff
 
-       * FS/MANIFEST: proper cdr_batch table, RT#6386
+       * httemplate/edit/cust_main/bottomfixup.js: clear geocode when we
+         DO have plus four
 
-2009-11-19 01:32  ivan
+2010-03-02 09:18  ivan
 
-       * FS/FS/cdr_batch.pm: file cdr_batch.pm was added on branch
-         FREESIDE_1_9_BRANCH on 2009-11-19 09:35:13 +0000
+       * httemplate/: search/elements/search-html.html,
+         misc/bulk_pkg_increment_bill.cgi, search/cust_pkg.cgi: UI: get
+         rid of undocumented extra_choices_callback in search.html: a
+         terrible place to put action links from a UI perspective, move
+         package links to html_init, now consitent with customer links,
+         change label on popup from "increment bill date" to "increment
+         next bill date", RT#7132
 
-2009-11-19 01:32  ivan
+2010-03-01 14:18  ivan
 
-       * FS/t/cdr_batch.t: file cdr_batch.t was added on branch
-         FREESIDE_1_9_BRANCH on 2009-11-19 09:35:13 +0000
+       * httemplate/edit/elements/svc_Common.html: fixup editing w/manual
+         inventory, RT#7010
 
-2009-11-19 01:32  ivan
+2010-03-01 14:00  ivan
 
-       * FS/: FS/cdr_batch.pm, t/cdr_batch.t: proper cdr_batch table,
-         RT#6386
+       * httemplate/elements/select-table.html: fix up editing services
+         w/manual select from inventory, RT#7010
 
-2009-11-18 23:06  ivan
+2010-03-01 13:56  ivan
 
-       * FS/FS/cdr.pm: format CDRs durations as NNm MMs instead of NN.MMm,
-         RT#6316
+       * FS/FS/svc_Common.pm: fix up editing services w/manual select from
+         inventory, RT#7010
 
-2009-11-18 22:21  ivan
+2010-03-01 13:36  ivan
 
-       * FS/FS/Cron/breakage.pm: consider credits and refunds in breakage,
-         RT#6407
+       * httemplate/edit/elements/edit.html: fix up editing services
+         w/manual select from inventory, RT#7010
 
-2009-11-18 01:39  mark
+2010-03-01 13:05  ivan
 
-       * FS/FS/Conf.pm, FS/FS/pay_batch/RBC.pm,
-         httemplate/search/cust_pay_batch.cgi: RT#4786, RBC batch format
+       * httemplate/search/inventory_item.html: fix inventory item links
+         to non-svc_acct services, RT#7010
 
-2009-11-18 01:27  mark
+2010-03-01 11:38  ivan
 
-       * FS/FS/pay_batch/RBC.pm: RT#4768, RBC batch format
+       * FS/FS/svc_Common.pm: enable manual selection from inventory
+         dropdowns for svc_broadband, svc_external & svc_phone, RT#7010
 
-2009-11-18 01:27  mark
+2010-03-01 11:29  ivan
 
-       * FS/FS/pay_batch/RBC.pm: file RBC.pm was added on branch
-         FREESIDE_1_9_BRANCH on 2009-11-18 09:40:04 +0000
+       * httemplate/: edit/part_svc.cgi, edit/elements/edit.html,
+         edit/elements/svc_Common.html, elements/select-table.html: enable
+         manual selection from inventory dropdowns for svc_broadband,
+         svc_external & svc_phone, RT#7010
 
-2009-11-18 01:09  mark
+2010-03-01 11:10  jeff
 
-       * httemplate/: browse/cust_attachment.html,
-         misc/cust_attachment.cgi: cust_attachment improvement, RT#4964
-         and #6225
+       * Makefile: get along better with RTless installs
 
-2009-11-18 01:09  mark
+2010-02-26 19:15  ivan
 
-       * httemplate/misc/cust_attachment.cgi: file cust_attachment.cgi was
-         added on branch FREESIDE_1_9_BRANCH on 2009-11-24 01:11:22 +0000
+       * httemplate/edit/cust_refund.cgi: expiration date not meaningful
+         for non-CARD, RT#7419
 
-2009-11-18 01:09  mark
+2010-02-26 18:59  ivan
 
-       * httemplate/browse/cust_attachment.html: file cust_attachment.html
-         was added on branch FREESIDE_1_9_BRANCH on 2009-11-24 01:11:21
-         +0000
+       * FS/FS/cust_bill_ApplicationCommon.pm: fix rare "Illegal division
+         by zero" error applying things when using weights, RT#7491
 
-2009-11-17 14:06  ivan
+2010-02-24 15:32  mark
 
-       * FS/FS/cust_main.pm: do a case-insensive search on
-         browser-remembered results, so starting to use USPS verification
-         (which UPPERCASES everything) doesn't invalidate everything your
-         browser remembered in quick payment entry
+       * httemplate/: misc/bulk_pkg_increment_bill.cgi,
+         misc/process/bulk_pkg_increment_bill.cgi, search/cust_pkg.cgi:
+         RT#7132: bulk increment package bill dates
 
-2009-11-16 23:42  ivan
+2010-02-22 02:35  ivan
 
-       * httemplate/search/: report_cust_pay.html,
-         report_cust_refund.html, elements/cust_pay_or_refund.html: add
-         otaker to payment/refund search, RT#6407
+       * FS/FS/part_export/communigate_pro.pm: communigate: domain account
+         defaults, RT#7083
 
-2009-11-16 23:08  ivan
+2010-02-22 01:18  ivan
 
-       * httemplate/: elements/menu.html, search/report_cust_refund.html:
-         add refund report, RT#6407
+       * httemplate/edit/svc_domain.cgi: communigate: domain account
+         defaults, RT#7083
 
-2009-11-15 19:55  ivan
+2010-02-22 01:14  ivan
 
-       * FS/FS/cust_bill.pm, FS/FS/cust_main.pm,
-         httemplate/search/cust_bill.html,
-         httemplate/search/report_cust_bill.html: add ability to search on
-         ranges of charged, owed to adv. invoice report, RT#6407
+       * FS/FS/Schema.pm, FS/FS/svc_acct.pm, FS/FS/svc_domain.pm,
+         httemplate/edit/part_svc.cgi,
+         httemplate/edit/process/svc_domain.cgi,
+         httemplate/view/svc_domain.cgi, httemplate/view/elements/tr.html,
+         httemplate/view/svc_acct/basics.html,
+         httemplate/view/svc_domain/acct_defaults.html,
+         httemplate/view/svc_domain/basics.html,
+         httemplate/view/svc_domain/dns.html,
+         httemplate/edit/svc_acct.cgi: communigate: domain account
+         defaults, RT#7083
 
-2009-11-15 18:27  ivan
+2010-02-21 23:13  ivan
 
-       * FS/: FS/Conf.pm, FS/Cron/bill.pm, bin/freeside-daily: add
-         disable_cron_billing config, RT#6407
+       * FS/FS/svc_domain.pm, FS/FS/part_export/communigate_pro.pm,
+         httemplate/edit/svc_domain.cgi, httemplate/view/svc_domain.cgi:
+         communigate: domain aliases, enabled services & administrator
+         domain, RT#7083
 
-2009-11-13 16:08  ivan
+2010-02-21 19:22  ivan
 
-       * FS/FS/cust_main.pm, httemplate/elements/select-terms.html,
-         httemplate/search/cust_main.html,
-         httemplate/search/report_cust_main.html: add invoice terms to
-         advanced customer report.  dogfood.
+       * FS/FS/Schema.pm, FS/FS/part_export/communigate_pro.pm,
+         FS/FS/svc_acct.pm, FS/FS/svc_domain.pm,
+         httemplate/edit/svc_domain.cgi,
+         httemplate/edit/process/svc_domain.cgi,
+         httemplate/view/svc_domain.cgi,
+         httemplate/edit/process/svc_acct.cgi: communigate: domain
+         aliases, enabled services, RT#7083
 
-2009-11-12 08:56  jeff
+2010-02-21 14:54  ivan
 
-       * FS/FS/: tax_rate.pm, Schema.pm: correct bugs in tax replacement
-         routine and allow updates to function
+       * FS/FS/part_export/communigate_pro.pm, FS/FS/Conf.pm,
+         httemplate/edit/svc_forward.cgi, httemplate/view/svc_forward.cgi:
+         communigate forwarders, RT#7083
 
-2009-11-06 14:07  ivan
+2010-02-21 01:19  ivan
 
-       * FS/FS/cust_main.pm: use business-onlinepayment-description in
-         1.9, even without $pkgs
+       * FS/FS/Schema.pm, FS/FS/svc_acct.pm,
+         FS/FS/part_export/communigate_pro.pm,
+         httemplate/edit/svc_acct.cgi,
+         httemplate/view/svc_acct/basics.html: communigate, RT#7083
 
-2009-11-05 17:51  ivan
+2010-02-20 23:32  ivan
 
-       * FS/FS/: Conf.pm, cust_main_invoice.pm: add
-         emailinvoice-apostrophe config option to allow apostrophies in
-         invoice email addresses, RT#6464
+       * httemplate/view/svc_acct/basics.html: communigate, RT#7083
 
-2009-11-05 16:25  ivan
+2010-02-20 23:28  ivan
 
-       * FS/FS/cust_main.pm, httemplate/search/cust_main.html,
-         httemplate/search/report_cust_main.html: add "payment expiration
-         before" to customer report, RT#6447
+       * FS/FS/Schema.pm, FS/FS/svc_acct.pm,
+         FS/FS/part_export/communigate_pro.pm,
+         httemplate/edit/svc_acct.cgi,
+         httemplate/view/elements/svc_export_settings.html,
+         httemplate/view/svc_acct/tr.html: communigate, RT#7083
 
-2009-11-05 15:55  ivan
+2010-02-20 19:16  ivan
 
-       * FS/FS/ConfDefaults.pm: try not to make the "Customer Fields"
-         SELECT so huge
+       * FS/FS/part_svc.pm, FS/FS/svc_acct.pm,
+         FS/FS/part_export/communigate_pro.pm,
+         httemplate/edit/part_svc.cgi, httemplate/edit/svc_acct.cgi,
+         httemplate/edit/process/svc_acct.cgi,
+         httemplate/elements/communigate_pro-accessmodes.html,
+         httemplate/pref/pref-process.html, httemplate/pref/pref.html,
+         httemplate/view/elements/svc_export_settings.html,
+         httemplate/view/svc_acct/basics.html: communigate, RT#7083
 
-2009-11-05 14:01  ivan
+2010-02-20 14:34  ivan
 
-       * httemplate/search/svc_acct.cgi: improvements in time remaining
-         report: correctly account for unpaid time for non-monthly
-         customers, report in hours+minutes intead of using Time::Duration
-         days/hours
+       * FS/FS/Conf.pm: communigate pro provisioning, RT#7083
 
-2009-11-05 13:22  ivan
+2010-02-20 14:31  ivan
 
-       * FS/bin/: freeside-paymentech-download,
-         freeside-paymentech-upload: back to old host name, info from
-         customer/paymentech was bogus, RT#5650
+       * httemplate/view/elements/svc_export_settings.html,
+         httemplate/view/svc_acct/basics.html,
+         httemplate/view/svc_acct/change_svc.html,
+         httemplate/view/svc_acct/change_svc_form.html,
+         httemplate/view/svc_acct/hosting.html,
+         httemplate/view/svc_acct/radius_usage.html,
+         httemplate/view/svc_acct/usage.html, FS/FS/Record.pm,
+         FS/FS/Schema.pm, FS/FS/svc_acct.pm,
+         FS/FS/part_export/communigate_pro.pm,
+         httemplate/edit/svc_acct.cgi, httemplate/view/svc_acct.cgi,
+         httemplate/view/svc_domain.cgi: communigate pro provisioning,
+         RT#7083
 
-2009-11-05 11:40  ivan
+2010-02-17 19:48  mark
 
-       * FS/FS/pkg_category.pm: fix pkg_category upgrade on 1.9 too
+       * FS/bin/freeside-void-payments: Documentation cleanup
 
-2009-11-04 17:47  ivan
+2010-02-17 01:00  ivan
 
-       * FS/bin/: freeside-paymentech-download,
-         freeside-paymentech-upload: update paymentech live server,
-         RT#5650
+       * httemplate/edit/svc_Common.html: fix svc_pbx provisioniing
 
-2009-11-04 16:52  ivan
+2010-02-17 00:30  ivan
 
-       * FS/FS/pkg_category.pm: fix pkg_category upgrades
+       * FS/FS/part_export.pm, FS/FS/part_export/communigate_pro.pm,
+         FS/FS/Conf.pm, FS/FS/Schema.pm, FS/FS/svc_Common.pm,
+         FS/FS/svc_domain.pm, httemplate/edit/svc_domain.cgi,
+         httemplate/edit/process/svc_domain.cgi,
+         httemplate/view/svc_domain.cgi, FS/FS/cust_svc.pm: communigate
+         pro provisioning, RT#7083
 
-2009-11-03 17:40  ivan
+2010-02-16 10:36  ivan
 
-       * FS/bin/: freeside-paymentech-download,
-         freeside-paymentech-upload: add explicit use of Expect module, so
-         the error is thrown immediate, RT#5650
+       * FS/FS/Conf.pm,
+         fs_selfservice/FS-SelfService/cgi/make_ach_payment.html,
+         fs_selfservice/FS-SelfService/cgi/make_payment.html,
+         FS/FS/ClientAPI/MyAccount.pm: option to uncheck the save checkbox
+         in self-service by default, RT#6955
 
-2009-11-03 17:04  ivan
+2010-02-15 18:19  jeff
 
-       * FS/FS/Cron/breakage.pm, httemplate/config/config-process.cgi,
-         httemplate/config/config-view.cgi: reconcile breakage from stale
-         accounts, RT#6407
+       * FS/FS/tax_rate.pm, httemplate/misc/tax-import.cgi,
+         httemplate/misc/process/tax-import.cgi: refactor cch tax import
+         to remove tons of false laziness and improve flexibility; allow
+         reload from local files
 
-2009-11-03 16:59  ivan
+2010-02-15 08:34  jeff
 
-       * FS/FS/part_pkg.pm: silence "use of uninitialized value in split"
-         warning
+       * htetc/handler.pl: lexical instead of dynamic warnings
 
-2009-11-03 16:53  ivan
+2010-02-15 06:39  jeff
 
-       * FS/FS/cust_pkg.pm, httemplate/browse/part_pkg.cgi: fix customer
-         package search (fallout from customer classes) & add "not yet
-         billed" status to customer package report
+       * htetc/handler.pl: get rid of some very annoying and pointless
+         noise
 
-2009-11-03 12:44  ivan
+2010-02-14 18:09  ivan
 
-       * FS/FS/pay_batch.pm: fix warning replacing pay_batch, RT#5650
+       * FS/FS/Conf.pm, FS/FS/Misc.pm, debian/control: switch to
+         Email::Sender and add options for every kind of mail encryption &
+         authentication, RT#7285
 
-2009-11-03 11:56  ivan
+2010-02-12 18:53  ivan
 
-       * FS/bin/: freeside-paymentech-download,
-         freeside-paymentech-upload: check for zip and unzip commands, use
-         multi-arg version of system to prevent the shell getting its
-         hands on things (metacharacters in pw or whatnot), RT#5650
+       * FS/FS/svc_external.pm, httemplate/edit/svc_Common.html,
+         httemplate/edit/svc_external.cgi,
+         httemplate/edit/elements/svc_Common.html,
+         httemplate/edit/process/svc_external.html: svc_external.title
+         from inventory, RT#7010
 
-2009-11-03 11:11  ivan
+2010-02-12 18:16  ivan
 
-       * FS/bin/: freeside-paymentech-download,
-         freeside-paymentech-upload: update usage & manpage w/ freeside-
-         prefix
+       * httemplate/search/: inventory_item.html: fix inventory item
+         search w/customer classes
 
-2009-11-03 11:03  ivan
+2010-02-12 15:44  ivan
 
-       * FS/bin/: freeside-paymentech-download,
-         freeside-paymentech-upload: fix usage of File::Temp->newdir, not
-         in 0.18 File::Temp on perl 5.10.0, RT#5650
+       * FS/FS/ClientAPI/MyAccount.pm: don't return an error about
+         changing the cust_main record to the user as a payment processing
+         error, log a bunch of verbose stuff in this case so we can track
+         down wtf is going on, RT#6955
 
-2009-11-03 10:54  ivan
+2010-02-12 14:42  ivan
 
-       * FS/bin/freeside-paymentech-download: file
-         freeside-paymentech-download was added on branch
-         FREESIDE_1_9_BRANCH on 2009-11-03 18:54:19 +0000
+       * httemplate/search/: svc_acct.cgi, elements/search-html.html:
+         totals time used on svc_acct report
 
-2009-11-03 10:54  ivan
+2010-02-12 13:49  ivan
 
-       * FS/bin/freeside-paymentech-upload: file
-         freeside-paymentech-upload was added on branch
-         FREESIDE_1_9_BRANCH on 2009-11-03 18:54:19 +0000
+       * fs_selfservice/java/freeside_create_ticket_example.java: tyop,
+         RT#7007
 
-2009-11-03 10:53  ivan
+2010-02-12 11:28  ivan
 
-       * bin/paymentech-download, bin/paymentech-upload,
-         FS/bin/freeside-paymentech-download,
-         FS/bin/freeside-paymentech-upload: moving paymentech-* to FS/bin,
-         RT#5650
+       * FS/FS/ClientAPI/MyAccount.pm, FS/FS/TicketSystem/RT_Internal.pm,
+         fs_selfservice/java/freeside_create_ticket_example.java,
+         fs_selfservice/perl/xmlrpc-create_ticket.pl: add mime_type option
+         to self-service ticket create, RT#7007
 
-2009-11-02 19:13  ivan
+2010-02-12 11:14  ivan
 
-       * FS/FS/Cron/breakage.pm: file breakage.pm was added on branch
-         FREESIDE_1_9_BRANCH on 2009-11-03 03:13:47 +0000
+       * fs_selfservice/perl/xmlrpc-create_ticket.pl,
+         FS/FS/ClientAPI/MyAccount.pm,
+         fs_selfservice/java/freeside_create_ticket_example.java: add
+         queue option to self-service ticket create, RT#7007
 
-2009-11-02 19:13  ivan
+2010-02-11 19:26  ivan
 
-       * FS/FS/Conf.pm, FS/bin/freeside-daily,
-         httemplate/config/config-process.cgi,
-         httemplate/config/config-view.cgi, httemplate/config/config.cgi,
-         httemplate/elements/tr-select-part_pkg.html,
-         FS/FS/Cron/breakage.pm: (start of) reconcile breakage from stale
-         accounts, RT#6407
+       * FS/FS/part_export/thirdlane.pm: add omit_countrycode option,
+         RT#7379
 
-2009-11-02 17:48  ivan
+2010-02-11 17:35  ivan
 
-       * bin/paymentech-download: spelling
+       * FS/FS/ClientAPI/MyAccount.pm, FS/FS/TicketSystem/RT_External.pm,
+         FS/FS/TicketSystem/RT_Internal.pm,
+         fs_selfservice/FS-SelfService/SelfService.pm, FS/FS/Conf.pm,
+         fs_selfservice/java/freeside_create_ticket_example.java,
+         fs_selfservice/perl/xmlrpc-create_ticket.pl,
+         httemplate/view/cust_svc.cgi, rt/lib/RT/URI/freeside.pm: add
+         ticket creation to self-service API, RT#7007
 
-2009-11-02 17:44  ivan
+2010-02-11 15:14  jeff
 
-       * bin/paymentech-download: add -a option for archive dir
+       * FS/FS/part_export/grandstream.pm: fix quoting
 
-2009-11-02 17:21  ivan
+2010-02-09 18:12  mark
 
-       * FS/FS/Conf.pm: clarify description of batchconfig-paymentech
-         based on notes from #5650
+       * FS/FS/: pay_batch.pm, pay_batch/RBC.pm: RT#7274: accept CR/LF in
+         RBC batch import
 
-2009-11-02 13:21  ivan
+2010-02-09 13:49  ivan
 
-       * httemplate/edit/payment_gateway.html: add Elavon, SagePay,
-         WorldPay, fix extra space on PlugnPay, PPIPayMover, Protx
+       * rt/lib/: RT.pm, RT.pm.in: add NoSignalHandlers option to
+         RT::Init() so we can pull things up the way we want under
+         self-service, RT#7007
 
-2009-11-01 15:03  jeff
+2010-02-09 11:56  ivan
 
-       * httemplate/search/: 477.html, elements/search-csv.html: form 477
-         improvements #6499
+       * httemplate/edit/process/discount.html: doh, fix for discounts
+         winding up with both amount and percent, RT#6679
 
-2009-10-31 14:22  jeff
+2010-02-08 19:37  ivan
 
-       * FS/FS/cust_bill.pm: unbork summary page invoices
+       * rt/lib/RT/Config.pm: fix RT wackiness when loaded concurrently
+         with Fcntl
 
-2009-10-30 16:29  ivan
+2010-02-08 11:01  ivan
 
-       * httemplate/elements/select-part_event.html: file
-         select-part_event.html was added on branch FREESIDE_1_9_BRANCH on
-         2009-10-30 23:30:13 +0000
+       * FS/: FS.pm, FS/h_svc_pbx.pm, t/h_svc_pbx.t, MANIFEST:
+         h_svc_pbx.pm, RT#7322
 
-2009-10-30 16:29  ivan
+2010-02-08 07:37  jeff
 
-       * httemplate/elements/tr-select-part_event.html: file
-         tr-select-part_event.html was added on branch FREESIDE_1_9_BRANCH
-         on 2009-10-30 23:30:12 +0000
+       * FS/FS/Mason.pm, FS/FS/Schema.pm, FS/FS/export_device.pm,
+         FS/FS/part_device.pm, FS/FS/part_export.pm,
+         FS/FS/phone_device.pm, FS/FS/part_export/grandstream.pm,
+         FS/FS/part_export/netsapiens.pm, FS/t/export_device.t, Makefile,
+         FS/MANIFEST, httemplate/edit/part_device.html,
+         httemplate/edit/process/part_device.html,
+         httemplate/elements/checkboxes-table.html,
+         httemplate/misc/phone_device_config.html,
+         httemplate/view/svc_phone.cgi: grandstream device configuration
+         support #4220
 
-2009-10-30 16:29  ivan
+2010-02-05 18:57  ivan
 
-       * httemplate/elements/select-part_event.html,
-         httemplate/elements/tr-select-part_event.html,
-         FS/FS/cust_event.pm, FS/FS/cust_main_Mixin.pm,
-         httemplate/elements/select-payby.html,
-         httemplate/search/cust_event.html,
-         httemplate/search/report_cust_event.html: more reporting options
-         for failed billing events, RT#6447
+       * FS/FS/: cust_pkg_discount.pm, part_pkg/flat.pm: discount
+         reporting, RT#6679
 
-2009-10-30 11:55  ivan
+2010-02-05 18:54  ivan
 
-       * FS/FS/: pay_batch.pm, pay_batch/paymentech.pm: backporting recent
-         paymentech changes to _1_9_BRANCH
+       * FS/FS/Schema.pm, FS/FS/Mason.pm, FS/FS/cust_bill_pkg.pm,
+         FS/FS/cust_bill_pkg_discount.pm, FS/FS/cust_main.pm,
+         FS/FS/cust_pkg.pm, FS/FS.pm, FS/MANIFEST,
+         FS/FS/Report/Table/Monthly.pm, FS/t/cust_bill_pkg_discount.t,
+         httemplate/elements/menu.html,
+         httemplate/misc/delete-cust_pkg_discount.html,
+         httemplate/search/cust_bill_pkg_discount.html,
+         httemplate/search/cust_pkg_discount.html,
+         httemplate/search/report_cust_bill_pkg_discount.html,
+         httemplate/search/report_cust_pkg_discount.html: discount
+         reporting, RT#6679
 
-2009-10-30 11:51  ivan
+2010-02-04 19:02  ivan
 
-       * bin/: paymentech-download, paymentech-upload: adding paymentech-*
-         on _1_9_BRANCH
+       * httemplate/edit/process/cust_pkg_discount.html: discounts,
+         RT#6679
 
-2009-10-30 11:37  ivan
+2010-02-04 18:39  ivan
 
-       * FS/FS/: Conf.pm: add paymentech to batch config options
+       * httemplate/view/cust_main/order_pkg_link.html, FS/FS/cust_pkg.pm,
+         FS/FS/cust_pkg_discount.pm, FS/FS/discount.pm,
+         FS/FS/part_pkg/flat.pm, httemplate/edit/cust_pkg_discount.html,
+         httemplate/edit/discount.html,
+         httemplate/edit/process/discount.html,
+         httemplate/edit/process/quick-cust_pkg.cgi,
+         httemplate/elements/tr-select-discount.html,
+         httemplate/misc/order_pkg.html,
+         httemplate/view/cust_main/packages/status.html: discounts,
+         RT#6679
 
-2009-10-29 17:02  ivan
-
-       * httemplate/: browse/cust_main_county.cgi,
-         edit/bulk-cust_main_county.html,
-         edit/process/bulk-cust_main_county.html: bulk tax changes,
-         RT#6445
+2010-02-04 12:39  ivan
 
-2009-10-29 16:42  mark
+       * FS/FS/discount.pm, httemplate/edit/discount.html,
+         httemplate/elements/select-discount.html,
+         httemplate/elements/select-table.html,
+         httemplate/elements/tr-input-text.html,
+         httemplate/elements/tr-select-discount.html,
+         httemplate/elements/tr-select.html: discounts, RT#6679
 
-       * bin/paymentech-upload: add option to upload all open batches
+2010-02-04 02:00  ivan
 
-2009-10-29 16:42  ivan
+       * httemplate/edit/cust_main/top_misc.html, FS/FS/AccessRight.pm,
+         httemplate/elements/search-cust_main.html: add ability to edit
+         referring customer, RT#7174
 
-       * bin/paymentech-upload: file paymentech-upload was added on branch
-         FREESIDE_1_9_BRANCH on 2009-10-30 18:51:05 +0000
+2010-02-03 22:53  ivan
 
-2009-10-29 16:37  ivan
+       * httemplate/: elements/phonenumber.html, pref/pref-process.html,
+         pref/pref.html: snom autodial integration
 
-       * httemplate/edit/bulk-cust_main_county.html: friendlier error
-         message when you select nothing, RT#6445
+2010-02-03 20:48  ivan
 
-2009-10-29 16:36  ivan
+       * FS/FS/part_event/Condition/every.pm: fix SQL error with date
+         field when using this condition, RT#7218
 
-       * httemplate/elements/errorpage-popup.html: adding errorpage popup,
-         RT#6445
+2010-02-03 11:27  ivan
 
-2009-10-29 15:55  ivan
+       * FS/FS/cust_main.pm: better error msg for profiling
 
-       * FS/bin/freeside-queued: have freeside-queued be more resillient
-         in the face of a database that's gone away, RT#6428
+2010-02-02 18:16  ivan
 
-2009-10-29 15:18  mark
+       * FS/FS/svc_acct.pm: fix time limits getting double added if the
+         service is provisioned before first billing
 
-       * httemplate/edit/payment_gateway.html: add Jety to the list
+2010-01-30 23:04  ivan
 
-2009-10-28 12:04  ivan
+       * FS/FS/discount.pm: discounts, RT#6679
 
-       * FS/FS/: svc_Common.pm, svc_acct.pm, svc_domain.pm,
-         svc_forward.pm, svc_www.pm: fix problems using inventory for UID
-         (and other fields controlled by check in svc_acct and also
-         svc_www, svc_domain and svc_forward), RT#6366
+2010-01-30 19:00  ivan
 
-2009-10-28 11:16  ivan
+       * httemplate/browse/part_pkg_taxclass.html: fix header on report
 
-       * FS/FS/part_svc.pm: fix removing a flag from a service definition
-         column
+2010-01-30 18:57  ivan
 
-2009-10-28 10:26  ivan
+       * FS/FS/: part_pkg/agent.pm, part_pkg/bulk.pm,
+         cust_pkg_discount.pm, part_pkg/flat.pm,
+         part_pkg/flat_comission.pm, part_pkg/flat_comission_cust.pm,
+         part_pkg/flat_comission_pkg.pm, part_pkg/prorate.pm,
+         part_pkg/recur_Common.pm, part_pkg/rt_time.pm,
+         part_pkg/sesmon_hour.pm, part_pkg/sesmon_minute.pm,
+         part_pkg/sql_external.pm, part_pkg/sql_generic.pm,
+         part_pkg/sqlradacct_hour.pm, part_pkg/subscription.pm,
+         part_pkg/voip_sqlradacct.pm: discounts, RT#6679
 
-       * httemplate/misc/inventory_item-import.html: fix inventory upload,
-         RT#6366
+2010-01-30 15:00  ivan
 
-2009-10-27 23:13  ivan
+       * httemplate/: view/cust_main/packages/package.html,
+         edit/cust_pkg_discount.html, edit/process/cust_pkg_discount.html,
+         misc/delete-cust_pkg_discount.html,
+         view/cust_main/packages/status.html: discounts, RT#6679
 
-       * FS/FS/cust_pkg.pm, httemplate/misc/bulk_change_pkg.cgi,
-         httemplate/search/cust_pkg.cgi,
-         httemplate/search/report_cust_pkg.html,
-         httemplate/view/cust_main/packages.html: customer link to package
-         reports for that customer, RT#6180
+2010-01-30 12:05  ivan
 
-2009-10-27 11:11  ivan
+       * httemplate/: misc/cust-part_pkg.cgi, misc/order_pkg.html,
+         view/cust_main/packages.html, elements/select-part_pkg.html,
+         elements/select-table.html,
+         elements/tr-select-cust-part_pkg.html,
+         view/cust_main/order_pkg_link.html: discounts, RT#6679
 
-       * FS/FS/Conf.pm, FS/FS/cust_main.pm,
-         httemplate/elements/header.html: address1 search, RT#5060
+2010-01-30 00:55  ivan
 
-2009-10-26 16:20  ivan
+       * FS/FS/cust_pkg.pm, FS/FS/cust_pkg_discount.pm,
+         httemplate/edit/process/quick-cust_pkg.cgi,
+         httemplate/elements/select-discount.html,
+         httemplate/elements/tr-select-discount.html,
+         httemplate/misc/order_pkg.html,
+         httemplate/view/cust_main/packages/status.html,
+         httemplate/view/cust_main/packages/package.html: discounts,
+         RT#6679
 
-       * httemplate/elements/tr-select-pkg_class.html: didn't want to
-         revert that, though
+2010-01-29 23:55  ivan
 
-2009-10-26 16:17  ivan
+       * FS/FS/part_pkg/rt_time.pm: giving it a weight avoids weight use
+         of uninitialized value in sort messages in part_pkg.pm
 
-       * httemplate/elements/tr-select-pkg_class.html: better fix for
-         ignoring disabled package classes that doesn't search them twice
+2010-01-29 23:38  ivan
 
-2009-10-26 14:55  ivan
+       * FS/FS.pm, FS/MANIFEST, FS/FS/AccessRight.pm, FS/FS/Mason.pm,
+         FS/FS/Schema.pm, FS/FS/cust_pkg_discount.pm, FS/FS/discount.pm,
+         FS/FS/part_pkg.pm, FS/FS/part_pkg/flat.pm,
+         FS/t/cust_pkg_discount.t, FS/t/discount.t,
+         httemplate/browse/discount.html, httemplate/edit/discount.html,
+         httemplate/edit/elements/edit.html,
+         httemplate/edit/process/discount.html,
+         httemplate/elements/menu.html,
+         httemplate/elements/tr-input-text.html: discounts, RT#6679
 
-       * FS/FS/cust_bill_pkg.pm: turn off debugging
+2010-01-29 12:21  ivan
 
-2009-10-25 18:11  ivan
+       * FS/FS/Conf.pm: add Cleartext-Password to radius-password export
+         options, RT#7150
 
-       * FS/FS/part_pkg/flat.pm: eliminiate noisy but harmless "Use of
-         uninitialized value in numeric gt (>)" warning
+2010-01-29 11:52  ivan
 
-2009-10-25 16:30  ivan
+       * FS/FS/part_export/thirdlane.pm: ssl option
 
-       * FS/FS/: cust_main.pm, ClientAPI/MyAccount.pm: add apply option to
-         realtime_collect, RT#5071
+2010-01-26 21:27  ivan
 
-2009-10-24 16:37  ivan
+       * FS/FS/part_export/thirdlane.pm: URI escape pw, RT#7051
 
-       * bin/paymentech-download: file paymentech-download was added on
-         branch FREESIDE_1_9_BRANCH on 2009-10-30 18:51:05 +0000
+2010-01-26 21:21  ivan
 
-2009-10-24 16:37  mark
+       * FS/FS/part_export/thirdlane.pm: add port option, RT#7051
 
-       * bin/: paymentech-download, paymentech-upload: Scripts for
-         paymentech batch transfer
+2010-01-26 02:40  ivan
 
-2009-10-23 19:04  ivan
+       * FS/FS/svc_pbx.pm: deleting an svc_pbx unlinks svc_phones and
+         deletes svc_accts, RT#7051
 
-       * FS/FS/ClientAPI/MyAccount.pm,
-         fs_selfservice/FS-SelfService/cgi/decline.html,
-         fs_selfservice/FS-SelfService/cgi/login.html,
-         fs_selfservice/FS-SelfService/cgi/selfservice.cgi,
-         fs_selfservice/FS-SelfService/cgi/signup.cgi,
-         fs_selfservice/FS-SelfService/cgi/signup.html,
-         fs_selfservice/FS-SelfService/cgi/success.html: remove an
-         inadvertant debugging call left in, allow an agentnum to be
-         specfied for non-logged in situations, RT#6166
+2010-01-26 02:34  ivan
 
-2009-10-23 17:34  ivan
+       * FS/FS/part_export/thirdlane.pm: admin operations from svc_acct
+         records
 
-       * FS/: FS/Conf.pm, FS/ClientAPI/MyAccount.pm,
-         FS/ClientAPI/Signup.pm, bin/freeside-selfservice-server:
-         selfservice per-agent skinning
+2010-01-26 02:05  ivan
 
-2009-10-23 17:16  ivan
+       * FS/FS/svc_acct.pm, httemplate/edit/process/svc_acct.cgi: more
+         fallout from default pw encryption: fix error reporting when
+         entering a bad password
 
-       * FS/FS/agent.pm: eliminate warnings from Business::CreditCard
-         about being passed an empty number
+2010-01-26 00:35  ivan
 
-2009-10-23 17:04  ivan
+       * FS/FS/: svc_pbx.pm, part_export/thirdlane.pm: svc_pbx.title
+         uniqueness (kludgy) and force to alphanumeric+space and 19 char
+         max when using thirdlane (conservative guess for 1st pass
+         implementation), RT#7051
 
-       * FS/FS/Record.pm: fix cause of harmless 'Premature end of base64
-         data' warning
+2010-01-26 00:18  ivan
 
-2009-10-22 18:41  ivan
+       * FS/FS/svc_pbx.pm: label isn't thirdlane-specific, RT#7051
 
-       * FS/FS/: Conf.pm, cust_pkg.pm: add cust_bill-consolidate_services
-         config to collapse multiple phone numbers (or whatever) into as
-         few lines as possible on invoices, RT#5223
+2010-01-25 23:15  ivan
 
-2009-10-22 15:11  ivan
+       * FS/FS/part_export/thirdlane.pm: figured out success/failure
+         reporting, and wrote DID creation/deletion/assign/unassign,
+         RT#7051
 
-       * FS/FS/cust_bill.pm: fix invoice sub-totals, RT#6489
+2010-01-25 22:15  ivan
 
-2009-10-22 01:08  ivan
+       * FS/FS/part_export/thirdlane.pm: initial thirdlane export w/tenant
+         insert/delete/replace, RT#7051
 
-       * httemplate/search/svc_phone.cgi: should at least run under pg 8.3
-         now, need to test & see if the data make sense, RT#5496
+2010-01-25 22:14  ivan
 
-2009-10-21 22:32  ivan
+       * FS/FS/svc_pbx.pm: fix label method and doc work
 
-       * FS/FS/cust_bill_pkg_display.pm: fix incompatibility
-         w/invoice_sections vs. cust_bill_pkg.pkgnum -1 "virtual line
-         item" (rare)
+2010-01-25 22:14  ivan
 
-2009-10-21 17:28  ivan
+       * FS/FS/svc_Common.pm: remove debugging
 
-       * FS/FS/Schema.pm, bin/cdr-netsapiens.import: fix netsapiens CDR
-         import, RT#5226
+2010-01-25 20:47  jayce
 
-2009-10-21 00:09  ivan
+       * FS/FS/: part_pkg/rt_time.pm, TicketSystem/RT_External.pm: First
+         version of RT Billing pkg.  Basic concept is if a customer has
+         this package, then any time added to ticket comments in RT will
+         be added up and multiplied by the base rate, with each entry
+         showing up as a lineitem on their next invoice.
 
-       * FS/FS/Schema.pm: MySQL doesn't like indexing a text field
+         This has not been used in production yet by anybody, it was just
+         a proposal done for a customer.   Modified Files:
+         TicketSystem/RT_External.pm   Added Files:
+         part_pkg/rt_time.pm
 
-2009-10-20 23:34  ivan
+2010-01-25 14:14  ivan
 
-       * httemplate/search/prepay_credit.html: fix agent link in unused
-         prepaid card report
+       * httemplate/elements/select-svc_pbx.html,
+         httemplate/elements/tr-select-svc_pbx.html, FS/FS/Schema.pm,
+         FS/FS/svc_Common.pm, FS/FS/svc_acct.pm, FS/FS/svc_pbx.pm,
+         FS/FS/svc_phone.pm, httemplate/edit/part_svc.cgi,
+         httemplate/edit/svc_acct.cgi, httemplate/edit/svc_phone.cgi,
+         httemplate/edit/elements/edit.html,
+         httemplate/edit/elements/svc_Common.html,
+         httemplate/view/svc_acct.cgi, httemplate/view/svc_phone.cgi:
+         linking DIDs and users to PBXes, RT#7051
 
-2009-10-20 16:24  ivan
+2010-01-25 09:41  ivan
 
-       * FS/FS/cust_bill_pay_pkg.pm: should fix problems sending a receipt
-         against a specific package when taxes are in use
+       * httemplate/edit/part_svc.cgi, FS/MANIFEST, FS/FS/Mason.pm,
+         FS/FS/Schema.pm: initial svc_pbx implementation, RT#7051
 
-2009-10-20 13:47  ivan
+2010-01-25 09:35  ivan
 
-       * bin/cdr-netsapiens.import: basic import working, still need
-         better src/dst mapping, RT#5226
+       * FS/: FS/svc_pbx.pm, t/svc_pbx.t: initial svc_pbx implementation,
+         RT#7051
 
-2009-10-20 13:43  ivan
+2010-01-24 16:31  ivan
 
-       * FS/FS/part_export/netsapiens.pm: better debug line showing full
-         URL, RT#5226
+       * FS/FS/svc_acct.pm: fix password length checks from applyhing to
+         already-crypted legacy passwords, RT#7139
 
-2009-10-20 11:30  ivan
+2010-01-24 14:38  ivan
 
-       * fs_selfservice/FS-SelfService/cgi/change_pay.html: don't show
-         duplicate 'Credit card' or 'Check' choices even when
-         signup_server-payby has CARD & DCRD (or CHEK & DCHK)
+       * httemplate/elements/: overlibmws.js, overlibmws_crossframe.js,
+         overlibmws_draggable.js, overlibmws_iframe.js: update overlib to
+         upstream v281 (jan 20, 2010)
 
-2009-10-16 15:39  ivan
+2010-01-24 12:37  ivan
 
-       * FS/FS/cust_bill_pkg.pm: make warning about expensive lookup a
-         carp & controlled by $DEBUG
+       * FS/FS/UI/Web.pm: right-align customer # in reports
 
-2009-10-12 07:11  ivan
+2010-01-24 11:53  ivan
 
-       * bin/cdr-netsapiens.import: finish netsapiens import, RT#6365
+       * httemplate/search/cust_bill.html: fix alignment of customer data
 
-2009-10-12 06:09  ivan
+2010-01-24 11:52  ivan
 
-       * FS/FS/part_export/shellcommands.pm: terrible typo
+       * httemplate/search/cust_bill_pay.html: separate out the invoice
+         and payment info into multiple columns, and fix application date
+         showing as payment date
 
-2009-10-12 05:50  ivan
+2010-01-21 00:54  ivan
 
-       * FS/FS/part_export/shellcommands.pm: add customer information to
-         shellcommands export, RT#5351
+       * FS/FS/Conf.pm: correct description for selfservice-body_footer
 
-2009-10-12 02:10  ivan
+2010-01-21 00:38  ivan
 
-       * fs_selfservice/FS-SelfService/cgi/: signup.cgi, signup.html: use
-         modules in signup.cgi instead of in the template, fixes "Insecure
-         dependency in rquire"
+       * fs_selfservice/FS-SelfService/cgi/selfservice.cgi: more
+         self-service skinning config options, and start taking a stab at
+         reorganizing config sections, RT#6893
 
-2009-10-11 23:48  ivan
+2010-01-21 00:34  ivan
 
-       * FS/FS/ClientAPI/MyAccount.pm,
+       * fs_selfservice/FS-SelfService/cgi/ach_payment_results.html,
+         fs_selfservice/FS-SelfService/cgi/change_bill.html,
+         fs_selfservice/FS-SelfService/cgi/change_password.html,
+         fs_selfservice/FS-SelfService/cgi/change_pay.html,
+         fs_selfservice/FS-SelfService/cgi/change_ship.html,
+         fs_selfservice/FS-SelfService/cgi/customer_change_pkg.html,
+         fs_selfservice/FS-SelfService/cgi/customer_order_pkg.html,
+         fs_selfservice/FS-SelfService/cgi/delete_svc.html,
+         fs_selfservice/FS-SelfService/cgi/header.html,
+         fs_selfservice/FS-SelfService/cgi/make_ach_payment.html,
+         fs_selfservice/FS-SelfService/cgi/make_payment.html,
+         fs_selfservice/FS-SelfService/cgi/make_thirdparty_payment.html,
          fs_selfservice/FS-SelfService/cgi/myaccount.html,
-         fs_selfservice/FS-SelfService/cgi/myaccount_menu.html: fix
-         inadvertant "unknown package" error, fallout from pkg-balance
-         work, RT#6125
+         fs_selfservice/FS-SelfService/cgi/myaccount_menu.html,
+         fs_selfservice/FS-SelfService/cgi/order_pkg.html,
+         fs_selfservice/FS-SelfService/cgi/payment_results.html,
+         fs_selfservice/FS-SelfService/cgi/process_change_bill.html,
+         fs_selfservice/FS-SelfService/cgi/process_change_password.html,
+         fs_selfservice/FS-SelfService/cgi/process_change_pay.html,
+         fs_selfservice/FS-SelfService/cgi/process_change_pkg.html,
+         fs_selfservice/FS-SelfService/cgi/process_change_ship.html,
+         fs_selfservice/FS-SelfService/cgi/process_order_pkg.html,
+         fs_selfservice/FS-SelfService/cgi/process_order_recharge.html,
+         fs_selfservice/FS-SelfService/cgi/process_svc_acct.html,
+         fs_selfservice/FS-SelfService/cgi/process_svc_external.html,
+         fs_selfservice/FS-SelfService/cgi/provision.html,
+         fs_selfservice/FS-SelfService/cgi/provision_svc_acct.html,
+         fs_selfservice/FS-SelfService/cgi/recharge_prepay.html,
+         fs_selfservice/FS-SelfService/cgi/recharge_results.html,
+         fs_selfservice/FS-SelfService/cgi/view_cdr_details.html,
+         fs_selfservice/FS-SelfService/cgi/view_invoice.html,
+         fs_selfservice/FS-SelfService/cgi/view_usage.html,
+         fs_selfservice/FS-SelfService/cgi/view_usage_details.html,
+         fs_selfservice/FS-SelfService/cgi/image.cgi,
+         FS/FS/ClientAPI/MyAccount.pm, httemplate/config/config-view.cgi,
+         FS/FS/Conf.pm: more self-service skinning config options, and
+         start taking a stab at reorganizing config sections, RT#6893
 
-2009-10-11 23:43  ivan
+2010-01-20 17:25  ivan
 
-       * FS/FS/part_event/Action/: cust_bill_fee_percent.pm, fee.pm: fix
-         for no finance_pkgclass set
+       * FS/: FS/ClientAPI.pm, FS/Mason.pm,
+         bin/freeside-selfservice-server: fix self-service fallout from RT
+         3.8, RT#6640
 
-2009-10-10 19:41  ivan
+2010-01-19 15:11  jeff
 
-       * ChangeLog, debian/changelog: Updated for 1.9.1
+       * FS/FS/part_export/prizm.pm: SM in new window
 
-2009-10-10 18:57  ivan
+2010-01-19 09:48  jeff
 
-       * ChangeLog, rpm/freeside.spec, debian/changelog: Updated for 1.9.1
+       * FS/FS/cust_main.pm: eliminate harmless uninitialized value noise
 
-2009-10-10 18:50  ivan
+2010-01-18 20:54  ivan
 
-       * Makefile, bin/cvs2cl: helps to have the tool
+       * FS/FS/pay_batch/paymentech.pm: patch from Peter Loeppky to make
+         sure some xml fields don't get larger than what paymentech wants
 
-2009-10-10 18:48  ivan
+2010-01-18 19:24  mark
 
-       * Makefile: do it
+       * httemplate/search/elements/search-csv.html: Fix mime type for CSV
+         files, RT#1526
 
-2009-10-10 18:48  ivan
+2010-01-18 18:09  jeff
 
-       * rt/lib/RT.pm: huh #2
+       * FS/FS/part_export/domreg_opensrs.pm: don't really need debugging
+         on
 
-2009-10-10 18:46  ivan
+2010-01-18 18:03  jeff
 
-       * rt/Makefile: huh
+       * FS/FS/: cust_bill_ApplicationCommon.pm,
+         part_export/domreg_opensrs.pm: debugged and tested opensrs export
 
-2009-10-10 18:45  ivan
+2010-01-18 16:13  ivan
 
-       * httemplate/search/elements/search-html.html: don't try to follow
-         a blank redirect
+       * httemplate/search/cust_bill_pkg.cgi: fix color/style after
+         removal of billpkgnum display
 
-2009-10-10 18:45  ivan
+2010-01-16 22:40  ivan
 
-       * httemplate/search/report_cdr.html: end form
+       * FS/FS/ClientAPI/MasonComponent.pm: fix for
+         selfservice_server-base_url without a trailing /
 
-2009-10-10 18:45  ivan
+2010-01-16 19:31  ivan
 
-       * httemplate/elements/tr-textarea.html: new rows and cols options
+       * FS/FS/cust_main.pm: return an error for 0 amount payments to
+         avoid a $0 payment getting stuck in declined or captured status,
+         RT#6993
 
-2009-10-10 18:44  ivan
+2010-01-16 18:34  ivan
 
-       * httemplate/elements/tr-select-pkg_class.html: respect
-         element_name
+       * FS/FS/svc_phone.pm: strip non-digits and 1- when searching for
+         phone numbers, RT#7000
 
-2009-10-10 18:43  ivan
+2010-01-16 18:22  ivan
 
-       * httemplate/browse/agent.cgi: cleanup
+       * FS/FS/: svc_acct.pm: remove svcnum from searchable fields for
+         svc_acct... custnum and invnum are user-visible, other database
+         ids, not so much.  also, breaks phone number search w/current Pg,
+         RT#7000
 
-2009-10-10 18:42  ivan
+2010-01-16 17:20  ivan
 
-       * eg/cdr_template.pm, httemplate/elements/selectlayers.html: doc
+       * ChangeLog: preparing for 2.1.0
 
-2009-10-10 18:41  ivan
+2010-01-16 16:22  jeff
 
-       * FS/FS/part_export/globalpops_voip.pm: correct variable
-         initialization
+       * FS/FS/cust_pkg.pm: work around bug in pre-perl5.10 which is at
+         best noisy and at worst missorting
 
-2009-10-10 18:40  ivan
+2010-01-16 15:39  ivan
 
-       * FS/FS/: access_right.pm, access_usergroup.pm,
-         clientapi_session_field.pm, cust_svc_option.pm: remembered to
-         customize this manpage
+       * FS/FS/part_pkg/: cdr_termination.pm: add usage_mandate option to
+         termination price plan, RT#6932
 
-2009-10-10 18:39  ivan
+2010-01-16 15:06  ivan
 
-       * FS/FS/Record.pm: ::1 becomes 127.0.0.1 in IP checks
+       * httemplate/search/cust_svc.html: fix searching for unlinked
+         services?  RT#7059
 
-2009-10-09 20:22  ivan
+2010-01-14 19:59  ivan
 
-       * ChangeLog: commit message for a file about commitmessages
+       * httemplate/edit/process/part_pkg.cgi: remove extraneous debugging
 
-2009-10-09 16:59  ivan
+2010-01-12 19:14  ivan
 
-       * FS/FS/Schema.pm, FS/FS/cust_main.pm,
-         httemplate/edit/cust_main/billing.html,
-         httemplate/elements/select-terms.html, FS/FS/cust_bill.pm,
-         httemplate/edit/quick-charge.html,
-         httemplate/edit/process/quick-charge.cgi: change invoice terms
-         for one-time charges (& bill them immediately), RT#5891
+       * FS/FS/tax_rate.pm: if ignore_icalculable_taxes is on, don't call
+         the errors fatal
 
-2009-10-09 14:37  ivan
+2010-01-12 09:08  jeff
 
-       * FS/FS/cust_main.pm: add cust_pkg_ref option to charge
+       * FS/FS/part_export/prizm.pm: add some debugging
 
-2009-10-08 01:28  ivan
+2010-01-12 08:40  jeff
 
-       * httemplate/view/cust_main/packages.html: fix "show old packages"
-         accidentally hiding cancelled packages, RT#5276
+       * FS/FS/part_export/prizm.pm: eliminate harmless argument isn't
+         numeric messages
 
-2009-10-07 23:00  ivan
+2010-01-09 15:41  ivan
 
-       * FS/FS/: cust_main.pm, Cron/bill.pm: freeside-daily -g and -m
-         cooperation (and no HASH() queue noise with -m)
+       * rt/etc/RT_SiteConfig.pm: QuickCreateLong obsolete with the better
+         quick create in 3.8
 
-2009-10-07 22:44  ivan
+2010-01-09 15:36  ivan
 
-       * FS/FS/: cust_bill.pm, cust_main.pm: avoid some (look to be
-         harmless) warnings:
+       * rt/: etc/RT_SiteConfig.pm, lib/RT/Config.pm, FREESIDE_MODIFIED,
+         etc/RT_Config.pm, etc/RT_Config.pm.in: add a "freeside2.1"
+         stylesheet to isolate our skinning changes
 
-         Argument "" isn't numeric in sprintf at
-         /usr/local/share/perl/5.10.0/FS/cust_bill.pm line 2358.
+2010-01-09 15:03  ivan
 
-         Argument "" isn't numeric in subtraction (-) at
-         /usr/local/share/perl/5.10.0/FS/cust_bill.pm line 2359.
+       * rt/html/NoAuth/images/small-logo.png: removing HTML files in old
+         location wrt RT 3.8
 
-         Argument "" isn't numeric in addition (+) at
-         /usr/local/share/perl/5.10.0/FS/cust_main.pm line 2788.
+2010-01-09 14:53  ivan
 
-2009-10-07 22:09  ivan
+       * rt/html/NoAuth/css/3.5-default/freeside.css: removing HTML files
+         in old location wrt RT 3.8
 
-       * FS/FS/cust_bill.pm: tyop
+2010-01-09 14:48  ivan
 
-2009-10-07 18:15  ivan
+       * Makefile, rt/FREESIDE_MODIFIED, rt/sbin/rt-setup-database.in:
+         fixup initial RT setup for 3.8
 
-       * FS/FS/Conf.pm, FS/FS/cust_bill.pm, conf/invoice_html,
-         conf/invoice_latex: conf switches to turn on smaller notes and
-         footer sections with stock templates, RT#5218
+2010-01-09 02:03  ivan
 
-2009-10-07 16:51  ivan
+       * FS/FS/Record.pm: need DBIx::DBSchema w/quoted_default to make
+         this all work right :/
 
-       * httemplate/view/cust_statement.html: naming follow-up notices
-         from the event rather than creting a slew of separate templates,
-         RT#5217
+2010-01-09 00:21  ivan
 
-2009-10-07 16:44  ivan
-
-       * FS/FS/cust_bill.pm, httemplate/misc/send-invoice.cgi,
-         httemplate/misc/send-statement.cgi,
-         httemplate/search/cust_event.html,
-         FS/FS/part_event/Action/cust_bill_send_reminder.pm,
-         conf/invoice_html, conf/invoice_latex, conf/invoice_template,
-         httemplate/view/cust_bill-pdf.cgi,
-         httemplate/view/cust_bill-ps.cgi, httemplate/view/cust_bill.cgi,
-         httemplate/view/cust_statement.html: naming follow-up notices
-         from the event rather than creting a slew of separate templates,
-         RT#5217
-
-2009-10-06 17:43  ivan
-
-       * FS/FS/Conf_compat17.pm: bring up-to-date wrt 1.7 Conf.pm
-         1.180.2.52 (2009-10-03), RT#2873
-
-2009-10-06 16:51  ivan
-
-       * FS/FS/cust_bill_pkg.pm: remove inadvertant debugging warnings
-
-2009-10-06 08:49  jeff
-
-       * httemplate/edit/router.cgi: replace disappearing line
-
-2009-10-05 16:36  ivan
-
-       * FS/FS/svc_acct.pm: remove annoying warning: Use of uninitialized
-         value $FS::svc_acct::passwordmin in pattern match (m//) at
-         /usr/local/share/perl/5.10.0/FS/svc_acct.pm line 60.
-
-2009-10-05 11:17  ivan
-
-       * httemplate/misc/payment.cgi: oops, handle old cust_main.pm
-         properly (should we be bothering?) :/ RT#5889
-
-2009-10-05 09:57  ivan
-
-       * httemplate/view/cust_main/payment_history/voided_payment.html:
-         doh, fix error viewing voided payments, RT#6382
-
-2009-10-05 08:07  jeff
-
-       * httemplate/elements/tr-select-pkg_class.html: remove unused
-         option that DTWT
-
-2009-10-05 07:04  jeff
-
-       * httemplate/edit/cust_main/: bottomfixup.js,
-         choose_tax_location.html, contact.html: low hanging fruit:
-         improvement in tax location selection RT#6000
-
-2009-10-05 07:01  jeff
-
-       * httemplate/edit/router.cgi: low hanging fruit: restore router
-         virtual fields (and svcnum) in 1.9 RT#5960
-
-2009-10-04 19:40  ivan
-
-       * httemplate/misc/payment.cgi: add manual_process-skip_first
-         option, RT#5889
-
-2009-10-04 19:35  ivan
-
-       * FS/FS/Conf.pm, FS/FS/cust_main.pm, httemplate/misc/payment.cgi:
-         add manual_process-skip_first option, RT#5889
-
-2009-10-04 19:16  ivan
-
-       * FS/FS/Conf.pm, httemplate/misc/payment.cgi,
-         httemplate/misc/process/payment.cgi: add manual_process-display
-         config to subtract fee from amount instead of adding, RT#5889
-
-2009-10-04 18:40  jeff
-
-       * conf/invoice_html: can't revert because windows is ghei
-
-2009-10-04 18:07  jeff
-
-       * FS/FS/cust_main.pm: don't consider setup or recurring taxes when
-         billing usage on cancel
-
-2009-10-04 18:00  jeff
-
-       * FS/FS/: cust_bill.pm, cust_main.pm, part_pkg/voip_cdr.pm:
-         invoices with details in separate section but usage not separated
-
-2009-10-04 17:49  jeff
-
-       * FS/FS/Conf.pm, FS/FS/Schema.pm, FS/FS/Upgrade.pm,
-         FS/FS/cust_bill.pm, conf/invoice_html, conf/invoice_htmlsummary,
-         conf/invoice_latex, conf/invoice_latexsummary,
-         FS/FS/cust_bill_pkg.pm, FS/FS/cust_bill_pkg_display.pm,
-         FS/FS/cust_main.pm, FS/FS/pkg_category.pm,
-         FS/FS/part_event/Action/cust_bill_fee_percent.pm,
-         FS/FS/part_event/Action/fee.pm,
-         httemplate/browse/pkg_category.html,
-         httemplate/edit/pkg_category.html: leading summary page invoices
-         #RT5086
-
-2009-10-04 16:36  ivan
-
-       * fs_selfservice/FS-SelfService/cgi/selfservice.cgi: fix the same
-         problem with processing payments & masked ACH amounts, RT#6374
-
-2009-10-04 16:31  ivan
-
-       * FS/FS/ClientAPI/MyAccount.pm: fix problems "re-saving" a masked
-         card.  hopefully the last of it!
-
-2009-10-03 19:09  ivan
-
-       * httemplate/misc/delete-cust_bill.html: delete invoices, RT#4048
-
-2009-10-03 19:04  ivan
-
-       * FS/FS/AccessRight.pm, FS/FS/Conf.pm, FS/FS/Setup.pm,
-         FS/FS/cust_bill.pm, FS/FS/cust_bill_pkg.pm,
-         FS/bin/freeside-addgroup, bin/mapsecrets2access_user,
-         httemplate/view/cust_bill.cgi,
-         httemplate/view/cust_main/payment_history.html,
-         httemplate/view/cust_main/payment_history/invoice.html: delete
-         invoices, RT#4048
-
-2009-10-03 17:08  ivan
-
-       * httemplate/view/cust_main.cgi: more room for cancellation reason
-
-2009-10-03 17:07  ivan
-
-       * httemplate/elements/popup_link-cust_main.html: doc
-
-2009-10-03 15:09  ivan
-
-       * httemplate/edit/part_bill_event.cgi: cancel to 80, comp @ 90,
-         RT#5674
-
-2009-10-03 15:06  ivan
-
-       * httemplate/edit/part_bill_event.cgi: in old invoice events,
-         chance default weight of cancel event to 90 so you can place it
-         at the same time as a realtime event, RT#5674
-
-2009-10-03 13:22  mark
-
-       * FS/FS/: pay_batch.pm, pay_batch/paymentech.pm: Load XML::Simple
-         at runtime to avoid breakage
-
-2009-10-01 16:48  ivan
-
-       * FS/FS/cust_main.pm: hopefully fully fix bulk email errors when
-         selecting a single payby
-
-2009-10-01 16:01  ivan
-
-       * FS/FS/Schema.pm: allow svc_acct._password to be NULL in the
-         schema
-
-2009-10-01 15:02  ivan
-
-       * httemplate/view/cust_main/payment_history/voided_payment.html:
-         consistency with un-voided payments wrt display
-
-2009-09-30 17:52  ivan
-
-       * fs_selfservice/FS-SelfService/cgi/selfservice.cgi: hopefully the
-         really final fix for the problems using remembered cards in
-         self-service. *sigh*
-
-2009-09-30 17:29  ivan
-
-       * FS/: FS/Conf.pm, FS/Cron/check.pm, bin/freeside-check: add login
-         check to FS::ClientAPI::SG/SGNG checks. RT#4610
-
-2009-09-30 12:33  ivan
-
-       * fs_selfservice/FS-SelfService/cgi/selfservice.cgi: hopefully the
-         final fix for the problems using remembered cards in self-service
+       * FS/bin/freeside-upgrade: undo damage from DBIx::DBSchema 0.37_03
 
-2009-09-29 15:08  ivan
+2010-01-08 08:05  jeff
 
-       * httemplate/misc/email-customers.html: should fix newsletter
-         sending error when you select a single payby only
+       * Makefile, htetc/freeside-base1.99.conf,
+         htetc/freeside-base1.conf, htetc/freeside-base2.conf,
+         htetc/htpasswd.logout, httemplate/elements/header.html,
+         httemplate/elements/logout.html,
+         httemplate/elements/rs_init_object.html,
+         httemplate/elements/xmlhttp.html: add a logout link (RT 1330 &
+         5518)
 
-2009-09-28 23:17  ivan
+2010-01-07 01:48  mark
 
-       * FS/t/cust_attachment.t: forgot
+       * FS/FS/: pay_batch.pm, pay_batch/RBC.pm: Fix problems with RBC
+         batch import (RT#6967)
 
-2009-09-28 15:45  ivan
+2010-01-05 20:47  ivan
 
-       * FS/FS/Cron/check.pm: more accurate SG check, RT#4610
+       * FS/FS/svc_acct.pm: eliminate spurious warnings on usage
+         changes...
 
-2009-09-28 15:35  ivan
+2010-01-05 20:43  ivan
 
-       * FS/: FS/Cron/check.pm, bin/freeside-check: correct place for use
-         Email::Send, RT#4610
+       * FS/FS/cust_main.pm: eliminate ya "use of uninitialized value"
+         warning
 
-2009-09-28 15:23  ivan
+2010-01-05 20:41  ivan
 
-       * FS/FS/Cron/check.pm: oops, hopefully fix sg cron check, RT#4610
+       * FS/FS/cust_main.pm: doc
 
-2009-09-28 08:55  jeff
+2010-01-03 20:13  jeff
 
-       * FS/FS/cust_pkg.pm: use object copy when billing on cancel to
-         avoid very weird side effects ( including 'impossible' history )
-         RT#5723
+       * FS/FS/Conf.pm, FS/FS/cust_bill_ApplicationCommon.pm,
+         FS/FS/part_export/domreg_opensrs.pm, bin/opensrs_domain_pkgs:
+         untested triggering of export on payments, requires config enable
+         (RT5825)
 
-2009-09-25 05:29  ivan
+2010-01-03 19:23  jeff
 
-       * FS/FS/Conf.pm, httemplate/config/config-view.cgi,
-         httemplate/config/config.cgi,
-         httemplate/config/config-process.cgi,
-         httemplate/misc/payment.cgi, httemplate/misc/process/payment.cgi:
-         processing fee on credit card recharges, RT#5889
+       * bin/monitor: add some debugging
 
-2009-09-25 03:29  ivan
+2010-01-03 00:04  ivan
 
-       * FS/FS/Conf.pm: this one too
+       * rt/: html/Elements/AddCustomers, html/Elements/EditCustomers,
+         html/Ticket/ModifyCustomers.html,
+         html/Elements/FreesideInvoiceSearch,
+         html/Elements/FreesideNewCust, html/Elements/FreesideSearch,
+         html/Elements/FreesideSvcSearch, FREESIDE_MODIFIED: port
+         skinning, customer display/edit from RT 3.6 integration to RT 3.8
+         integration
 
-2009-09-25 03:14  ivan
+2010-01-02 23:40  ivan
 
-       * FS/FS/Conf.pm, FS/FS/svc_acct.pm, FS/FS/ClientAPI/Signup.pm,
-         fs_selfservice/FS-SelfService/cgi/signup.cgi,
-         fs_selfservice/FS-SelfService/cgi/signup.html,
-         httemplate/config/config-process.cgi,
-         httemplate/config/config-view.cgi, httemplate/config/config.cgi,
-         httemplate/elements/select-part_svc.html,
-         httemplate/elements/select-table.html,
-         httemplate/elements/tr-select-part_svc.html: nomadix, RT#5876
+       * htetc/: freeside-base1.99.conf, freeside-base1.conf,
+         freeside-base2.conf, handler.pl: port skinning, customer
+         display/edit from RT 3.6 integration to RT 3.8 integration
 
-2009-09-24 19:30  mark
+2010-01-02 22:42  ivan
 
-       * FS/FS/pay_batch.pm, FS/FS/Conf.pm, FS/FS/pay_batch/BoM.pm,
-         FS/FS/pay_batch/PAP.pm, FS/FS/pay_batch/ach_spiritone.pm,
-         FS/FS/pay_batch/chase_canada.pm, FS/FS/pay_batch/paymentech.pm,
-         FS/FS/pay_batch/td_canada_trust.pm,
-         httemplate/misc/download-batch.cgi,
-         httemplate/search/cust_pay_batch.cgi: Batch payment refactoring
+       * rt/html/Ticket/Elements/: AddCustomers, EditCustomers,
+         ShowCustomers: moved to new location in RT 3.8
 
-2009-09-24 18:04  mark
+2010-01-02 22:24  ivan
 
-       * FS/MANIFEST: Add cust_attachment
+       * FS/FS/TicketSystem/RT_Internal.pm: attempt to get more
+         information on errors using an RT-instansiated session??
 
-2009-09-24 12:59  ivan
+2010-01-02 19:07  ivan
 
-       * FS/FS/: Cron/check.pm, Conf.pm: get the ping username/pass from a
-         config, good enough, RT#4610
+       * Makefile, FS/FS/Mason.pm, FS/FS/Mason/Request.pm,
+         rt/etc/RT_SiteConfig.pm: can't we all just get along (with RT
+         3.8.7)?
 
-2009-09-23 20:14  ivan
+2009-12-31 15:03  mark
 
-       * FS/FS/Cron/check.pm, FS/bin/freeside-check,
-         FS/FS/ClientAPI/SGNG.pm,
-         fs_selfservice/FS-SelfService/SelfService.pm: add SG and SGNG
-         ping, RT#4610
+       * FS/FS/pay_batch/RBC.pm: Add pre-header line
 
-2009-09-23 16:47  ivan
+2009-12-31 06:31  ivan
 
-       * FS/FS/TicketSystem/RT_External.pm: this should fix the occasional
-         extra ticket showing up on wrong customer record
+       * rt/: Makefile, Makefile.in: prevent fatality
 
-2009-09-21 20:08  ivan
+2009-12-31 06:11  ivan
 
-       * FS/FS/Mason.pm: add addl_comp_root.pl and addl_handler_use.pl
-         config files, RT#4743
+       * rt/Makefile: otherwise it aborts bitchinga bout missing
+         schema.Oracle
 
-2009-09-21 13:48  ivan
+2009-12-31 06:08  ivan
 
-       * FS/FS/cust_bill.pm: i think it is new Pg (or... new Record.pm???)
-         that causes this problem... before it just returned nothing for
-         the search instead of erroring out?
+       * rt/: Makefile, config.status: install-sh????
 
-2009-09-20 23:05  ivan
+2009-12-31 05:59  ivan
+
+       * rt/: .gitignore, Makefile, config.status, bin/mason_handler.fcgi,
+         bin/mason_handler.scgi, bin/mason_handler.svc, bin/rt-crontool,
+         bin/rt-mailgate, etc/RT_Config.pm, etc/RT_Config.pm.in,
+         etc/RT_SiteConfig.pm, etc/schema.Pg, etc/schema.mysql,
+         html/autohandler, html/index.html, html/l,
+         html/Admin/autohandler, html/Admin/index.html,
+         html/Admin/CustomFields/GroupRights.html,
+         html/Admin/CustomFields/Modify.html,
+         html/Admin/CustomFields/Objects.html,
+         html/Admin/CustomFields/UserRights.html,
+         html/Admin/CustomFields/index.html,
+         html/Admin/Elements/AddCustomFieldValue,
+         html/Admin/Elements/ConfigureMyRT,
+         html/Admin/Elements/CreateUserCalled,
+         html/Admin/Elements/CustomFieldTabs,
+         html/Admin/Elements/EditCustomField,
+         html/Admin/Elements/EditCustomFieldValues,
+         html/Admin/Elements/EditCustomFields,
+         html/Admin/Elements/EditQueueWatchers,
+         html/Admin/Elements/EditScrip, html/Admin/Elements/EditScrips,
+         html/Admin/Elements/EditTemplates,
+         html/Admin/Elements/EditUserComments,
+         html/Admin/Elements/GlobalCustomFieldTabs,
+         html/Admin/Elements/GroupTabs, html/Admin/Elements/Header,
+         html/Admin/Elements/ListGlobalCustomFields,
+         html/Admin/Elements/ListGlobalScrips,
+         html/Admin/Elements/ModifyTemplate,
+         html/Admin/Elements/ObjectCustomFields,
+         html/Admin/Elements/PickCustomFields,
+         html/Admin/Elements/PickObjects,
+         html/Admin/Elements/QueueRightsForUser,
+         html/Admin/Elements/QueueTabs,
+         html/Admin/Elements/SelectCustomFieldLookupType,
+         html/Admin/Elements/SelectCustomFieldType,
+         html/Admin/Elements/SelectGroups,
+         html/Admin/Elements/SelectModifyGroup,
+         html/Admin/Elements/SelectModifyQueue,
+         html/Admin/Elements/SelectModifyUser,
+         html/Admin/Elements/SelectNewGroupMembers,
+         html/Admin/Elements/SelectRights,
+         html/Admin/Elements/SelectScrip,
+         html/Admin/Elements/SelectScripAction,
+         html/Admin/Elements/SelectScripCondition,
+         html/Admin/Elements/SelectSingleOrMultiple,
+         html/Admin/Elements/SelectStage,
+         html/Admin/Elements/SelectTemplate,
+         html/Admin/Elements/SelectUsers, html/Admin/Elements/SystemTabs,
+         html/Admin/Elements/Tabs, html/Admin/Elements/ToolTabs,
+         html/Admin/Elements/UserTabs, html/Admin/Global/GroupRights.html,
+         html/Admin/Global/MyRT.html, html/Admin/Global/Scrip.html,
+         html/Admin/Global/Scrips.html, html/Admin/Global/Template.html,
+         html/Admin/Global/Templates.html,
+         html/Admin/Global/UserRights.html, html/Admin/Global/index.html,
+         html/Admin/Global/CustomFields/Groups.html,
+         html/Admin/Global/CustomFields/Queue-Tickets.html,
+         html/Admin/Global/CustomFields/Queue-Transactions.html,
+         html/Admin/Global/CustomFields/Users.html,
+         html/Admin/Global/CustomFields/index.html,
+         html/Admin/Groups/CustomFields.html,
+         html/Admin/Groups/GroupRights.html,
+         html/Admin/Groups/History.html, html/Admin/Groups/Members.html,
+         html/Admin/Groups/Modify.html, html/Admin/Groups/UserRights.html,
+         html/Admin/Groups/index.html, html/Admin/Queues/CustomField.html,
+         html/Admin/Queues/CustomFields.html,
+         html/Admin/Queues/GroupRights.html,
+         html/Admin/Queues/Modify.html, html/Admin/Queues/People.html,
+         html/Admin/Queues/Scrip.html, html/Admin/Queues/Scrips.html,
+         html/Admin/Queues/Template.html,
+         html/Admin/Queues/Templates.html,
+         html/Admin/Queues/UserRights.html, html/Admin/Queues/index.html,
+         html/Admin/Tools/Configuration.html, html/Admin/Tools/index.html,
+         html/Admin/Users/CustomFields.html,
+         html/Admin/Users/History.html, html/Admin/Users/Memberships.html,
+         html/Admin/Users/Modify.html, html/Admin/Users/MyRT.html,
+         html/Admin/Users/index.html, html/Approvals/Display.html,
+         html/Approvals/index.html, html/Approvals/Elements/Approve,
+         html/Approvals/Elements/PendingMyApproval,
+         html/Approvals/Elements/ShowDependency,
+         html/Approvals/Elements/Tabs,
+         html/Download/CustomFieldValue/dhandler,
+         html/Download/Tabular/dhandler, html/Elements/BevelBoxRaisedEnd,
+         html/Elements/BevelBoxRaisedStart, html/Elements/Callback,
+         html/Elements/Checkbox, html/Elements/CreateTicket,
+         html/Elements/EditCustomField,
+         html/Elements/EditCustomFieldBinary,
+         html/Elements/EditCustomFieldCombobox,
+         html/Elements/EditCustomFieldFreeform,
+         html/Elements/EditCustomFieldImage,
+         html/Elements/EditCustomFieldSelect,
+         html/Elements/EditCustomFieldText,
+         html/Elements/EditCustomFieldWikitext, html/Elements/EditLinks,
+         html/Elements/EmailInput, html/Elements/Error,
+         html/Elements/Footer, html/Elements/GotoTicket,
+         html/Elements/Header, html/Elements/ListActions,
+         html/Elements/Login, html/Elements/Logo, html/Elements/Menu,
+         html/Elements/MessageBox, html/Elements/MyAdminQueues,
+         html/Elements/MyRT, html/Elements/MyReminders,
+         html/Elements/MyRequests, html/Elements/MySupportQueues,
+         html/Elements/MyTickets, html/Elements/PageLayout,
+         html/Elements/QueryString, html/Elements/QueueSummary,
+         html/Elements/QuickCreate, html/Elements/Quicksearch,
+         html/Elements/Refresh, html/Elements/RefreshHomepage,
+         html/Elements/ScrubHTML, html/Elements/Section,
+         html/Elements/SelectAttachmentField, html/Elements/SelectBoolean,
+         html/Elements/SelectCustomFieldOperator,
+         html/Elements/SelectCustomFieldValue, html/Elements/SelectDate,
+         html/Elements/SelectDateRelation, html/Elements/SelectDateType,
+         html/Elements/SelectEqualityOperator, html/Elements/SelectGroups,
+         html/Elements/SelectLang, html/Elements/SelectLinkType,
+         html/Elements/SelectMatch, html/Elements/SelectNewTicketQueue,
+         html/Elements/SelectOwner, html/Elements/SelectQueue,
+         html/Elements/SelectResultsPerPage,
+         html/Elements/SelectSortOrder, html/Elements/SelectStatus,
+         html/Elements/SelectTicketSortBy,
+         html/Elements/SelectTicketTypes, html/Elements/SelectTimeUnits,
+         html/Elements/SelectUsers, html/Elements/SelectWatcherType,
+         html/Elements/SetupSessionCookie,
+         html/Elements/ShowCustomFieldBinary,
+         html/Elements/ShowCustomFieldImage,
+         html/Elements/ShowCustomFieldWikitext,
+         html/Elements/ShowCustomFields, html/Elements/ShowLink,
+         html/Elements/ShowLinks, html/Elements/ShowMemberships,
+         html/Elements/ShowSearch, html/Elements/SimpleSearch,
+         html/Elements/Submit, html/Elements/Tabs,
+         html/Elements/TicketList, html/Elements/TitleBox,
+         html/Elements/TitleBoxEnd, html/Elements/TitleBoxStart,
+         html/Elements/ValidateCustomFields,
+         html/Elements/CollectionAsTable/Header,
+         html/Elements/CollectionAsTable/ParseFormat,
+         html/Elements/CollectionAsTable/Row,
+         html/Elements/RT__Ticket/ColumnMap, html/Helpers/CalPopup.html,
+         html/Helpers/EmailAutocomplete, html/NoAuth/Logout.html,
+         html/NoAuth/Reminder.html, html/NoAuth/css/autohandler,
+         html/NoAuth/css/dhandler, html/NoAuth/css/print.css,
+         html/NoAuth/css/3.4-compat/body.css,
+         html/NoAuth/css/3.4-compat/footer.css,
+         html/NoAuth/css/3.4-compat/forms.css,
+         html/NoAuth/css/3.4-compat/header.css,
+         html/NoAuth/css/3.4-compat/login.css,
+         html/NoAuth/css/3.4-compat/main.css,
+         html/NoAuth/css/3.4-compat/misc.css,
+         html/NoAuth/css/3.4-compat/nav.css,
+         html/NoAuth/css/3.4-compat/quickbar.css,
+         html/NoAuth/css/3.4-compat/ticket.css,
+         html/NoAuth/css/3.4-compat/titlebox.css,
+         html/NoAuth/css/3.4-compat/transactions.css,
+         html/NoAuth/css/3.5-default/approvals.css,
+         html/NoAuth/css/3.5-default/body.css,
+         html/NoAuth/css/3.5-default/footer.css,
+         html/NoAuth/css/3.5-default/forms.css,
+         html/NoAuth/css/3.5-default/header.css,
+         html/NoAuth/css/3.5-default/login.css,
+         html/NoAuth/css/3.5-default/logo.css,
+         html/NoAuth/css/3.5-default/main.css,
+         html/NoAuth/css/3.5-default/misc.css,
+         html/NoAuth/css/3.5-default/nav.css,
+         html/NoAuth/css/3.5-default/quickbar.css,
+         html/NoAuth/css/3.5-default/ticket.css,
+         html/NoAuth/css/3.5-default/titlebox.css,
+         html/NoAuth/css/3.5-default/transactions.css,
+         html/NoAuth/images/autohandler, html/NoAuth/images/bplogo.gif,
+         html/NoAuth/images/favicon.png,
+         html/NoAuth/images/css/cb-light.gif,
+         html/NoAuth/images/css/cb.gif,
+         html/NoAuth/images/css/cbr-b2g.gif,
+         html/NoAuth/images/css/cbr-b2lb.gif,
+         html/NoAuth/images/css/cbr-gray.gif,
+         html/NoAuth/images/css/cbr-trans.gif,
+         html/NoAuth/images/css/cbr.gif,
+         html/NoAuth/images/css/ct-light.gif,
+         html/NoAuth/images/css/ct.gif,
+         html/NoAuth/images/css/ctr-b2g.gif,
+         html/NoAuth/images/css/ctr-b2lb.gif,
+         html/NoAuth/images/css/ctr-gray.gif,
+         html/NoAuth/images/css/ctr-trans.gif,
+         html/NoAuth/images/css/ctr.gif,
+         html/NoAuth/images/css/dark-arrow-up.png,
+         html/NoAuth/images/css/dark-arrow.png,
+         html/NoAuth/images/css/fieldbg-autocomplete.gif,
+         html/NoAuth/images/css/light-arrow-up.png,
+         html/NoAuth/images/css/light-arrow.png,
+         html/NoAuth/images/css/rolldown-arrow.gif,
+         html/NoAuth/images/css/rolldown-arrow.png,
+         html/NoAuth/images/css/rollup-arrow.gif, html/NoAuth/js/ahah.js,
+         html/NoAuth/js/autohandler, html/NoAuth/js/cascaded.js,
+         html/NoAuth/js/class.js, html/NoAuth/js/combobox.js,
+         html/NoAuth/js/list.js, html/NoAuth/js/titlebox-state.js,
+         html/NoAuth/js/util.js, html/NoAuth/js/scriptaculous/controls.js,
+         html/NoAuth/js/scriptaculous/effects.js,
+         html/NoAuth/js/scriptaculous/prototype.js,
+         html/NoAuth/js/scriptaculous/scriptaculous.js,
+         html/Prefs/MyRT.html, html/Prefs/Quicksearch.html,
+         html/Prefs/Search.html, html/Prefs/SearchOptions.html,
+         html/Prefs/Elements/Tabs, html/REST/1.0/autohandler,
+         html/REST/1.0/dhandler, html/REST/1.0/logout,
+         html/REST/1.0/Forms/queue/default, html/REST/1.0/Forms/queue/ns,
+         html/REST/1.0/Forms/ticket/attachments,
+         html/REST/1.0/Forms/ticket/comment,
+         html/REST/1.0/Forms/ticket/default,
+         html/REST/1.0/Forms/ticket/history,
+         html/REST/1.0/Forms/ticket/links,
+         html/REST/1.0/Forms/ticket/merge,
+         html/REST/1.0/Forms/ticket/take,
+         html/REST/1.0/Forms/transaction/default,
+         html/REST/1.0/Forms/user/default, html/REST/1.0/Forms/user/ns,
+         html/REST/1.0/NoAuth/mail-gateway, html/REST/1.0/search/dhandler,
+         html/REST/1.0/search/ticket, html/REST/1.0/ticket/comment,
+         html/REST/1.0/ticket/link, html/REST/1.0/ticket/merge,
+         html/Search/Build.html, html/Search/Bulk.html, html/Search/Chart,
+         html/Search/Chart.html, html/Search/Edit.html,
+         html/Search/Results.html, html/Search/Results.rdf,
+         html/Search/Results.tsv, html/Search/Simple.html,
+         html/Search/Elements/BuildFormatString,
+         html/Search/Elements/Chart, html/Search/Elements/DisplayOptions,
+         html/Search/Elements/EditFormat, html/Search/Elements/EditQuery,
+         html/Search/Elements/EditSearches,
+         html/Search/Elements/NewListActions,
+         html/Search/Elements/PickBasics, html/Search/Elements/PickCFs,
+         html/Search/Elements/PickCriteria,
+         html/Search/Elements/SearchPrivacy,
+         html/Search/Elements/SearchesForObject,
+         html/Search/Elements/SelectAndOr,
+         html/Search/Elements/SelectChartType,
+         html/Search/Elements/SelectGroup,
+         html/Search/Elements/SelectGroupBy,
+         html/Search/Elements/SelectLinks,
+         html/Search/Elements/SelectPersonType,
+         html/Search/Elements/SelectSearchObject,
+         html/Search/Elements/SelectSearchesForObjects,
+         html/SelfService/Closed.html, html/SelfService/Create.html,
+         html/SelfService/CreateTicketInQueue.html,
+         html/SelfService/Display.html, html/SelfService/Error.html,
+         html/SelfService/Prefs.html, html/SelfService/Update.html,
+         html/SelfService/index.html,
+         html/SelfService/Attachment/dhandler,
+         html/SelfService/Elements/GotoTicket,
+         html/SelfService/Elements/Header,
+         html/SelfService/Elements/MyRequests,
+         html/SelfService/Elements/Tabs, html/Ticket/Create.html,
+         html/Ticket/Display.html, html/Ticket/History.html,
+         html/Ticket/Modify.html, html/Ticket/ModifyAll.html,
+         html/Ticket/ModifyDates.html, html/Ticket/ModifyLinks.html,
+         html/Ticket/ModifyPeople.html, html/Ticket/Reminders.html,
+         html/Ticket/ShowEmailRecord.html, html/Ticket/Update.html,
+         html/Ticket/Attachment/dhandler,
+         html/Ticket/Elements/AddWatchers, html/Ticket/Elements/BulkLinks,
+         html/Ticket/Elements/EditBasics,
+         html/Ticket/Elements/EditCustomField,
+         html/Ticket/Elements/EditCustomFields,
+         html/Ticket/Elements/EditDates, html/Ticket/Elements/EditPeople,
+         html/Ticket/Elements/EditWatchers,
+         html/Ticket/Elements/FindAttachments,
+         html/Ticket/Elements/LoadTextAttachments,
+         html/Ticket/Elements/PreviewScrips,
+         html/Ticket/Elements/Reminders,
+         html/Ticket/Elements/ShowAttachments,
+         html/Ticket/Elements/ShowBasics,
+         html/Ticket/Elements/ShowCustomFields,
+         html/Ticket/Elements/ShowDates,
+         html/Ticket/Elements/ShowDependencies,
+         html/Ticket/Elements/ShowGroupMembers,
+         html/Ticket/Elements/ShowHistory,
+         html/Ticket/Elements/ShowMembers,
+         html/Ticket/Elements/ShowMessageHeaders,
+         html/Ticket/Elements/ShowMessageStanza,
+         html/Ticket/Elements/ShowPeople, html/Ticket/Elements/ShowQueue,
+         html/Ticket/Elements/ShowRequestor,
+         html/Ticket/Elements/ShowSummary, html/Ticket/Elements/ShowTime,
+         html/Ticket/Elements/ShowTransaction,
+         html/Ticket/Elements/ShowTransactionAttachments,
+         html/Ticket/Elements/ShowUserEntry, html/Ticket/Elements/Tabs,
+         html/Tools/MyDay.html, html/Tools/Offline.html,
+         html/Tools/index.html, html/Tools/Elements/Tabs,
+         html/Tools/Reports/CreatedByDates.html,
+         html/Tools/Reports/ResolvedByDates.html,
+         html/Tools/Reports/ResolvedByOwner.html,
+         html/Tools/Reports/index.html, html/Tools/Reports/Elements/Tabs,
+         html/User/Delegation.html, html/User/Prefs.html,
+         html/User/Elements/DelegateRights, html/User/Elements/GroupTabs,
+         html/User/Elements/Tabs, html/User/Groups/Members.html,
+         html/User/Groups/Modify.html, html/User/Groups/index.html,
+         html/Widgets/ComboBox, html/Widgets/SavedSearch,
+         html/Widgets/SelectionBox, html/Widgets/TitleBox,
+         html/Widgets/TitleBoxEnd, html/Widgets/TitleBoxStart, lib/RT.pm,
+         lib/RT/Groups_Overlay.pm, lib/RT/Record.pm,
+         lib/RT/SearchBuilder.pm, lib/RT/Ticket_Overlay.pm,
+         lib/RT/Transaction_Overlay.pm, lib/RT/User_Overlay.pm,
+         lib/RT/Users_Overlay.pm, lib/RT/I18N/no.po, lib/RT/I18N/pt_br.po,
+         lib/RT/I18N/pt_pt.po, lib/RT/I18N/zh_cn.po, lib/RT/I18N/zh_tw.po,
+         lib/t/00smoke.t, lib/t/create_data.pl, lib/t/setup_regression.t,
+         lib/t/data/crashes-file-based-parser, lib/t/data/lorem-ipsum,
+         lib/t/data/multipart-alternative-with-umlaut,
+         lib/t/data/multipart-report, lib/t/data/nested-mime-sample,
+         lib/t/data/nested-rfc-822, lib/t/data/new-ticket-from-iso-8859-1,
+         lib/t/data/new-ticket-from-iso-8859-1-full,
+         lib/t/data/notes-uuencoded, lib/t/data/rt-send-cc,
+         lib/t/data/russian-subject-no-content-type,
+         lib/t/data/subject-with-folding-ws,
+         lib/t/data/text-html-in-russian,
+         lib/t/data/text-html-with-umlaut, lib/t/data/very-long-subject,
+         lib/t/data/8859-15-message-series/dir,
+         lib/t/data/8859-15-message-series/msg1,
+         lib/t/data/8859-15-message-series/msg2,
+         lib/t/data/8859-15-message-series/msg3,
+         lib/t/data/8859-15-message-series/msg4,
+         lib/t/data/8859-15-message-series/msg5,
+         lib/t/data/8859-15-message-series/msg6,
+         lib/t/data/8859-15-message-series/msg7,
+         lib/t/regression/00-mason-syntax.t,
+         lib/t/regression/01ticket_link_searching.t,
+         lib/t/regression/02basic_web.t,
+         lib/t/regression/03web_compiliation_errors.t,
+         lib/t/regression/04send_email.t,
+         lib/t/regression/05cronsupport.t,
+         lib/t/regression/06-mime_decoding.t,
+         lib/t/regression/06mailgateway.t, lib/t/regression/07acl.t,
+         lib/t/regression/07rights.t, lib/t/regression/08web_cf_access.t,
+         lib/t/regression/09record_cf_api.t, lib/t/regression/10merge.t,
+         lib/t/regression/11-template-insert.t,
+         lib/t/regression/12-search.t,
+         lib/t/regression/13-attribute-tests.t,
+         lib/t/regression/14linking.t, lib/t/regression/14merge.t,
+         lib/t/regression/15cf_combo_cascade.t,
+         lib/t/regression/15cf_pattern.t,
+         lib/t/regression/15cf_single_values_are_single.t,
+         lib/t/regression/16-transaction_cf_tests.t,
+         lib/t/regression/17custom_search.t,
+         lib/t/regression/17multiple_deleg_revocation.t,
+         lib/t/regression/18custom_frontpage.t,
+         lib/t/regression/18stale_delegations_cleanup.t,
+         lib/t/regression/19-rtname.t, lib/t/regression/19quicksearch.t,
+         lib/t/regression/20-sort-by-queue.t,
+         lib/t/regression/20-sort-by-requestor.t,
+         lib/t/regression/20-sort-by-user.t,
+         lib/t/regression/20savedsearch.t,
+         lib/t/regression/21query-builder.t,
+         lib/t/regression/22search_tix_by_txn.t,
+         lib/t/regression/22search_tix_by_watcher.t,
+         lib/t/regression/23-batch-upload-csv.t,
+         lib/t/regression/23-web_attachments.t,
+         lib/t/regression/23cfsort-freeform-multiple.t,
+         lib/t/regression/23cfsort-freeform-single.t,
+         lib/t/regression/23cfsort.t, lib/t/regression/24-watchers.t,
+         lib/t/regression/24pawsort.t, lib/t/regression/25scrip_order.t,
+         lib/t/regression/26command_line.t, lib/t/regression/27verp.t,
+         lib/t/regression/mime_tests, sbin/extract_pod_tests,
+         sbin/regression_harness, sbin/rt-setup-database.in: merging
+         3.8.7!!!
+
+2009-12-31 05:16  ivan
+
+       * rt/etc/: schema.mysql-4.0, schema.mysql-4.1,
+         upgrade/shrink_cgm_table.pl, upgrade/split-out-cf-categories,
+         upgrade/split-out-cf-categories.in,
+         upgrade/upgrade-mysql-schema.pl,
+         upgrade/3.8-branded-queues-extension,
+         upgrade/3.8-branded-queues-extension.in,
+         upgrade/3.8-ical-extension, upgrade/3.8-ical-extension.in:
+         Initial revision
+
+2009-12-31 05:12  ivan
+
+       * rt/: lib/RT/I18N/pt_BR.po, lib/RT/I18N/nb.po,
+         lib/RT/I18N/zh_CN.po, lib/RT/I18N/ar.po, lib/RT/I18N/pt.po,
+         lib/RT/I18N/ru.pm, lib/RT/Condition/ReopenTicket.pm,
+         lib/RT/Condition/CloseTicket.pm,
+         docs/creating_external_custom_fields.pod,
+         docs/extending_clickable_links.pod, docs/gnupg_integration.pod,
+         docs/porting.windows, docs/queue_subject_tag.pod,
+         docs/templates.pod, docs/using_forms_widgets.pod,
+         docs/design_docs/gnupg_details_on_output_formats: Initial
+         revision
+
+2009-12-31 05:09  ivan
+
+       * rt/: UPGRADING.mysql, lib/RT/Test.pm, sbin/merge-rosetta.pl,
+         sbin/rt-attributes-viewer, sbin/rt-attributes-viewer.in,
+         sbin/rt-clean-sessions, sbin/rt-clean-sessions.in,
+         sbin/rt-email-dashboards, sbin/rt-email-dashboards.in,
+         sbin/rt-email-digest, sbin/rt-email-digest.in,
+         sbin/rt-email-group-admin, sbin/rt-email-group-admin.in,
+         sbin/rt-server, sbin/rt-server.in, sbin/rt-shredder,
+         sbin/rt-shredder.in, sbin/rt-validator, sbin/rt-validator.in,
+         sbin/tweak-template-locstring, lib/RT/Search.pm,
+         lib/RT/Config.pm, lib/RT/Dashboard.pm, lib/RT/Installer.pm,
+         lib/RT/Plugin.pm, lib/RT/Ruleset.pm, lib/RT/Shredder.pm,
+         lib/RT/Approval.pm, lib/RT/Action.pm, lib/RT/SharedSetting.pm,
+         lib/RT/Condition.pm, lib/RT/SQL.pm, lib/RT/Util.pm,
+         lib/RT/Rule.pm, lib/RT/Interface/Web/Request.pm,
+         lib/RT/Interface/Web/Session.pm, lib/RT/Action/LinearEscalate.pm,
+         lib/RT/Action/ExtractSubjectTag.pm, lib/RT/Action/NotifyGroup.pm,
+         lib/RT/Action/NotifyGroupAsComment.pm, lib/RT/I18N/bg.po,
+         lib/RT/I18N/rt.pot, lib/RT/I18N/hr.po, lib/RT/I18N/zh_TW.po:
+         Initial revision
+
+2009-12-31 04:56  ivan
+
+       * rt/: Makefile, lib/RT.pm: rt 3.6.10
+
+2009-12-31 04:44  ivan
+
+       * rt/: etc/RT_Config.pm.in, html/Admin/Users/Modify.html,
+         html/Elements/Footer, html/Elements/Header, html/Elements/Menu,
+         html/Elements/PageLayout, html/Elements/QuickCreate,
+         html/Elements/SelectDate, html/Elements/SimpleSearch,
+         html/Elements/Tabs, html/Elements/TicketList,
+         html/Elements/TitleBoxStart, html/Elements/CollectionAsTable/Row,
+         html/NoAuth/css/3.5-default/main.css,
+         html/NoAuth/css/3.5-default/misc.css,
+         html/NoAuth/css/3.5-default/titlebox.css,
+         html/NoAuth/css/3.5-default/transactions.css,
+         html/Prefs/SearchOptions.html, html/Search/Bulk.html,
+         html/Ticket/Create.html, html/Ticket/Display.html,
+         html/Ticket/Elements/ShowSummary,
+         html/Ticket/Elements/ShowTransactionAttachments,
+         html/Ticket/Elements/Tabs, html/User/Prefs.html,
+         html/Widgets/TitleBoxStart, lib/RT/Groups_Overlay.pm,
+         lib/RT/Record.pm, lib/RT/SearchBuilder.pm,
+         lib/RT/Ticket_Overlay.pm, lib/RT/Transaction_Overlay.pm,
+         lib/RT/User_Overlay.pm, lib/RT/Users_Overlay.pm,
+         sbin/rt-setup-database.in: rt 3.6.10
+
+2009-12-31 04:35  ivan
+
+       * rt/FREESIDE_MODIFIED: up-to-date
+
+2009-12-30 23:16  ivan
+
+       * FS/FS/Schema.pm: fix h_cdr acctid changing from bigint to int
+         with recent DBIx::DBSchema
+
+2009-12-30 21:10  ivan
+
+       * FS/: FS/Cron/bill.pm, bin/freeside-daily: specify multiple
+         agentnums with freeside-daily
+
+2009-12-30 19:33  ivan
+
+       * Makefile: goodbye conf dir
+
+2009-12-30 18:50  jeff
+
+       * FS/FS/cust_main.pm: really reduce the noise
+
+2009-12-30 18:20  ivan
+
+       * httemplate/: edit/prospect_main.html, edit/elements/edit.html,
+         edit/process/elements/process.html, elements/contact.html,
+         elements/menu.html: prospecting: proper contact error handling
+         when you add a prospect
+
+2009-12-29 22:41  jeff
+
+       * FS/FS/part_pkg/voip_cdr.pm: define all detail header list
+         elements
+
+2009-12-29 22:05  jeff
+
+       * FS/FS/cust_main.pm: noise reduction
+
+2009-12-29 21:22  jeff
+
+       * FS/FS/tax_rate.pm: noise reduction
+
+2009-12-29 18:39  jeff
+
+       * FS/FS/cust_bill_pkg_detail.pm: use the class used
+
+2009-12-29 18:26  jeff
+
+       * FS/FS/cust_main.pm: noise reduction
+
+2009-12-28 20:49  ivan
+
+       * FS/bin/freeside-upgrade: output SQL statements as we run them
+         (and only the ones we run), not immediately
+
+2009-12-28 20:44  ivan
+
+       * FS/FS/Conf.pm: oops, syntax error adding queued-sleep_time
+
+2009-12-28 20:24  ivan
+
+       * FS/bin/: freeside-upgrade: don't change h_queue.job type under
+         non-mysql, takes forever on large dbs, RT#6946
+
+2009-12-28 17:38  ivan
+
+       * FS/bin/freeside-daily: add -u option for vacuuming, RT#5258
+
+2009-12-28 17:30  ivan
+
+       * bin/: del-old-history, pg-sizer: some random utils for disk space
+         analysis and eliminating old history records, RT#6914
+
+2009-12-28 17:00  mark
+
+       * FS/FS/AccessRight.pm, httemplate/browse/cust_attachment.html,
+         httemplate/elements/menu.html: Add Browse attachments ACL
+         (RT#4964)
+
+2009-12-28 16:38  ivan
+
+       * FS/: FS/Conf.pm, bin/freeside-queued: add queued-sleep_time
+
+2009-12-28 11:18  ivan
+
+       * FS/FS/AccessRight.pm, FS/FS/Mason.pm, FS/FS/Schema.pm,
+         FS/FS/Setup.pm, FS/FS/Upgrade.pm, FS/FS/contact.pm,
+         FS/FS/contact_email.pm, FS/FS/contact_phone.pm,
+         FS/FS/cust_location.pm, FS/FS/o2m_Common.pm, FS/FS/phone_type.pm,
+         FS/FS/prospect_main.pm, FS/MANIFEST, FS/t/contact.t,
+         FS/t/contact_email.t, FS/t/contact_phone.t, FS/t/phone_type.t,
+         FS/t/prospect_main.t, httemplate/edit/prospect_main.html,
+         httemplate/edit/process/prospect_main.html,
+         httemplate/elements/city.html, httemplate/elements/contact.html,
+         httemplate/elements/header.html, httemplate/elements/menu.html,
+         httemplate/elements/tr-contact.html,
+         httemplate/elements/tr-select-cust_location.html,
+         httemplate/search/prospect_main.html,
+         httemplate/search/report_prospect_main.html,
+         httemplate/view/prospect_main.html,
+         httemplate/edit/elements/edit.html,
+         httemplate/edit/process/elements/process.html,
+         httemplate/misc/location.cgi,
+         httemplate/view/cust_main/packages/location.html, FS/FS.pm:
+         beginning of prospect/CRM/contact work
+
+2009-12-27 21:25  ivan
+
+       * FS/FS/: part_pkg_taxclass.pm, phone_device.pm: use blessed
+
+2009-12-26 17:00  jeff
+
+       * FS/FS/: cust_location.pm, cust_main.pm: improve spacing around
+         county
+
+2009-12-23 15:32  jeff
+
+       * bin/monitor: remove debugging
+
+2009-12-23 15:29  jeff
+
+       * bin/monitor: add non-forking one machine monitor program
+
+2009-12-23 15:14  jeff
+
+       * FS/FS/Yori.pm: teach yori to do some load monitoring
+
+2009-12-23 13:21  jeff
+
+       * FS/FS/cust_bill.pm, FS/FS/cust_location.pm, FS/FS/cust_main.pm,
+         FS/FS/cust_pkg.pm,
+         httemplate/view/cust_main/packages/location.html: correct invoice
+         package address display and reduce false laziness
+
+2009-12-22 16:30  mark
+
+       * FS/FS/svc_acct.pm, httemplate/edit/svc_acct.cgi,
+         httemplate/edit/process/svc_acct.cgi: Tweak set_password per
+         RT#6358
+
+2009-12-21 06:44  jeff
+
+       * FS/FS/: Schema.pm, cust_bill_pkg.pm,
+         cust_bill_pkg_tax_location.pm, cust_credit_bill_pkg.pm,
+         cust_tax_exempt_pkg.pm: manage tax exemptions (texas-tax) on
+         credit application RT953
+
+2009-12-21 06:36  jeff
+
+       * FS/FS/Conf.pm, FS/FS/tax_rate.pm, bin/fetch_and_expand_taxes,
+         bin/reassemble_taxes: move cch conf into database and add a
+         couple small tools for processing updates more manually
+
+2009-12-20 18:00  ivan
+
+       * FS/FS/cust_main.pm, httemplate/misc/bill.cgi: have 'Bill now'
+         link cancel expired (and suspend adjourned) packages, and catch
+         and return errors in all cases, RT#6627
+
+2009-12-20 13:52  ivan
+
+       * FS/FS/Conf.pm: late fee package class specified in the event
+         action instead of a global finance_pkgclass config, RT#6617
+
+2009-12-20 13:48  ivan
+
+       * FS/FS/part_event/Action/: cust_bill_fee_percent.pm, fee.pm: late
+         fee package class specified in the event action instead of a
+         global finance_pkgclass config, RT#6617
+
+2009-12-20 11:42  ivan
+
+       * FS/FS/ClientAPI/MyAccount.pm: fix usage details pulling from
+         wrong account for customers who have multiple accounts, RT#6681,
+         fallout from RT#4189
+
+2009-12-19 22:52  ivan
+
+       * httemplate/search/cust_pkg.cgi: fix address fields on advanced
+         package search, RT#6609
+
+2009-12-19 18:51  ivan
+
+       * FS/FS/cust_pkg.pm: fix bulk package order with one package
+         changing to one new package, RT#6519, fallout from RT#4499
+
+2009-12-19 17:02  ivan
+
+       * httemplate/view/cust_main/: packages.html, payment_history.html:
+         fix cust_main-packages-years, RT#6798
+
+2009-12-19 15:52  ivan
+
+       * FS/FS/cust_bill_ApplicationCommon.pm: fix more
+         ->owed_setup/owed_recur clashing with
+         cust_bill->open_cust_bill_pkg separating line items, RT#4729
+
+2009-12-19 15:28  ivan
+
+       * FS/FS/cust_bill_ApplicationCommon.pm: fix credit application, at
+         least in vedeya's case on HEAD, RT#6819, fallout from tax
+         credits, RT#4729
+
+2009-12-19 14:52  ivan
+
+       * httemplate/edit/elements/ApplicationCommon.html: fix fill-in of
+         credit amount when there aren't tax buttons
+
+2009-12-19 14:41  ivan
+
+       * httemplate/edit/cust_credit.cgi: add add'l info field as a
+         customer-editable field, RT#6505
+
+2009-12-19 14:32  ivan
+
+       * httemplate/view/cust_main/payment_history.html: make room for
+         credit reasons in popup
+
+2009-12-19 12:29  ivan
+
+       * FS/FS/cust_main_Mixin.pm: fix event report w/ a customer status
+
+2009-12-19 11:10  ivan
+
+       * FS/FS/part_pkg.pm: fix package order to really display only those
+         pacakges available
+
+2009-12-19 11:09  ivan
+
+       * httemplate/misc/cust-part_pkg.cgi: fix order of packages after
+         class selection changes
+
+2009-12-18 10:20  jeff
+
+       * FS/FS/cust_bill_pkg_tax_location.pm,
+         FS/FS/cust_bill_pkg_tax_rate_location.pm,
+         httemplate/edit/elements/ApplicationCommon.html,
+         httemplate/misc/xmlhttp-calculate_taxes.html: fix handling of tax
+         location records and add a 'clear' button for tax credits
+
+2009-12-17 16:41  ivan
+
+       * rt/bin/standalone_httpd: Initial revision
+
+2009-12-17 16:38  ivan
+
+       * rt/: .gitignore, sbin/rt-dump-database, lib/RT/I18N/pt_pt.po,
+         lib/t/regression/20-sort-by-user.t,
+         lib/t/regression/20-sort-by-queue.t,
+         lib/t/regression/23cfsort-freeform-multiple.t,
+         lib/t/regression/23cfsort-freeform-single.t,
+         lib/t/regression/24-watchers.t: Initial revision
+
+2009-12-16 09:35  ivan
+
+       * httemplate/edit/cust_main_attach.cgi: tweak attachment adding UI:
+         table consistency, input sizes and maxlengths, RT#4964
+
+2009-12-16 07:03  jeff
+
+       * FS/FS/: Conf.pm, Record.pm, cust_bill.pm, cust_location.pm,
+         cust_main.pm, cust_pkg.pm: group invoice line items by location,
+         show location address on invoice, option for due date rather than
+         invoice date on prior unpaid invoice line items, and option for
+         aging on invoice (#6418, #5235, #4648)
+
+2009-12-13 23:52  ivan
+
+       * FS/FS/svc_acct.pm: use a global config too
+
+2009-12-13 23:10  ivan
+
+       * FS/FS/: Conf.pm, svc_acct.pm, part_export/sqlradius.pm: add
+         overlimit_groups agent-specific config, overriding
+         export-specific overlimit_groups, RT#6622
+
+2009-12-13 19:36  mark
+
+       * httemplate/search/elements/search-xls.html: Fix filename for
+         Excel spreadsheet reports
+
+2009-12-13 17:41  mark
+
+       * FS/FS/AccessRight.pm, httemplate/browse/cust_attachment.html,
+         httemplate/edit/cust_main_attach.cgi,
+         httemplate/elements/menu.html, httemplate/view/cust_main.cgi,
+         httemplate/view/cust_main/attachments.html: Add access right to
+         view attachments
+
+2009-12-12 15:53  ivan
+
+       * httemplate/search/cust_credit_bill_pkg.html,
+         FS/FS/cust_credit_bill_pkg.pm,
+         httemplate/search/cust_bill_pkg.cgi: better reporting for tax
+         credits, RT#4729
+
+2009-12-12 15:32  ivan
+
+       * httemplate/search/: cust_bill_pkg.cgi, cust_credit_bill_pkg.html,
+         report_tax.cgi: better reporting for tax credits, RT#4729
+
+2009-12-12 14:35  ivan
+
+       * FS/FS/cust_credit_bill_pkg.pm: doc
+
+2009-12-12 14:22  ivan
+
+       * Makefile: sync versioning with branches, sorry jeremy
+
+2009-12-12 13:38  ivan
+
+       * FS/FS/cust_pkg.pm, httemplate/search/cust_bill_pkg.cgi,
+         httemplate/search/report_tax.cgi,
+         httemplate/search/report_tax.html: reporting with city taxes,
+         RT#6776
+
+2009-12-10 15:03  ivan
+
+       * FS/FS/cust_main.pm: fully fix bulk customer reports, RT#6778
+
+2009-12-07 22:21  mark
+
+       * FS/FS/Schema.pm: Fix cust_attachment.disabled type
+
+2009-12-06 15:44  ivan
+
+       * httemplate/edit/part_pkg.cgi: fix initial value of agent types
+         when cloning
+
+2009-12-06 15:18  ivan
+
+       * httemplate/elements/header.html: fix search box clearing from
+         within RT, caused by different quoting rules in RT comp_root.
+         grr.
+
+2009-12-06 11:19  ivan
+
+       * FS/FS/Schema.pm: more reasonable sizes for filename, mime type
+         and title, RT#6823
+
+2009-12-04 10:37  jeff
+
+       * FS/FS/cust_bill.pm: holy cow! correct sense of skip usage testing
+
+2009-12-03 20:45  ivan
+
+       * FS/FS/svc_acct.pm, httemplate/search/svc_acct.cgi:
+         customer-specific account report (and some small refactoring of
+         method names to clash less), RT#6180
+
+2009-12-03 20:40  ivan
+
+       * FS/FS/cust_bill.pm, FS/FS/cust_bill_event.pm,
+         httemplate/search/477.html, httemplate/search/cust_bill.html,
+         httemplate/search/cust_bill_event.cgi,
+         httemplate/search/cust_event.html,
+         httemplate/search/cust_main.html, httemplate/search/cust_pkg.cgi,
+         httemplate/search/report_svc_acct.html,
+         httemplate/view/cust_main/packages.html, FS/FS/cust_event.pm,
+         FS/FS/cust_main.pm, FS/FS/cust_pkg.pm,
+         httemplate/misc/email-customers.html,
+         httemplate/misc/process/bulk_change_pkg.cgi,
+         httemplate/misc/process/email-customers.html: customer-specific
+         account report (and some small refactoring of method names to
+         clash less), RT#6180
+
+2009-12-03 19:23  ivan
+
+       * FS/FS/cust_pkg.pm: doh, 1.9 fix customer package search (fallout
+         from customer classes) and add "not yet billed" status to
+         customer package report
+
+2009-12-03 11:22  ivan
+
+       * httemplate/graph/cust_bill_pkg.cgi: average per cust_pkg option
+         for peter
+
+2009-12-03 11:06  ivan
+
+       * FS/FS/Report/Table/Monthly.pm,
+         httemplate/graph/cust_bill_pkg.cgi,
+         httemplate/graph/report_cust_bill_pkg.html: average per cust_pkg
+         option for peter
+
+2009-12-02 23:53  ivan
+
+       * FS/FS/Schema.pm: index cdrbatchnum
+
+2009-12-02 23:37  ivan
+
+       * FS/FS/: Record.pm, cdr/sansay.pm: fix startdate in sansay CDR
+         import (and skip blank lines), RT#6801
+
+2009-12-02 23:18  ivan
+
+       * httemplate/search/cdr.html: fix cdr search
+
+2009-12-02 20:22  ivan
+
+       * FS/FS/cdr/sansay.pm: no header?
+
+2009-12-02 12:58  ivan
+
+       * FS/FS/Schema.pm: add index to rate_prefix.npa for a performance
+         improvement on CDR billing, RT#6386
+
+2009-12-02 12:51  ivan
+
+       * httemplate/view/: svc_broadband.cgi, svc_domain.cgi,
+         svc_external.cgi, svc_forward.cgi, svc_www.cgi: fix viewing
+         unlinked forwards, domains, broadband/external/www services,
+         RT#6794
+
+2009-12-01 11:16  jeff
+
+       * FS/FS/cust_bill.pm: want a listref not a list
+
+2009-11-29 16:38  ivan
+
+       * FS/FS/cust_main.pm, httemplate/misc/email-customers.html: fix
+         bulk sending of customer notices, RT#6778
+
+2009-11-29 16:06  ivan
+
+       * httemplate/edit/REAL_cust_pkg.cgi: fix
+
+2009-11-29 16:04  ivan
+
+       * httemplate/edit/: REAL_cust_pkg.cgi, process/REAL_cust_pkg.cgi:
+         UI changes to make it impossible to add a start date to a package
+         that already has a setup fee (can still remove an existing start
+         date causing problems), RT#6712
+
+2009-11-29 15:18  ivan
+
+       * FS/FS/: Conf.pm, cust_pkg.pm: add
+         cust_pkg-change_pkgpart-bill_now option to bill the new package
+         immediately on package changes.  Useful for prepaid situations
+         with RADIUS where an Expiration attribute base don the package
+         must be present at all times.  RT#6692
+
+2009-11-29 15:15  ivan
+
+       * FS/FS/cust_main.pm: doc: spelling
+
+2009-11-25 16:27  ivan
+
+       * FS/FS/part_pkg/voip_cdr.pm: debugging left on
+
+2009-11-25 11:58  ivan
+
+       * httemplate/edit/part_pkg.cgi: don't consider disabled report
+         classes, don't load up the whole table just to see if there are
+         any
+
+2009-11-25 11:32  jeff
+
+       * FS/FS/: cust_bill.pm, usage_class.pm: improve appearance of cdr
+         records in cdr sections
+
+2009-11-25 08:13  jeff
+
+       * FS/FS/cust_bill.pm: bug fixes, reuse summary_page, eliminate
+         dups, and rearrange
+
+2009-11-25 08:09  jeff
+
+       * conf/invoice_latex: really insert a pagebreak
+
+2009-11-25 08:07  jeff
+
+       * conf/invoice_latex: oops.. need updated template for new formats
+
+2009-11-24 13:00  ivan
+
+       * FS/FS/cust_bill.pm: debugging left on
+
+2009-11-24 09:05  jeff
+
+       * FS/FS/cust_bill.pm: cope with sections lacking a pkg_category
+
+2009-11-23 23:42  ivan
+
+       * httemplate/: misc/timeworked.html, misc/process/timeworked.html,
+         search/timeworked.html: timeworked report: carry the date range
+         through to the success redirect
+
+2009-11-23 23:23  ivan
+
+       * httemplate/: search/report_timeworked.html, elements/menu.html,
+         search/timeworked.html: add date constratint on time worked
+         search
+
+2009-11-23 22:04  ivan
+
+       * FS/FS/cust_main.pm: send card number with void transactions for
+         B:OP:IPPay, RT#5690
+
+2009-11-23 14:09  mark
+
+       * FS/FS/Schema.pm: Add title field to cust_attachment
+
+2009-11-22 16:25  jeff
+
+       * FS/FS/cust_bill_ApplicationCommon.pm: apply to taxes last
+
+2009-11-20 09:33  jeff
+
+       * FS/FS/Conf.pm, FS/FS/Schema.pm, FS/FS/cust_bill.pm,
+         FS/FS/cust_bill_pkg.pm, FS/FS/cust_bill_pkg_detail.pm,
+         FS/FS/usage_class.pm, FS/FS/part_pkg/voip_cdr.pm,
+         conf/invoice_html, httemplate/browse/pkg_category.html,
+         httemplate/browse/usage_class.html,
+         httemplate/edit/pkg_category.html,
+         httemplate/edit/usage_class.html: invoice formatting: add
+         sections for usage, add sections per svc_phone, add folding like
+         line items into one #6592
+
+2009-11-19 01:47  ivan
+
+       * FS/FS.pm, FS/FS/Record.pm, FS/FS/cdr.pm,
+         FS/bin/freeside-cdr-sftp_and_import, bin/cdr-transnexus.import,
+         bin/cdr.http_and_import, bin/cdr.import,
+         httemplate/elements/select-cdrbatch.html,
+         httemplate/elements/tr-select-cdrbatch.html,
+         httemplate/search/cdr.html, httemplate/search/report_cdr.html,
+         httemplate/view/svc_phone.cgi: proper cdr_batch table, RT#6386
+
+2009-11-19 01:43  ivan
+
+       * FS/FS/: Mason.pm, Schema.pm, Upgrade.pm: proper cdr_batch table,
+         RT#6386
+
+2009-11-19 01:39  ivan
+
+       * FS/MANIFEST: proper cdr_batch table, RT#6386
+
+2009-11-19 01:32  ivan
+
+       * FS/: FS/cdr_batch.pm, t/cdr_batch.t: proper cdr_batch table,
+         RT#6386
+
+2009-11-18 23:06  ivan
+
+       * FS/FS/cdr.pm: format CDRs durations as NNm MMs instead of NN.MMm,
+         RT#6316
+
+2009-11-18 22:21  ivan
+
+       * FS/FS/Cron/breakage.pm: consider credits and refunds in breakage,
+         RT#6407
+
+2009-11-18 01:39  mark
+
+       * httemplate/search/cust_pay_batch.cgi: RT#4786, RBC batch format
+
+2009-11-18 01:27  mark
+
+       * FS/FS/Conf.pm, FS/FS/pay_batch/RBC.pm,
+         httemplate/search/cust_pay_batch.cgi: RT#4768, RBC batch format
+
+2009-11-18 01:09  mark
+
+       * httemplate/: browse/cust_attachment.html,
+         misc/cust_attachment.cgi: cust_attachment improvement, RT#4964
+         and #6225
+
+2009-11-17 14:06  ivan
+
+       * FS/FS/cust_main.pm: do a case-insensive search on
+         browser-remembered results, so starting to use USPS verification
+         (which UPPERCASES everything) doesn't invalidate everything your
+         browser remembered in quick payment entry
+
+2009-11-17 12:56  jeff
+
+       * httemplate/edit/elements/ApplicationCommon.html: work around ie7
+         javascript issues
+
+2009-11-16 23:42  ivan
+
+       * httemplate/search/: report_cust_pay.html,
+         report_cust_refund.html, elements/cust_pay_or_refund.html: add
+         otaker to payment/refund search, RT#6407
+
+2009-11-16 23:08  ivan
+
+       * httemplate/: elements/menu.html, search/report_cust_refund.html:
+         add refund report, RT#6407
+
+2009-11-16 16:06  mark
+
+       * httemplate/: edit/cust_main_attach.cgi,
+         edit/process/cust_main_attach.cgi, elements/menu.html,
+         search/elements/search-html.html, view/cust_main.cgi,
+         view/cust_main/attachments.html: cust_attachment improvement,
+         RT#4964 and #6225
+
+2009-11-15 19:55  ivan
+
+       * FS/FS/cust_bill.pm, FS/FS/cust_main.pm,
+         httemplate/search/cust_bill.html,
+         httemplate/search/report_cust_bill.html: add ability to search on
+         ranges of charged, owed to adv. invoice report, RT#6407
+
+2009-11-15 18:27  ivan
+
+       * FS/: FS/Conf.pm, FS/Cron/bill.pm, bin/freeside-daily: add
+         disable_cron_billing config, RT#6407
+
+2009-11-13 16:08  ivan
+
+       * FS/FS/cust_main.pm, httemplate/elements/select-terms.html,
+         httemplate/search/cust_main.html,
+         httemplate/search/report_cust_main.html: add invoice terms to
+         advanced customer report.  dogfood.
+
+2009-11-12 23:12  ivan
+
+       * FS/FS/cust_pkg.pm: fix advanced package report fallout from
+         customer classes, RT#6677
+
+2009-11-12 13:45  mark
+
+       * FS/FS/Conf.pm, FS/FS/svc_acct.pm, httemplate/view/svc_acct.cgi,
+         httemplate/edit/svc_acct.cgi,
+         httemplate/edit/process/svc_acct.cgi: Add default password
+         encoding option
+
+2009-11-12 08:56  jeff
+
+       * FS/FS/: Schema.pm, tax_rate.pm: correct bugs in tax replacement
+         routine and allow updates to function
+
+2009-11-11 18:05  mark
+
+       * FS/FS/pay_batch/paymentech.pm: Fix date format string
+
+2009-11-11 18:03  mark
+
+       * FS/bin/: freeside-paymentech-upload,
+         freeside-paymentech-download: Fix zip password
+
+2009-11-11 08:38  jeff
+
+       * httemplate/edit/cust_credit.cgi: cruft removal
+
+2009-11-06 14:25  jeff
+
+       * httemplate/misc/xmlhttp-calculate_taxes.html: oops!  forgot an
+         important file for applying tax credits #4729
+
+2009-11-06 14:07  ivan
+
+       * FS/FS/cust_main.pm: use business-onlinepayment-description in
+         1.9, even without $pkgs
+
+2009-11-05 17:51  ivan
+
+       * FS/FS/: Conf.pm, cust_main_invoice.pm: add
+         emailinvoice-apostrophe config option to allow apostrophies in
+         invoice email addresses, RT#6464
+
+2009-11-05 16:25  ivan
+
+       * FS/FS/cust_main.pm, httemplate/search/cust_main.html,
+         httemplate/search/report_cust_main.html: add "payment expiration
+         before" to customer report, RT#6447
+
+2009-11-05 15:55  ivan
+
+       * FS/FS/ConfDefaults.pm: try not to make the "Customer Fields"
+         SELECT so huge
+
+2009-11-05 14:01  ivan
+
+       * httemplate/search/svc_acct.cgi: improvements in time remaining
+         report: correctly account for unpaid time for non-monthly
+         customers, report in hours+minutes intead of using Time::Duration
+         days/hours
+
+2009-11-05 13:22  ivan
+
+       * FS/bin/: freeside-paymentech-download,
+         freeside-paymentech-upload: back to old host name, info from
+         customer/paymentech was bogus, RT#5650
+
+2009-11-04 17:47  ivan
+
+       * FS/bin/: freeside-paymentech-download,
+         freeside-paymentech-upload: update paymentech live server,
+         RT#5650
+
+2009-11-04 16:52  ivan
+
+       * FS/FS/pkg_category.pm: fix pkg_category upgrades
+
+2009-11-04 16:48  ivan
+
+       * FS/FS/cust_main.pm: fix bad interaction between new city tax code
+         & using taxclasses without cities, RT#6637
+
+2009-11-04 16:29  ivan
+
+       * FS/FS/Mason.pm: oops, for customer categories
+
+2009-11-04 16:04  ivan
+
+       * httemplate/browse/cust_main_county.cgi: fix county filter on tax
+         config, fallout from city tax changes, RT#5852
+
+2009-11-03 17:40  ivan
+
+       * FS/bin/: freeside-paymentech-download,
+         freeside-paymentech-upload: add explicit use of Expect module, so
+         the error is thrown immediate, RT#5650
+
+2009-11-03 17:04  ivan
+
+       * FS/FS/Cron/breakage.pm, httemplate/config/config-process.cgi,
+         httemplate/config/config-view.cgi: reconcile breakage from stale
+         accounts, RT#6407
+
+2009-11-03 16:59  ivan
+
+       * FS/FS/part_pkg.pm: silence "use of uninitialized value in split"
+         warning
+
+2009-11-03 12:44  ivan
+
+       * FS/FS/pay_batch.pm: fix warning replacing pay_batch, RT#5650
+
+2009-11-03 11:56  ivan
+
+       * FS/bin/: freeside-paymentech-upload,
+         freeside-paymentech-download: check for zip and unzip commands,
+         use multi-arg version of system to prevent the shell getting its
+         hands on things (metacharacters in pw or whatnot), RT#5650
+
+2009-11-03 11:11  ivan
+
+       * FS/bin/: freeside-paymentech-download,
+         freeside-paymentech-upload: update usage & manpage w/ freeside-
+         prefix
+
+2009-11-03 11:03  ivan
+
+       * FS/bin/: freeside-paymentech-download,
+         freeside-paymentech-upload: fix usage of File::Temp->newdir, not
+         in 0.18 File::Temp on perl 5.10.0, RT#5650
+
+2009-11-03 10:53  ivan
+
+       * bin/paymentech-download, bin/paymentech-upload,
+         FS/bin/freeside-paymentech-download,
+         FS/bin/freeside-paymentech-upload: moving paymentech-* to FS/bin,
+         RT#5650
+
+2009-11-02 19:13  ivan
+
+       * httemplate/config/config.cgi, FS/FS/Conf.pm,
+         FS/bin/freeside-daily, httemplate/config/config-process.cgi,
+         httemplate/config/config-view.cgi,
+         httemplate/elements/tr-select-part_pkg.html,
+         FS/FS/Cron/breakage.pm: (start of) reconcile breakage from stale
+         accounts, RT#6407
+
+2009-11-02 17:48  ivan
+
+       * bin/paymentech-download: spelling
+
+2009-11-02 17:44  ivan
+
+       * bin/paymentech-download: add -a option for archive dir
+
+2009-11-02 17:21  ivan
+
+       * FS/FS/Conf.pm: clarify description of batchconfig-paymentech
+         based on notes from #5650
+
+2009-11-02 13:21  ivan
+
+       * httemplate/edit/payment_gateway.html: add Elavon, SagePay,
+         WorldPay, fix extra space on PlugnPay, PPIPayMover, Protx
+
+2009-11-01 14:12  jeff
+
+       * httemplate/search/: 477.html, elements/search-csv.html: form 477
+         improvements #6499
+
+2009-10-31 13:09  jeff
+
+       * FS/FS/cust_bill.pm: unbork summary page invoices
+
+2009-10-30 16:29  ivan
+
+       * FS/FS/cust_event.pm, FS/FS/cust_main_Mixin.pm,
+         httemplate/elements/select-part_event.html,
+         httemplate/elements/select-payby.html,
+         httemplate/elements/tr-select-part_event.html,
+         httemplate/search/cust_event.html,
+         httemplate/search/report_cust_event.html: more reporting options
+         for failed billing events, RT#6447
+
+2009-10-30 11:37  ivan
+
+       * FS/FS/: Conf.pm: add paymentech to batch config options
+
+2009-10-29 17:02  ivan
+
+       * httemplate/: browse/cust_main_county.cgi,
+         edit/bulk-cust_main_county.html,
+         edit/process/bulk-cust_main_county.html: bulk tax changes,
+         RT#6445
+
+2009-10-29 16:43  mark
+
+       * FS/FS/pay_batch/paymentech.pm: use XML::Writer for tighter
+         compliance with spec
+
+2009-10-29 16:42  mark
+
+       * bin/paymentech-upload: add option to upload all open batches
+
+2009-10-29 16:37  ivan
+
+       * httemplate/edit/bulk-cust_main_county.html: friendlier error
+         message when you select nothing, RT#6445
+
+2009-10-29 16:36  ivan
+
+       * httemplate/elements/errorpage-popup.html: adding errorpage popup,
+         RT#6445
+
+2009-10-29 15:55  ivan
+
+       * FS/bin/freeside-queued: have freeside-queued be more resillient
+         in the face of a database that's gone away, RT#6428
+
+2009-10-29 12:10  ivan
+
+       * FS/FS/cust_bill_pkg.pm: turn off debugging
+
+2009-10-29 12:08  ivan
+
+       * httemplate/search/cust_main.html,
+         httemplate/search/report_cust_main.html, FS/FS/cust_main.pm,
+         httemplate/elements/select-table.html: customer classification,
+         RT#6376
+
+2009-10-29 11:38  ivan
+
+       * FS/MANIFEST, FS/FS/cust_main.pm, FS/t/category_Common.t,
+         FS/t/class_Common.t, httemplate/browse/pkg_category.html,
+         httemplate/edit/cust_main/top_misc.html,
+         httemplate/view/cust_main/misc.html,
+         httemplate/elements/select-cust_class.html,
+         httemplate/elements/tr-select-cust_class.html: customer
+         classification, RT#6376
+
+2009-10-28 18:08  ivan
+
+       * FS/FS.pm, FS/MANIFEST, FS/FS/Schema.pm, FS/FS/category_Common.pm,
+         FS/FS/class_Common.pm, FS/FS/cust_category.pm,
+         FS/FS/cust_class.pm, FS/FS/cust_main.pm, FS/FS/pkg_category.pm,
+         FS/FS/pkg_class.pm, FS/t/cust_category.t, FS/t/cust_class.t,
+         httemplate/elements/menu.html,
+         httemplate/browse/cust_category.html,
+         httemplate/browse/cust_class.html,
+         httemplate/browse/part_pkg_report_option.html,
+         httemplate/browse/pkg_category.html,
+         httemplate/browse/pkg_class.html,
+         httemplate/edit/cust_category.html,
+         httemplate/edit/cust_class.html,
+         httemplate/edit/pkg_category.html,
+         httemplate/edit/pkg_class.html,
+         httemplate/edit/elements/category_Common.html,
+         httemplate/edit/elements/class_Common.html,
+         httemplate/edit/process/cust_category.html,
+         httemplate/edit/process/cust_class.html: customer classification,
+         RT#6376
+
+2009-10-28 12:04  ivan
+
+       * FS/FS/: svc_Common.pm, svc_acct.pm, svc_domain.pm,
+         svc_forward.pm, svc_www.pm: fix problems using inventory for UID
+         (and other fields controlled by check in svc_acct and also
+         svc_www, svc_domain and svc_forward), RT#6366
+
+2009-10-28 12:01  jeff
+
+       * FS/FS/cust_bill_pkg.pm, FS/FS/cust_credit.pm, FS/FS/cust_main.pm,
+         httemplate/edit/elements/ApplicationCommon.html,
+         httemplate/edit/process/cust_credit_bill.cgi,
+         httemplate/edit/process/elements/ApplicationCommon.html: UI
+         changes for credit applications include on the fly tax
+         calculations #4729
+
+2009-10-28 11:16  ivan
+
+       * FS/FS/part_svc.pm: fix removing a flag from a service definition
+         column
+
+2009-10-28 10:26  ivan
+
+       * httemplate/misc/inventory_item-import.html: fix inventory upload,
+         RT#6366
+
+2009-10-27 23:13  ivan
+
+       * FS/FS/cust_pkg.pm, httemplate/misc/bulk_change_pkg.cgi,
+         httemplate/search/cust_pkg.cgi,
+         httemplate/search/report_cust_pkg.html,
+         httemplate/view/cust_main/packages.html: customer link to package
+         reports for that customer, RT#6180
+
+2009-10-27 11:11  ivan
+
+       * FS/FS/Conf.pm, FS/FS/cust_main.pm,
+         httemplate/elements/header.html: address1 search, RT#5060
+
+2009-10-26 18:26  mark
+
+       * httemplate/edit/payment_gateway.html: add Jety to the list
+
+2009-10-26 16:20  ivan
+
+       * httemplate/elements/tr-select-pkg_class.html: didn't want to
+         revert that, though
+
+2009-10-26 16:17  ivan
+
+       * httemplate/elements/tr-select-pkg_class.html: better fix for
+         ignoring disabled package classes that doesn't search them twice
+
+2009-10-26 00:12  jeff
+
+       * FS/FS/Conf.pm, FS/FS/Schema.pm,
+         FS/FS/cust_bill_ApplicationCommon.pm, FS/FS/cust_bill_pay_pkg.pm,
+         FS/FS/cust_bill_pkg.pm, FS/FS/cust_bill_pkg_tax_location.pm,
+         FS/FS/cust_bill_pkg_tax_rate_location.pm,
+         FS/FS/cust_credit_bill_pkg.pm, httemplate/edit/cust_credit.cgi,
+         httemplate/edit/elements/ApplicationCommon.html,
+         httemplate/edit/process/elements/ApplicationCommon.html,
+         httemplate/search/cust_bill_pkg.cgi,
+         httemplate/search/report_newtax.cgi,
+         httemplate/search/report_tax.cgi,
+         httemplate/view/cust_main/payment_history/credit.html,
+         httemplate/view/cust_main/payment_history/payment.html: credits
+         return taxes, but the magic calculation button does not yet work
+         properly (grrr - more sleep required) RT#4729
+
+2009-10-25 18:11  ivan
+
+       * FS/FS/part_pkg/flat.pm: eliminiate noisy but harmless "Use of
+         uninitialized value in numeric gt (>)" warning
+
+2009-10-25 16:30  ivan
+
+       * FS/FS/: cust_main.pm, ClientAPI/MyAccount.pm: add apply option to
+         realtime_collect, RT#5071
+
+2009-10-24 17:29  ivan
+
+       * httemplate/search/cust_bill.html: import legacy invoice numbers
+         to cust_bill.agent_invid, RT#5351
+
+2009-10-24 16:37  mark
+
+       * FS/FS/pay_batch.pm, FS/FS/Conf.pm, FS/FS/pay_batch/paymentech.pm,
+         bin/paymentech-download, bin/paymentech-upload: Scripts for
+         paymentech batch transfer
+
+2009-10-23 19:04  ivan
+
+       * FS/FS/ClientAPI/MyAccount.pm,
+         fs_selfservice/FS-SelfService/cgi/decline.html,
+         fs_selfservice/FS-SelfService/cgi/login.html,
+         fs_selfservice/FS-SelfService/cgi/selfservice.cgi,
+         fs_selfservice/FS-SelfService/cgi/signup.cgi,
+         fs_selfservice/FS-SelfService/cgi/signup.html,
+         fs_selfservice/FS-SelfService/cgi/success.html: remove an
+         inadvertant debugging call left in, allow an agentnum to be
+         specfied for non-logged in situations, RT#6166
+
+2009-10-23 17:34  ivan
+
+       * FS/: FS/Conf.pm, FS/ClientAPI/MyAccount.pm,
+         FS/ClientAPI/Signup.pm, bin/freeside-selfservice-server:
+         selfservice per-agent skinning
+
+2009-10-23 17:16  ivan
+
+       * FS/FS/agent.pm: eliminate warnings from Business::CreditCard
+         about being passed an empty number
+
+2009-10-23 17:04  ivan
+
+       * FS/FS/Record.pm: fix cause of harmless 'Premature end of base64
+         data' warning
+
+2009-10-23 01:21  ivan
+
+       * bin/move-unlinked: adding unlinked account migration script,
+         RT#6126
+
+2009-10-22 18:41  ivan
+
+       * FS/FS/: Conf.pm, cust_pkg.pm: add cust_bill-consolidate_services
+         config to collapse multiple phone numbers (or whatever) into as
+         few lines as possible on invoices, RT#5223
+
+2009-10-22 15:11  ivan
+
+       * FS/FS/cust_bill.pm: fix invoice sub-totals, RT#6489
+
+2009-10-22 12:56  ivan
+
+       * FS/FS/ClientAPI/MasonComponent.pm: make sure that in the case
+         where there's no uncancelled active packages, the filter doesn't
+         reduce the package list to nothing, RT#6029
+
+2009-10-22 12:53  ivan
+
+       * FS/FS/ClientAPI/MasonComponent.pm: acciendtally left debugging
+         in, RT#6029
+
+2009-10-22 05:50  ivan
+
+       * FS/FS/Conf.pm, FS/FS/Schema.pm, FS/FS/part_pkg.pm,
+         FS/FS/ClientAPI/MasonComponent.pm,
+         httemplate/browse/part_pkg.cgi, httemplate/edit/part_pkg.cgi:
+         restrict additinal package order option, RT#6029
+
+2009-10-22 02:34  ivan
+
+       * httemplate/elements/city.html: yay, found blank city problem
+         w/new citytax foo, RT#5852
+
+2009-10-22 01:58  ivan
+
+       * httemplate/elements/select-county.html: fix all location selects
+         hidden on new customer add, fallout from city tax stuff, yay for
+         this not being on _1_9_BRANCH, RT#5852
+
+2009-10-22 01:08  ivan
+
+       * httemplate/search/svc_phone.cgi: should at least run under pg 8.3
+         now, need to test & see if the data make sense, RT#5496
+
+2009-10-21 22:32  ivan
+
+       * FS/FS/cust_bill_pkg_display.pm: fix incompatibility
+         w/invoice_sections vs. cust_bill_pkg.pkgnum -1 "virtual line
+         item" (rare)
+
+2009-10-21 17:28  ivan
+
+       * FS/FS/Schema.pm, bin/cdr-netsapiens.import: fix netsapiens CDR
+         import, RT#5226
+
+2009-10-21 00:09  ivan
+
+       * FS/FS/Schema.pm: MySQL doesn't like indexing a text field
+
+2009-10-20 23:34  ivan
+
+       * httemplate/search/prepay_credit.html: fix agent link in unused
+         prepaid card report
+
+2009-10-20 16:24  ivan
+
+       * FS/FS/cust_bill_pay_pkg.pm: should fix problems sending a receipt
+         against a specific package when taxes are in use
+
+2009-10-20 13:47  ivan
+
+       * bin/cdr-netsapiens.import: basic import working, still need
+         better src/dst mapping, RT#5226
+
+2009-10-20 13:43  ivan
+
+       * FS/FS/part_export/netsapiens.pm: better debug line showing full
+         URL, RT#5226
+
+2009-10-20 11:30  ivan
+
+       * fs_selfservice/FS-SelfService/cgi/change_pay.html: don't show
+         duplicate 'Credit card' or 'Check' choices even when
+         signup_server-payby has CARD & DCRD (or CHEK & DCHK)
+
+2009-10-16 15:39  ivan
+
+       * FS/FS/cust_bill_pkg.pm: make warning about expensive lookup a
+         carp & controlled by $DEBUG
+
+2009-10-12 07:11  ivan
+
+       * bin/cdr-netsapiens.import: finish netsapiens import, RT#6365
+
+2009-10-12 06:09  ivan
+
+       * FS/FS/part_export/shellcommands.pm: terrible typo
+
+2009-10-12 05:50  ivan
+
+       * FS/FS/part_export/shellcommands.pm: add customer information to
+         shellcommands export, RT#5351
+
+2009-10-12 02:10  ivan
+
+       * fs_selfservice/FS-SelfService/cgi/: signup.cgi, signup.html: use
+         modules in signup.cgi instead of in the template, fixes "Insecure
+         dependency in rquire"
+
+2009-10-11 23:48  ivan
+
+       * FS/FS/ClientAPI/MyAccount.pm,
+         fs_selfservice/FS-SelfService/cgi/myaccount.html,
+         fs_selfservice/FS-SelfService/cgi/myaccount_menu.html: fix
+         inadvertant "unknown package" error, fallout from pkg-balance
+         work, RT#6125
+
+2009-10-11 19:34  ivan
+
+       * FS/FS/cust_main.pm: using the per-city taxes sure was a lot
+         easier than the UI... RT#5852
+
+2009-10-11 19:30  ivan
+
+       * FS/FS/part_event/Action/: cust_bill_fee_percent.pm, fee.pm: fix
+         for no finance_pkgclass set
+
+2009-10-11 19:14  ivan
+
+       * httemplate/edit/cust_main_county.html: UI for per-city taxes
+         (setup and assigning to customers/package locations), RT#5852
+
+2009-10-11 18:58  ivan
+
+       * httemplate/: edit/cust_main/contact.html,
+         elements/select-country.html: UI for per-city taxes (setup and
+         assigning to customers/package locations), RT#5852
+
+2009-10-11 18:45  ivan
+
+       * FS/FS/Mason.pm, FS/FS/Misc.pm, FS/FS/Schema.pm,
+         FS/FS/cust_main_county.pm,
+         httemplate/browse/cust_main_county.cgi,
+         httemplate/edit/cust_main.cgi,
+         httemplate/edit/cust_main_county-expand.cgi,
+         httemplate/edit/process/cust_main_county-collapse.cgi,
+         httemplate/edit/process/cust_main_county-expand.cgi,
+         httemplate/elements/city.html, httemplate/elements/location.html,
+         httemplate/elements/select-county.html,
+         httemplate/elements/tr-select-cust_location.html,
+         httemplate/misc/cities.cgi: UI for per-city taxes (setup and
+         assigning to customers/package locations), RT#5852
+
+2009-10-11 00:44  ivan
+
+       * conf/ticket_system-default_queueid: default to 1
+
+2009-10-10 19:41  ivan
+
+       * ChangeLog, debian/changelog: Updated for 1.9.1
+
+2009-10-10 18:57  ivan
+
+       * ChangeLog, rpm/freeside.spec, debian/changelog: Updated for 1.9.1
+
+2009-10-10 18:50  ivan
+
+       * Makefile, bin/cvs2cl: helps to have the tool
+
+2009-10-10 18:48  ivan
+
+       * Makefile: do it
+
+2009-10-10 18:48  ivan
+
+       * rt/lib/RT.pm: huh #2
+
+2009-10-10 18:46  ivan
+
+       * rt/Makefile: huh
+
+2009-10-10 18:45  ivan
+
+       * httemplate/search/elements/search-html.html: don't try to follow
+         a blank redirect
+
+2009-10-10 18:45  ivan
+
+       * httemplate/search/report_cdr.html: end form
+
+2009-10-10 18:45  ivan
+
+       * httemplate/elements/tr-textarea.html: new rows and cols options
+
+2009-10-10 18:44  ivan
+
+       * httemplate/elements/tr-select-pkg_class.html: respect
+         element_name
+
+2009-10-10 18:43  ivan
+
+       * httemplate/browse/agent.cgi: cleanup
+
+2009-10-10 18:42  ivan
+
+       * eg/cdr_template.pm, httemplate/elements/selectlayers.html: doc
+
+2009-10-10 18:41  ivan
+
+       * FS/FS/part_export/globalpops_voip.pm: correct variable
+         initialization
+
+2009-10-10 18:40  ivan
+
+       * FS/FS/: access_right.pm, access_usergroup.pm,
+         clientapi_session_field.pm, cust_svc_option.pm: remembered to
+         customize this manpage
+
+2009-10-10 18:39  ivan
+
+       * FS/FS/Record.pm: ::1 becomes 127.0.0.1 in IP checks
+
+2009-10-09 20:22  ivan
+
+       * ChangeLog: commit message for a file about commitmessages
+
+2009-10-09 16:59  ivan
+
+       * FS/FS/Schema.pm, FS/FS/cust_main.pm,
+         httemplate/edit/cust_main/billing.html,
+         httemplate/elements/select-terms.html, FS/FS/cust_bill.pm,
+         httemplate/edit/quick-charge.html,
+         httemplate/edit/process/quick-charge.cgi: change invoice terms
+         for one-time charges (& bill them immediately), RT#5891
+
+2009-10-09 14:37  ivan
+
+       * FS/FS/cust_main.pm: add cust_pkg_ref option to charge
+
+2009-10-08 01:28  ivan
+
+       * httemplate/view/cust_main/packages.html: fix "show old packages"
+         accidentally hiding cancelled packages, RT#5276
+
+2009-10-07 23:00  ivan
+
+       * FS/FS/: cust_main.pm, Cron/bill.pm: freeside-daily -g and -m
+         cooperation (and no HASH() queue noise with -m)
+
+2009-10-07 22:44  ivan
+
+       * FS/FS/: cust_bill.pm, cust_main.pm: avoid some (look to be
+         harmless) warnings:
+
+         Argument "" isn't numeric in sprintf at
+         /usr/local/share/perl/5.10.0/FS/cust_bill.pm line 2358.
+
+         Argument "" isn't numeric in subtraction (-) at
+         /usr/local/share/perl/5.10.0/FS/cust_bill.pm line 2359.
+
+         Argument "" isn't numeric in addition (+) at
+         /usr/local/share/perl/5.10.0/FS/cust_main.pm line 2788.
+
+2009-10-07 22:09  ivan
+
+       * FS/FS/cust_bill.pm: tyop
+
+2009-10-07 18:15  ivan
+
+       * FS/FS/Conf.pm, FS/FS/cust_bill.pm, conf/invoice_html,
+         conf/invoice_latex: conf switches to turn on smaller notes and
+         footer sections with stock templates, RT#5218
+
+2009-10-07 16:51  ivan
+
+       * httemplate/view/cust_statement.html: naming follow-up notices
+         from the event rather than creting a slew of separate templates,
+         RT#5217
+
+2009-10-07 16:44  ivan
+
+       * FS/FS/cust_bill.pm, httemplate/misc/email-statement.cgi,
+         httemplate/misc/send-invoice.cgi,
+         httemplate/misc/send-statement.cgi,
+         httemplate/search/cust_event.html,
+         FS/FS/part_event/Action/cust_bill_send_reminder.pm,
+         conf/invoice_html, conf/invoice_latex, conf/invoice_template,
+         httemplate/view/cust_bill-pdf.cgi,
+         httemplate/view/cust_bill-ps.cgi, httemplate/view/cust_bill.cgi,
+         httemplate/view/cust_statement.html: naming follow-up notices
+         from the event rather than creting a slew of separate templates,
+         RT#5217
+
+2009-10-06 17:43  ivan
+
+       * FS/FS/Conf_compat17.pm: bring up-to-date wrt 1.7 Conf.pm
+         1.180.2.52 (2009-10-03), RT#2873
+
+2009-10-06 16:51  ivan
+
+       * FS/FS/cust_bill_pkg.pm: remove inadvertant debugging warnings
+
+2009-10-06 08:49  jeff
+
+       * httemplate/edit/router.cgi: replace disappearing line
+
+2009-10-05 16:36  ivan
+
+       * FS/FS/svc_acct.pm: remove annoying warning: Use of uninitialized
+         value $FS::svc_acct::passwordmin in pattern match (m//) at
+         /usr/local/share/perl/5.10.0/FS/svc_acct.pm line 60.
+
+2009-10-05 11:17  ivan
+
+       * httemplate/misc/payment.cgi: oops, handle old cust_main.pm
+         properly (should we be bothering?) :/ RT#5889
+
+2009-10-05 09:57  ivan
+
+       * httemplate/view/cust_main/payment_history/voided_payment.html:
+         doh, fix error viewing voided payments, RT#6382
+
+2009-10-05 08:07  jeff
+
+       * httemplate/elements/tr-select-pkg_class.html: remove unused
+         option that DTWT
+
+2009-10-05 07:04  jeff
+
+       * httemplate/edit/cust_main/: bottomfixup.js,
+         choose_tax_location.html, contact.html: low hanging fruit:
+         improvement in tax location selection RT#6000
+
+2009-10-05 07:01  jeff
+
+       * httemplate/edit/router.cgi: low hanging fruit: restore router
+         virtual fields (and svcnum) in 1.9 RT#5960
+
+2009-10-04 19:40  ivan
+
+       * httemplate/misc/payment.cgi: add manual_process-skip_first
+         option, RT#5889
+
+2009-10-04 19:35  ivan
+
+       * FS/FS/Conf.pm, FS/FS/cust_main.pm, httemplate/misc/payment.cgi:
+         add manual_process-skip_first option, RT#5889
+
+2009-10-04 19:16  ivan
+
+       * FS/FS/Conf.pm, httemplate/misc/payment.cgi,
+         httemplate/misc/process/payment.cgi: add manual_process-display
+         config to subtract fee from amount instead of adding, RT#5889
+
+2009-10-04 18:40  jeff
+
+       * conf/invoice_html: can't revert because windows is ghei
+
+2009-10-04 18:07  jeff
+
+       * FS/FS/cust_main.pm: don't consider setup or recurring taxes when
+         billing usage on cancel
+
+2009-10-04 18:00  jeff
+
+       * FS/FS/: cust_bill.pm, cust_main.pm, part_pkg/voip_cdr.pm:
+         invoices with details in separate section but usage not separated
+
+2009-10-04 17:49  jeff
+
+       * FS/FS/Conf.pm, FS/FS/Schema.pm, FS/FS/Upgrade.pm,
+         FS/FS/cust_bill.pm, conf/invoice_html, conf/invoice_htmlsummary,
+         conf/invoice_latex, conf/invoice_latexsummary,
+         FS/FS/cust_bill_pkg.pm, FS/FS/cust_bill_pkg_display.pm,
+         FS/FS/cust_main.pm, FS/FS/pkg_category.pm,
+         FS/FS/part_event/Action/cust_bill_fee_percent.pm,
+         FS/FS/part_event/Action/fee.pm,
+         httemplate/browse/pkg_category.html,
+         httemplate/edit/pkg_category.html: leading summary page invoices
+         #RT5086
+
+2009-10-04 16:36  ivan
+
+       * fs_selfservice/FS-SelfService/cgi/selfservice.cgi: fix the same
+         problem with processing payments & masked ACH amounts, RT#6374
+
+2009-10-04 16:31  ivan
+
+       * FS/FS/ClientAPI/MyAccount.pm: fix problems "re-saving" a masked
+         card.  hopefully the last of it!
+
+2009-10-03 19:09  ivan
+
+       * httemplate/misc/delete-cust_bill.html: delete invoices, RT#4048
+
+2009-10-03 19:04  ivan
+
+       * FS/FS/AccessRight.pm, FS/FS/Conf.pm, FS/FS/Setup.pm,
+         FS/FS/cust_bill.pm, FS/FS/cust_bill_pkg.pm,
+         FS/bin/freeside-addgroup, bin/mapsecrets2access_user,
+         httemplate/view/cust_bill.cgi,
+         httemplate/view/cust_main/payment_history.html,
+         httemplate/view/cust_main/payment_history/invoice.html: delete
+         invoices, RT#4048
+
+2009-10-03 17:08  ivan
+
+       * httemplate/view/cust_main.cgi: more room for cancellation reason
+
+2009-10-03 17:07  ivan
+
+       * httemplate/elements/popup_link-cust_main.html: doc
+
+2009-10-03 15:09  ivan
+
+       * httemplate/edit/part_bill_event.cgi: cancel to 80, comp @ 90,
+         RT#5674
+
+2009-10-03 15:06  ivan
+
+       * httemplate/edit/part_bill_event.cgi: in old invoice events,
+         chance default weight of cancel event to 90 so you can place it
+         at the same time as a realtime event, RT#5674
+
+2009-10-03 13:22  mark
+
+       * FS/FS/: pay_batch.pm, pay_batch/paymentech.pm: Load XML::Simple
+         at runtime to avoid breakage
+
+2009-10-01 16:48  ivan
+
+       * FS/FS/cust_main.pm: hopefully fully fix bulk email errors when
+         selecting a single payby
+
+2009-10-01 16:01  ivan
+
+       * FS/FS/Schema.pm: allow svc_acct._password to be NULL in the
+         schema
+
+2009-10-01 15:02  ivan
+
+       * httemplate/view/cust_main/payment_history/voided_payment.html:
+         consistency with un-voided payments wrt display
+
+2009-09-30 17:52  ivan
+
+       * fs_selfservice/FS-SelfService/cgi/selfservice.cgi: hopefully the
+         really final fix for the problems using remembered cards in
+         self-service. *sigh*
+
+2009-09-30 17:29  ivan
+
+       * FS/: FS/Conf.pm, FS/Cron/check.pm, bin/freeside-check: add login
+         check to FS::ClientAPI::SG/SGNG checks. RT#4610
+
+2009-09-30 12:33  ivan
+
+       * fs_selfservice/FS-SelfService/cgi/selfservice.cgi: hopefully the
+         final fix for the problems using remembered cards in self-service
+
+2009-09-29 15:08  ivan
+
+       * httemplate/misc/email-customers.html: should fix newsletter
+         sending error when you select a single payby only
+
+2009-09-28 23:17  ivan
+
+       * FS/t/cust_attachment.t: forgot
+
+2009-09-28 15:45  ivan
+
+       * FS/FS/Cron/check.pm: more accurate SG check, RT#4610
+
+2009-09-28 15:35  ivan
+
+       * FS/: FS/Cron/check.pm, bin/freeside-check: correct place for use
+         Email::Send, RT#4610
+
+2009-09-28 15:23  ivan
+
+       * FS/FS/Cron/check.pm: oops, hopefully fix sg cron check, RT#4610
+
+2009-09-28 08:55  jeff
+
+       * FS/FS/cust_pkg.pm: use object copy when billing on cancel to
+         avoid very weird side effects ( including 'impossible' history )
+         RT#5723
+
+2009-09-25 05:29  ivan
+
+       * FS/FS/Conf.pm, httemplate/config/config-view.cgi,
+         httemplate/config/config.cgi,
+         httemplate/config/config-process.cgi,
+         httemplate/misc/payment.cgi, httemplate/misc/process/payment.cgi:
+         processing fee on credit card recharges, RT#5889
+
+2009-09-25 03:29  ivan
+
+       * FS/FS/Conf.pm: this one too
+
+2009-09-25 03:14  ivan
+
+       * FS/FS/Conf.pm, FS/FS/svc_acct.pm, FS/FS/ClientAPI/Signup.pm,
+         fs_selfservice/FS-SelfService/cgi/signup.cgi,
+         fs_selfservice/FS-SelfService/cgi/signup.html,
+         httemplate/config/config-process.cgi,
+         httemplate/config/config-view.cgi, httemplate/config/config.cgi,
+         httemplate/elements/select-part_svc.html,
+         httemplate/elements/select-table.html,
+         httemplate/elements/tr-select-part_svc.html: nomadix, RT#5876
+
+2009-09-24 19:30  mark
+
+       * FS/FS/pay_batch.pm, FS/FS/Conf.pm, FS/FS/pay_batch/BoM.pm,
+         FS/FS/pay_batch/PAP.pm, FS/FS/pay_batch/ach_spiritone.pm,
+         FS/FS/pay_batch/chase_canada.pm, FS/FS/pay_batch/paymentech.pm,
+         FS/FS/pay_batch/td_canada_trust.pm,
+         httemplate/misc/download-batch.cgi,
+         httemplate/search/cust_pay_batch.cgi: Batch payment refactoring
+
+2009-09-24 18:04  mark
+
+       * FS/MANIFEST: Add cust_attachment
+
+2009-09-24 12:59  ivan
+
+       * FS/FS/: Cron/check.pm, Conf.pm: get the ping username/pass from a
+         config, good enough, RT#4610
+
+2009-09-23 20:14  ivan
+
+       * FS/FS/Cron/check.pm, FS/bin/freeside-check,
+         FS/FS/ClientAPI/SGNG.pm,
+         fs_selfservice/FS-SelfService/SelfService.pm: add SG and SGNG
+         ping, RT#4610
+
+2009-09-23 16:47  ivan
+
+       * FS/FS/TicketSystem/RT_External.pm: this should fix the occasional
+         extra ticket showing up on wrong customer record
+
+2009-09-21 20:08  ivan
+
+       * FS/FS/Mason.pm: add addl_comp_root.pl and addl_handler_use.pl
+         config files, RT#4743
+
+2009-09-21 13:48  ivan
+
+       * FS/FS/cust_bill.pm: i think it is new Pg (or... new Record.pm???)
+         that causes this problem... before it just returned nothing for
+         the search instead of erroring out?
+
+2009-09-20 23:05  ivan
 
        * FS/FS/Conf.pm: doc clarification
 
          FS/FS/part_event/Condition/has_pkg_class.pm,
          FS/FS/part_event/Condition/has_pkgpart.pm,
          FS/FS/part_event/Condition/hasnt_pkgpart.pm,
+         httemplate/misc/email-statement.cgi,
          httemplate/view/cust_statement-pdf.cgi,
          httemplate/view/cust_statement.html: email statements, RT#4860
 
 
 2009-08-12 07:58  jeff
 
-       * Makefile, FS/FS/Conf.pm, FS/FS/Cron/upload.pm,
+       * bin/billco-upload, Makefile, FS/FS/Conf.pm, FS/FS/Cron/upload.pm,
          FS/bin/freeside-daily, FS/bin/freeside-monthly,
          httemplate/config/config-view.cgi: internalize billco-upload and
          automate the transfer to the provider RT#5902
        * FS/: FS/cust_main.pm, FS/Cron/bill.pm, bin/freeside-daily: commit
          pkgpart exclusion for billing run, RT#5495
 
+2009-07-17 07:58  jeff
+
+       * bin/billco-upload: add mutex and commit changes found on
+         installed system
+
 2009-07-16 19:29  jeff
 
        * httemplate/search/cust_pkg.cgi: FSM, another missed file for 477
 
 2009-07-16 17:10  ivan
 
-       * FS/: FS/Schema.pm, FS/cdr.pm, FS/part_pkg/voip_cdr.pm, FS.pm: get
-         rid of cdr_upstream_rate table and some other old convergent
-         cruft
+       * FS/: FS/Schema.pm, FS/cdr.pm, FS/cdr_upstream_rate.pm,
+         FS/part_pkg/voip_cdr.pm, FS.pm, t/cdr_upstream_rate.t: get rid of
+         cdr_upstream_rate table and some other old convergent cruft
 
 2009-07-16 15:16  jeff
 
 
        * FS/MANIFEST: remove freeside-expiration-alerter
 
+2009-06-26 17:55  ivan
+
+       * FS/bin/freeside-expiration-alerter: replaced by
+         FS::Cron::alert_expiration
+
 2009-06-26 16:21  ivan
 
        * FS/bin/freeside-queued: doh, brainfart, RT#5572
 
 2009-05-09 16:54  ivan
 
-       * FS/bin/freeside-cdr-sftp_and_import: move cdr-sftp_and_import
-         script to FS/bin, add -p option, RT#4081
+       * FS/bin/freeside-cdr-sftp_and_import, bin/cdr.sftp_and_import:
+         move cdr-sftp_and_import script to FS/bin, add -p option, RT#4081
 
 2009-05-09 00:56  ivan
 
          httemplate/edit/cust_main/top_misc.html,
          httemplate/edit/cust_main/billing.html,
          httemplate/edit/cust_main/choose_tax_location.html,
+         httemplate/edit/cust_main/select-domain.html,
          httemplate/edit/cust_main/first_pkg/select-part_pkg.html,
          httemplate/edit/cust_main/first_pkg/svc_acct.html,
          httemplate/edit/cust_main/first_pkg/svc_phone.html,
 
        * FS/FS/Setup.pm: be quiet
 
+2009-02-24 02:09  ivan
+
+       * conf/report_template: more bootstrapping bs
+
 2009-02-24 02:06  ivan
 
        * FS/FS/part_referral.pm: bootstrapping issues
 2009-02-09 06:05  ivan
 
        * FS/FS/Conf.pm, FS/FS/cust_bill.pm, FS/FS/cust_credit.pm,
-         FS/FS/cust_pay.pm, conf/invoice_html,
-         conf/invoice_html_statement, httemplate/config/config-image.cgi,
+         FS/FS/cust_pay.pm, FS/bin/freeside-expiration-alerter,
+         conf/invoice_html, conf/invoice_html_statement,
+         httemplate/config/config-image.cgi,
          httemplate/config/config-process.cgi,
          httemplate/config/config-view.cgi, httemplate/config/config.cgi,
          httemplate/elements/header.html, httemplate/view/REAL_logo.cgi,
 
 2009-01-02 17:52  ivan
 
-       * bin/cdr.http_and_import, bin/cdr.import, FS/FS/Record.pm,
-         FS/FS/cdr.pm, FS/FS/cdr/indosoft.pm: indosoft CDR format, RT#4425
+       * bin/cdr.http_and_import, bin/cdr.import, bin/cdr.sftp_and_import,
+         FS/FS/Record.pm, FS/FS/cdr.pm, FS/FS/cdr/indosoft.pm: indosoft
+         CDR format, RT#4425
 
 2009-01-02 14:03  ivan
 
        * FS/FS/Record.pm, FS/FS/cdr.pm, FS/FS/cdr/bell_west.pm,
-         FS/FS/cdr/troop.pm, bin/cdr.import: add troop CDRs, RT#4413
+         FS/FS/cdr/troop.pm, bin/cdr.import, bin/cdr.sftp_and_import: add
+         troop CDRs, RT#4413
 
 2009-01-02 10:01  ivan
 
 
 2008-12-29 10:06  jeff
 
-       * Makefile, conf/invoice_latex, etc/fslongtable.sty: ease
-         deployment of patched longtable
+       * Makefile, conf/invoice_latex, conf/longtable.sty.patch,
+         etc/fslongtable.sty: ease deployment of patched longtable
 
 2008-12-28 11:10  ivan
 
 
        * httemplate/: browse/cust_main_county.cgi,
          edit/cust_main/contact.html, edit/cust_main/billing.html,
-         misc/payment.cgi: fix browse results for selecting counties
-         (resulting from separating tax classes), also add dropdowns to
-         browse by state and county, RT#4496
+         misc/payment.cgi, edit/cust_main/select-country.html,
+         edit/cust_main/select-county.html,
+         edit/cust_main/select-state.html: fix browse results for
+         selecting counties (resulting from separating tax classes), also
+         add dropdowns to browse by state and county, RT#4496
 
 2008-12-24 16:45  jeff
 
 
        * conf/invoice_latex: better value for non-broken tetex
 
+2008-10-12 12:43  jeff
+
+       * conf/longtable.sty.patch: check not just for fit, but move the
+         goalposts as well
+
 2008-10-11 17:58  ivan
 
        * httemplate/browse/cust_main_county.cgi: fix link
 
 2008-10-10 14:30  jeff
 
-       * conf/invoice_latex: avoid overprinting remittance coupons
+       * conf/: invoice_latex, longtable.sty.patch: avoid overprinting
+         remittance coupons
 
 2008-10-10 12:25  ivan
 
 
 2008-08-28 18:09  ivan
 
-       * FS/FS/Schema.pm, FS/FS/cdr.pm,
+       * FS/FS/Schema.pm, FS/FS/cdr.pm, bin/cdr.sftp_and_import,
          httemplate/elements/select-cdrbatch.html,
          httemplate/elements/tr-select-cdrbatch.html,
          httemplate/search/cdr.html, httemplate/search/report_cdr.html:
 
 2008-07-30 15:10  ivan
 
-       * FS/FS/cdr/nextone.pm: rename nt to nextone
+       * FS/FS/cdr/: nextone.pm, nt.pm: rename nt to nextone
 
 2008-07-29 13:00  jeff
 
 2008-07-17 16:55  ivan
 
        * FS/FS/: cdr.pm, cdr/asterisk.pm, cdr/genband.pm,
-         cdr/genband_meetme.pm, cdr/openser.pm, cdr/simple.pm,
+         cdr/genband_meetme.pm, cdr/nt.pm, cdr/openser.pm, cdr/simple.pm,
          cdr/taqua.pm, cdr/unitel.pm: CDR updates; modularize CDR import
          formats; add formats for OpenSER, Genband/Tekelec, and "NT"
 
          httemplate/misc/areacodes.cgi, httemplate/misc/exchanges.cgi,
          httemplate/misc/phonenums.cgi, FS/FS/Record.pm,
          FS/FS/part_export/globalpops_voip.pm,
-         httemplate/edit/svc_phone.cgi: get DIDs from globalpops
+         httemplate/edit/svc_phone.cgi,
+         httemplate/edit/cust_main/select-state.html: get DIDs from
+         globalpops
 
 2008-06-28 12:25  jeff
 
          (cancel/suspend) reason and possibly fix a lingering spurious
          usergroup bug
 
+2008-04-16 04:54  jeff
+
+       * httemplate/edit/part_pkg_taxproduct.html: this no longer belongs
+
 2008-04-15 21:42  ivan
 
        * httemplate/: edit/part_pkg.cgi, browse/part_pkg.cgi: add plan &
 
 2008-04-07 22:49  ivan
 
-       * debian/: README.Debian, TODO, changelog, compat, config, control,
-         copyright, cron.d, dbconfig-common.install,
-         dbconfig-common.upgrade, freeside-webui.links,
-         freeside.apache-alias.conf, freeside.default, freeside.docs,
-         init.d.ex, init.d.lsb.ex, postinst, postrm, preinst, prerm,
-         rules, templates: debian packages!
+       * debian/: README.Debian, TODO, changelog, compat, conffiles.ex,
+         config, control, copyright, cron.d, cron.d.ex,
+         dbconfig-common.install, dbconfig-common.upgrade, dirs, docs,
+         ex.doc-base.package, freeside-doc.docs, freeside-doc.files,
+         freeside-webui.links, freeside.apache-alias.conf,
+         freeside.default, freeside.docs, init.d.ex, init.d.lsb.ex,
+         manpage.1.ex, manpage.sgml.ex, menu.ex, postinst, postinst.ex,
+         postrm, postrm.ex, preinst, preinst.ex, prerm, prerm.ex, rules,
+         templates, watch.ex: debian packages!
 
 2008-04-06 09:12  jeff
 
        * httemplate/docs/: credits.html, license.html: adding license and
          credits in app itself
 
+2008-04-01 16:24  ivan
+
+       * TODO: remove TODO
+
+2008-04-01 16:24  ivan
+
+       * SCHEMA_CHANGE: remove SCHEMA_CHANGE
+
 2008-04-01 16:20  ivan
 
        * README: welcome to the new world
          FS/t/part_pkg_taxrate.t, FS/t/tax_class.t, FS/t/tax_rate.t,
          httemplate/browse/tax_rate.cgi, httemplate/edit/part_pkg.cgi,
          httemplate/edit/part_pkg_taxoverride.html,
+         httemplate/edit/part_pkg_taxproduct.html,
          httemplate/edit/tax_class.html, httemplate/edit/tax_rate.html,
          httemplate/edit/process/part_pkg.cgi,
          httemplate/edit/process/tax_class.html,
 2008-03-23 16:32  ivan
 
        * rt/html/Elements/: AddCustomers, EditCustomers: part 1 of #1160:
-         associate users w/customers, manual editing
-
-2008-03-19 12:48  jeff
-
-       * httemplate/edit/part_bill_event.cgi: quick fix for deep recursion
-         (RT#3267)
-
-2008-03-17 23:43  ivan
-
-       * fs_selfservice/fri/modules/: billing.module, dashboard.module,
-         myaccount.module: pre-show checkpoint.  duct tape!
-
-2008-03-17 09:24  ivan
-
-       * fs_selfservice/fri/modules/: billing.module, dashboard.module,
-         myaccount.module: checkpoint
-
-2008-03-16 19:49  ivan
-
-       * fs_selfservice/fri/: includes/freeside.class.php,
-         modules.template/blank.module: missed bits
-
-2008-03-16 19:48  ivan
-
-       * fs_selfservice/fri/: includes/login.php, includes/main.conf.php,
-         locale/ari.po, modules/billing.module,
-         modules/callmonitor.module, modules/dashboard.module,
-         modules/myaccount.module, modules/settings.module,
-         theme/page.tpl.php: first bits of working FRI!  woop!
-
-2008-03-16 19:37  ivan
-
-       * httemplate/view/cust_main/packages.html: fix oops in new popup
-         components
-
-2008-03-16 16:36  ivan
-
-       * FS/FS/ClientAPI/MyAccount.pm: hopefully allow phone login to work
-
-2008-03-16 16:25  ivan
-
-       * httemplate/view/svc_phone.cgi: view PINs too
-
-2008-03-16 16:05  jeff
-
-       * httemplate/: elements/popup_link-cust_main.html,
-         elements/popup_link-cust_pkg.html,
-         elements/popup_link-cust_svc.html, elements/popup_link.html,
-         view/cust_main.cgi, view/cust_main/packages.html: componentize
-         conflicting %once subroutines (rt#3250)
-
-2008-03-16 15:48  ivan
-
-       * httemplate/edit/svc_phone.cgi: phone gets a pin
-
-2008-03-16 15:39  ivan
-
-       * FS/FS/ClientAPI/MyAccount.pm: phonenum + pin login
-
-2008-03-16 15:24  ivan
-
-       * FS/FS/: Conf.pm, svc_phone.pm, ClientAPI/MyAccount.pm: phonenum +
-         pin login
-
-2008-03-16 14:07  ivan
-
-       * fs_selfservice/fri/includes/: common.php, login.php: first try at
-         single sign-on
-
-2008-03-16 12:58  ivan
-
-       * fs_selfservice/fri/: theme/page.tpl.php,
-         modules/callmonitor.module, modules/settings.module,
-         includes/main.conf.php, includes/common.php, includes/login.php,
-         locale/ari.po: Initial revision
-
-2008-03-16 12:58  ivan
-
-       * fs_selfservice/fri/: CHANGE.log, LICENSE.txt, README.txt,
-         index.php, version.php, theme/global.css, theme/header.css,
-         theme/iefixes.css, theme/layout.css, theme/logo.gif,
-         theme/main.css, theme/navigation.css, theme/spacer.gif,
-         theme/text.css, theme/images/arrow-asc.gif,
-         theme/images/arrow-desc.gif, modules/phonefeatures.module,
-         modules/voicemail.module, modules/featurecodes.module,
-         modules/followme.module, includes/ajax.php, includes/crypt.php,
-         misc/audio.php, misc/popup.css, misc/recording_popup.php,
-         modules/VmX.module, includes/asi.php, includes/bootstrap.php,
-         includes/database.php, includes/display.php, includes/lang.php,
-         locale/readme.txt, locale/ari.utf-8.po, locale/locale.txt,
-         locale/de_DE/LC_MESSAGES/ari.mo, locale/hu_HU/LC_MESSAGES/ari.mo,
-         locale/hu_HU/LC_MESSAGES/ari.po, locale/pt_BR/LC_MESSAGES/ari.mo,
-         locale/pt_BR/LC_MESSAGES/ari.po, locale/de_DE/LC_MESSAGES/ari.po,
-         locale/el_GR/LC_MESSAGES/ari.mo, locale/el_GR/LC_MESSAGES/ari.po,
-         locale/es_ES/LC_MESSAGES/ari.mo, locale/es_ES/LC_MESSAGES/ari.po,
-         locale/sv_SE/LC_MESSAGES/ari.mo, locale/sv_SE/LC_MESSAGES/ari.po,
-         locale/it_IT/LC_MESSAGES/ari.mo, locale/fr_FR/LC_MESSAGES/ari.mo,
-         locale/fr_FR/LC_MESSAGES/ari.po, locale/he_IL/LC_MESSAGES/ari.mo,
-         locale/he_IL/LC_MESSAGES/ari.po, locale/it_IT/LC_MESSAGES/ari.po:
-         [no log message]
-
-2008-03-16 09:57  jeff
-
-       * httemplate/misc/recharge_svc.html: doh
-
-2008-03-16 01:04  ivan
-
-       * FS/FS/UID.pm: goodness, i hope this fixes the bootstrapping
-
-2008-03-16 00:25  ivan
-
-       * FS/FS/UID.pm: okay, really now, how about this
-
-2008-03-16 00:24  ivan
-
-       * FS/FS/UID.pm: okay, how about this
-
-2008-03-16 00:21  ivan
-
-       * FS/FS/UID.pm: fix 1.7->1.9 bootstrapping, i think
-
-2008-03-15 22:22  ivan
-
-       * httemplate/search/svc_broadband.cgi: clean up and
-         agent-virtualize svc_broadband searching
-
-2008-03-15 22:13  ivan
-
-       * httemplate/edit/part_svc.cgi: finish bringing sanity to
-         svc_broadband service definition blocknum edit
-
-2008-03-15 22:13  ivan
-
-       * FS/FS/: addr_block.pm, svc_broadband.pm: bring some sanity to
-         address block selection in svc_broadband service definition edit
-
-2008-03-15 21:54  ivan
-
-       * httemplate/browse/: addr_block.cgi, router.cgi: drag address &
-         router browse into this centiry
-
-2008-03-15 21:00  ivan
-
-       * httemplate/elements/header.html, httemplate/elements/menu.html,
-         rt/html/Elements/FreesideSearch: hide customer search if user
-         does not have "List customers" ACL, closes: RT#3105
-
-2008-03-15 15:18  ivan
-
-       * httemplate/edit/part_pkg.cgi, FS/FS/part_pkg/voip_cdr.pm:
-         slightly better voip_cdr package edit: use radio buttons for
-         selecting long things
-
-2008-03-15 14:39  ivan
-
-       * FS/FS/part_pkg/voip_cdr.pm: be asssertive
-
-2008-03-15 14:14  ivan
-
-       * FS/FS/: cust_svc.pm, part_pkg/voip_cdr.pm: configurable
-         disable_src, domestic_prefix and international_prefix options for
-         voip price plan
-
-2008-03-15 12:52  ivan
-
-       * httemplate/search/cust_bill.html, FS/FS/cust_bill.pm: check on
-         invoice re-printing newest percust... can't reproduce any
-         problem, prints newest per cust fine, closes: #3161
-
-2008-03-14 17:30  ivan
-
-       * httemplate/: view/svc_domain.cgi, misc/catchall.cgi: fix harmless
-         code leaking out onto the page, hehe, closes: Bug#3253, also
-         remove silly formatting on catchall edit
-
-2008-03-14 13:11  ivan
-
-       * FS/FS/cust_main.pm: eliminate some harmless uninitialized value
-         warnings
-
-2008-03-14 10:30  jeff
-
-       * FS/FS/part_export/prizm.pm: insist on Net::Prizm 0.04
-
-2008-03-14 01:13  ivan
-
-       * httemplate/edit/process/cust_pkg.cgi: whew, glad that change
-         package bugfix was easy to find, closes: Bug#3241
-
-2008-03-14 00:48  ivan
-
-       * FS/FS/cust_credit_bill.pm, FS/FS/Report/Table/Monthly.pm,
-         httemplate/graph/money_time.cgi,
-         httemplate/search/cust_credit_bill.html,
-         httemplate/search/cust_credit.html: add net credits to
-         sales/credits/receipts report
-
-2008-03-13 19:10  ivan
-
-       * FS/FS/Conf.pm: add Net20 invoice terms, closes: #3219
+         associate users w/customers, manual editing
 
-2008-03-13 19:09  ivan
+2008-03-19 12:48  jeff
 
-       * FS/FS/Conf.pm: show where the warning about no conf comes from
+       * httemplate/edit/part_bill_event.cgi: quick fix for deep recursion
+         (RT#3267)
 
-2008-03-13 02:28  ivan
+2008-03-17 23:43  ivan
 
-       * FS/FS/cust_pay.pm: yow.  very sleep deprived.  remove the
-         infinite loop rather than add one.
+       * fs_selfservice/fri/modules/: billing.module, dashboard.module,
+         myaccount.module: pre-show checkpoint.  duct tape!
 
-2008-03-13 02:14  ivan
+2008-03-17 09:24  ivan
 
-       * FS/FS/cust_pay.pm: infinite loop protection
+       * fs_selfservice/fri/modules/: billing.module, dashboard.module,
+         myaccount.module: checkpoint
 
-2008-03-13 01:57  ivan
+2008-03-16 19:49  ivan
 
-       * FS/FS/cust_pay.pm: allow cust_pay.otaker upgrade to proceed even
-         if there are some old crufty records around attached to
-         now-deleted customers
+       * fs_selfservice/fri/: includes/freeside.class.php,
+         modules.template/blank.module: missed bits
 
-2008-03-12 09:22  jeff
+2008-03-16 19:48  ivan
 
-       * FS/FS/cust_svc.pm, FS/FS/part_export.pm, FS/FS/svc_Common.pm,
-         FS/FS/UI/Web.pm, FS/FS/part_export/prizm.pm,
-         eg/export_template.pm, httemplate/view/cust_main/packages.html:
-         allow exports to add links to customer view (#1407)
+       * fs_selfservice/fri/: includes/login.php, includes/main.conf.php,
+         locale/ari.po, modules/billing.module,
+         modules/callmonitor.module, modules/dashboard.module,
+         modules/myaccount.module, modules/settings.module,
+         theme/page.tpl.php: first bits of working FRI!  woop!
 
-2008-03-04 13:07  ivan
+2008-03-16 19:37  ivan
 
-       * FS/FS/cust_refund.pm: fix otaker population for cust_refund like
-         cust_credit and cust_pay
+       * httemplate/view/cust_main/packages.html: fix oops in new popup
+         components
 
-2008-03-04 13:06  ivan
+2008-03-16 16:36  ivan
 
-       * FS/FS/cust_pay.pm: fix cust_pay.otaker population
+       * FS/FS/ClientAPI/MyAccount.pm: hopefully allow phone login to work
 
-2008-03-04 11:15  ivan
+2008-03-16 16:25  ivan
 
-       * httemplate/: edit/cust_pkg.cgi, edit/process/cust_pkg.cgi,
-         misc/change_pkg.cgi: fix edit/process/cust_pkg getting confused
-         about the two different places that would be calling it... i.e.
-         with an empty new_pkgnum it would redirect the popup back the
-         customer view, hehe
+       * httemplate/view/svc_phone.cgi: view PINs too
 
-2008-03-03 19:38  ivan
+2008-03-16 16:05  jeff
 
-       * FS/FS/cust_bill.pm: AND fix latex->html notes substituion for ~s
+       * httemplate/: elements/popup_link-cust_main.html,
+         elements/popup_link-cust_pkg.html,
+         elements/popup_link-cust_svc.html, elements/popup_link.html,
+         view/cust_main.cgi, view/cust_main/packages.html: componentize
+         conflicting %once subroutines (rt#3250)
 
-2008-03-03 19:37  ivan
+2008-03-16 15:48  ivan
 
-       * FS/FS/cust_bill.pm: and fix latex->html notes substituion for
-         escaped #s
+       * httemplate/edit/svc_phone.cgi: phone gets a pin
 
-2008-03-03 19:34  ivan
+2008-03-16 15:39  ivan
 
-       * FS/FS/cust_bill.pm: fix latex->html notes substituion for
-         newlines
+       * FS/FS/ClientAPI/MyAccount.pm: phonenum + pin login
 
-2008-03-03 18:27  ivan
+2008-03-16 15:24  ivan
 
-       * httemplate/browse/rate_region.html: should improve compatibility
-         with older Pg.  i hope
+       * FS/FS/: Conf.pm, svc_phone.pm, ClientAPI/MyAccount.pm: phonenum +
+         pin login
 
-2008-03-03 17:49  ivan
+2008-03-16 14:07  ivan
 
-       * FS/FS/UID.pm: argh, don't load up a user until the other
-         initialization is done
+       * fs_selfservice/fri/includes/: common.php, login.php: first try at
+         single sign-on
 
-2008-03-03 15:12  ivan
+2008-03-16 12:58  ivan
 
-       * rt/: etc/RT_Config.pm.in, html/Elements/Header,
-         html/Elements/PageLayout, html/Elements/Tabs,
-         html/Elements/CollectionAsTable/Row,
-         html/Ticket/Elements/ShowTransactionAttachments,
-         html/Widgets/TitleBoxStart, sbin/rt-setup-database.in: merge in
-         rt 3.6.6.  *gulp*!
+       * fs_selfservice/fri/: CHANGE.log, LICENSE.txt, README.txt,
+         index.php, version.php, theme/global.css, theme/header.css,
+         theme/iefixes.css, theme/layout.css, theme/logo.gif,
+         theme/main.css, theme/navigation.css, theme/page.tpl.php,
+         theme/spacer.gif, theme/text.css, theme/images/arrow-asc.gif,
+         theme/images/arrow-desc.gif, modules/callmonitor.module,
+         modules/phonefeatures.module, modules/settings.module,
+         modules/voicemail.module, modules/featurecodes.module,
+         modules/followme.module, includes/ajax.php, includes/crypt.php,
+         includes/main.conf.php, misc/audio.php, misc/popup.css,
+         misc/recording_popup.php, modules/VmX.module, includes/asi.php,
+         includes/bootstrap.php, includes/common.php,
+         includes/database.php, includes/display.php, includes/lang.php,
+         includes/login.php, locale/readme.txt, locale/ari.po,
+         locale/ari.utf-8.po, locale/locale.txt,
+         locale/de_DE/LC_MESSAGES/ari.mo, locale/hu_HU/LC_MESSAGES/ari.mo,
+         locale/hu_HU/LC_MESSAGES/ari.po, locale/pt_BR/LC_MESSAGES/ari.mo,
+         locale/pt_BR/LC_MESSAGES/ari.po, locale/de_DE/LC_MESSAGES/ari.po,
+         locale/el_GR/LC_MESSAGES/ari.mo, locale/el_GR/LC_MESSAGES/ari.po,
+         locale/es_ES/LC_MESSAGES/ari.mo, locale/es_ES/LC_MESSAGES/ari.po,
+         locale/sv_SE/LC_MESSAGES/ari.mo, locale/sv_SE/LC_MESSAGES/ari.po,
+         locale/it_IT/LC_MESSAGES/ari.mo, locale/fr_FR/LC_MESSAGES/ari.mo,
+         locale/fr_FR/LC_MESSAGES/ari.po, locale/he_IL/LC_MESSAGES/ari.mo,
+         locale/he_IL/LC_MESSAGES/ari.po, locale/it_IT/LC_MESSAGES/ari.po:
+         Initial revision
 
-2008-03-01 20:10  ivan
+2008-03-16 09:57  jeff
 
-       * rt/: lib/t/regression/08web_cf_access.t,
-         lib/t/regression/12-search.t, lib/t/regression/04send_email.t,
-         lib/t/regression/21query-builder.t,
-         lib/t/regression/22search_tix_by_txn.t,
-         lib/t/regression/22search_tix_by_watcher.t,
-         lib/t/regression/06-mime_decoding.t, lib/t/regression/23cfsort.t,
-         lib/t/regression/00-mason-syntax.t,
-         lib/t/regression/02basic_web.t, lib/t/regression/14linking.t,
-         lib/t/regression/01ticket_link_searching.t,
-         lib/t/regression/13-attribute-tests.t,
-         lib/t/regression/26command_line.t,
-         lib/t/regression/06mailgateway.t,
-         lib/t/regression/03web_compiliation_errors.t,
-         lib/t/regression/07acl.t, lib/t/regression/07rights.t,
-         lib/t/regression/23-web_attachments.t, html/autohandler,
-         html/index.html, html/l, html/Elements/SelectBoolean,
-         html/Elements/SelectCustomFieldValue, html/Elements/SelectStatus,
-         html/Elements/TitleBox, html/Elements/EditCustomFieldImage,
-         html/Elements/EditCustomFieldSelect, html/Elements/ShowLinks,
-         html/Elements/EditLinks, html/Elements/ListActions,
-         html/Elements/MessageBox, html/Elements/SelectDateRelation,
-         html/Elements/SelectNewTicketQueue,
-         html/Elements/SelectWatcherType, html/Elements/Error,
-         html/Elements/GotoTicket, html/Elements/MyTickets,
-         html/Elements/QueryString, html/Elements/Section,
-         html/Elements/SelectLinkType, html/Elements/SelectMatch,
-         html/Elements/ShowCustomFieldBinary, html/Elements/ShowLink,
-         html/Elements/ShowMemberships, html/Elements/BevelBoxRaisedEnd,
-         html/Elements/Callback, html/Elements/EmailInput,
-         html/Elements/Login, html/Elements/Refresh,
-         html/Elements/SelectOwner, html/Elements/SelectQueue,
-         html/Elements/SelectTicketTypes, html/Elements/SelectUsers,
-         html/Elements/Checkbox, html/Elements/EditCustomField,
-         html/Elements/ScrubHTML, html/Elements/MyRT,
-         html/Elements/SelectCustomFieldOperator,
-         html/Elements/SelectEqualityOperator,
-         html/Elements/SelectResultsPerPage,
-         html/Elements/SelectTicketSortBy,
-         html/Elements/ShowCustomFieldImage,
-         html/Elements/ShowCustomFieldWikitext,
-         html/Elements/BevelBoxRaisedStart, html/Elements/CreateTicket,
-         html/Elements/MyRequests, html/Elements/SelectGroups,
-         html/Elements/SelectLang, html/Elements/SelectSortOrder,
-         html/Elements/SetupSessionCookie, html/Elements/ShowCustomFields,
-         html/Elements/Submit, html/Elements/TitleBoxEnd,
-         html/Elements/EditCustomFieldBinary,
-         html/Elements/EditCustomFieldFreeform,
-         html/Elements/EditCustomFieldText,
-         html/Elements/EditCustomFieldWikitext, html/Elements/Quicksearch,
-         html/Elements/SelectAttachmentField,
-         html/Elements/SelectDateType,
-         html/Elements/CollectionAsTable/ParseFormat,
-         html/Elements/CollectionAsTable/Header,
-         html/Elements/RT__Ticket/ColumnMap, html/User/Delegation.html,
-         html/Search/Results.html, html/Search/Simple.html,
-         html/User/Elements/DelegateRights, html/User/Elements/GroupTabs,
-         html/User/Elements/Tabs, html/User/Groups/Members.html,
-         html/User/Groups/Modify.html, html/User/Groups/index.html,
-         html/Search/Chart, html/Search/Edit.html,
-         html/Search/Results.rdf, html/Search/Results.tsv,
-         html/Search/Build.html, html/Search/Elements/SelectAndOr,
-         html/Search/Elements/SelectPersonType,
-         html/Search/Elements/PickBasics, html/Search/Elements/PickCFs,
-         html/Search/Elements/SelectSearchObject,
-         html/Search/Elements/SelectSearchesForObjects,
-         html/REST/1.0/logout, html/Search/Elements/BuildFormatString,
-         html/Search/Elements/DisplayOptions,
-         html/Search/Elements/EditFormat, html/Search/Elements/EditQuery,
-         html/Search/Elements/EditSearches,
-         html/Search/Elements/NewListActions,
-         html/Search/Elements/PickCriteria,
-         html/Search/Elements/SearchPrivacy,
-         html/Search/Elements/SelectGroup,
-         html/Search/Elements/SelectLinks, html/REST/1.0/autohandler,
-         html/REST/1.0/dhandler, html/REST/1.0/Forms/queue/default,
-         html/REST/1.0/Forms/queue/ns,
-         html/REST/1.0/Forms/ticket/attachments,
-         html/REST/1.0/Forms/ticket/default,
-         html/REST/1.0/Forms/ticket/history,
-         html/REST/1.0/Forms/ticket/links,
-         html/REST/1.0/Forms/user/default, html/REST/1.0/Forms/user/ns,
-         html/REST/1.0/NoAuth/mail-gateway, html/REST/1.0/search/dhandler,
-         html/REST/1.0/search/ticket, html/REST/1.0/ticket/merge,
-         html/NoAuth/Logout.html, html/NoAuth/Reminder.html,
-         html/NoAuth/css/dhandler, html/REST/1.0/ticket/comment,
-         html/REST/1.0/ticket/link, html/NoAuth/images/autohandler,
-         html/NoAuth/images/bplogo.gif,
-         html/NoAuth/images/css/fieldbg-autocomplete.gif,
-         html/NoAuth/js/scriptaculous/controls.js,
-         html/NoAuth/js/scriptaculous/effects.js,
-         html/NoAuth/js/scriptaculous/prototype.js,
-         html/NoAuth/js/scriptaculous/scriptaculous.js,
-         html/Widgets/SavedSearch, html/Widgets/SelectionBox,
-         html/Helpers/EmailAutocomplete, html/Tools/MyDay.html,
-         html/Tools/Offline.html, html/Tools/Elements/Tabs,
-         html/Admin/autohandler, html/Admin/index.html,
-         html/Admin/Queues/CustomField.html,
-         html/Admin/Queues/GroupRights.html,
-         html/Admin/Queues/People.html,
-         html/Download/CustomFieldValue/dhandler,
-         html/Download/Tabular/dhandler,
-         html/Admin/Elements/EditUserComments,
-         html/Admin/Elements/GroupTabs,
-         html/Admin/Elements/ObjectCustomFields,
-         html/Admin/Elements/SelectCustomFieldType,
-         html/Admin/Elements/SelectScrip,
-         html/Admin/Elements/SelectScripCondition,
-         html/Admin/Queues/CustomFields.html,
-         html/Admin/Queues/Modify.html, html/Admin/Queues/Scrip.html,
-         html/Admin/Queues/Scrips.html, html/Admin/Queues/Template.html,
-         html/Admin/Queues/Templates.html,
-         html/Admin/Queues/UserRights.html, html/Admin/Queues/index.html,
-         html/Admin/Elements/CustomFieldTabs,
-         html/Admin/Elements/EditCustomFieldValues,
-         html/Admin/Elements/EditCustomFields,
-         html/Admin/Elements/QueueTabs,
-         html/Admin/Elements/SelectModifyQueue,
-         html/Admin/Elements/SelectScripAction,
-         html/Admin/Elements/SelectStage,
-         html/Admin/Elements/SelectTemplate, html/Admin/Elements/Tabs,
-         html/Admin/Elements/CreateUserCalled,
-         html/Admin/Elements/EditScrip,
-         html/Admin/Elements/GlobalCustomFieldTabs,
-         html/Admin/Elements/ModifyTemplate,
-         html/Admin/Elements/PickCustomFields,
-         html/Admin/Elements/SelectModifyGroup,
-         html/Admin/Elements/SelectModifyUser,
-         html/Admin/Elements/SelectNewGroupMembers,
-         html/Admin/Elements/SelectSingleOrMultiple,
-         html/Admin/Elements/SystemTabs,
-         html/Admin/Elements/AddCustomFieldValue,
-         html/Admin/Elements/EditCustomField,
-         html/Admin/Elements/EditQueueWatchers,
-         html/Admin/Elements/EditScrips,
-         html/Admin/Elements/ListGlobalCustomFields,
-         html/Admin/Elements/ListGlobalScrips,
-         html/Admin/Elements/SelectCustomFieldLookupType,
-         html/Admin/Elements/SelectGroups,
-         html/Admin/Elements/SelectUsers, html/Admin/Elements/UserTabs,
-         html/Admin/Elements/EditTemplates, html/Admin/Elements/Header,
-         html/Admin/Elements/PickObjects,
-         html/Admin/Elements/QueueRightsForUser,
-         html/Admin/Elements/SelectRights, html/Admin/Elements/ToolTabs,
-         html/Admin/Global/GroupRights.html, html/Admin/Global/Scrip.html,
-         html/Admin/Global/Scrips.html, html/Admin/Global/Template.html,
-         html/Admin/Global/Templates.html,
-         html/Admin/Global/UserRights.html, html/Admin/Global/index.html,
-         html/Admin/Global/CustomFields/Queue-Transactions.html,
-         html/Admin/Global/CustomFields/Groups.html,
-         html/Admin/Global/CustomFields/Queue-Tickets.html,
-         html/Admin/Global/CustomFields/Users.html,
-         html/Admin/Global/CustomFields/index.html,
-         html/Admin/Users/CustomFields.html,
-         html/Admin/Users/Memberships.html,
-         html/Admin/CustomFields/GroupRights.html,
-         html/Admin/CustomFields/Modify.html,
-         html/Admin/CustomFields/Objects.html,
-         html/Admin/CustomFields/index.html,
-         html/Admin/Users/History.html, html/Admin/Users/index.html,
-         html/Admin/CustomFields/UserRights.html,
-         html/Admin/Groups/CustomFields.html,
-         html/Admin/Groups/GroupRights.html,
-         html/Admin/Groups/History.html, html/Admin/Groups/Members.html,
-         html/Admin/Groups/Modify.html, html/Admin/Groups/index.html,
-         html/Admin/Tools/Configuration.html, html/Admin/Tools/index.html,
-         html/Admin/Groups/UserRights.html, html/Ticket/Modify.html,
-         html/Ticket/ShowEmailRecord.html, html/Ticket/History.html,
-         html/Ticket/ModifyAll.html, html/Ticket/ModifyDates.html,
-         html/Ticket/ModifyLinks.html, html/Ticket/ModifyPeople.html,
-         html/Ticket/Update.html, html/Ticket/Elements/AddWatchers,
-         html/Ticket/Elements/BulkLinks,
-         html/Ticket/Elements/EditWatchers,
-         html/Ticket/Elements/ShowDates,
-         html/Ticket/Elements/EditCustomFields,
-         html/Ticket/Elements/FindAttachments,
-         html/Ticket/Elements/ShowMessageHeaders,
-         html/Ticket/Elements/ShowRequestor,
-         html/Ticket/Elements/ShowUserEntry,
-         html/Ticket/Elements/EditBasics,
-         html/Ticket/Elements/PreviewScrips,
-         html/Ticket/Elements/ShowDependencies,
-         html/Ticket/Elements/ShowGroupMembers,
-         html/Ticket/Elements/ShowHistory,
-         html/Ticket/Elements/ShowMembers,
-         html/Ticket/Elements/ShowPeople, html/Ticket/Attachment/dhandler,
-         html/Ticket/Elements/EditCustomField,
-         html/Ticket/Elements/EditDates, html/Ticket/Elements/EditPeople,
-         html/Ticket/Elements/LoadTextAttachments,
-         html/Ticket/Elements/ShowAttachments,
-         html/Ticket/Elements/ShowBasics,
-         html/Ticket/Elements/ShowCustomFields,
-         html/Ticket/Elements/ShowMessageStanza,
-         html/Ticket/Elements/ShowQueue,
-         html/Ticket/Elements/ShowTransaction,
-         html/SelfService/Closed.html, html/SelfService/Create.html,
-         html/SelfService/CreateTicketInQueue.html,
-         html/SelfService/Display.html, html/SelfService/Error.html,
-         html/SelfService/Prefs.html, html/SelfService/Update.html,
-         html/SelfService/index.html,
-         html/SelfService/Elements/GotoTicket,
-         html/SelfService/Elements/Tabs, html/Approvals/Display.html,
-         html/Approvals/index.html, html/Approvals/Elements/Approve,
-         html/Approvals/Elements/PendingMyApproval,
-         html/Approvals/Elements/ShowDependency,
-         html/Approvals/Elements/Tabs,
-         html/SelfService/Attachment/dhandler,
-         html/SelfService/Elements/Header,
-         html/SelfService/Elements/MyRequests, bin/mason_handler.fcgi.in,
-         bin/mason_handler.scgi.in, bin/mason_handler.svc.in, bin/rt.in,
-         bin/standalone_httpd.in, bin/rt-crontool.in, bin/rt-mailgate.in,
-         bin/webmux.pl.in, etc/initialdata, etc/drop.Oracle: import rt
-         3.6.6
-
-2008-03-01 20:07  ivan
-
-       * rt/: configure, aclocal.m4, Changelog, Makefile.in, README,
-         UPGRADING, configure.ac, sbin/extract_pod_tests,
-         sbin/rt-test-dependencies.in, sbin/extract-message-catalog,
-         sbin/license_tag, sbin/regression_harness,
-         sbin/rt-dump-database.in, lib/RT.pm.in,
-         lib/RT/ObjectCustomFieldValues.pm,
-         lib/RT/Transactions_Overlay.pm, lib/RT/URI.pm, sbin/factory,
-         lib/RT/CustomFieldValues_Overlay.pm, lib/RT/Handle.pm,
-         lib/RT/ObjectCustomField.pm, lib/RT/ObjectCustomFieldValue.pm,
-         lib/RT/ScripCondition_Overlay.pm, lib/RT/ScripConditions.pm,
-         lib/RT/Scrip_Overlay.pm, lib/RT/Tickets_Overlay.pm,
-         lib/RT/CustomField_Overlay.pm, lib/RT/GroupMembers_Overlay.pm,
-         lib/RT/I18N.pm, lib/RT/CachedGroupMember.pm,
-         lib/RT/CustomFieldValues.pm, lib/RT/Links.pm, lib/RT/Queue.pm,
-         lib/RT/ScripConditions_Overlay.pm, lib/RT/Scrips.pm,
-         lib/RT/Scrips_Overlay.pm, lib/RT/System.pm,
-         lib/RT/SavedSearch.pm, lib/RT/CustomFields_Overlay.pm,
-         lib/RT/ObjectCustomFields.pm, lib/RT/ACE.pm,
-         lib/RT/Attributes.pm, lib/RT/CurrentUser.pm,
-         lib/RT/CustomFieldValue_Overlay.pm, lib/RT/User.pm,
-         lib/RT/Base.pm, lib/RT/ScripAction_Overlay.pm,
-         lib/RT/Attributes_Overlay.pm, lib/RT/CustomField.pm,
-         lib/RT/Principal.pm, lib/RT/Principals_Overlay.pm,
-         lib/RT/Queues.pm, lib/RT/ScripAction.pm, lib/RT/Attachments.pm,
-         lib/RT/StyleGuide.pod, lib/RT/Attribute_Overlay.pm,
-         lib/RT/CachedGroupMember_Overlay.pm,
-         lib/RT/ObjectCustomFieldValues_Overlay.pm,
-         lib/RT/SavedSearches.pm,
-         lib/RT/ObjectCustomFieldValue_Overlay.pm,
-         lib/RT/ScripCondition.pm, lib/RT/Templates.pm, lib/RT/Tickets.pm,
-         lib/RT/Tickets_Overlay_SQL.pm, lib/RT/Users.pm,
-         lib/RT/Attachments_Overlay.pm, lib/RT/CachedGroupMembers.pm,
-         lib/RT/GroupMember_Overlay.pm, lib/RT/Link.pm,
-         lib/RT/Transaction.pm, lib/RT/ScripActions_Overlay.pm,
-         lib/RT/ACE_Overlay.pm, lib/RT/CachedGroupMembers_Overlay.pm,
-         lib/RT/Scrip.pm, lib/RT/EmailParser.pm, lib/RT/Group.pm,
-         lib/RT/ObjectCustomField_Overlay.pm, lib/RT/Template.pm,
-         lib/RT/ACL_Overlay.pm, lib/RT/GroupMembers.pm,
-         lib/RT/Principal_Overlay.pm, lib/RT/Transactions.pm,
-         lib/RT/Attachment_Overlay.pm, lib/RT/Date.pm,
-         lib/RT/Templates_Overlay.pm, lib/RT/ACL.pm,
-         lib/RT/GroupMember.pm, lib/RT/Groups.pm, lib/RT/CustomFields.pm,
-         lib/RT/Group_Overlay.pm, lib/RT/Links_Overlay.pm,
-         lib/RT/ObjectCustomFields_Overlay.pm, lib/RT/Queues_Overlay.pm,
-         lib/RT/Ticket.pm, lib/RT/Attribute.pm,
-         lib/RT/CustomFieldValue.pm, lib/RT/Link_Overlay.pm,
-         lib/RT/Principals.pm, lib/RT/ScripActions.pm,
-         lib/RT/Attachment.pm, lib/RT/Queue_Overlay.pm,
-         lib/RT/Template_Overlay.pm, lib/RT/URI/base.pm,
-         lib/RT/URI/fsck_com_rt.pm, lib/RT/URI/t.pm,
-         lib/RT/Interface/Email.pm, lib/RT/Interface/REST.pm,
-         lib/RT/Interface/CLI.pm, lib/RT/Interface/Web.pm,
-         lib/RT/Interface/Web/Handler.pm,
-         lib/RT/Interface/Web/QueryBuilder.pm,
-         lib/RT/Interface/Web/Standalone.pm,
-         lib/RT/Interface/Web/QueryBuilder/Tree.pm,
-         lib/RT/Action/Autoreply.pm, lib/RT/Action/Generic.pm,
-         lib/RT/Action/RecordComment.pm,
-         lib/RT/Action/RecordCorrespondence.pm,
-         lib/RT/Interface/Email/Auth/GnuPG.pm,
-         lib/RT/Interface/Email/Auth/MailFrom.pm,
-         lib/RT/Interface/Email/Filter/SpamAssassin.pm,
-         lib/RT/Action/Notify.pm, lib/RT/Action/AutoOpen.pm,
-         lib/RT/Action/CreateTickets.pm,
-         lib/RT/Action/EscalatePriority.pm,
-         lib/RT/Action/NotifyAsComment.pm,
-         lib/RT/Action/ResolveMembers.pm, lib/RT/Action/SetPriority.pm,
-         lib/RT/Action/UserDefined.pm, lib/RT/Action/SendEmail.pm,
-         lib/RT/Search/ActiveTicketsInQueue.pm, lib/RT/Search/FromSQL.pm,
-         lib/RT/Search/Generic.pm, lib/RT/Search/Googleish.pm,
-         lib/RT/I18N/cs.po, lib/RT/I18N/es.po, lib/RT/I18N/fi.po,
-         lib/RT/I18N/zh_cn.po, lib/RT/I18N/hu.po, lib/RT/I18N/he.po,
-         lib/RT/I18N/de.po, lib/RT/I18N/ru.po, lib/RT/I18N/nl.po,
-         lib/RT/I18N/pl.po, lib/RT/I18N/da.po, lib/RT/I18N/fr.po,
-         lib/RT/I18N/cs.pm, lib/RT/I18N/it.po, lib/RT/I18N/id.po,
-         lib/RT/I18N/ja.po, lib/RT/I18N/zh_tw.po,
-         lib/RT/I18N/i_default.pm, lib/RT/I18N/pt_br.po,
-         lib/RT/I18N/en.po, lib/RT/Condition/AnyTransaction.pm,
-         lib/RT/Condition/BeforeDue.pm, lib/RT/Condition/Generic.pm,
-         lib/RT/Condition/Overdue.pm, lib/RT/Condition/OwnerChange.pm,
-         lib/RT/Condition/PriorityChange.pm,
-         lib/RT/Condition/PriorityExceeds.pm,
-         lib/RT/Condition/StatusChange.pm,
-         lib/RT/Condition/UserDefined.pm, lib/RT/I18N/no.po,
-         lib/RT/Condition/QueueChange.pm, lib/RT/Report/Tickets.pm: import
-         rt 3.6.6
+       * httemplate/misc/recharge_svc.html: doh
 
-2008-03-01 20:05  ivan
+2008-03-16 01:04  ivan
 
-       * rt/: html/SelfService/Create.html, html/SelfService/Error.html,
-         html/Ticket/Attachment/dhandler, html/Ticket/Elements/EditBasics,
-         html/Ticket/Elements/EditCustomField,
-         html/Ticket/Elements/EditDates, html/Ticket/Elements/EditPeople,
-         html/Ticket/Elements/LoadTextAttachments,
-         html/Ticket/Elements/ShowAttachments,
-         html/Ticket/Elements/ShowBasics,
-         html/Ticket/Elements/ShowCustomFields,
-         html/Ticket/Elements/ShowGroupMembers,
-         html/Ticket/Elements/ShowMessageStanza,
-         html/Ticket/Elements/ShowPeople,
-         html/Ticket/Elements/ShowTransaction,
-         html/SelfService/Closed.html,
-         html/SelfService/CreateTicketInQueue.html,
-         html/SelfService/Display.html, html/SelfService/Prefs.html,
-         html/SelfService/Update.html, html/SelfService/index.html,
-         html/SelfService/Attachment/dhandler,
-         html/SelfService/Elements/GotoTicket,
-         html/SelfService/Elements/Header,
-         html/SelfService/Elements/MyRequests,
-         html/SelfService/Elements/Tabs, html/Approvals/Display.html,
-         html/Approvals/index.html, html/Approvals/Elements/Approve,
-         html/Approvals/Elements/PendingMyApproval,
-         html/Approvals/Elements/Tabs,
-         html/Approvals/Elements/ShowDependency,
-         bin/mason_handler.fcgi.in, bin/mason_handler.scgi.in,
-         bin/mason_handler.svc.in, bin/rt.in, bin/standalone_httpd.in,
-         bin/rt-crontool.in, bin/rt-mailgate.in, bin/webmux.pl.in,
-         etc/initialdata, etc/drop.Oracle: import rt 3.4.6
+       * FS/FS/UID.pm: goodness, i hope this fixes the bootstrapping
 
-2008-03-01 20:02  ivan
+2008-03-16 00:25  ivan
 
-       * rt/: configure, aclocal.m4, Changelog, Makefile.in, README,
-         UPGRADING, configure.ac, sbin/extract_pod_tests,
-         sbin/rt-test-dependencies.in, sbin/extract-message-catalog,
-         sbin/license_tag, sbin/regression_harness,
-         sbin/rt-dump-database.in, lib/RT.pm.in,
-         lib/RT/Transactions_Overlay.pm, lib/RT/URI.pm, sbin/factory,
-         lib/RT/Handle.pm, lib/RT/ObjectCustomField.pm,
-         lib/RT/ObjectCustomFieldValues.pm,
-         lib/RT/ScripCondition_Overlay.pm,
-         lib/RT/CustomFieldValues_Overlay.pm,
-         lib/RT/ObjectCustomFieldValue.pm, lib/RT/ScripConditions.pm,
-         lib/RT/Scrip_Overlay.pm, lib/RT/Tickets_Overlay.pm,
-         lib/RT/CustomField_Overlay.pm, lib/RT/GroupMembers_Overlay.pm,
-         lib/RT/I18N.pm, lib/RT/CachedGroupMember.pm, lib/RT/Links.pm,
-         lib/RT/Queue.pm, lib/RT/ScripConditions_Overlay.pm,
-         lib/RT/Scrips.pm, lib/RT/System.pm, lib/RT/CustomFieldValues.pm,
-         lib/RT/SavedSearch.pm, lib/RT/Scrips_Overlay.pm, lib/RT/ACE.pm,
-         lib/RT/Attributes.pm, lib/RT/CurrentUser.pm,
-         lib/RT/CustomFieldValue_Overlay.pm,
-         lib/RT/CustomFields_Overlay.pm, lib/RT/ObjectCustomFields.pm,
-         lib/RT/Base.pm, lib/RT/ScripAction_Overlay.pm, lib/RT/User.pm,
-         lib/RT/Principal.pm, lib/RT/Principals_Overlay.pm,
-         lib/RT/ScripAction.pm, lib/RT/Attributes_Overlay.pm,
-         lib/RT/CustomField.pm, lib/RT/Queues.pm, lib/RT/Attachments.pm,
-         lib/RT/Attribute_Overlay.pm, lib/RT/CachedGroupMember_Overlay.pm,
-         lib/RT/ObjectCustomFieldValues_Overlay.pm,
-         lib/RT/ObjectCustomFieldValue_Overlay.pm,
-         lib/RT/SavedSearches.pm, lib/RT/ScripCondition.pm,
-         lib/RT/Templates.pm, lib/RT/Tickets.pm,
-         lib/RT/Tickets_Overlay_SQL.pm, lib/RT/Users.pm,
-         lib/RT/Attachments_Overlay.pm, lib/RT/CachedGroupMembers.pm,
-         lib/RT/GroupMember_Overlay.pm, lib/RT/Link.pm,
-         lib/RT/Transaction.pm, lib/RT/ScripActions_Overlay.pm,
-         lib/RT/ACE_Overlay.pm, lib/RT/CachedGroupMembers_Overlay.pm,
-         lib/RT/Scrip.pm, lib/RT/EmailParser.pm, lib/RT/Group.pm,
-         lib/RT/ObjectCustomField_Overlay.pm, lib/RT/Template.pm,
-         lib/RT/ACL_Overlay.pm, lib/RT/GroupMembers.pm,
-         lib/RT/Principal_Overlay.pm, lib/RT/Transactions.pm,
-         lib/RT/ACL.pm, lib/RT/Attachment_Overlay.pm, lib/RT/Date.pm,
-         lib/RT/GroupMember.pm, lib/RT/Groups.pm,
-         lib/RT/Templates_Overlay.pm, lib/RT/Group_Overlay.pm,
-         lib/RT/Links_Overlay.pm, lib/RT/CustomFieldValue.pm,
-         lib/RT/CustomFields.pm, lib/RT/ObjectCustomFields_Overlay.pm,
-         lib/RT/Principals.pm, lib/RT/Queues_Overlay.pm, lib/RT/Ticket.pm,
-         lib/RT/Link_Overlay.pm, lib/RT/Attachment.pm,
-         lib/RT/Attribute.pm, lib/RT/Queue_Overlay.pm,
-         lib/RT/ScripActions.pm, lib/RT/Template_Overlay.pm,
-         lib/RT/URI/base.pm, lib/RT/URI/fsck_com_rt.pm, lib/RT/URI/t.pm,
-         lib/RT/Interface/Email.pm, lib/RT/Interface/REST.pm,
-         lib/RT/Interface/CLI.pm, lib/RT/Interface/Web.pm,
-         lib/RT/Interface/Web/Handler.pm,
-         lib/RT/Interface/Web/QueryBuilder.pm,
-         lib/RT/Interface/Web/Standalone.pm, lib/RT/Action/Autoreply.pm,
-         lib/RT/Action/Generic.pm, lib/RT/Action/RecordCorrespondence.pm,
-         lib/RT/Interface/Email/Auth/GnuPG.pm,
-         lib/RT/Interface/Email/Auth/MailFrom.pm,
-         lib/RT/Interface/Email/Filter/SpamAssassin.pm,
-         lib/RT/Interface/Web/QueryBuilder/Tree.pm,
-         lib/RT/Action/Notify.pm, lib/RT/Action/RecordComment.pm,
-         lib/RT/Action/AutoOpen.pm, lib/RT/Action/CreateTickets.pm,
-         lib/RT/Action/EscalatePriority.pm,
-         lib/RT/Action/NotifyAsComment.pm,
-         lib/RT/Action/ResolveMembers.pm, lib/RT/Action/SetPriority.pm,
-         lib/RT/Action/UserDefined.pm, lib/RT/Action/SendEmail.pm,
-         lib/RT/Search/ActiveTicketsInQueue.pm, lib/RT/Search/FromSQL.pm,
-         lib/RT/Search/Generic.pm, lib/RT/I18N/cs.po, lib/RT/I18N/es.po,
-         lib/RT/I18N/fi.po, lib/RT/I18N/zh_cn.po, lib/RT/I18N/hu.po,
-         lib/RT/I18N/he.po, lib/RT/I18N/de.po, lib/RT/I18N/ru.po,
-         lib/RT/I18N/nl.po, lib/RT/I18N/pl.po, lib/RT/I18N/da.po,
-         lib/RT/I18N/fr.po, lib/RT/I18N/cs.pm, lib/RT/I18N/it.po,
-         lib/RT/I18N/id.po, lib/RT/I18N/ja.po, lib/RT/I18N/zh_tw.po,
-         lib/RT/I18N/en.po, lib/RT/I18N/i_default.pm,
-         lib/RT/I18N/pt_br.po, lib/RT/Condition/Generic.pm,
-         lib/RT/I18N/no.po, lib/RT/Condition/AnyTransaction.pm,
-         lib/RT/Condition/BeforeDue.pm, lib/RT/Condition/Overdue.pm,
-         lib/RT/Condition/OwnerChange.pm,
-         lib/RT/Condition/PriorityChange.pm,
-         lib/RT/Condition/PriorityExceeds.pm,
-         lib/RT/Condition/QueueChange.pm,
-         lib/RT/Condition/StatusChange.pm,
-         lib/RT/Condition/UserDefined.pm,
-         lib/t/regression/08web_cf_access.t, lib/t/regression/12-search.t,
-         lib/t/regression/04send_email.t,
-         lib/t/regression/06-mime_decoding.t,
-         lib/t/regression/14linking.t, lib/t/regression/21query-builder.t,
-         lib/t/regression/22search_tix_by_txn.t,
-         lib/t/regression/22search_tix_by_watcher.t,
-         lib/t/regression/01ticket_link_searching.t,
-         lib/t/regression/02basic_web.t,
-         lib/t/regression/13-attribute-tests.t,
-         lib/t/regression/03web_compiliation_errors.t,
-         lib/t/regression/06mailgateway.t, lib/t/regression/07acl.t,
-         lib/t/regression/07rights.t,
-         lib/t/regression/23-web_attachments.t, html/autohandler,
-         html/index.html, html/l, html/Elements/EditCustomFieldImage,
-         html/Elements/EditCustomFieldSelect, html/Elements/EditLinks,
-         html/Elements/ListActions, html/Elements/MessageBox,
-         html/Elements/SelectBoolean,
-         html/Elements/SelectCustomFieldValue, html/Elements/SelectStatus,
-         html/Elements/ShowLinks, html/Elements/TitleBox,
-         html/Elements/Error, html/Elements/Section,
-         html/Elements/SelectDateRelation,
-         html/Elements/SelectNewTicketQueue,
-         html/Elements/SelectWatcherType, html/Elements/BevelBoxRaisedEnd,
-         html/Elements/Callback, html/Elements/GotoTicket,
-         html/Elements/Login, html/Elements/MyTickets,
-         html/Elements/QueryString, html/Elements/Refresh,
-         html/Elements/SelectLinkType, html/Elements/SelectMatch,
-         html/Elements/SelectOwner, html/Elements/SelectQueue,
-         html/Elements/SelectTicketTypes, html/Elements/SelectUsers,
-         html/Elements/ShowCustomFieldBinary, html/Elements/ShowLink,
-         html/Elements/ShowMemberships, html/Elements/Checkbox,
-         html/Elements/EditCustomField, html/Elements/ScrubHTML,
-         html/Elements/SelectCustomFieldOperator,
-         html/Elements/SelectEqualityOperator,
-         html/Elements/SelectResultsPerPage,
-         html/Elements/SelectSortOrder, html/Elements/SelectTicketSortBy,
-         html/Elements/ShowCustomFieldImage,
-         html/Elements/ShowCustomFieldWikitext, html/Elements/TitleBoxEnd,
-         html/Elements/BevelBoxRaisedStart, html/Elements/CreateTicket,
-         html/Elements/MyRequests, html/Elements/SelectAttachmentField,
-         html/Elements/SelectDateType, html/Elements/SelectGroups,
-         html/Elements/SelectLang, html/Elements/SetupSessionCookie,
-         html/Elements/ShowCustomFields, html/Elements/Submit,
-         html/Elements/EditCustomFieldBinary,
-         html/Elements/EditCustomFieldFreeform,
-         html/Elements/EditCustomFieldText,
-         html/Elements/EditCustomFieldWikitext, html/Elements/Quicksearch,
-         html/Elements/CollectionAsTable/Header,
-         html/Elements/CollectionAsTable/ParseFormat,
-         html/Elements/RT__Ticket/ColumnMap, html/User/Delegation.html,
-         html/Search/Edit.html, html/Search/Results.html,
-         html/Search/Results.rdf, html/User/Elements/DelegateRights,
-         html/User/Elements/GroupTabs, html/User/Elements/Tabs,
-         html/User/Groups/Members.html, html/User/Groups/Modify.html,
-         html/User/Groups/index.html, html/Search/Results.tsv,
-         html/Search/Build.html, html/Search/Elements/BuildFormatString,
-         html/Search/Elements/PickBasics, html/Search/Elements/PickCFs,
-         html/Search/Elements/SelectAndOr,
-         html/Search/Elements/SelectLinks,
-         html/Search/Elements/SelectPersonType,
-         html/Search/Elements/SelectSearchObject,
-         html/Search/Elements/SelectSearchesForObjects,
-         html/REST/1.0/logout, html/Search/Elements/DisplayOptions,
-         html/Search/Elements/EditFormat, html/Search/Elements/EditQuery,
-         html/Search/Elements/EditSearches,
-         html/Search/Elements/NewListActions,
-         html/Search/Elements/PickCriteria,
-         html/Search/Elements/SearchPrivacy,
-         html/Search/Elements/SelectGroup, html/REST/1.0/autohandler,
-         html/REST/1.0/dhandler, html/REST/1.0/Forms/queue/default,
-         html/REST/1.0/Forms/queue/ns, html/NoAuth/Logout.html,
-         html/NoAuth/Reminder.html,
-         html/REST/1.0/Forms/ticket/attachments,
-         html/REST/1.0/Forms/ticket/default,
-         html/REST/1.0/Forms/ticket/history,
-         html/REST/1.0/Forms/ticket/links,
-         html/REST/1.0/Forms/user/default, html/REST/1.0/Forms/user/ns,
-         html/REST/1.0/NoAuth/mail-gateway, html/REST/1.0/search/dhandler,
-         html/REST/1.0/search/ticket, html/REST/1.0/ticket/comment,
-         html/REST/1.0/ticket/link, html/REST/1.0/ticket/merge,
-         html/Admin/autohandler, html/Admin/index.html,
-         html/Download/CustomFieldValue/dhandler,
-         html/Download/Tabular/dhandler, html/NoAuth/images/autohandler,
-         html/NoAuth/images/bplogo.gif, html/Tools/MyDay.html,
-         html/Tools/Offline.html, html/Tools/Elements/Tabs,
-         html/Admin/Queues/CustomField.html,
-         html/Admin/Queues/CustomFields.html,
-         html/Admin/Queues/GroupRights.html,
-         html/Admin/Queues/Modify.html, html/Admin/Queues/People.html,
-         html/Admin/Queues/Scrip.html, html/Admin/Queues/Scrips.html,
-         html/Admin/Queues/Template.html,
-         html/Admin/Elements/EditCustomFieldValues,
-         html/Admin/Elements/EditUserComments,
-         html/Admin/Elements/GroupTabs,
-         html/Admin/Elements/ObjectCustomFields,
-         html/Admin/Elements/SelectCustomFieldType,
-         html/Admin/Elements/SelectScrip,
-         html/Admin/Elements/SelectScripCondition,
-         html/Admin/Elements/SelectStage,
-         html/Admin/Queues/Templates.html,
-         html/Admin/Queues/UserRights.html, html/Admin/Queues/index.html,
-         html/Admin/Elements/CustomFieldTabs,
-         html/Admin/Elements/EditCustomFields,
-         html/Admin/Elements/EditScrip,
-         html/Admin/Elements/GlobalCustomFieldTabs,
-         html/Admin/Elements/ModifyTemplate,
-         html/Admin/Elements/QueueTabs,
-         html/Admin/Elements/SelectModifyGroup,
-         html/Admin/Elements/SelectModifyQueue,
-         html/Admin/Elements/SelectNewGroupMembers,
-         html/Admin/Elements/SelectScripAction,
-         html/Admin/Elements/SelectSingleOrMultiple,
-         html/Admin/Elements/SelectTemplate,
-         html/Admin/Elements/SystemTabs, html/Admin/Elements/Tabs,
-         html/Admin/Elements/AddCustomFieldValue,
-         html/Admin/Elements/CreateUserCalled,
-         html/Admin/Elements/EditCustomField,
-         html/Admin/Elements/EditQueueWatchers,
-         html/Admin/Elements/EditScrips,
-         html/Admin/Elements/ListGlobalCustomFields,
-         html/Admin/Elements/ListGlobalScrips,
-         html/Admin/Elements/PickCustomFields,
-         html/Admin/Elements/SelectModifyUser,
-         html/Admin/Elements/SelectUsers, html/Admin/Elements/UserTabs,
-         html/Admin/Elements/EditTemplates, html/Admin/Elements/Header,
-         html/Admin/Elements/PickObjects,
-         html/Admin/Elements/QueueRightsForUser,
-         html/Admin/Elements/SelectCustomFieldLookupType,
-         html/Admin/Elements/SelectGroups,
-         html/Admin/Elements/SelectRights, html/Admin/Elements/ToolTabs,
-         html/Admin/Global/GroupRights.html, html/Admin/Global/Scrip.html,
-         html/Admin/Global/Scrips.html, html/Admin/Global/Template.html,
-         html/Admin/Global/Templates.html,
-         html/Admin/Global/UserRights.html, html/Admin/Global/index.html,
-         html/Admin/Global/CustomFields/Groups.html,
-         html/Admin/Global/CustomFields/Queue-Tickets.html,
-         html/Admin/Global/CustomFields/Queue-Transactions.html,
-         html/Admin/Global/CustomFields/Users.html,
-         html/Admin/Global/CustomFields/index.html,
-         html/Admin/Users/CustomFields.html,
-         html/Admin/CustomFields/GroupRights.html,
-         html/Admin/CustomFields/Modify.html,
-         html/Admin/CustomFields/Objects.html,
-         html/Admin/CustomFields/index.html,
-         html/Admin/Users/History.html, html/Admin/Users/Memberships.html,
-         html/Admin/Users/index.html,
-         html/Admin/CustomFields/UserRights.html,
-         html/Admin/Groups/CustomFields.html,
-         html/Admin/Groups/GroupRights.html,
-         html/Admin/Groups/History.html, html/Admin/Groups/Members.html,
-         html/Admin/Groups/Modify.html, html/Admin/Groups/UserRights.html,
-         html/Admin/Groups/index.html,
-         html/Admin/Tools/Configuration.html, html/Admin/Tools/index.html,
-         html/Ticket/Modify.html, html/Ticket/ShowEmailRecord.html,
-         html/Ticket/History.html, html/Ticket/ModifyAll.html,
-         html/Ticket/ModifyDates.html, html/Ticket/ModifyLinks.html,
-         html/Ticket/ModifyPeople.html, html/Ticket/Update.html,
-         html/Ticket/Elements/AddWatchers, html/Ticket/Elements/BulkLinks,
-         html/Ticket/Elements/EditWatchers,
-         html/Ticket/Elements/FindAttachments,
-         html/Ticket/Elements/ShowDates,
-         html/Ticket/Elements/EditCustomFields,
-         html/Ticket/Elements/PreviewScrips,
-         html/Ticket/Elements/ShowDependencies,
-         html/Ticket/Elements/ShowHistory,
-         html/Ticket/Elements/ShowMembers,
-         html/Ticket/Elements/ShowMessageHeaders,
-         html/Ticket/Elements/ShowRequestor,
-         html/Ticket/Elements/ShowUserEntry: import rt 3.4.6
+       * FS/FS/UID.pm: okay, really now, how about this
+
+2008-03-16 00:24  ivan
+
+       * FS/FS/UID.pm: okay, how about this
+
+2008-03-16 00:21  ivan
+
+       * FS/FS/UID.pm: fix 1.7->1.9 bootstrapping, i think
+
+2008-03-15 22:22  ivan
+
+       * httemplate/search/svc_broadband.cgi: clean up and
+         agent-virtualize svc_broadband searching
+
+2008-03-15 22:13  ivan
+
+       * httemplate/edit/part_svc.cgi: finish bringing sanity to
+         svc_broadband service definition blocknum edit
+
+2008-03-15 22:13  ivan
+
+       * FS/FS/: addr_block.pm, svc_broadband.pm: bring some sanity to
+         address block selection in svc_broadband service definition edit
+
+2008-03-15 21:54  ivan
+
+       * httemplate/browse/: addr_block.cgi, router.cgi: drag address &
+         router browse into this centiry
+
+2008-03-15 21:00  ivan
+
+       * httemplate/elements/header.html, httemplate/elements/menu.html,
+         rt/html/Elements/FreesideSearch: hide customer search if user
+         does not have "List customers" ACL, closes: RT#3105
+
+2008-03-15 15:18  ivan
+
+       * httemplate/edit/part_pkg.cgi, FS/FS/part_pkg/voip_cdr.pm:
+         slightly better voip_cdr package edit: use radio buttons for
+         selecting long things
+
+2008-03-15 14:39  ivan
+
+       * FS/FS/part_pkg/voip_cdr.pm: be asssertive
+
+2008-03-15 14:14  ivan
+
+       * FS/FS/: cust_svc.pm, part_pkg/voip_cdr.pm: configurable
+         disable_src, domestic_prefix and international_prefix options for
+         voip price plan
+
+2008-03-15 12:52  ivan
+
+       * httemplate/search/cust_bill.html, FS/FS/cust_bill.pm: check on
+         invoice re-printing newest percust... can't reproduce any
+         problem, prints newest per cust fine, closes: #3161
+
+2008-03-14 17:30  ivan
+
+       * httemplate/: view/svc_domain.cgi, misc/catchall.cgi: fix harmless
+         code leaking out onto the page, hehe, closes: Bug#3253, also
+         remove silly formatting on catchall edit
+
+2008-03-14 13:11  ivan
+
+       * FS/FS/cust_main.pm: eliminate some harmless uninitialized value
+         warnings
+
+2008-03-14 10:30  jeff
+
+       * FS/FS/part_export/prizm.pm: insist on Net::Prizm 0.04
+
+2008-03-14 01:13  ivan
+
+       * httemplate/edit/process/cust_pkg.cgi: whew, glad that change
+         package bugfix was easy to find, closes: Bug#3241
+
+2008-03-14 00:48  ivan
+
+       * FS/FS/cust_credit_bill.pm, FS/FS/Report/Table/Monthly.pm,
+         httemplate/graph/money_time.cgi,
+         httemplate/search/cust_credit_bill.html,
+         httemplate/search/cust_credit.html: add net credits to
+         sales/credits/receipts report
+
+2008-03-13 19:10  ivan
+
+       * FS/FS/Conf.pm: add Net20 invoice terms, closes: #3219
+
+2008-03-13 19:09  ivan
+
+       * FS/FS/Conf.pm: show where the warning about no conf comes from
+
+2008-03-13 02:28  ivan
+
+       * FS/FS/cust_pay.pm: yow.  very sleep deprived.  remove the
+         infinite loop rather than add one.
+
+2008-03-13 02:14  ivan
+
+       * FS/FS/cust_pay.pm: infinite loop protection
+
+2008-03-13 01:57  ivan
+
+       * FS/FS/cust_pay.pm: allow cust_pay.otaker upgrade to proceed even
+         if there are some old crufty records around attached to
+         now-deleted customers
+
+2008-03-12 09:22  jeff
+
+       * FS/FS/cust_svc.pm, FS/FS/part_export.pm, FS/FS/svc_Common.pm,
+         FS/FS/UI/Web.pm, FS/FS/part_export/prizm.pm,
+         eg/export_template.pm, httemplate/view/cust_main/packages.html:
+         allow exports to add links to customer view (#1407)
+
+2008-03-04 13:07  ivan
+
+       * FS/FS/cust_refund.pm: fix otaker population for cust_refund like
+         cust_credit and cust_pay
+
+2008-03-04 13:06  ivan
+
+       * FS/FS/cust_pay.pm: fix cust_pay.otaker population
+
+2008-03-04 11:15  ivan
+
+       * httemplate/: edit/cust_pkg.cgi, edit/process/cust_pkg.cgi,
+         misc/change_pkg.cgi: fix edit/process/cust_pkg getting confused
+         about the two different places that would be calling it... i.e.
+         with an empty new_pkgnum it would redirect the popup back the
+         customer view, hehe
+
+2008-03-03 19:38  ivan
+
+       * FS/FS/cust_bill.pm: AND fix latex->html notes substituion for ~s
+
+2008-03-03 19:37  ivan
+
+       * FS/FS/cust_bill.pm: and fix latex->html notes substituion for
+         escaped #s
+
+2008-03-03 19:34  ivan
+
+       * FS/FS/cust_bill.pm: fix latex->html notes substituion for
+         newlines
+
+2008-03-03 18:27  ivan
+
+       * httemplate/browse/rate_region.html: should improve compatibility
+         with older Pg.  i hope
+
+2008-03-03 17:49  ivan
+
+       * FS/FS/UID.pm: argh, don't load up a user until the other
+         initialization is done
+
+2008-03-03 15:12  ivan
+
+       * rt/: etc/RT_Config.pm.in, html/Elements/Header,
+         html/Elements/PageLayout, html/Elements/Tabs,
+         html/Elements/CollectionAsTable/Row,
+         html/Ticket/Elements/ShowTransactionAttachments,
+         html/Widgets/TitleBoxStart, sbin/rt-setup-database.in: merge in
+         rt 3.6.6.  *gulp*!
+
+2008-03-01 20:11  ivan
+
+       * rt/html/: Elements/EmailInput, NoAuth/css/dhandler,
+         NoAuth/images/css/fieldbg-autocomplete.gif,
+         NoAuth/js/scriptaculous/controls.js,
+         NoAuth/js/scriptaculous/effects.js,
+         NoAuth/js/scriptaculous/prototype.js,
+         NoAuth/js/scriptaculous/scriptaculous.js,
+         Helpers/EmailAutocomplete, Ticket/Elements/ShowQueue: Initial
+         revision
 
 2008-03-01 19:07  ivan
 
 
 2008-01-03 18:35  ivan
 
-       * httemplate/browse/elements/browse.html: new tax rate editor
+       * httemplate/: edit/cust_main_county.cgi,
+         edit/process/cust_main_county.cgi, browse/elements/browse.html:
+         new tax rate editor
 
 2008-01-03 18:27  ivan
 
          setting maxLength (and other attributes?).  hopefully that's all
          it is.
 
+2007-12-17 15:57  jeff
+
+       * httemplate/view/cust_main/quick-charge.html: cruft removal
+
 2007-12-17 14:57  jeff
 
        * FS/FS/cust_credit.pm: stricter otaker rules
 
 2007-12-16 12:48  ivan
 
-       * httemplate/search/cust_main.html: more consistent naming:
-         cust_main_ADV.cgi becomes cust_main.html
+       * httemplate/search/: cust_main.html, cust_main_ADV.cgi: more
+         consistent naming: cust_main_ADV.cgi becomes cust_main.html
 
 2007-12-15 14:47  rsiddall
 
 2007-11-28 10:49  jeff
 
        * FS/FS/ConfDefaults.pm, FS/FS/UI/Web.pm,
+         httemplate/search/cust_main_ADV.cgi,
          httemplate/search/report_cust_main.html: advanced customer report
          rearrangement
 
 
 2007-11-20 09:18  ivan
 
-       * AGPL: it finally happened
+       * AGPL, GPL: it finally happened
 
 2007-11-18 12:02  ivan
 
 2007-11-07 16:59  ivan
 
        * FS/FS/Conf.pm, FS/FS/cust_bill.pm, FS/FS/cust_main.pm,
-         conf/alerter_template, conf/company_address, conf/company_name,
+         FS/bin/freeside-expiration-alerter, conf/alerter_template,
+         conf/company_address, conf/company_name,
          conf/impending_recur_template, conf/invoice_latexfooter,
-         conf/invoice_latexnotes, conf/invoice_latexsmallfooter,
-         conf/invoice_template, conf/invoice_template_statement,
-         conf/welcome_letter: for new installs, centralize some stuff that
-         was spread around different config files.
+         conf/invoice_latexnotes, conf/invoice_latexreturnaddress,
+         conf/invoice_latexsmallfooter, conf/invoice_template,
+         conf/invoice_template_statement, conf/welcome_letter: for new
+         installs, centralize some stuff that was spread around different
+         config files.
 
 2007-11-05 17:59  ivan
 
          fs_selfservice/FS-SelfService/SelfService.pm: add
          process_payment_order_pkg method
 
+2007-11-04 10:22  jeff
+
+       * httemplate/search/cust_main_ADV.cgi: comma is a bad delimiter
+         choice according to ut_text()
+
 2007-11-03 10:38  ivan
 
        * httemplate/elements/menu.html: move menu option for adv. customer
 
 2007-11-02 17:55  jeff
 
-       * httemplate/: elements/menu.html, search/report_cust_main.html:
-         new customer report/flattened package report (ticket 1428)
+       * httemplate/: elements/menu.html, search/cust_main_ADV.cgi,
+         search/report_cust_main.html: new customer report/flattened
+         package report (ticket 1428)
 
 2007-10-29 05:04  ivan
 
 
        * FS/bin/freeside-sqlradius-seconds: fixing wrong POD NAME doc
 
+2007-10-03 18:29  ivan
+
+       * FS/t/cust_tax_exempt.pm: wtf!
+
 2007-10-03 18:21  ivan
 
        * FS/FS.pm: update FS base page for new stuff in 1.9
 2007-09-13 15:35  ivan
 
        * FS/MANIFEST, FS/FS/Schema.pm, FS/FS/acct_rt_transaction.pm,
-         FS/t/acct_rt_transaction.t, htetc/handler.pl,
+         FS/FS/svc_acct_rt_transaction.pm, FS/t/acct_rt_transaction.t,
+         FS/t/svc_acct_rt_transaction.t, htetc/handler.pl,
          httemplate/misc/process/timeworked.html,
          httemplate/search/timeworked.html: rename svc_acct_rt_transaction
          to acct_rt_transaction, as it is not a service, its something
 
 2007-08-16 06:40  jeff
 
-       * FS/FS/AccessRight.pm, FS/FS/Conf.pm, FS/FS/Schema.pm,
-         FS/FS/cust_main.pm, httemplate/misc/batch-cust_pay.html,
+       * FS/FS/svc_acct_rt_transaction.pm, FS/FS/AccessRight.pm,
+         FS/FS/Conf.pm, FS/FS/Schema.pm, FS/FS/cust_main.pm,
+         FS/t/svc_acct_rt_transaction.t,
+         httemplate/misc/batch-cust_pay.html,
          httemplate/misc/timeworked.html, FS/MANIFEST,
          httemplate/misc/process/timeworked.html,
          httemplate/search/timeworked.html, FS/FS/ClientAPI/MyAccount.pm,
 
 2007-08-10 16:50  ivan
 
-       * FS/bin/: freeside-dbdef-create: rename dbdef-create to
-         freeside-dbdef-create and move it to FS/bin, so it gets
-         %%%FREESIDE_CONF%%% substituted
+       * bin/dbdef-create, FS/bin/freeside-dbdef-create: rename
+         dbdef-create to freeside-dbdef-create and move it to FS/bin, so
+         it gets %%%FREESIDE_CONF%%% substituted
 
 2007-08-10 15:48  ivan
 
          html/Elements/PageLayout, html/Elements/QuickCreate,
          html/Elements/SimpleSearch, html/Elements/Tabs,
          html/Elements/TicketList, html/Elements/TitleBoxStart,
-         html/Elements/CollectionAsTable/Row, html/Search/Bulk.html,
+         html/Elements/CollectionAsTable/Row, html/NoAuth/printrt.css,
+         html/NoAuth/webrt.css, html/NoAuth/images/space.gif,
+         html/Search/Bulk.html, html/Ticket/Elements/ShowMemberOf,
+         html/Ticket/Elements/ShowReferences,
          html/Ticket/Elements/ShowSummary, html/Ticket/Elements/Tabs,
          html/Widgets/TitleBoxStart, lib/RT/SearchBuilder.pm,
          sbin/rt-setup-database.in: merging RT_3_6_4 to HEAD
        * httemplate/view/cust_main/packages.html: line up package acitons
          all on one line
 
-2007-08-02 12:56  ivan
-
-       * rt/: html/Ticket/Elements/EditCustomFields,
-         html/Ticket/Elements/PreviewScrips,
-         html/Ticket/Elements/ShowDependencies,
-         html/Ticket/Elements/ShowMessageHeaders,
-         html/Ticket/Elements/ShowRequestor,
-         html/Ticket/Elements/ShowUserEntry,
-         html/Ticket/Elements/EditBasics,
-         html/Ticket/Elements/EditCustomField,
-         html/Ticket/Elements/Reminders,
-         html/Ticket/Elements/ShowGroupMembers,
-         html/Ticket/Elements/ShowHistory,
-         html/Ticket/Elements/ShowMembers,
-         html/Ticket/Elements/ShowPeople,
-         html/Ticket/Elements/ShowTransaction,
-         html/Ticket/Elements/EditDates, html/Ticket/Elements/EditPeople,
-         html/Ticket/Elements/ShowAttachments,
-         html/Ticket/Elements/ShowBasics,
-         html/Ticket/Elements/ShowCustomFields,
-         html/Ticket/Elements/ShowMessageStanza,
-         html/SelfService/Closed.html, html/SelfService/Create.html,
-         html/SelfService/CreateTicketInQueue.html,
-         html/SelfService/Display.html, html/SelfService/Error.html,
-         html/SelfService/Prefs.html, html/SelfService/Update.html,
-         html/Ticket/Attachment/dhandler,
-         html/Ticket/Elements/LoadTextAttachments,
-         html/SelfService/index.html,
-         html/SelfService/Attachment/dhandler,
-         html/SelfService/Elements/GotoTicket,
-         html/SelfService/Elements/Header,
-         html/SelfService/Elements/MyRequests,
-         html/SelfService/Elements/Tabs, html/Approvals/Display.html,
-         html/Approvals/index.html,
-         html/Approvals/Elements/PendingMyApproval,
-         html/Approvals/Elements/Tabs, html/Approvals/Elements/Approve,
-         html/Approvals/Elements/ShowDependency,
-         bin/mason_handler.fcgi.in, bin/mason_handler.svc.in, bin/rt.in,
-         bin/standalone_httpd.in, bin/mason_handler.scgi.in,
-         bin/rt-crontool.in, bin/rt-mailgate.in, bin/webmux.pl.in,
-         etc/initialdata, etc/drop.Oracle, etc/schema.mysql,
-         etc/upgrade/3.5.1/content: import rt 3.6.4
-
 2007-08-02 12:54  ivan
 
-       * rt/html/: Prefs/SearchOptions.html,
-         NoAuth/css/3.5-default/main.css, NoAuth/css/3.5-default/misc.css,
-         NoAuth/css/3.5-default/titlebox.css,
-         NoAuth/css/3.5-default/transactions.css,
-         NoAuth/images/css/cb.gif, NoAuth/images/css/cbr.gif,
-         NoAuth/images/css/ct.gif, NoAuth/images/css/ctr.gif,
-         Widgets/TitleBoxStart: Initial revision
-
-2007-08-02 12:53  ivan
-
-       * rt/: lib/RT/I18N/de.po, lib/RT/I18N/ru.po, lib/RT/I18N/nl.po,
-         lib/RT/I18N/pl.po, lib/RT/I18N/da.po, lib/RT/I18N/fr.po,
-         lib/RT/I18N/cs.pm, lib/RT/I18N/it.po, lib/RT/I18N/id.po,
-         lib/RT/I18N/ja.po, lib/RT/I18N/zh_tw.po,
-         lib/RT/I18N/i_default.pm, lib/RT/I18N/pt_br.po,
-         lib/RT/I18N/en.po, lib/RT/I18N/tr.po,
-         lib/RT/Condition/AnyTransaction.pm,
-         lib/RT/Condition/BeforeDue.pm, lib/RT/Condition/Generic.pm,
-         lib/RT/Condition/Overdue.pm, lib/RT/Condition/PriorityChange.pm,
-         lib/RT/Condition/PriorityExceeds.pm,
-         lib/RT/Condition/StatusChange.pm,
-         lib/RT/Condition/UserDefined.pm, lib/RT/I18N/no.po,
-         lib/RT/Condition/OwnerChange.pm, lib/RT/Condition/QueueChange.pm,
-         lib/RT/Report/Tickets.pm, lib/RT/Report/Tickets/Entry.pm,
+       * rt/: lib/RT/I18N/tr.po, lib/RT/Report/Tickets.pm,
+         lib/RT/Report/Tickets/Entry.pm,
          lib/t/data/subject-with-folding-ws, lib/t/data/lorem-ipsum,
-         lib/t/data/very-long-subject, lib/t/regression/08web_cf_access.t,
-         lib/t/regression/12-search.t, lib/t/regression/04send_email.t,
+         lib/t/data/very-long-subject,
          lib/t/regression/06-mime_decoding.t,
          lib/t/regression/15cf_pattern.t,
-         lib/t/regression/21query-builder.t,
-         lib/t/regression/22search_tix_by_txn.t,
-         lib/t/regression/22search_tix_by_watcher.t,
          lib/t/regression/23-batch-upload-csv.t,
          lib/t/regression/25scrip_order.t, lib/t/regression/27verp.t,
-         lib/t/regression/14linking.t, lib/t/regression/17custom_search.t,
+         lib/t/regression/17custom_search.t,
          lib/t/regression/19quicksearch.t, lib/t/regression/23cfsort.t,
          lib/t/regression/00-mason-syntax.t,
-         lib/t/regression/02basic_web.t,
-         lib/t/regression/01ticket_link_searching.t,
-         lib/t/regression/13-attribute-tests.t,
          lib/t/regression/26command_line.t,
-         lib/t/regression/03web_compiliation_errors.t,
-         lib/t/regression/06mailgateway.t, lib/t/regression/07acl.t,
          lib/t/regression/15cf_combo_cascade.t,
          lib/t/regression/18custom_frontpage.t,
-         lib/t/regression/24pawsort.t, lib/t/regression/07rights.t,
+         lib/t/regression/24pawsort.t,
          lib/t/regression/20-sort-by-requestor.t,
          lib/t/regression/23-web_attachments.t,
-         docs/design_docs/ruleset-workflow.txt, html/autohandler,
-         html/index.html, html/l, html/Elements/SelectBoolean,
-         html/Elements/SelectCustomFieldValue, html/Elements/SelectStatus,
-         html/Elements/TitleBox, html/Elements/EditCustomFieldImage,
-         html/Elements/EditCustomFieldSelect, html/Elements/ShowLinks,
-         html/Elements/EditLinks, html/Elements/ListActions,
-         html/Elements/MessageBox, html/Elements/SelectDateRelation,
-         html/Elements/SelectNewTicketQueue,
-         html/Elements/SelectTimeUnits, html/Elements/SelectWatcherType,
-         html/Elements/Error, html/Elements/GotoTicket,
-         html/Elements/MyTickets, html/Elements/QueryString,
-         html/Elements/RefreshHomepage, html/Elements/Section,
-         html/Elements/SelectLinkType, html/Elements/SelectMatch,
-         html/Elements/ShowCustomFieldBinary, html/Elements/ShowLink,
-         html/Elements/ShowMemberships, html/Elements/Login,
-         html/Elements/Refresh, html/Elements/SelectOwner,
-         html/Elements/SelectQueue, html/Elements/SelectUsers,
-         html/Elements/BevelBoxRaisedEnd, html/Elements/Callback,
-         html/Elements/SelectTicketTypes, html/Elements/Checkbox,
-         html/Elements/EditCustomField, html/Elements/MyAdminQueues,
-         html/Elements/MyRT, html/Elements/MyReminders,
-         html/Elements/MySupportQueues, html/Elements/QueueSummary,
-         html/Elements/ScrubHTML, html/Elements/SelectCustomFieldOperator,
-         html/Elements/SelectEqualityOperator,
-         html/Elements/SelectResultsPerPage,
-         html/Elements/SelectTicketSortBy,
-         html/Elements/ShowCustomFieldImage,
-         html/Elements/ShowCustomFieldWikitext, html/Elements/ShowSearch,
+         docs/design_docs/ruleset-workflow.txt,
+         html/Elements/SelectTimeUnits, html/Elements/RefreshHomepage,
+         html/Elements/MyAdminQueues, html/Elements/MyRT,
+         html/Elements/MyReminders, html/Elements/MySupportQueues,
+         html/Elements/QueueSummary, html/Elements/ShowSearch,
          html/Elements/ValidateCustomFields, html/Elements/Logo,
-         html/Elements/SelectSortOrder, html/Elements/SetupSessionCookie,
-         html/Elements/Submit, html/Elements/TitleBoxEnd,
-         html/Elements/BevelBoxRaisedStart, html/Elements/CreateTicket,
-         html/Elements/MyRequests, html/Elements/SelectGroups,
-         html/Elements/SelectLang, html/Elements/ShowCustomFields,
-         html/Elements/EditCustomFieldBinary,
-         html/Elements/EditCustomFieldFreeform, html/Elements/Quicksearch,
-         html/Elements/SelectAttachmentField,
-         html/Elements/SelectDateType,
-         html/Elements/EditCustomFieldCombobox,
-         html/Elements/EditCustomFieldText,
-         html/Elements/EditCustomFieldWikitext,
-         html/Elements/CollectionAsTable/Header,
-         html/Elements/CollectionAsTable/ParseFormat,
-         html/Elements/RT__Ticket/ColumnMap, html/Prefs/MyRT.html,
+         html/Elements/EditCustomFieldCombobox, html/Prefs/MyRT.html,
          html/Prefs/Quicksearch.html, html/Prefs/Search.html,
-         html/Prefs/Elements/Tabs, html/User/Delegation.html,
-         html/User/Elements/DelegateRights, html/User/Elements/GroupTabs,
-         html/User/Elements/Tabs, html/User/Groups/Modify.html,
-         html/Search/Chart.html, html/Search/Edit.html,
-         html/Search/Results.html, html/Search/Results.rdf,
-         html/Search/Simple.html, html/User/Groups/Members.html,
-         html/User/Groups/index.html, html/Search/Chart,
-         html/Search/Results.tsv, html/Search/Build.html,
-         html/Search/Elements/SelectAndOr,
-         html/Search/Elements/SelectGroupBy,
-         html/Search/Elements/SelectPersonType,
-         html/Search/Elements/BuildFormatString,
-         html/Search/Elements/Chart, html/Search/Elements/PickBasics,
-         html/Search/Elements/PickCFs, html/Search/Elements/SearchPrivacy,
+         html/Prefs/SearchOptions.html, html/Prefs/Elements/Tabs,
+         html/Search/Chart.html, html/Search/Simple.html,
+         html/Search/Chart, html/Search/Elements/SelectGroupBy,
+         html/Search/Elements/Chart,
          html/Search/Elements/SearchesForObject,
-         html/Search/Elements/SelectGroup,
-         html/Search/Elements/SelectLinks,
-         html/Search/Elements/SelectSearchObject,
-         html/Search/Elements/SelectSearchesForObjects,
-         html/Search/Elements/DisplayOptions,
-         html/Search/Elements/EditFormat, html/Search/Elements/EditQuery,
-         html/Search/Elements/PickCriteria,
-         html/Search/Elements/SelectChartType, html/REST/1.0/autohandler,
-         html/REST/1.0/dhandler, html/REST/1.0/logout,
-         html/REST/1.0/Forms/queue/default, html/REST/1.0/Forms/queue/ns,
+         html/Search/Elements/SelectChartType,
          html/REST/1.0/Forms/ticket/merge,
-         html/Search/Elements/EditSearches,
-         html/Search/Elements/NewListActions,
          html/REST/1.0/Forms/ticket/comment,
          html/REST/1.0/Forms/ticket/take,
-         html/REST/1.0/Forms/ticket/attachments,
-         html/REST/1.0/Forms/ticket/default,
-         html/REST/1.0/Forms/ticket/history,
-         html/REST/1.0/Forms/ticket/links,
          html/REST/1.0/Forms/transaction/default,
-         html/REST/1.0/Forms/user/default, html/REST/1.0/Forms/user/ns,
-         html/REST/1.0/NoAuth/mail-gateway, html/REST/1.0/search/dhandler,
-         html/REST/1.0/search/ticket, html/REST/1.0/ticket/merge,
-         html/NoAuth/Logout.html, html/NoAuth/Reminder.html,
          html/NoAuth/css/autohandler, html/NoAuth/css/print.css,
          html/NoAuth/css/3.4-compat/footer.css,
-         html/NoAuth/css/3.4-compat/header.css,
-         html/NoAuth/css/3.4-compat/login.css,
-         html/NoAuth/css/3.4-compat/nav.css,
-         html/NoAuth/css/3.4-compat/ticket.css,
-         html/NoAuth/css/3.4-compat/transactions.css,
-         html/REST/1.0/ticket/comment, html/REST/1.0/ticket/link,
-         html/NoAuth/css/3.4-compat/body.css,
-         html/NoAuth/css/3.4-compat/forms.css,
-         html/NoAuth/css/3.4-compat/main.css,
-         html/NoAuth/css/3.4-compat/misc.css,
-         html/NoAuth/css/3.4-compat/quickbar.css,
-         html/NoAuth/css/3.4-compat/titlebox.css,
-         html/NoAuth/css/3.5-default/footer.css,
-         html/NoAuth/css/3.5-default/login.css,
-         html/NoAuth/css/3.5-default/nav.css,
-         html/NoAuth/css/3.5-default/ticket.css,
-         html/NoAuth/css/3.5-default/approvals.css,
-         html/NoAuth/css/3.5-default/body.css,
-         html/NoAuth/css/3.5-default/forms.css,
-         html/NoAuth/css/3.5-default/header.css,
-         html/NoAuth/css/3.5-default/logo.css,
-         html/NoAuth/css/3.5-default/quickbar.css,
-         html/NoAuth/images/autohandler, html/NoAuth/images/bplogo.gif,
-         html/NoAuth/images/css/cb-light.gif,
-         html/NoAuth/images/css/cbr-b2g.gif,
-         html/NoAuth/images/css/cbr-b2lb.gif,
-         html/NoAuth/images/css/cbr-gray.gif,
-         html/NoAuth/images/css/cbr-trans.gif,
-         html/NoAuth/images/css/ct-light.gif,
-         html/NoAuth/images/css/ctr-b2g.gif,
-         html/NoAuth/images/css/ctr-b2lb.gif,
-         html/NoAuth/images/css/ctr-gray.gif,
-         html/NoAuth/images/css/ctr-trans.gif,
-         html/NoAuth/images/css/dark-arrow-up.png,
-         html/NoAuth/images/css/dark-arrow.png,
-         html/NoAuth/images/css/light-arrow-up.png,
-         html/NoAuth/images/css/light-arrow.png,
-         html/NoAuth/images/css/rolldown-arrow.gif,
-         html/NoAuth/images/css/rolldown-arrow.png,
-         html/NoAuth/images/css/rollup-arrow.gif,
-         html/NoAuth/js/cascaded.js, html/NoAuth/js/util.js,
-         html/NoAuth/js/autohandler, html/NoAuth/js/combobox.js,
-         html/NoAuth/js/list.js, html/NoAuth/js/ahah.js,
-         html/NoAuth/js/class.js, html/NoAuth/js/titlebox-state.js,
-         html/Widgets/ComboBox, html/Widgets/SavedSearch,
-         html/Widgets/SelectionBox, html/Widgets/TitleBox,
-         html/Widgets/TitleBoxEnd, html/Helpers/CalPopup.html,
-         html/Tools/MyDay.html, html/Tools/Offline.html,
-         html/Tools/index.html, html/Tools/Elements/Tabs,
-         html/Tools/Reports/CreatedByDates.html,
-         html/Tools/Reports/ResolvedByDates.html,
-         html/Tools/Reports/ResolvedByOwner.html,
-         html/Tools/Reports/index.html, html/Admin/autohandler,
-         html/Admin/index.html, html/Admin/Queues/CustomField.html,
-         html/Admin/Queues/CustomFields.html,
-         html/Admin/Queues/GroupRights.html,
-         html/Admin/Queues/People.html,
-         html/Download/CustomFieldValue/dhandler,
-         html/Download/Tabular/dhandler, html/Tools/Reports/Elements/Tabs,
-         html/Admin/Queues/Modify.html, html/Admin/Queues/Scrip.html,
-         html/Admin/Queues/Scrips.html, html/Admin/Queues/Template.html,
-         html/Admin/Elements/ObjectCustomFields,
-         html/Admin/Elements/SelectCustomFieldType,
-         html/Admin/Elements/SelectScripCondition,
-         html/Admin/Queues/Templates.html,
-         html/Admin/Queues/UserRights.html, html/Admin/Queues/index.html,
-         html/Admin/Elements/CustomFieldTabs,
-         html/Admin/Elements/EditCustomFieldValues,
-         html/Admin/Elements/EditUserComments,
-         html/Admin/Elements/GroupTabs,
-         html/Admin/Elements/SelectModifyQueue,
-         html/Admin/Elements/SelectScrip,
-         html/Admin/Elements/SelectScripAction,
-         html/Admin/Elements/SelectStage,
-         html/Admin/Elements/SelectTemplate, html/Admin/Elements/Tabs,
-         html/Admin/Elements/ConfigureMyRT,
-         html/Admin/Elements/EditCustomFields,
-         html/Admin/Elements/QueueTabs, html/Admin/Elements/EditScrip,
-         html/Admin/Elements/GlobalCustomFieldTabs,
-         html/Admin/Elements/ModifyTemplate,
-         html/Admin/Elements/SelectModifyGroup,
-         html/Admin/Elements/SelectSingleOrMultiple,
-         html/Admin/Elements/SystemTabs,
-         html/Admin/Elements/AddCustomFieldValue,
-         html/Admin/Elements/CreateUserCalled,
-         html/Admin/Elements/EditQueueWatchers,
-         html/Admin/Elements/EditScrips,
-         html/Admin/Elements/PickCustomFields,
-         html/Admin/Elements/SelectModifyUser,
-         html/Admin/Elements/SelectNewGroupMembers,
-         html/Admin/Elements/SelectUsers, html/Admin/Elements/UserTabs,
-         html/Admin/Elements/EditCustomField,
-         html/Admin/Elements/ListGlobalCustomFields,
-         html/Admin/Elements/ListGlobalScrips,
-         html/Admin/Elements/PickObjects,
-         html/Admin/Elements/SelectCustomFieldLookupType,
-         html/Admin/Elements/SelectGroups,
-         html/Admin/Elements/EditTemplates, html/Admin/Elements/Header,
-         html/Admin/Elements/QueueRightsForUser,
-         html/Admin/Elements/SelectRights, html/Admin/Elements/ToolTabs,
-         html/Admin/Global/MyRT.html, html/Admin/Global/GroupRights.html,
-         html/Admin/Global/Scrip.html, html/Admin/Global/Scrips.html,
-         html/Admin/Global/Template.html,
-         html/Admin/Global/Templates.html,
-         html/Admin/Global/UserRights.html, html/Admin/Global/index.html,
-         html/Admin/Global/CustomFields/Queue-Tickets.html,
-         html/Admin/Global/CustomFields/Queue-Transactions.html,
-         html/Admin/Global/CustomFields/Users.html,
-         html/Admin/Global/CustomFields/Groups.html,
-         html/Admin/Global/CustomFields/index.html,
-         html/Admin/Users/CustomFields.html, html/Admin/Users/MyRT.html,
-         html/Admin/Users/History.html, html/Admin/Users/Memberships.html,
-         html/Admin/CustomFields/GroupRights.html,
-         html/Admin/CustomFields/Modify.html,
-         html/Admin/CustomFields/Objects.html,
-         html/Admin/CustomFields/UserRights.html,
-         html/Admin/CustomFields/index.html, html/Admin/Users/index.html,
-         html/Admin/Groups/CustomFields.html,
-         html/Admin/Groups/GroupRights.html,
-         html/Admin/Groups/History.html, html/Admin/Groups/Modify.html,
-         html/Admin/Tools/Configuration.html, html/Admin/Tools/index.html,
-         html/Admin/Groups/Members.html,
-         html/Admin/Groups/UserRights.html, html/Admin/Groups/index.html,
-         html/Ticket/History.html, html/Ticket/Modify.html,
-         html/Ticket/ModifyLinks.html, html/Ticket/Reminders.html,
-         html/Ticket/ShowEmailRecord.html, html/Ticket/ModifyDates.html,
-         html/Ticket/ModifyPeople.html, html/Ticket/Update.html,
-         html/Ticket/ModifyAll.html, html/Ticket/Elements/AddWatchers,
-         html/Ticket/Elements/BulkLinks,
-         html/Ticket/Elements/EditWatchers,
-         html/Ticket/Elements/FindAttachments,
-         html/Ticket/Elements/ShowDates, html/Ticket/Elements/ShowTime:
-         import rt 3.6.4
+         html/NoAuth/css/3.4-compat/header.css,
+         html/NoAuth/css/3.4-compat/login.css,
+         html/NoAuth/css/3.4-compat/nav.css,
+         html/NoAuth/css/3.4-compat/ticket.css,
+         html/NoAuth/css/3.4-compat/transactions.css,
+         html/NoAuth/css/3.4-compat/body.css,
+         html/NoAuth/css/3.4-compat/forms.css,
+         html/NoAuth/css/3.4-compat/main.css,
+         html/NoAuth/css/3.4-compat/misc.css,
+         html/NoAuth/css/3.4-compat/quickbar.css,
+         html/NoAuth/css/3.4-compat/titlebox.css,
+         html/NoAuth/css/3.5-default/footer.css,
+         html/NoAuth/css/3.5-default/login.css,
+         html/NoAuth/css/3.5-default/nav.css,
+         html/NoAuth/css/3.5-default/ticket.css,
+         html/NoAuth/css/3.5-default/approvals.css,
+         html/NoAuth/css/3.5-default/body.css,
+         html/NoAuth/css/3.5-default/forms.css,
+         html/NoAuth/css/3.5-default/header.css,
+         html/NoAuth/css/3.5-default/logo.css,
+         html/NoAuth/css/3.5-default/main.css,
+         html/NoAuth/css/3.5-default/misc.css,
+         html/NoAuth/css/3.5-default/quickbar.css,
+         html/NoAuth/css/3.5-default/titlebox.css,
+         html/NoAuth/css/3.5-default/transactions.css,
+         html/NoAuth/images/css/cb-light.gif,
+         html/NoAuth/images/css/cb.gif,
+         html/NoAuth/images/css/cbr-b2g.gif,
+         html/NoAuth/images/css/cbr-b2lb.gif,
+         html/NoAuth/images/css/cbr-gray.gif,
+         html/NoAuth/images/css/cbr-trans.gif,
+         html/NoAuth/images/css/cbr.gif,
+         html/NoAuth/images/css/ct-light.gif,
+         html/NoAuth/images/css/ct.gif,
+         html/NoAuth/images/css/ctr-b2g.gif,
+         html/NoAuth/images/css/ctr-b2lb.gif,
+         html/NoAuth/images/css/ctr-gray.gif,
+         html/NoAuth/images/css/ctr-trans.gif,
+         html/NoAuth/images/css/ctr.gif,
+         html/NoAuth/images/css/dark-arrow-up.png,
+         html/NoAuth/images/css/dark-arrow.png,
+         html/NoAuth/images/css/light-arrow-up.png,
+         html/NoAuth/images/css/light-arrow.png,
+         html/NoAuth/images/css/rolldown-arrow.gif,
+         html/NoAuth/images/css/rolldown-arrow.png,
+         html/NoAuth/images/css/rollup-arrow.gif,
+         html/NoAuth/js/cascaded.js, html/NoAuth/js/util.js,
+         html/NoAuth/js/autohandler, html/NoAuth/js/combobox.js,
+         html/NoAuth/js/list.js, html/NoAuth/js/ahah.js,
+         html/NoAuth/js/class.js, html/NoAuth/js/titlebox-state.js,
+         html/Widgets/ComboBox, html/Widgets/SavedSearch,
+         html/Widgets/SelectionBox, html/Widgets/TitleBox,
+         html/Widgets/TitleBoxEnd, html/Widgets/TitleBoxStart,
+         html/Helpers/CalPopup.html, html/Tools/index.html,
+         html/Tools/Reports/CreatedByDates.html,
+         html/Tools/Reports/ResolvedByDates.html,
+         html/Tools/Reports/ResolvedByOwner.html,
+         html/Tools/Reports/index.html, html/Tools/Reports/Elements/Tabs,
+         html/Admin/Elements/ConfigureMyRT, html/Admin/Global/MyRT.html,
+         html/Admin/Users/MyRT.html, html/Ticket/Reminders.html,
+         html/Ticket/Elements/ShowTime, html/Ticket/Elements/Reminders,
+         etc/upgrade/3.5.1/content: Initial revision
 
-2007-08-02 12:49  ivan
+2007-08-02 12:51  ivan
 
-       * rt/: configure, aclocal.m4, Changelog, Makefile.in, README,
-         UPGRADING, configure.ac, sbin/extract_pod_tests,
-         sbin/rt-test-dependencies.in, sbin/extract-message-catalog,
-         sbin/regression_harness, sbin/rt-dump-database.in, sbin/factory,
-         sbin/license_tag, lib/RT.pm.in,
-         lib/RT/ObjectCustomFieldValues.pm,
-         lib/RT/Transactions_Overlay.pm, lib/RT/URI.pm, lib/RT/Handle.pm,
-         lib/RT/ObjectCustomField.pm, lib/RT/ScripCondition_Overlay.pm,
-         lib/RT/CustomFieldValues_Overlay.pm,
-         lib/RT/ObjectCustomFieldValue.pm, lib/RT/ScripConditions.pm,
-         lib/RT/Scrip_Overlay.pm, lib/RT/Tickets_Overlay.pm,
-         lib/RT/CustomField_Overlay.pm, lib/RT/GroupMembers_Overlay.pm,
-         lib/RT/I18N.pm, lib/RT/Queue.pm,
-         lib/RT/ScripConditions_Overlay.pm, lib/RT/Scrips.pm,
-         lib/RT/System.pm, lib/RT/CachedGroupMember.pm, lib/RT/Links.pm,
-         lib/RT/CustomFieldValues.pm, lib/RT/SavedSearch.pm,
-         lib/RT/Scrips_Overlay.pm, lib/RT/CustomFields_Overlay.pm,
-         lib/RT/ObjectCustomFields.pm, lib/RT/Reminders.pm, lib/RT/ACE.pm,
-         lib/RT/CurrentUser.pm, lib/RT/CustomFieldValue_Overlay.pm,
-         lib/RT/Attributes.pm, lib/RT/Base.pm,
-         lib/RT/ScripAction_Overlay.pm, lib/RT/User.pm,
-         lib/RT/Principals_Overlay.pm, lib/RT/ScripAction.pm,
-         lib/RT/CustomField.pm, lib/RT/Principal.pm,
-         lib/RT/Attributes_Overlay.pm, lib/RT/Queues.pm,
-         lib/RT/Attachments.pm, lib/RT/Attribute_Overlay.pm,
-         lib/RT/CachedGroupMember_Overlay.pm,
-         lib/RT/ObjectCustomFieldValues_Overlay.pm,
-         lib/RT/SavedSearches.pm, lib/RT/ScripCondition.pm,
-         lib/RT/Templates.pm, lib/RT/Tickets.pm,
-         lib/RT/ObjectCustomFieldValue_Overlay.pm,
-         lib/RT/Tickets_Overlay_SQL.pm, lib/RT/Users.pm,
-         lib/RT/Attachments_Overlay.pm, lib/RT/CachedGroupMembers.pm,
-         lib/RT/Link.pm, lib/RT/Transaction.pm,
-         lib/RT/GroupMember_Overlay.pm, lib/RT/ScripActions_Overlay.pm,
-         lib/RT/ACE_Overlay.pm, lib/RT/CachedGroupMembers_Overlay.pm,
-         lib/RT/Scrip.pm, lib/RT/EmailParser.pm,
-         lib/RT/ObjectCustomField_Overlay.pm, lib/RT/Group.pm,
-         lib/RT/Template.pm, lib/RT/GroupMembers.pm,
-         lib/RT/Principal_Overlay.pm, lib/RT/Transactions.pm,
-         lib/RT/ACL_Overlay.pm, lib/RT/Attachment_Overlay.pm,
-         lib/RT/ACL.pm, lib/RT/Date.pm, lib/RT/GroupMember.pm,
-         lib/RT/Groups.pm, lib/RT/Templates_Overlay.pm,
-         lib/RT/Group_Overlay.pm, lib/RT/Links_Overlay.pm,
-         lib/RT/CustomFieldValue.pm, lib/RT/CustomFields.pm,
-         lib/RT/Link_Overlay.pm, lib/RT/ObjectCustomFields_Overlay.pm,
-         lib/RT/Principals.pm, lib/RT/Queues_Overlay.pm, lib/RT/Ticket.pm,
-         lib/RT/Attribute.pm, lib/RT/ScripActions.pm,
-         lib/RT/Attachment.pm, lib/RT/Queue_Overlay.pm,
-         lib/RT/Template_Overlay.pm, lib/RT/URI/base.pm,
-         lib/RT/URI/fsck_com_rt.pm, lib/RT/URI/t.pm,
-         lib/RT/Interface/Email.pm, lib/RT/Interface/REST.pm,
-         lib/RT/Interface/CLI.pm, lib/RT/Interface/Web.pm,
-         lib/RT/Interface/Web/Handler.pm, lib/RT/Interface/Web/Menu.pm,
-         lib/RT/Interface/Web/QueryBuilder.pm,
-         lib/RT/Interface/Web/Standalone.pm,
-         lib/RT/Interface/Email/Auth/GnuPG.pm,
-         lib/RT/Interface/Email/Filter/SpamAssassin.pm,
-         lib/RT/Interface/Web/Menu/Item.pm,
-         lib/RT/Interface/Web/QueryBuilder/Tree.pm,
-         lib/RT/Action/Autoreply.pm, lib/RT/Action/Generic.pm,
-         lib/RT/Interface/Email/Auth/MailFrom.pm, lib/RT/Action/Notify.pm,
-         lib/RT/Action/RecordComment.pm,
-         lib/RT/Action/RecordCorrespondence.pm,
-         lib/RT/Action/CreateTickets.pm, lib/RT/Action/NotifyAsComment.pm,
-         lib/RT/Action/ResolveMembers.pm, lib/RT/Action/UserDefined.pm,
-         lib/RT/Action/AutoOpen.pm, lib/RT/Action/EscalatePriority.pm,
-         lib/RT/Action/SendEmail.pm, lib/RT/Action/SetPriority.pm,
-         lib/RT/Search/ActiveTicketsInQueue.pm, lib/RT/Search/FromSQL.pm,
-         lib/RT/Search/Generic.pm, lib/RT/Search/Googleish.pm,
-         lib/RT/I18N/cs.po, lib/RT/I18N/es.po, lib/RT/I18N/sv.po,
-         lib/RT/I18N/fi.po, lib/RT/I18N/zh_cn.po, lib/RT/I18N/hu.po,
-         lib/RT/I18N/he.po: import rt 3.6.4
+       * rt/lib/RT/: Reminders.pm, Interface/Web/Menu.pm,
+         Interface/Web/Menu/Item.pm, Search/Googleish.pm, I18N/sv.po:
+         Initial revision
 
 2007-08-01 15:33  ivan
 
 
 2007-08-01 15:24  ivan
 
-       * CREDITS, FS/MANIFEST, FS/FS/AccessRight.pm, FS/FS/Conf.pm,
-         FS/FS/Record.pm, FS/FS/Schema.pm, FS/FS/Setup.pm,
-         FS/FS/access_group.pm, FS/FS/access_user.pm,
-         FS/FS/access_user_pref.pm, FS/FS/agent.pm, FS/FS/cust_bill.pm,
-         FS/FS/cust_credit.pm, FS/FS/cust_event.pm, FS/FS/cust_main.pm,
-         FS/FS/cust_pay.pm, FS/FS/cust_pay_batch.pm, FS/FS/cust_pkg.pm,
-         FS/FS/cust_refund.pm, FS/FS/m2name_Common.pm,
+       * ANNOUNCE.1.5, CREDITS, FS/MANIFEST, FS/README,
+         FS/FS/AccessRight.pm, FS/FS/Conf.pm, FS/FS/Record.pm,
+         FS/FS/Schema.pm, FS/FS/Setup.pm, FS/FS/access_group.pm,
+         FS/FS/access_user.pm, FS/FS/access_user_pref.pm, FS/FS/agent.pm,
+         FS/FS/cust_bill.pm, FS/FS/cust_credit.pm, FS/FS/cust_event.pm,
+         FS/FS/cust_main.pm, FS/FS/cust_pay.pm, FS/FS/cust_pay_batch.pm,
+         FS/FS/cust_pkg.pm, FS/FS/cust_refund.pm, FS/FS/m2name_Common.pm,
          FS/FS/option_Common.pm, FS/FS/part_bill_event.pm,
          FS/FS/part_event.pm, FS/FS/part_event_condition.pm,
          FS/FS/part_event_condition_option.pm,
          httemplate/view/cust_bill-logo.cgi,
          httemplate/view/cust_bill.cgi, httemplate/view/cust_main.cgi,
          httemplate/view/logo.cgi, httemplate/view/svc_Common.html,
+         httemplate/view/cust_main/order_pkg.html,
          httemplate/view/cust_main/packages.html,
          httemplate/view/cust_main/payment_history.html, test/cgi-test:
          event refactor, landing on HEAD!
        * rt/: Makefile, config.log, config.status, bin/mason_handler.fcgi,
          bin/mason_handler.scgi, bin/mason_handler.svc,
          bin/rt-commit-handler, bin/rt-crontool, bin/rt-mailgate,
-         etc/RT_Config.pm, lib/RT.pm, lib/RTx/WebCronTool.pm,
-         lib/t/02regression.t, lib/t/03web.pl, lib/t/04_send_email.pl:
-         commit these RT differences, seem to be mostly in autogen'ed
-         stuff
+         bin/webmux.pl, etc/RT_Config.pm, lib/RT.pm,
+         lib/RTx/WebCronTool.pm, lib/t/02regression.t, lib/t/03web.pl,
+         lib/t/04_send_email.pl: commit these RT differences, seem to be
+         mostly in autogen'ed stuff
 
 2007-08-01 15:13  ivan
 
 
 2007-07-06 01:08  ivan
 
-       * README: v3!
+       * GPL, README: v3!
 
 2007-07-05 15:05  ivan
 
 
        * FS/FS/cust_pkg.pm: missing method name in docs
 
+2007-07-01 11:09  ivan
+
+       * TODO: remove obsolete information and dollar sign Id dollar sign
+         from TODO
+
 2007-06-30 17:36  ivan
 
        * httemplate/edit/agent.cgi: separate agent interface is
 
 2007-06-28 18:27  ivan
 
-       * bin/strip-eps: removing create-history-tables, freeside-upgrade
-         does this anyway
+       * bin/: create-history-tables, strip-eps: removing
+         create-history-tables, freeside-upgrade does this anyway
 
 2007-06-28 18:23  ivan
 
 
        * FS/FS/Schema.pm, FS/FS/cust_main.pm,
          httemplate/edit/cust_main.cgi,
-         httemplate/edit/cust_main/billing.html: ticket 1443 add account
-         type and bank state for echeck processing
+         httemplate/edit/cust_main/billing.html,
+         httemplate/edit/cust_main/select-state.html: ticket 1443 add
+         account type and bank state for echeck processing
 
 2007-04-05 17:37  ivan
 
 
 2007-02-28 11:14  jeff
 
-       * httemplate/misc/svc_acct-domains.cgi: restore (none) choice to
-         first package select
+       * httemplate/: edit/cust_main/select-domain.html,
+         misc/svc_acct-domains.cgi: restore (none) choice to first package
+         select
 
 2007-02-27 16:16  jayce
 
        * FS/FS/cust_main.pm: *** ERROR: unterminated L<...> at line 4716
          in file FS/cust_main.pm
 
+2007-02-14 17:09  ivan
+
+       * httemplate/docs/billing.html: removing docs moved to wiki
+
 2007-02-14 16:49  ivan
 
        * httemplate/edit/part_bill_event.cgi: add send_email event
 
 2007-02-14 15:32  jeff
 
-       * httemplate/: edit/cust_main.cgi, misc/svc_acct-domains.cgi:
-         selectable domain on first package in edit/cust_main
+       * httemplate/: edit/cust_main/select-domain.html,
+         edit/cust_main.cgi, misc/svc_acct-domains.cgi: selectable domain
+         on first package in edit/cust_main
 
 2007-02-14 14:43  ivan
 
 
 2007-02-12 09:56  jeff
 
-       * FS/FS/ClientAPI/Signup.pm: alpha sort packages in new package
-         order SELECT (ticket 1446)
+       * FS/FS/ClientAPI/Signup.pm,
+         httemplate/view/cust_main/order_pkg.html: alpha sort packages in
+         new package order SELECT (ticket 1446)
 
 2007-02-11 19:11  ivan
 
 
        * FS/FS/pay_batch.pm: remove refactored code
 
+2007-02-05 05:11  ivan
+
+       * httemplate/search/svc_Smart.html: remove unused svc_Smart
+
 2007-02-05 05:10  ivan
 
        * httemplate/search/: report_receivables.cgi,
        * FS/FS/AccessRight.pm, httemplate/view/cust_bill-logo.cgi,
          httemplate/view/cust_bill-pdf.cgi,
          httemplate/view/cust_bill-ps.cgi, httemplate/view/cust_bill.cgi,
-         httemplate/view/cust_main.cgi, httemplate/view/svc_Common.html,
-         httemplate/view/svc_acct.cgi, httemplate/view/svc_broadband.cgi,
+         httemplate/view/cust_main.cgi, httemplate/view/cust_pkg.cgi,
+         httemplate/view/svc_Common.html, httemplate/view/svc_acct.cgi,
+         httemplate/view/svc_broadband.cgi,
          httemplate/view/svc_domain.cgi, httemplate/view/svc_external.cgi,
          httemplate/view/svc_forward.cgi, httemplate/view/svc_www.cgi,
          httemplate/view/cust_main/contacts.html,
 
 2007-01-21 05:26  ivan
 
-       * Makefile, htetc/freeside-base1.conf, htetc/freeside-base2.conf:
-         mod_perl v2, it finally happened
+       * Makefile, htetc/freeside-base.conf, htetc/freeside-base1.conf,
+         htetc/freeside-base2.conf: mod_perl v2, it finally happened
 
 2007-01-21 01:13  ivan
 
 
        * httemplate/docs/index.html: link more docs to wiki
 
+2006-12-29 00:29  ivan
+
+       * httemplate/browse/pay_batch.cgi: this is unused, replaced by
+         search/pay_batch.cgi
+
 2006-12-29 00:25  ivan
 
        * FS/FS/part_export/vpopmail.pm: didn't get checked in with
        * FS/FS/part_export.pm: use FS::queue for exports, though they
          should probably just use it themselves
 
+2006-12-29 00:21  ivan
+
+       * Changelog, Changes.1.5.7, Changes.1.5.8: removing old changelogs
+
+2006-12-29 00:20  ivan
+
+       * Changes.1.7.0: changelog now in the wiki
+
 2006-12-28 23:23  ivan
 
        * httemplate/edit/elements/edit.html: document field types
 
        * FS/FS/Misc.pm, htetc/handler.pl,
          httemplate/edit/cust_main/contact.html,
+         httemplate/edit/cust_main/select-county.html,
          httemplate/misc/counties.cgi: Add a (magically appearing and
          disappearing) label on the county selector.  confusing when
          labeled "state"
 
 2006-12-26 17:07  ivan
 
-       * httemplate/: edit/cust_main.cgi, misc/counties.cgi: fix county
+       * httemplate/: edit/cust_main.cgi,
+         edit/cust_main/select-county.html, misc/counties.cgi: fix county
          selector
 
 2006-12-26 11:53  ivan
          FS/bin/freeside-deluser, FS/bin/freeside-queued,
          FS/bin/freeside-selfservice-server, FS/bin/freeside-setup,
          FS/bin/freeside-sqlradius-radacctd, FS/bin/freeside-upgrade,
-         bin/mapsecrets2access_user, htetc/handler.pl: make the config
-         directory configurable
+         bin/dbdef-create, bin/mapsecrets2access_user, htetc/handler.pl:
+         make the config directory configurable
 
 2006-12-13 22:00  ivan
 
 
 2006-12-08 05:36  ivan
 
-       * httemplate/edit/process/quick-charge.cgi: some javascript
-         validation magic to give one-time charges better UI
+       * httemplate/: view/cust_main/quick-charge.html,
+         edit/process/quick-charge.cgi: some javascript validation magic
+         to give one-time charges better UI
 
 2006-12-07 08:46  ivan
 
        * FS/bin/freeside-queued: remove unnecessary service use (in an
          awfully odd place)
 
+2006-11-30 17:35  ivan
+
+       * FS/bin/freeside-expiration-alerter: go away and never come back,
+         $Id$
+
 2006-11-30 17:34  ivan
 
        * FS/bin/freeside-email: begone $Id$ and your diff noise!
 
        * FS/MANIFEST: removing freeside-daily
 
+2006-10-29 16:26  ivan
+
+       * FS/bin/freeside-bill: removing pre-1.4 freeside-bill
+
 2006-10-27 12:10  ivan
 
        * FS/FS/: Conf.pm, cust_pkg.pm: add
 2006-10-19 07:26  jeff
 
        * httemplate/elements/tr-select-reason.html,
-         httemplate/misc/cancel_pkg.html,
-         httemplate/misc/process/cancel_pkg.html, FS/t/cust_pkg_reason.t:
-         suspension and cancellation reasons
+         httemplate/misc/cancel_pkg.cgi, httemplate/misc/cancel_pkg.html,
+         httemplate/misc/expire_pkg.cgi,
+         httemplate/misc/process/cancel_pkg.html,
+         httemplate/misc/process/expire_pkg.cgi,
+         httemplate/misc/susp_pkg.cgi, FS/t/cust_pkg_reason.t: suspension
+         and cancellation reasons
 
 2006-10-19 07:23  jeff
 
-       * FS/FS/reason.pm, FS/FS/reason_type.pm, FS/t/reason.t,
-         FS/t/reason_type.t, httemplate/browse/reason.html,
+       * FS/FS/cancel_reason.pm, FS/FS/reason.pm, FS/FS/reason_type.pm,
+         FS/t/cancel_reason.t, FS/t/reason.t, FS/t/reason_type.t,
+         httemplate/browse/reason.html,
          httemplate/browse/reason_type.html,
          httemplate/edit/process/reason.html,
          httemplate/edit/process/reason_type.html,
          httemplate/view/cust_main/packages.html: suspension and
          cancellation reasons
 
+2006-10-18 02:30  ivan
+
+       * httemplate/docs/: config.html, export.html: removing obsolete
+         config.html, moving info from export.html into wiki
+
 2006-10-17 17:05  jeff
 
        * httemplate/elements/tr-input-date-field.html: fix ugly null dates
 2006-10-17 02:03  ivan
 
        * rt/: html/Elements/Header, html/Elements/CollectionAsTable/Row,
-         sbin/rt-setup-database.in: commiting rt 3.4.5 to HEAD
+         html/NoAuth/webrt.css, sbin/rt-setup-database.in: commiting rt
+         3.4.5 to HEAD
 
 2006-10-17 01:49  ivan
 
-       * rt/: configure, configure.ac, README, Changelog,
-         sbin/rt-test-dependencies.in,
-         html/Ticket/Elements/EditCustomFields, html/Search/Build.html,
-         html/Search/Results.rdf, html/Search/Results.tsv,
-         html/Search/Elements/BuildFormatString,
-         html/Approvals/Elements/PendingMyApproval,
-         html/Elements/EditCustomField, html/Elements/QueryString,
-         html/Elements/ScrubHTML, html/Elements/EditCustomFieldSelect,
-         html/Elements/Callback, html/Elements/ShowCustomFields,
-         html/Elements/RT__Ticket/ColumnMap, html/User/Elements/Tabs,
-         lib/t/regression/22search_tix_by_txn.t,
-         lib/t/regression/09record_cf_api.t, lib/t/regression/07acl.t,
-         lib/t/regression/14linking.t,
-         lib/t/regression/22search_tix_by_watcher.t,
-         lib/t/regression/06mailgateway.t, lib/t/regression/07rights.t,
-         lib/RT/CustomField_Overlay.pm, lib/RT/Tickets_Overlay_SQL.pm,
-         lib/RT/EmailParser.pm, lib/RT/I18N.pm, lib/RT/Tickets_Overlay.pm,
-         lib/RT/CustomFieldValues.pm, lib/RT/Transactions_Overlay.pm,
-         lib/RT/Principal_Overlay.pm, lib/RT/Queue_Overlay.pm,
-         lib/RT/Attachments_Overlay.pm,
-         lib/RT/ObjectCustomFieldValues_Overlay.pm, lib/RT/ACE_Overlay.pm,
-         lib/RT/Link_Overlay.pm, lib/RT/I18N/en.po, lib/RT/I18N/cs.po,
-         lib/RT/I18N/pt_br.po, lib/RT/I18N/fr.po, lib/RT/I18N/es.po,
-         lib/RT/I18N/nl.po, lib/RT/I18N/pl.po, lib/RT/I18N/no.po,
-         lib/RT/I18N/it.po, lib/RT/I18N/hu.po, lib/RT/I18N/da.po,
-         lib/RT/I18N/ru.po, lib/RT/I18N/de.po, lib/RT/I18N/ja.po,
-         lib/RT/I18N/zh_tw.po, lib/RT/I18N/id.po, lib/RT/I18N/he.po,
-         lib/RT/I18N/fi.po, lib/RT/I18N/zh_cn.po,
-         lib/RT/Action/SendEmail.pm, lib/RT/Interface/Email.pm: import rt
-         3.4.5
+       * rt/: html/NoAuth/printrt.css, lib/t/regression/14linking.t,
+         lib/t/regression/22search_tix_by_watcher.t: Initial revision
 
 2006-10-16 22:49  ivan
 
 
 2006-10-14 02:55  ivan
 
-       * httemplate/docs/index.html: move signup/self-service install to
-         wiki
+       * httemplate/docs/: index.html, selfservice.html: move
+         signup/self-service install to wiki
 
 2006-10-12 02:42  ivan
 
 
 2006-09-26 11:55  ivan
 
-       * httemplate/search/svc_acct.cgi: fix username@domain search
+       * httemplate/search/: svc_Smart.html, svc_acct.cgi: fix
+         username@domain search
 
 2006-09-23 11:33  ivan
 
        * FS/FS/AccessRight.pm, httemplate/elements/menu.html: add RADIUS
          session search back to main menu
 
+2006-09-02 20:14  ivan
+
+       * bin/dbdef-create: REALLY don't error out trying to create a dbdef
+         file from scratch
+
+2006-09-02 20:12  ivan
+
+       * bin/dbdef-create: don't error out trying to create a dbdef file
+         from scratch
+
 2006-09-02 13:38  ivan
 
        * httemplate/search/: cust_bill_event.cgi, cust_bill_event.html:
 
        * bin/: svc_acct.import, svc_domain.erase: BEGONE $Id$
 
+2006-08-31 13:44  ivan
+
+       * bin/svc_acct.export: removing obsolete file
+
 2006-08-31 12:59  ivan
 
        * bin/fs-migrate-svc_acct_sm: BEGONE $Id$
          FS/FS/cust_main.pm, FS/FS/cust_pay_batch.pm,
          FS/FS/part_bill_event.pm, FS/FS/payby.pm,
          FS/FS/ClientAPI/MyAccount.pm, FS/FS/ClientAPI/Signup.pm,
-         FS/t/cust_bill_pay_batch.t, httemplate/edit/cust_bill_pay.cgi,
+         FS/t/cust_bill_pay_batch.t, httemplate/browse/cust_pay_batch.cgi,
+         httemplate/edit/cust_bill_pay.cgi,
          httemplate/edit/cust_credit.cgi,
          httemplate/edit/cust_credit_bill.cgi,
          httemplate/edit/part_bill_event.cgi,
 
 2006-08-25 12:30  ivan
 
-       * FS/FS/: Misc.pm, Record.pm: use GROUP BY instead of DISTINCT ON
-         in the state and country queries for better cross-database
-         compatibility, based on a preliminary patch from Jason Thomas
+       * FS/FS/Misc.pm, FS/FS/Record.pm,
+         httemplate/edit/cust_main/select-country.html,
+         httemplate/edit/cust_main/select-county.html,
+         httemplate/edit/cust_main/select-state.html: use GROUP BY instead
+         of DISTINCT ON in the state and country queries for better
+         cross-database compatibility, based on a preliminary patch from
+         Jason Thomas
 
 2006-08-23 18:37  ivan
 
          httemplate/browse/addr_block.cgi, httemplate/browse/agent.cgi,
          httemplate/browse/agent_type.cgi,
          httemplate/browse/cust_main_county.cgi,
+         httemplate/browse/cust_pay_batch.cgi,
          httemplate/browse/inventory_class.html,
          httemplate/browse/msgcat.cgi, httemplate/browse/nas.cgi,
          httemplate/browse/part_bill_event.cgi,
          httemplate/browse/elements/browse.html,
          httemplate/config/config-process.cgi,
          httemplate/config/config-view.cgi, httemplate/config/config.cgi,
-         httemplate/edit/REAL_cust_pkg.cgi,
+         httemplate/docs/trouble.html, httemplate/edit/REAL_cust_pkg.cgi,
          httemplate/edit/access_group.html,
          httemplate/edit/access_user.html, httemplate/edit/agent.cgi,
          httemplate/edit/agent_payment_gateway.html,
          httemplate/edit/cust_credit_bill.cgi,
          httemplate/edit/cust_main.cgi,
          httemplate/edit/cust_main_county-expand.cgi,
+         httemplate/edit/cust_main_county.cgi,
          httemplate/edit/cust_pay.cgi, httemplate/edit/cust_pkg.cgi,
          httemplate/edit/cust_refund.cgi,
          httemplate/edit/inventory_class.html, httemplate/edit/msgcat.cgi,
          httemplate/edit/svc_www.cgi,
          httemplate/edit/cust_main/billing.html,
          httemplate/edit/cust_main/contact.html,
+         httemplate/edit/cust_main/select-country.html,
+         httemplate/edit/cust_main/select-county.html,
+         httemplate/edit/cust_main/select-state.html,
          httemplate/edit/elements/edit.html,
          httemplate/edit/elements/svc_Common.html,
          httemplate/edit/process/REAL_cust_pkg.cgi,
          httemplate/edit/process/cust_main.cgi,
          httemplate/edit/process/cust_main_county-collapse.cgi,
          httemplate/edit/process/cust_main_county-expand.cgi,
+         httemplate/edit/process/cust_main_county.cgi,
          httemplate/edit/process/cust_pay.cgi,
          httemplate/edit/process/cust_pkg.cgi,
          httemplate/edit/process/cust_refund.cgi,
          httemplate/graph/elements/monthly.html,
          httemplate/misc/batch-cust_pay.html, httemplate/misc/bill.cgi,
          httemplate/misc/cancel-unaudited.cgi,
-         httemplate/misc/catchall.cgi, httemplate/misc/cdr-import.html,
-         httemplate/misc/change_pkg.cgi, httemplate/misc/counties.cgi,
+         httemplate/misc/cancel_pkg.cgi, httemplate/misc/catchall.cgi,
+         httemplate/misc/cdr-import.html, httemplate/misc/change_pkg.cgi,
+         httemplate/misc/counties.cgi,
          httemplate/misc/cust_main-cancel.cgi,
          httemplate/misc/cust_main-import.cgi,
          httemplate/misc/cust_main-import_charges.cgi,
          httemplate/misc/email-invoice.cgi,
          httemplate/misc/email_invoice_events.cgi,
          httemplate/misc/email_invoices.cgi,
-         httemplate/misc/fax-invoice.cgi,
+         httemplate/misc/expire_pkg.cgi, httemplate/misc/fax-invoice.cgi,
          httemplate/misc/fax_invoice_events.cgi,
          httemplate/misc/fax_invoices.cgi,
          httemplate/misc/inventory_item-import.html,
          httemplate/misc/payment.cgi, httemplate/misc/print-invoice.cgi,
          httemplate/misc/print_invoice_events.cgi,
          httemplate/misc/print_invoices.cgi, httemplate/misc/queue.cgi,
-         httemplate/misc/states.cgi,
+         httemplate/misc/states.cgi, httemplate/misc/susp_pkg.cgi,
          httemplate/misc/unapply-cust_credit.cgi,
          httemplate/misc/unapply-cust_pay.cgi,
          httemplate/misc/unprovision.cgi, httemplate/misc/unsusp_pkg.cgi,
          httemplate/misc/process/cust_main-import.cgi,
          httemplate/misc/process/cust_main-import_charges.cgi,
          httemplate/misc/process/delete-customer.cgi,
+         httemplate/misc/process/expire_pkg.cgi,
          httemplate/misc/process/inventory_item-import.html,
          httemplate/misc/process/link.cgi,
          httemplate/misc/process/meta-import.cgi,
          httemplate/search/report_tax.cgi,
          httemplate/search/report_tax.html, httemplate/search/sql.html,
          httemplate/search/sqlradius.cgi,
-         httemplate/search/sqlradius.html, httemplate/search/svc_acct.cgi,
+         httemplate/search/sqlradius.html,
+         httemplate/search/svc_Smart.html, httemplate/search/svc_acct.cgi,
          httemplate/search/svc_broadband.cgi,
          httemplate/search/svc_domain.cgi,
          httemplate/search/svc_external.cgi,
          httemplate/view/cust_bill-logo.cgi,
          httemplate/view/cust_bill-pdf.cgi,
          httemplate/view/cust_bill-ps.cgi, httemplate/view/cust_bill.cgi,
-         httemplate/view/cust_main.cgi, httemplate/view/svc_acct.cgi,
-         httemplate/view/svc_broadband.cgi,
+         httemplate/view/cust_main.cgi, httemplate/view/cust_pkg.cgi,
+         httemplate/view/svc_acct.cgi, httemplate/view/svc_broadband.cgi,
          httemplate/view/svc_domain.cgi, httemplate/view/svc_external.cgi,
          httemplate/view/svc_forward.cgi, httemplate/view/svc_phone.cgi,
          httemplate/view/svc_www.cgi,
          httemplate/view/cust_main/billing.html,
          httemplate/view/cust_main/contacts.html,
          httemplate/view/cust_main/misc.html,
+         httemplate/view/cust_main/order_pkg.html,
          httemplate/view/cust_main/packages.html,
          httemplate/view/cust_main/payment_history.html,
+         httemplate/view/cust_main/quick-charge.html,
          httemplate/view/cust_main/tickets.html,
          httemplate/view/elements/svc_Common.html: Will things ever be the
          same again? It's the final masonize
 
 2006-08-22 05:23  ivan
 
-       * httemplate/docs/index.html: get rid of old upgrade instructions
+       * httemplate/docs/: index.html, upgrade-1.4.2.html, upgrade10.html,
+         upgrade9.html: get rid of old upgrade instructions
+
+2006-08-22 05:20  ivan
+
+       * README.1.7.0: wiki!
+
+2006-08-22 05:09  ivan
+
+       * README.1.5.0pre6, README.1.5.7, README.1.5.7.lastbit,
+         README.1.5.8: removing old upgrade instructions...  can always
+         get the out of the Attic
 
 2006-08-21 16:01  ivan
 
 
 2006-08-21 02:46  ivan
 
-       * httemplate/docs/index.html: we're off to see the wiki, the
-         wonderful wiki of oz
+       * httemplate/docs/: install-rt.html, install.html, index.html:
+         we're off to see the wiki, the wonderful wiki of oz
 
 2006-08-18 05:18  ivan
 
        * FS/FS/cust_main.pm: pass email, phone and ip adderss to B:OP when
          doing refunds, hopefully this will fix OpenECHO refunds
 
+2006-08-14 05:24  ivan
+
+       * Changes.1.7.0: there's more, but this will have to do
+
 2006-08-14 05:13  ivan
 
        * FS/FS/cust_main.pm, httemplate/edit/cust_main.cgi,
          rt/html/Elements/FreesideNewCust,
          rt/html/Elements/FreesideSearch,
          rt/html/Elements/FreesideSvcSearch, rt/html/Elements/PageLayout,
-         rt/html/Elements/SimpleSearch, rt/html/Elements/Tabs: sprinkle
-         some magic ajax fairy dust on referring customer SELEKTAH.
-         rewind!  make smart search smarter, re-layout the top search bars
-         and add an invoice one
+         rt/html/Elements/SimpleSearch, rt/html/Elements/Tabs,
+         rt/html/NoAuth/webrt.css: sprinkle some magic ajax fairy dust on
+         referring customer SELEKTAH.  rewind!  make smart search smarter,
+         re-layout the top search bars and add an invoice one
 
 2006-08-14 01:38  ivan
 
 
 2006-08-10 06:50  ivan
 
-       * FS/FS/Schema.pm, FS/FS/cust_main.pm, FS/FS/part_referral.pm,
-         httemplate/browse/part_referral.html,
+       * README.1.7.0, FS/FS/Schema.pm, FS/FS/cust_main.pm,
+         FS/FS/part_referral.pm, httemplate/browse/part_referral.html,
          httemplate/view/cust_main/misc.html: add cust_main.agent_custid
          (at least to schema and customer view, no manual editing yet)
 
 
        * FS/FS/AccessRight.pm, FS/FS/Record.pm, FS/FS/Schema.pm,
          FS/FS/access_user.pm, FS/FS/part_referral.pm,
+         httemplate/browse/part_referral.cgi,
          httemplate/browse/part_referral.html,
+         httemplate/edit/part_referral.cgi,
          httemplate/edit/part_referral.html,
+         httemplate/edit/process/part_referral.cgi,
          httemplate/edit/process/part_referral.html,
          httemplate/elements/menu.html: agent-virtualize advertising
          sources
 
 2006-08-08 23:43  jeff
 
-       * FS/FS/Schema.pm, FS/FS/Setup.pm, FS/FS/cust_bill.pm,
-         FS/FS/cust_main.pm, FS/FS/cust_pay_batch.pm,
+       * README.1.7.0, FS/FS/Schema.pm, FS/FS/Setup.pm,
+         FS/FS/cust_bill.pm, FS/FS/cust_main.pm, FS/FS/cust_pay_batch.pm,
          FS/FS/part_bill_event.pm, FS/FS/pay_batch.pm, FS/FS/payby.pm,
-         httemplate/docs/schema.html, httemplate/misc/download-batch.cgi:
-         batch refactor
+         httemplate/browse/cust_pay_batch.cgi,
+         httemplate/browse/pay_batch.cgi, httemplate/docs/schema.html,
+         httemplate/misc/download-batch.cgi: batch refactor
 
 2006-08-08 23:34  ivan
 
 
 2006-07-15 17:55  ivan
 
-       * FS/FS/Conf.pm, FS/FS/agent.pm, FS/FS/cust_bill.pm,
+       * SCHEMA_CHANGE, FS/FS/Conf.pm, FS/FS/agent.pm, FS/FS/cust_bill.pm,
          FS/FS/inventory_item.pm,
          fs_selfservice/FS-SelfService/freeside-selfservice-clientd,
-         httemplate/autohandler, httemplate/edit/cust_credit.cgi,
+         httemplate/autohandler, httemplate/browse/cust_pay_batch.cgi,
+         httemplate/edit/cust_credit.cgi,
          httemplate/elements/overlibmws.js,
          httemplate/elements/overlibmws_draggable.js,
          httemplate/elements/phonenumber.html,
 
        * FS/FS/cust_main.pm: patch to fix fuzzy searching from Ryan Gunn
 
+2006-07-05 04:23  ivan
+
+       * README.1.7.0: hint about permissions and users
+
 2006-07-04 05:01  ivan
 
        * FS/: bin/freeside-addgroup, bin/freeside-adduser, MANIFEST:
 
 2006-06-19 04:57  ivan
 
-       * bin/mapsecrets2access_user: ACL bootstrapping/upgrade
+       * Changes.1.7.0, README.1.7.0, bin/mapsecrets2access_user: ACL
+         bootstrapping/upgrade
 
 2006-06-19 04:25  ivan
 
          httemplate/elements/tr-select-cust-fields.html,
          httemplate/elements/tr-select-cust_pkg-status.html,
          httemplate/graph/cust_bill_pkg.cgi,
+         httemplate/search/cust_pkg_report.cgi,
          httemplate/search/report_cust_pkg.html,
          httemplate/view/cust_main/contacts.html: add ability to select
          specific package defs. and package status to package report for
 
        * httemplate/elements/menu.html: fix link to prepaid card setup
 
+2006-06-06 04:16  ivan
+
+       * rt/html/NoAuth/webrt.css: whew, this can go back
+
+2006-06-06 04:08  ivan
+
+       * rt/html/NoAuth/webrt.css: yay this should finally fix the weird
+         black navigation links; hide the Mason stuff from browsers when
+         it doesn't get processed for some reason
+
+2006-06-06 03:57  ivan
+
+       * rt/html/NoAuth/webrt.css: yet another attempt to fix weird black
+         RT navigation links
+
+2006-06-06 03:54  ivan
+
+       * rt/html/NoAuth/webrt.css: another attempt to fix weird black RT
+         navigation links
+
+2006-06-06 03:46  ivan
+
+       * rt/html/NoAuth/webrt.css: attempt to fix weird black RT
+         navigation links
+
 2006-06-06 03:30  ivan
 
        * FS/FS/cdr.pm: fix unmatched =back somehow futzing things up with
 
 2006-06-02 06:20  ivan
 
-       * httemplate/elements/header.html, rt/FREESIDE_MODIFIED,
+       * httemplate/elements/header.html,
+         httemplate/search/svc_Smart.html, rt/FREESIDE_MODIFIED,
          rt/html/Elements/FreesideSvcSearch, rt/html/Elements/PageLayout,
          rt/html/Elements/Tabs: add a service search
 
 
        * FS/MANIFEST: removing duplicate entries
 
+2006-05-23 08:54  ivan
+
+       * README.1.7.0: adding batch upgrade instructions to 1.7.0
+         instructions too
+
 2006-05-22 13:38  ivan
 
        * rt/html/Elements/FreesideNewCust: missing > tag on INPUT
 
        * FS/FS/cust_main.pm: better error message for banned cards
 
+2006-05-22 11:05  ivan
+
+       * Changes.1.5.8: justification
+
 2006-05-21 19:06  ivan
 
        * Makefile: docs are going in the wiki Real Soon Now anyway
 
+2006-05-21 19:04  ivan
+
+       * Changes.1.5.8: 1.5.8!
+
 2006-05-21 17:50  ivan
 
        * Makefile: 1.7.0?  why not?
 
 2006-05-20 13:06  jeff
 
-       * FS/FS.pm, FS/MANIFEST, FS/FS/Schema.pm, FS/FS/cust_bill.pm,
-         FS/FS/cust_pay_batch.pm, FS/FS/pay_batch.pm, FS/t/pay_batch.t,
-         htetc/handler.pl, httemplate/docs/schema.html,
+       * README.1.5.7.lastbit, README.1.5.8, FS/FS.pm, FS/MANIFEST,
+         FS/FS/Schema.pm, FS/FS/cust_bill.pm, FS/FS/cust_pay_batch.pm,
+         FS/FS/pay_batch.pm, FS/t/pay_batch.t, htetc/handler.pl,
+         httemplate/browse/cust_pay_batch.cgi,
+         httemplate/docs/schema.html, httemplate/docs/upgrade10.html,
          httemplate/misc/download-batch.cgi: first stab at BoM download
 
 2006-05-15 06:57  ivan
 
 2006-05-15 04:05  ivan
 
-       * httemplate/elements/freeside.css,
+       * rt/html/NoAuth/webrt.css, httemplate/elements/freeside.css,
          httemplate/elements/header.html, httemplate/elements/xmenu.css,
          httemplate/search/cust_main.cgi, rt/FREESIDE_MODIFIED,
          rt/html/Elements/FreesideNewCust,
 
 2006-05-14 09:47  ivan
 
-       * CREDITS, htetc/handler.pl, httemplate/autohandler,
+       * CREDITS, Changes.1.7.0, htetc/handler.pl, httemplate/autohandler,
          httemplate/index.html, httemplate/browse/access_group.html,
          httemplate/browse/access_user.html,
          httemplate/browse/agent_type.cgi,
          httemplate/edit/cust_credit.cgi,
          httemplate/edit/cust_credit_bill.cgi,
          httemplate/edit/cust_main.cgi, httemplate/edit/cust_pkg.cgi,
+         httemplate/edit/part_referral.cgi,
          httemplate/edit/part_virtual_field.cgi,
          httemplate/edit/svc_domain.cgi,
          httemplate/edit/elements/edit.html,
          httemplate/elements/tr-select-access_group.html,
          httemplate/elements/xmenu.css, httemplate/elements/xmenu.js,
          httemplate/misc/batch-cust_pay.html, httemplate/misc/payment.cgi,
+         httemplate/search/cust_bill.cgi,
          httemplate/search/cust_main-otaker.cgi,
-         httemplate/search/cust_main.cgi,
+         httemplate/search/cust_main-payinfo.html,
+         httemplate/search/cust_main-quickpay.html,
+         httemplate/search/cust_main.cgi, httemplate/search/cust_pay.html,
+         httemplate/search/cust_pkg_report.cgi,
          httemplate/search/report_cust_bill.html,
          httemplate/search/report_cust_credit.html,
          httemplate/search/report_cust_pay.html,
          httemplate/search/report_prepaid_income.html,
          httemplate/search/report_tax.html,
          httemplate/search/sqlradius.html,
+         httemplate/search/svc_acct.html,
          httemplate/search/svc_domain.cgi,
+         httemplate/search/svc_domain.html,
          httemplate/search/svc_external.cgi, FS/MANIFEST,
          FS/FS/AccessRight.pm, FS/FS/CGI.pm, FS/FS/Schema.pm,
          FS/FS/access_group.pm, FS/FS/access_groupagent.pm,
          FS/FS/access_user_pref.pm, FS/FS/access_usergroup.pm,
          FS/FS/agent_type.pm, FS/FS/cust_bill.pm, FS/FS/m2m_Common.pm,
          FS/FS/payby.pm, FS/FS/svc_domain.pm, FS/FS/UI/Web.pm,
-         FS/bin/freeside-addoutsourceuser, FS/t/AccessRight.t,
-         FS/t/access_group.t, FS/t/access_groupagent.t,
-         FS/t/access_right.t, FS/t/access_user.t, FS/t/access_user_pref.t,
+         FS/FS/part_pkg/billoneday.pm, FS/bin/freeside-addoutsourceuser,
+         FS/t/AccessRight.t, FS/t/access_group.t,
+         FS/t/access_groupagent.t, FS/t/access_right.t,
+         FS/t/access_user.t, FS/t/access_user_pref.t,
          FS/t/access_usergroup.t, httemplate/view/cust_main/packages.html,
          httemplate/view/cust_main/payment_history.html: first part of ACL
          and re-skinning work and some other small stuff
        * httemplate/search/report_receivables.cgi: Pg 8.1 fix was
          incorrect and broke things, this should actually work
 
+2006-05-08 04:48  ivan
+
+       * README.1.5.8, README.1.7.0: suggest "make clean" on upgrade -
+         something is not quite right with perl Makefile hoohaw
+
 2006-05-08 04:28  ivan
 
        * FS/FS/Conf.pm, FS/FS/cust_main.pm,
 2006-05-08 03:01  ivan
 
        * FS/FS/Report/Table/Monthly.pm, httemplate/index.html,
+         httemplate/graph/cust_bill_pkg-graph.cgi,
          httemplate/graph/cust_bill_pkg.cgi,
          httemplate/graph/elements/monthly.html,
          httemplate/search/cust_bill_pkg.cgi: sales report per agent and
 
 2006-05-07 13:27  ivan
 
-       * htetc/handler.pl, httemplate/elements/select-month_year.html,
+       * README.1.7.0, htetc/handler.pl, httemplate/docs/upgrade10.html,
+         httemplate/elements/select-month_year.html,
          httemplate/elements/select-pkg_class.html,
          httemplate/elements/select-table.html,
          httemplate/elements/tr-select-from_to.html,
          httemplate/elements/tr-select-pkg_class.html,
+         httemplate/graph/cust_bill_pkg-graph.cgi,
          httemplate/graph/cust_bill_pkg.cgi,
+         httemplate/graph/money_time-graph.cgi,
          httemplate/graph/money_time.cgi,
          httemplate/graph/report_cust_bill_pkg.html,
          httemplate/graph/report_money_time.html,
        * httemplate/: index.html, search/report_receivables.html: add an
          agent pre-selection page to receivables report
 
+2006-05-02 06:29  ivan
+
+       * SCHEMA_CHANGE: need to install the new Schema.pm before you can
+         autogenerate off it
+
 2006-05-02 04:59  ivan
 
        * httemplate/index.html, FS/FS/Report/Table/Monthly.pm,
+         httemplate/graph/money_time-graph.cgi,
          httemplate/graph/money_time.cgi,
          httemplate/graph/report_money_time.html: add a "pre-report" page
          to this report/graph as requested by lewis/wtxs, also add 12mo
 
 2006-04-21 17:58  ivan
 
-       * httemplate/browse/inventory_class.html,
+       * httemplate/browse/generic.cgi,
+         httemplate/browse/inventory_class.html,
          httemplate/browse/part_pkg.cgi, httemplate/browse/pkg_class.html,
          httemplate/browse/rate.cgi,
          httemplate/browse/elements/browse.html, htetc/handler.pl,
          httemplate/elements/select-pkg_class.html,
          httemplate/elements/select-table.html,
          httemplate/elements/tr-select-pkg_class.html,
-         httemplate/search/cust_pkg.cgi, FS/FS/part_pkg.pm,
+         httemplate/search/cust_pkg.cgi,
+         httemplate/search/inventory_class.html, FS/FS/part_pkg.pm,
          httemplate/search/elements/search.html: start of package class
          web UI (add/edit package classes, package class selection in
          package def edit)
 
 2006-04-21 05:45  ivan
 
-       * httemplate/: index.html, misc/queue.cgi, search/queue.html:
-         s(browse/queue.cgi)(search/queue.html)
+       * httemplate/: index.html, browse/queue.cgi, misc/queue.cgi,
+         search/queue.html: s(browse/queue.cgi)(search/queue.html)
 
 2006-04-18 23:37  ivan
 
        * FS/FS/cust_main.pm: DOH!  perlvar: not counting patterns matched
          in nested blocks that have been exited already.
 
+2006-04-18 12:33  ivan
+
+       * httemplate/docs/install.html: add JSON to initial install
+         instructions
+
 2006-04-15 06:32  ivan
 
        * httemplate/graph/money_time.cgi: REALLY correct the period for
 
        * htetc/handler.pl, FS/FS/Misc.pm,
          httemplate/edit/cust_main/contact.html,
+         httemplate/edit/cust_main/select-country.html,
+         httemplate/edit/cust_main/select-state.html,
          httemplate/misc/states.cgi,
          httemplate/view/cust_main/contacts.html: have the UI use full
          country names, and state names outside the US...
 
 2006-03-30 06:22  ivan
 
-       * FS/bin/freeside-upgrade: move all the schema-updating magic into
-         DBIx::DBSchema
+       * README.1.7.0, FS/bin/freeside-upgrade: move all the
+         schema-updating magic into DBIx::DBSchema
 
 2006-03-24 18:23  ivan
 
 
 2006-03-23 04:00  lsc
 
-       * FS/FS/part_pkg/: prorate.pm, subscription.pm: for subscription.pm
-         and prorate.pm:
+       * FS/FS/part_pkg/: billoneday.pm, prorate.pm, subscription.pm: for
+         subscription.pm and prorate.pm:
 
          -modify the subscription and prorate price plans
          (FS/FS/part_pkg/subscription.pm and prorate.pm) to have a
 
 2006-03-20 11:13  ivan
 
-       * FS/FS/Conf.pm, FS/FS/Schema.pm, FS/FS/cdr.pm, FS/FS/cust_main.pm,
+       * FS/FS/Conf.pm, FS/FS/Schema.pm, FS/FS/cdr.pm,
+         FS/FS/cdr_upstream_rate.pm, FS/FS/cust_main.pm,
          FS/FS/cust_svc.pm, FS/FS/rate_detail.pm, FS/FS/svc_acct.pm,
          FS/FS/part_pkg/voip_cdr.pm, httemplate/edit/part_pkg.cgi,
-         FS/MANIFEST, bin/cdr_upstream_rate.import,
-         httemplate/edit/rate.cgi, httemplate/edit/cust_main/billing.html,
+         FS/MANIFEST, FS/t/cdr_upstream_rate.t,
+         bin/cdr_upstream_rate.import, httemplate/edit/rate.cgi,
+         httemplate/edit/cust_main/billing.html,
          httemplate/search/cdr.html, httemplate/search/report_cdr.html,
          httemplate/view/cust_main/billing.html: add price plan to bill on
          internal or external CDRs directly, add option to export CDRs to
        * FS/FS/inventory_item.pm,
          httemplate/misc/inventory_item-import.html,
          httemplate/misc/process/inventory_item-import.html,
+         httemplate/search/inventory_class.html,
          httemplate/search/inventory_item.html:  Add an option to the web
          interface to batch upload new entries to the
          inventory_item table.
 
        * FS/MANIFEST, FS/FS/Schema.pm, FS/FS/inventory_class.pm,
          FS/FS/inventory_item.pm, FS/t/inventory_class.t,
-         FS/t/inventory_item.t, httemplate/search/inventory_item.html,
-         bin/generate-table-module, htetc/handler.pl,
-         httemplate/edit/inventory_class.html,
+         FS/t/inventory_item.t, httemplate/search/inventory_class.html,
+         httemplate/search/inventory_item.html, bin/generate-table-module,
+         htetc/handler.pl, httemplate/edit/inventory_class.html,
          httemplate/edit/elements/edit.html,
          httemplate/edit/process/inventory_class.html,
          httemplate/edit/process/elements/process.html,
 
 2006-03-03 07:02  ivan
 
-       * FS/FS/Report/Table/Monthly.pm, httemplate/graph/money_time.cgi:
-         agent-specific sales/credit/receipts summary
+       * FS/FS/Report/Table/Monthly.pm,
+         httemplate/graph/money_time-graph.cgi,
+         httemplate/graph/money_time.cgi: agent-specific
+         sales/credit/receipts summary
 
 2006-02-28 11:34  ivan
 
 
        * FS/FS/Schema.pm, FS/FS/cdr.pm, FS/FS/cdr_calltype.pm,
          FS/FS/cdr_carrier.pm, FS/FS/cdr_type.pm, FS/FS/cust_main.pm,
-         FS/MANIFEST, FS/FS/part_pkg/voip_sqlradacct.pm, FS/t/cdr.t,
+         README.1.7.0, README.2.0.0, FS/MANIFEST,
+         FS/FS/part_pkg/voip_sqlradacct.pm, FS/t/cdr.t,
          FS/t/cdr_calltype.t, FS/t/cdr_carrier.t, FS/t/cdr_type.t,
          FS/t/part_pkg-voip_cdr.t, htetc/handler.pl,
          httemplate/misc/cdr-import.html,
          httemplate/search/cdr.html, httemplate/search/report_cdr.html,
          bin/cdr_calltype.import: CDR schema and class
 
+2006-02-17 20:32  ivan
+
+       * htetc/global.asa, httemplate/docs/install.html: Mason it is
+
 2006-02-17 18:11  ivan
 
        * FS/FS/: cust_tax_exempt_pkg.pm, domain_record.pm, msgcat.pm,
 
 2006-02-16 13:43  ivan
 
-       * FS/FS/Setup.pm, FS/bin/freeside-setup,
-         httemplate/docs/admin.html: automate more of the initial data
-         adding...
+       * FS/FS/Setup.pm, FS/bin/freeside-setup, bin/populate-msgcat,
+         httemplate/docs/admin.html, httemplate/docs/install.html:
+         automate more of the initial data adding...
 
 2006-02-08 23:18  ivan
 
        * FS/bin/freeside-selfservice-server: don't leave ssh zombies
          around either
 
+2006-02-07 19:50  ivan
+
+       * httemplate/docs/: upgrade7.html, upgrade8.html: remove ancient
+         upgrade instructions
+
 2006-02-07 19:49  ivan
 
-       * httemplate/docs/index.html: slightly html-ize the 1.5.8 upgrade
-         instructions
+       * httemplate/docs/: upgrade10.html, index.html: slightly html-ize
+         the 1.5.8 upgrade instructions
 
 2006-02-07 18:26  ivan
 
 2006-01-30 20:26  ivan
 
        * httemplate/: browse/addr_block.cgi, browse/agent.cgi,
-         browse/agent_type.cgi, browse/part_bill_event.cgi,
-         browse/part_export.cgi, browse/part_pkg.cgi, browse/part_svc.cgi,
-         browse/part_virtual_field.cgi, browse/payment_gateway.html,
-         browse/rate.cgi, browse/router.cgi, browse/svc_acct_pop.cgi,
+         browse/agent_type.cgi, browse/cust_pay_batch.cgi,
+         browse/part_bill_event.cgi, browse/part_export.cgi,
+         browse/part_pkg.cgi, browse/part_referral.cgi,
+         browse/part_svc.cgi, browse/part_virtual_field.cgi,
+         browse/payment_gateway.html, browse/queue.cgi, browse/rate.cgi,
+         browse/router.cgi, browse/svc_acct_pop.cgi,
          config/config-view.cgi, config/config.cgi,
          edit/REAL_cust_pkg.cgi, edit/agent.cgi,
          edit/agent_payment_gateway.html, edit/agent_type.cgi,
          edit/svc_forward.cgi, edit/process/prepay_credit.cgi,
          edit/process/reg_code.cgi, misc/batch-cust_pay.html,
          misc/cust_main-import.cgi, misc/cust_main-import_charges.cgi,
-         misc/link.cgi, misc/meta-import.cgi, misc/upload-batch.cgi,
-         misc/whois.cgi, misc/process/cust_main-import.cgi,
+         misc/expire_pkg.cgi, misc/link.cgi, misc/meta-import.cgi,
+         misc/upload-batch.cgi, misc/whois.cgi,
+         misc/process/cust_main-import.cgi,
          misc/process/cust_main-import_charges.cgi,
          misc/process/meta-import.cgi, search/report_prepaid_income.cgi,
          search/report_tax.cgi, search/svc_external.cgi,
 
 2006-01-25 04:34  ivan
 
-       * FS/: FS/Record.pm, FS/Schema.pm, FS/cust_bill.pm,
-         FS/cust_main.pm, FS/cust_tax_exempt.pm,
-         FS/cust_tax_exempt_pkg.pm, FS/h_cust_bill.pm,
-         FS/h_cust_tax_exempt.pm, t/cust_tax_exempt_pkg.t,
-         t/h_cust_bill.t, t/h_cust_tax_exempt.t, MANIFEST: change
-         texas-style tax exemptions to be against a specific line item
-         rather than just general per-customer, for later tracking and tax
-         reporting.  fix 1969/1970 exemptions for one-off charges
+       * FS/FS/Record.pm, FS/FS/Schema.pm, FS/FS/cust_bill.pm,
+         FS/FS/cust_main.pm, FS/FS/cust_tax_exempt.pm,
+         FS/FS/cust_tax_exempt_pkg.pm, FS/FS/h_cust_bill.pm,
+         FS/FS/h_cust_tax_exempt.pm, FS/t/cust_tax_exempt_pkg.t,
+         FS/t/h_cust_bill.t, FS/t/h_cust_tax_exempt.t, README.2.0.0,
+         FS/MANIFEST: change texas-style tax exemptions to be against a
+         specific line item rather than just general per-customer, for
+         later tracking and tax reporting.  fix 1969/1970 exemptions for
+         one-off charges
+
+2006-01-05 01:34  ivan
+
+       * httemplate/docs/upgrade10.html: my last 1.4 -> 1.5 upgrade...
 
 2006-01-04 18:03  ivan
 
        * FS/FS/Schema.pm: remove redundant indices on cust_main ship_
          columns
 
+2006-01-03 00:45  ivan
+
+       * bin/billco-upload: agentnums 1-3
+
 2005-12-29 18:41  rsiddall
 
        * FS/FS/Conf.pm, FS/FS/ConfItem.pm, FS/FS/cust_pkg.pm,
 
 2005-12-24 19:00  ivan
 
-       * FS/FS/Schema.pm: update indices for better tax report performance
+       * README.1.5.8, FS/FS/Schema.pm: update indices for better tax
+         report performance
 
 2005-12-24 18:31  ivan
 
          causing " "my" variable $t masks earlier declaration in same
          scope" errors
 
+2005-12-21 20:02  ivan
+
+       * Changes.1.5.8: more accurate description of tax report changes
+
 2005-12-21 20:01  ivan
 
        * httemplate/search/cust_bill_event.html,
          httemplate/search/cust_bill_pkg.cgi,
+         httemplate/search/cust_pkg_report.cgi,
          httemplate/search/report_cust_bill.html,
          httemplate/search/report_cust_credit.html,
          httemplate/search/report_cust_pay.html,
 
 2005-12-18 20:18  ivan
 
-       * FS/FS/part_pkg/sqlradacct_hour.pm: add maximum "caps" to RADIUS
-         usage charges
+       * Changes.1.5.8, FS/FS/part_pkg/sqlradacct_hour.pm: add maximum
+         "caps" to RADIUS usage charges
 
 2005-12-16 14:47  ivan
 
        * FS/bin/freeside-upgrade: force a dbdef reload.  no wonder this
          had to be run multiple times before
 
+2005-12-02 22:49  ivan
+
+       * README.1.5.8, httemplate/docs/install.html,
+         httemplate/docs/upgrade10.html: add Term::ReadKey to install &
+         upgrade docs and README.1.5.8
+
+2005-12-01 18:30  ivan
+
+       * httemplate/docs/upgrade10.html: and Net::Whois::Raw
+
+2005-12-01 17:52  ivan
+
+       * README.1.5.8, httemplate/docs/upgrade10.html: note DBIx::DBSchema
+         0.29 is required for Pg 7.2.x and earlier
+
+2005-12-01 17:22  ivan
+
+       * httemplate/docs/upgrade10.html: apache instructions already up
+         top
+
 2005-12-01 11:17  ivan
 
        * httemplate/edit/agent_type.cgi: list disabled packages on agent
          shouldn't apply to RADIUS groups, this is messing up unrelated
          RADIUS exports
 
+2005-11-30 09:48  ivan
+
+       * README.1.5.8: later versions are okay too
+
 2005-11-28 09:16  ivan
 
        * FS/FS/cust_main.pm: turn off debugging
        * FS/FS/part_export/radiator.pm: update radiator export to deal
          with prepaid and some other random stuff
 
+2005-11-22 01:13  ivan
+
+       * httemplate/docs/install.html: correct common misconception RIGHT
+         THERE in the docs
+
 2005-11-21 07:24  ivan
 
        * FS/FS/: export_svc.pm, part_svc.pm, rate.pm: when editing exports
        * FS/FS/TicketSystem/RT_External.pm: update custom priorioty field
          BS for RT 3.4.4
 
+2005-11-17 23:05  ivan
+
+       * README.1.5.8: slightly more info in 1.5.8 upgrade instructions
+
 2005-11-17 19:48  ivan
 
        * FS/FS/cust_main.pm: allow expired cards to remain on file; only
 
 2005-11-17 04:27  ivan
 
-       * FS/FS/Schema.pm: add cust_pkg2 index on cust_pkg.pkgpart
+       * README.1.5.8, FS/FS/Schema.pm: add cust_pkg2 index on
+         cust_pkg.pkgpart
 
 2005-11-17 03:15  ivan
 
 2005-11-16 05:14  ivan
 
        * FS/FS/part_svc.pm, httemplate/index.html,
-         httemplate/browse/part_svc.cgi, FS/FS/UI/Web.pm,
+         httemplate/browse/part_svc.cgi, Changes.1.5.8, FS/FS/UI/Web.pm,
          httemplate/edit/bulk-cust_svc.html,
          httemplate/edit/process/bulk-cust_svc.cgi: bulk svcpart change
 
+2005-11-12 04:19  ivan
+
+       * README.1.5.8: one last bit for 1.5.7->1.5.8 RT upgrade
+         instructions
+
 2005-11-11 17:24  ivan
 
        * httemplate/view/cust_main/tickets.html: huh seem to have
          unaudited domain deletion, add record being deleted to record
          deletion popup
 
+2005-11-09 12:48  ivan
+
+       * httemplate/docs/install.html: closing paren
+
 2005-11-07 18:16  ivan
 
        * httemplate/docs/admin.html: bah
 
        * FS/FS/cust_bill.pm: only send to specific destinations, oops!
 
+2005-10-31 21:21  ivan
+
+       * bin/billco-upload: do the zip
+
 2005-10-31 21:14  ivan
 
        * httemplate/edit/part_bill_event.cgi: add option for spool_csv
          events to apply only to a specific destination type (i.e. postal
          only)
 
+2005-10-31 19:16  ivan
+
+       * bin/billco-upload: good nuff for 11/1
+
 2005-10-31 19:15  ivan
 
        * httemplate/edit/part_bill_event.cgi, FS/FS/cust_bill.pm: add
          spool one giant (pair of) CSV files in addition to FTPing them
          individually
 
+2005-10-28 10:10  ivan
+
+       * bin/billco-upload: beginning of quick billco zip & upload tool
+
 2005-10-28 04:56  ivan
 
        * httemplate/search/cust_bill_event.cgi: don't show 'N/A'
 
 2005-10-24 04:56  ivan
 
-       * FS/FS/Schema.pm, httemplate/edit/process/rate.cgi,
+       * README.1.5.8, FS/FS/Schema.pm, httemplate/edit/process/rate.cgi,
          httemplate/elements/progress-init.html,
          httemplate/elements/xmlhttp.html: fix rate plan editing with new
          xmlhttp progressbar - use POST instead of GET.  also optimize SQL
        * FS/FS/Conf.pm: make sure config still works if no ticket system
          is configured...
 
-2005-10-15 05:58  ivan
-
-       * bin/backup-dvd: adding quick backup-to-dvd script
-
-2005-10-15 04:29  ivan
-
-       * FS/FS/Conf.pm, FS/FS/Schema.pm, FS/FS/TicketSystem.pm,
-         FS/FS/agent.pm, FS/FS/TicketSystem/RT_External.pm,
-         FS/FS/TicketSystem/RT_Internal.pm, httemplate/browse/agent.cgi,
-         httemplate/edit/agent.cgi, httemplate/config/config-view.cgi,
-         httemplate/config/config.cgi: agent option to select RT queue
-
-2005-10-15 04:13  ivan
-
-       * rt/html/Elements/Header: land RT 3.4.4 on HEAD
-
-2005-10-15 02:33  ivan
-
-       * rt/: etc/RT_SiteConfig.pm, html/Elements/Footer,
-         html/Elements/Header, html/Elements/Menu,
-         html/Elements/PageLayout, html/Elements/SimpleSearch,
-         html/Elements/Tabs, html/Elements/CollectionAsTable/Row,
-         html/Ticket/Elements/ShowSummary, html/Ticket/Elements/Tabs,
-         sbin/rt-setup-database.in: landing rt 3.4.4 on HEAD
-
-2005-10-15 02:09  ivan
-
-       * rt/: UPGRADING, configure, Makefile.in, README, configure.ac,
-         Changelog, aclocal.m4, docs/rt3-schema-relationships.dot,
-         docs/design_docs/realflow.txt, m4/rt_layout.m4,
-         docs/design_docs/3.3-schema-redesign.txt,
-         docs/design_docs/cvs_integration,
-         docs/design_docs/link-definitions.txt, docs/design_docs/rt-mvc,
-         sbin/extract-message-catalog, sbin/extract_pod_tests,
-         sbin/factory, sbin/license_tag, sbin/regression_harness,
-         sbin/rt-dump-database.in, sbin/rt-test-dependencies.in,
-         html/autohandler, html/index.html, html/l,
-         html/Ticket/History.html, html/Ticket/Modify.html,
-         html/Ticket/ModifyAll.html, html/Ticket/ModifyDates.html,
-         html/Ticket/ModifyPeople.html, html/Ticket/Update.html,
-         html/Tools/MyDay.html, html/Tools/Offline.html,
-         html/Tools/Elements/Tabs, html/Ticket/ModifyLinks.html,
-         html/Ticket/ShowEmailRecord.html,
-         html/Ticket/Attachment/dhandler,
-         html/Ticket/Elements/AddWatchers,
-         html/Ticket/Elements/EditCustomField,
-         html/Ticket/Elements/EditWatchers,
-         html/Ticket/Elements/LoadTextAttachments,
-         html/Ticket/Elements/ShowDependencies,
-         html/Ticket/Elements/ShowMessageHeaders,
-         html/Ticket/Elements/ShowPeople,
-         html/Ticket/Elements/ShowTransaction,
-         html/Ticket/Elements/BulkLinks,
-         html/Ticket/Elements/EditCustomFields,
-         html/Ticket/Elements/EditDates, html/Ticket/Elements/EditPeople,
-         html/Ticket/Elements/PreviewScrips,
-         html/Ticket/Elements/ShowBasics,
-         html/Ticket/Elements/ShowCustomFields,
-         html/Ticket/Elements/ShowDates, html/Ticket/Elements/ShowHistory,
-         html/Ticket/Elements/ShowMembers,
-         html/Ticket/Elements/ShowMessageStanza,
-         html/Ticket/Elements/ShowRequestor,
-         html/Ticket/Elements/ShowUserEntry, html/Search/Build.html,
-         html/Search/Edit.html, html/Search/Results.html,
-         html/Search/Results.rdf, html/Search/Results.tsv,
-         html/Ticket/Elements/EditBasics,
-         html/Ticket/Elements/FindAttachments,
-         html/Ticket/Elements/ShowAttachments,
-         html/Ticket/Elements/ShowGroupMembers,
-         html/Search/Elements/BuildFormatString,
-         html/Search/Elements/DisplayOptions,
-         html/Search/Elements/EditFormat,
-         html/Search/Elements/EditSearches,
-         html/Search/Elements/NewListActions,
-         html/Search/Elements/PickCFs, html/Search/Elements/SearchPrivacy,
-         html/Search/Elements/SelectAndOr,
-         html/Search/Elements/SelectGroup,
-         html/Search/Elements/SelectLinks,
-         html/Search/Elements/SelectSearchObject,
-         html/Search/Elements/SelectSearchesForObjects,
-         html/Admin/autohandler, html/Admin/index.html,
-         html/Approvals/Display.html, html/Approvals/index.html,
-         html/Approvals/Elements/Approve,
-         html/Approvals/Elements/PendingMyApproval,
-         html/Approvals/Elements/ShowDependency,
-         html/Approvals/Elements/Tabs,
+2005-10-15 05:58  ivan
+
+       * bin/backup-dvd: adding quick backup-to-dvd script
+
+2005-10-15 04:29  ivan
+
+       * FS/FS/Conf.pm, FS/FS/Schema.pm, FS/FS/TicketSystem.pm,
+         FS/FS/agent.pm, FS/FS/TicketSystem/RT_External.pm,
+         FS/FS/TicketSystem/RT_Internal.pm, httemplate/browse/agent.cgi,
+         httemplate/edit/agent.cgi, httemplate/config/config-view.cgi,
+         httemplate/config/config.cgi: agent option to select RT queue
+
+2005-10-15 04:25  ivan
+
+       * README.1.5.8: upgrade instructions for new RT verison
+
+2005-10-15 04:13  ivan
+
+       * README.1.5.8, rt/html/Elements/Header, rt/html/NoAuth/webrt.css:
+         land RT 3.4.4 on HEAD
+
+2005-10-15 02:33  ivan
+
+       * rt/: etc/RT_SiteConfig.pm, html/Admin/Global/CustomField.html,
+         html/Admin/Global/CustomFields.html, html/Elements/Footer,
+         html/Elements/Header, html/Elements/Menu,
+         html/Elements/PageLayout, html/Elements/SimpleSearch,
+         html/Elements/Tabs, html/Elements/CollectionAsTable/Row,
+         html/NoAuth/webrt.css, html/NoAuth/images/back_home.gif,
+         html/NoAuth/images/head_requestracker.gif,
+         html/NoAuth/images/rt.jpg, html/NoAuth/images/spacer.gif,
+         html/NoAuth/images/squares_blue.gif,
+         html/Ticket/Elements/ShowSummary, html/Ticket/Elements/Tabs,
+         lib/RT/TicketCustomFieldValue.pm,
+         lib/RT/TicketCustomFieldValue_Overlay.pm,
+         lib/RT/TicketCustomFieldValues.pm,
+         lib/RT/TicketCustomFieldValues_Overlay.pm,
+         lib/RT/I18N/en_malkovich.po, lib/t/00smoke.t.in,
+         lib/t/01harness.t.in, lib/t/02regression.t.in, lib/t/03web.pl.in,
+         lib/t/04_send_email.pl.in, lib/t/05cronsupport.pl.in,
+         lib/t/regression/00placeholder, sbin/rt-setup-database.in:
+         landing rt 3.4.4 on HEAD
+
+2005-10-15 02:09  ivan
+
+       * rt/: docs/design_docs/realflow.txt,
+         docs/design_docs/3.3-schema-redesign.txt,
+         docs/design_docs/rt-mvc, sbin/rt-dump-database.in,
+         html/Search/Elements/SelectGroup, html/Admin/autohandler,
          html/Download/CustomFieldValue/dhandler,
          html/Download/Tabular/dhandler, html/Search/Elements/EditQuery,
-         html/Search/Elements/PickBasics,
-         html/Search/Elements/PickCriteria,
-         html/Search/Elements/SelectPersonType,
          html/Admin/CustomFields/GroupRights.html,
-         html/Admin/Global/GroupRights.html, html/Admin/Global/Scrip.html,
-         html/Admin/Global/Scrips.html, html/Admin/Global/Template.html,
-         html/Admin/Global/Templates.html,
-         html/Admin/Global/UserRights.html, html/Admin/Global/index.html,
          html/Admin/Global/CustomFields/Groups.html,
          html/Admin/Global/CustomFields/Queue-Tickets.html,
          html/Admin/Global/CustomFields/Queue-Transactions.html,
          html/Admin/Global/CustomFields/Users.html,
          html/Admin/Global/CustomFields/index.html,
          html/Admin/Groups/CustomFields.html,
-         html/Admin/Groups/GroupRights.html,
-         html/Admin/Groups/History.html, html/Admin/Groups/Members.html,
-         html/Admin/Groups/Modify.html, html/Admin/Groups/UserRights.html,
-         html/Admin/Groups/index.html,
-         html/Admin/Tools/Configuration.html, html/Admin/Tools/index.html,
+         html/Admin/Groups/History.html,
          html/Admin/CustomFields/Modify.html,
          html/Admin/CustomFields/Objects.html,
          html/Admin/CustomFields/UserRights.html,
          html/Admin/CustomFields/index.html,
-         html/Admin/Queues/CustomFields.html,
-         html/Admin/Queues/GroupRights.html,
          html/Admin/Users/CustomFields.html,
          html/Admin/Users/History.html, html/Admin/Users/Memberships.html,
-         html/Admin/Users/index.html, html/Admin/Queues/CustomField.html,
-         html/Admin/Queues/Scrip.html, html/Admin/Queues/Templates.html,
-         html/Admin/Queues/UserRights.html,
          html/Admin/Elements/CustomFieldTabs,
-         html/Admin/Elements/EditCustomField,
-         html/Admin/Elements/EditCustomFieldValues,
-         html/Admin/Elements/EditScrip, html/Admin/Elements/EditTemplates,
-         html/Admin/Elements/EditUserComments, html/Admin/Elements/Header,
-         html/Admin/Elements/ListGlobalScrips,
-         html/Admin/Elements/QueueTabs,
          html/Admin/Elements/SelectCustomFieldLookupType,
-         html/Admin/Elements/SelectCustomFieldType,
-         html/Admin/Elements/SelectModifyGroup,
-         html/Admin/Elements/SelectModifyUser,
-         html/Admin/Elements/SelectSingleOrMultiple,
-         html/Admin/Elements/SelectUsers, html/Admin/Elements/Tabs,
-         html/Admin/Elements/ToolTabs, html/Admin/Elements/UserTabs,
-         html/Admin/Queues/Modify.html, html/Admin/Queues/People.html,
-         html/Admin/Queues/Scrips.html, html/Admin/Queues/Template.html,
-         html/Admin/Queues/index.html,
-         html/Admin/Elements/AddCustomFieldValue,
-         html/Admin/Elements/EditCustomFields,
-         html/Admin/Elements/EditQueueWatchers,
-         html/Admin/Elements/EditScrips,
          html/Admin/Elements/GlobalCustomFieldTabs,
-         html/Admin/Elements/ModifyTemplate,
          html/Admin/Elements/ObjectCustomFields,
-         html/Admin/Elements/SelectGroups,
-         html/Admin/Elements/SelectModifyQueue,
-         html/Admin/Elements/SelectNewGroupMembers,
-         html/Admin/Elements/SelectScrip,
-         html/Admin/Elements/SelectScripCondition,
-         html/Admin/Elements/CreateUserCalled,
-         html/Admin/Elements/GroupTabs,
-         html/Admin/Elements/ListGlobalCustomFields,
          html/Admin/Elements/PickCustomFields,
          html/Admin/Elements/PickObjects,
-         html/Admin/Elements/QueueRightsForUser,
-         html/Admin/Elements/SelectRights,
-         html/Admin/Elements/SelectScripAction,
-         html/Admin/Elements/SelectStage,
-         html/Admin/Elements/SelectTemplate,
-         html/Admin/Elements/SystemTabs, html/SelfService/Closed.html,
-         html/SelfService/Create.html,
          html/SelfService/CreateTicketInQueue.html,
-         html/SelfService/Display.html, html/SelfService/Error.html,
-         html/SelfService/Prefs.html, html/SelfService/Update.html,
-         html/SelfService/index.html,
-         html/SelfService/Attachment/dhandler,
-         html/Elements/BevelBoxRaisedEnd, html/Elements/CreateTicket,
          html/Elements/EditCustomField,
-         html/Elements/EditCustomFieldImage, html/Elements/EditLinks,
-         html/Elements/Error, html/Elements/ListActions,
-         html/Elements/MyRequests, html/Elements/QueryString,
-         html/Elements/ScrubHTML, html/Elements/SelectDateType,
-         html/Elements/SelectMatch, html/Elements/SelectNewTicketQueue,
-         html/Elements/SelectSortOrder, html/Elements/SelectTicketSortBy,
-         html/Elements/SelectUsers, html/Elements/ShowLinks,
-         html/SelfService/Elements/GotoTicket,
-         html/SelfService/Elements/Header,
-         html/SelfService/Elements/MyRequests,
-         html/SelfService/Elements/Tabs,
-         html/Elements/BevelBoxRaisedStart,
+         html/Elements/EditCustomFieldImage,
          html/Elements/EditCustomFieldBinary,
-         html/Elements/EditCustomFieldSelect, html/Elements/GotoTicket,
-         html/Elements/MessageBox, html/Elements/SelectAttachmentField,
-         html/Elements/SelectGroups, html/Elements/SelectOwner,
-         html/Elements/SelectQueue, html/Elements/SelectStatus,
-         html/Elements/SelectWatcherType,
+         html/Elements/EditCustomFieldSelect,
          html/Elements/ShowCustomFieldBinary,
          html/Elements/ShowCustomFieldImage,
          html/Elements/ShowCustomFieldWikitext,
-         html/Elements/ShowCustomFields, html/Elements/ShowLink,
-         html/Elements/TitleBox, html/Elements/Callback,
-         html/Elements/Checkbox, html/Elements/EditCustomFieldFreeform,
-         html/Elements/Quicksearch, html/Elements/Refresh,
-         html/Elements/Section, html/Elements/SelectLinkType,
-         html/Elements/SelectTicketTypes,
+         html/Elements/ShowCustomFields,
+         html/Elements/EditCustomFieldFreeform,
          html/Elements/EditCustomFieldText,
-         html/Elements/EditCustomFieldWikitext, html/Elements/Login,
-         html/Elements/MyTickets, html/Elements/SelectBoolean,
-         html/Elements/SelectCustomFieldOperator,
-         html/Elements/SelectCustomFieldValue,
-         html/Elements/SelectDateRelation,
-         html/Elements/SelectEqualityOperator, html/Elements/SelectLang,
-         html/Elements/SelectResultsPerPage,
-         html/Elements/SetupSessionCookie, html/Elements/ShowMemberships,
-         html/Elements/Submit, html/Elements/TitleBoxEnd,
-         html/Elements/CollectionAsTable/Header,
-         html/Elements/CollectionAsTable/ParseFormat,
-         html/Elements/RT__Ticket/ColumnMap, html/REST/1.0/autohandler,
-         html/REST/1.0/dhandler, html/REST/1.0/logout,
-         html/REST/1.0/Forms/queue/default, html/REST/1.0/Forms/queue/ns,
-         html/REST/1.0/Forms/ticket/attachments,
-         html/REST/1.0/Forms/ticket/default,
-         html/REST/1.0/Forms/ticket/history,
-         html/REST/1.0/Forms/ticket/links,
-         html/REST/1.0/Forms/user/default, html/REST/1.0/Forms/user/ns,
-         html/REST/1.0/NoAuth/mail-gateway, html/REST/1.0/search/dhandler,
-         html/REST/1.0/search/ticket, html/REST/1.0/ticket/comment,
-         html/REST/1.0/ticket/link, html/REST/1.0/ticket/merge,
-         html/NoAuth/Logout.html, html/NoAuth/Reminder.html,
-         html/NoAuth/images/autohandler, html/User/Delegation.html,
-         html/User/Elements/DelegateRights, html/User/Elements/GroupTabs,
-         html/User/Elements/Tabs, html/User/Groups/Members.html,
-         html/User/Groups/Modify.html, html/User/Groups/index.html,
-         lib/RT.pm.in, lib/t/00smoke.t, lib/t/setup_regression.t,
+         html/Elements/EditCustomFieldWikitext,
+         html/Elements/ShowMemberships, lib/t/setup_regression.t,
          lib/t/create_data.pl, lib/t/regression/01ticket_link_searching.t,
          lib/t/regression/02basic_web.t,
          lib/t/regression/03web_compiliation_errors.t,
          lib/t/regression/06mailgateway.t, lib/t/regression/07rights.t,
          lib/t/regression/15cf_single_values_are_single.t,
          lib/t/regression/18stale_delegations_cleanup.t,
-         lib/RT/GroupMembers.pm, lib/RT/Principals.pm,
-         lib/RT/Scrips_Overlay.pm, lib/RT/Tickets.pm, lib/RT/Base.pm,
-         lib/RT/CustomField_Overlay.pm, lib/RT/Date.pm,
-         lib/RT/Queues_Overlay.pm, lib/RT/ScripConditions_Overlay.pm,
-         lib/RT/Template_Overlay.pm, lib/RT/User.pm, lib/RT/Attributes.pm,
-         lib/RT/SavedSearch.pm, lib/RT/StyleGuide.pod, lib/RT/System.pm,
-         lib/RT/Templates_Overlay.pm, lib/RT/Tickets_Overlay_SQL.pm,
-         lib/RT/ACL_Overlay.pm, lib/RT/Attachment.pm,
-         lib/RT/Attribute_Overlay.pm, lib/RT/Group.pm, lib/RT/Handle.pm,
-         lib/RT/ObjectCustomFields.pm, lib/RT/EmailParser.pm,
-         lib/RT/GroupMembers_Overlay.pm, lib/RT/I18N.pm,
-         lib/RT/Principal.pm, lib/RT/Principals_Overlay.pm,
-         lib/RT/Tickets_Overlay.pm, lib/RT/Transactions.pm,
-         lib/RT/CachedGroupMember.pm, lib/RT/CustomFieldValue.pm,
-         lib/RT/Links.pm, lib/RT/Scrip.pm, lib/RT/Attachment_Overlay.pm,
-         lib/RT/Attributes_Overlay.pm, lib/RT/CurrentUser.pm,
-         lib/RT/CustomFieldValue_Overlay.pm, lib/RT/CustomFieldValues.pm,
-         lib/RT/Group_Overlay.pm, lib/RT/ObjectCustomField.pm,
-         lib/RT/ObjectCustomFields_Overlay.pm, lib/RT/Queue.pm,
-         lib/RT/ScripActions.pm, lib/RT/Attachments.pm,
-         lib/RT/CachedGroupMember_Overlay.pm, lib/RT/Groups.pm,
-         lib/RT/Links_Overlay.pm, lib/RT/SavedSearches.pm,
-         lib/RT/ScripAction.pm, lib/RT/Scrip_Overlay.pm, lib/RT/Scrips.pm,
-         lib/RT/Transactions_Overlay.pm, lib/RT/ACE.pm,
-         lib/RT/CachedGroupMembers.pm,
-         lib/RT/CustomFieldValues_Overlay.pm, lib/RT/CustomFields.pm,
-         lib/RT/GroupMember.pm, lib/RT/Link.pm,
-         lib/RT/ObjectCustomFieldValues.pm, lib/RT/Principal_Overlay.pm,
-         lib/RT/Queue_Overlay.pm, lib/RT/Queues.pm,
-         lib/RT/ScripCondition.pm, lib/RT/ScripConditions.pm,
-         lib/RT/Transaction.pm, lib/RT/CustomField.pm,
+         lib/RT/SavedSearch.pm, lib/RT/ObjectCustomFields.pm,
+         lib/RT/CustomFieldValue_Overlay.pm, lib/RT/ObjectCustomField.pm,
+         lib/RT/ObjectCustomFields_Overlay.pm, lib/RT/SavedSearches.pm,
+         lib/RT/ObjectCustomFieldValues.pm,
          lib/RT/ObjectCustomFieldValue.pm,
          lib/RT/ObjectCustomField_Overlay.pm,
-         lib/RT/ScripActions_Overlay.pm, lib/RT/Template.pm,
-         lib/RT/Attachments_Overlay.pm, lib/RT/ScripAction_Overlay.pm,
-         lib/RT/ScripCondition_Overlay.pm, lib/RT/Ticket.pm,
-         lib/RT/ACL.pm, lib/RT/GroupMember_Overlay.pm,
-         lib/RT/ObjectCustomFieldValues_Overlay.pm, lib/RT/ACE_Overlay.pm,
-         lib/RT/Attribute.pm, lib/RT/CachedGroupMembers_Overlay.pm,
-         lib/RT/CustomFields_Overlay.pm, lib/RT/Link_Overlay.pm,
-         lib/RT/ObjectCustomFieldValue_Overlay.pm, lib/RT/Templates.pm,
-         lib/RT/URI.pm, lib/RT/Users.pm, lib/RT/I18N/en.po,
-         lib/RT/I18N/i_default.pm, lib/RT/I18N/cs.pm, lib/RT/I18N/cs.po,
-         lib/RT/I18N/pt_br.po, lib/RT/I18N/fr.po, lib/RT/I18N/es.po,
-         lib/RT/I18N/nl.po, lib/RT/I18N/pl.po, lib/RT/I18N/no.po,
-         lib/RT/I18N/it.po, lib/RT/I18N/hu.po, lib/RT/I18N/da.po,
-         lib/RT/I18N/ru.po, lib/RT/I18N/de.po, lib/RT/I18N/ja.po,
-         lib/RT/I18N/zh_tw.po, lib/RT/I18N/id.po, lib/RT/I18N/he.po,
-         lib/RT/I18N/fi.po, lib/RT/I18N/zh_cn.po, lib/RT/URI/base.pm,
-         lib/RT/URI/fsck_com_rt.pm, lib/RT/URI/t.pm,
-         lib/RT/Action/AutoOpen.pm, lib/RT/Action/Autoreply.pm,
-         lib/RT/Action/CreateTickets.pm, lib/RT/Action/Generic.pm,
-         lib/RT/Action/Notify.pm, lib/RT/Action/NotifyAsComment.pm,
-         lib/RT/Action/RecordComment.pm,
-         lib/RT/Action/RecordCorrespondence.pm,
-         lib/RT/Action/ResolveMembers.pm, lib/RT/Action/SetPriority.pm,
-         lib/RT/Action/UserDefined.pm, lib/RT/Action/EscalatePriority.pm,
-         lib/RT/Action/SendEmail.pm, lib/RT/Interface/CLI.pm,
-         lib/RT/Interface/Email.pm, lib/RT/Interface/REST.pm,
-         lib/RT/Interface/Web.pm, lib/RT/Interface/Email/Auth/GnuPG.pm,
-         lib/RT/Interface/Email/Auth/MailFrom.pm,
-         lib/RT/Interface/Email/Filter/SpamAssassin.pm,
-         lib/RT/Interface/Web/Handler.pm,
+         lib/RT/ObjectCustomFieldValues_Overlay.pm,
+         lib/RT/ObjectCustomFieldValue_Overlay.pm, lib/RT/I18N/pl.po,
+         lib/RT/I18N/id.po, lib/RT/URI/t.pm,
          lib/RT/Interface/Web/QueryBuilder.pm,
-         lib/RT/Interface/Web/Standalone.pm, bin/mason_handler.scgi.in,
-         bin/standalone_httpd.in, lib/RT/Condition/AnyTransaction.pm,
-         lib/RT/Condition/BeforeDue.pm, lib/RT/Condition/Generic.pm,
-         lib/RT/Condition/Overdue.pm, lib/RT/Condition/OwnerChange.pm,
-         lib/RT/Condition/PriorityChange.pm,
-         lib/RT/Condition/PriorityExceeds.pm,
-         lib/RT/Condition/QueueChange.pm,
-         lib/RT/Condition/StatusChange.pm,
-         lib/RT/Condition/UserDefined.pm,
+         lib/RT/Interface/Web/Standalone.pm,
          lib/RT/Interface/Web/QueryBuilder/Tree.pm,
-         lib/RT/Search/ActiveTicketsInQueue.pm, lib/RT/Search/FromSQL.pm,
-         lib/RT/Search/Generic.pm, bin/mason_handler.fcgi.in,
-         bin/mason_handler.svc.in, bin/rt-crontool.in, bin/rt.in,
-         bin/webmux.pl.in, bin/rt-mailgate.in, etc/initialdata,
-         etc/acl.mysql, etc/schema.Informix, etc/schema.SQLite,
-         etc/acl.Pg, etc/schema.mysql, etc/upgrade/3.1.0/schema.SQLite,
-         etc/upgrade/3.1.0/schema.Pg, etc/upgrade/3.3.0/acl.Informix,
-         etc/upgrade/3.3.0/acl.Oracle, etc/upgrade/3.3.0/acl.Pg,
-         etc/upgrade/3.3.0/acl.SQLite, etc/upgrade/3.3.0/acl.mysql,
-         etc/upgrade/3.3.0/content, etc/upgrade/3.3.0/schema.Oracle,
-         etc/upgrade/3.3.0/schema.Pg, etc/upgrade/3.3.0/schema.mysql,
-         etc/upgrade/3.3.11/acl.Oracle, etc/upgrade/3.3.11/acl.Pg,
-         etc/upgrade/3.3.11/acl.SQLite, etc/upgrade/3.3.11/acl.mysql,
-         etc/upgrade/3.3.11/content, etc/upgrade/3.3.11/schema.Oracle,
-         etc/upgrade/3.3.11/schema.Pg, etc/upgrade/3.3.11/schema.SQLite,
-         etc/upgrade/3.3.11/schema.mysql: import rt 3.4.4
+         etc/upgrade/3.3.0/acl.Informix, etc/upgrade/3.3.0/acl.Oracle,
+         etc/upgrade/3.3.0/acl.Pg, etc/upgrade/3.3.0/acl.SQLite,
+         etc/upgrade/3.3.0/acl.mysql, etc/upgrade/3.3.0/content,
+         etc/upgrade/3.3.0/schema.Oracle, etc/upgrade/3.3.0/schema.Pg,
+         etc/upgrade/3.3.0/schema.mysql, etc/upgrade/3.3.11/acl.Oracle,
+         etc/upgrade/3.3.11/acl.Pg, etc/upgrade/3.3.11/acl.SQLite,
+         etc/upgrade/3.3.11/acl.mysql, etc/upgrade/3.3.11/content,
+         etc/upgrade/3.3.11/schema.Oracle, etc/upgrade/3.3.11/schema.Pg,
+         etc/upgrade/3.3.11/schema.SQLite,
+         etc/upgrade/3.3.11/schema.mysql: Initial revision
 
 2005-10-13 14:16  ivan
 
 
 2005-10-10 05:20  ivan
 
-       * FS/FS/cust_pay.pm, htetc/handler.pl, httemplate/index.html,
+       * Changes.1.5.8, README.1.5.8, FS/FS/cust_pay.pm, htetc/global.asa,
+         htetc/handler.pl, httemplate/index.html,
+         httemplate/docs/upgrade10.html,
          httemplate/misc/batch-cust_pay.html,
          httemplate/misc/xmlhttp-cust_main-search.cgi,
          httemplate/misc/process/batch-cust_pay.cgi,
 2005-10-07 17:47  ivan
 
        * httemplate/: edit/part_pkg.cgi, edit/process/part_pkg.cgi,
-         edit/process/quick-charge.cgi, elements/select-taxclass.html: fix
-         tax class selection in package add/edit too
+         edit/process/quick-charge.cgi, elements/select-taxclass.html,
+         view/cust_main/quick-charge.html: fix tax class selection in
+         package add/edit too
 
 2005-10-07 16:28  ivan
 
        * conf/invoice_latex: allow more width for return address, stuff is
          wrapping
 
+2005-10-06 22:03  ivan
+
+       * README.1.5.8: need new B:CC
+
 2005-10-06 21:50  ivan
 
        * httemplate/view/cust_main/billing.html: mask out echeck account
 2005-10-06 19:25  ivan
 
        * FS/FS/Conf.pm, FS/FS/part_pkg.pm,
-         httemplate/edit/process/quick-charge.cgi: add require_taxclasses
-         config flag
+         httemplate/edit/process/quick-charge.cgi,
+         httemplate/view/cust_main/quick-charge.html: add
+         require_taxclasses config flag
 
 2005-10-06 16:09  ivan
 
          usage information displays for any usage-capable export, add
          ability to edit uid/gid
 
+2005-10-02 07:04  ivan
+
+       * httemplate/docs/install.html: fix leading % causing Mason to barf
+
 2005-10-02 00:09  ivan
 
        * Makefile, htetc/handler.pl, init.d/freeside-init: add dev make
 
 2005-09-25 01:13  ivan
 
-       * CREDITS, FS/FS/UI/Web.pm, httemplate/edit/process/part_svc.cgi,
+       * CREDITS, Changes.1.5.8, JSRS-LICENSE, README.1.5.7,
+         FS/FS/UI/Web.pm, httemplate/edit/cust_main/select-country.html,
+         httemplate/edit/cust_main/select-county.html,
+         httemplate/edit/process/part_svc.cgi,
          httemplate/edit/process/rate.cgi,
          httemplate/elements/jsrsServer.html,
          httemplate/elements/progress-init.html,
          httemplate/elements/progress-popup.html,
-         httemplate/elements/xmlhttp.html: get rid of JSRS iframe foo for
+         httemplate/elements/xmlhttp.html, httemplate/docs/install.html,
+         httemplate/docs/upgrade10.html: get rid of JSRS iframe foo for
          progress bar, use XMLHTTPRequest instead.  really should have
          done that in the first place.  JSON will wait until another
          day...
 2005-09-14 04:01  ivan
 
        * FS/t/agent_payment_gateway.t, FS/t/banned_pay.t,
-         FS/t/payment_gateway.t, FS/t/payment_gateway_option.t,
-         bin/generate-table-module: fix autogenerated simple test
+         FS/t/cancel_reason.t, FS/t/payment_gateway.t,
+         FS/t/payment_gateway_option.t, bin/generate-table-module: fix
+         autogenerated simple test
 
 2005-09-13 13:12  ivan
 
 2005-09-10 07:50  ivan
 
        * CREDITS, httemplate/edit/cust_main/contact.html,
+         httemplate/edit/cust_main/select-country.html,
+         httemplate/edit/cust_main/select-county.html,
+         httemplate/edit/cust_main/select-state.html,
          httemplate/edit/cust_main.cgi, httemplate/elements/xmlhttp.html,
          httemplate/misc/counties.cgi, httemplate/misc/states.cgi:
          ajax-style xmlhttprequest state/county/country selector!
 
 2005-09-07 02:37  ivan
 
-       * FS/FS/part_export/cpanel.pm, eg/export_template.pm: add cpanel
-         export
+       * Changes.1.5.8, FS/FS/part_export/cpanel.pm,
+         eg/export_template.pm: add cpanel export
 
 2005-09-06 14:58  ivan
 
 2005-08-27 01:46  ivan
 
        * FS/MANIFEST, FS/FS/Schema.pm, FS/FS/banned_pay.pm,
-         FS/FS/cust_main.pm, FS/t/banned_pay.t, bin/generate-table-module,
+         FS/FS/cancel_reason.pm, FS/FS/cust_main.pm, FS/t/banned_pay.t,
+         FS/t/cancel_reason.t, bin/generate-table-module,
          httemplate/view/cust_main.cgi,
          httemplate/misc/cust_main-cancel.cgi: add banned credit card /
          ACH table, re-do cancel popup to have a checkbox to ban payinfo
 
+2005-08-24 07:07  ivan
+
+       * README.1.5.8, httemplate/docs/upgrade10.html: need
+         H:W:SelectLayers 0.05
+
 2005-08-24 06:47  ivan
 
        * httemplate/edit/cust_main/billing.html: fix size of cvv2 help
 
 2005-08-24 06:22  ivan
 
-       * htetc/handler.pl, httemplate/edit/cust_main.cgi,
+       * htetc/global.asa, htetc/handler.pl,
+         httemplate/edit/cust_main.cgi,
          httemplate/edit/cust_main/billing.html,
-         httemplate/edit/cust_main/contact.html, FS/FS/cust_main.pm,
-         FS/FS/cust_main_county.pm, FS/FS/ClientAPI/MyAccount.pm,
-         FS/FS/ClientAPI/Signup.pm,
+         httemplate/edit/cust_main/contact.html, Changes.1.5.8,
+         FS/FS/cust_main.pm, FS/FS/cust_main_county.pm,
+         FS/FS/ClientAPI/MyAccount.pm, FS/FS/ClientAPI/Signup.pm,
          fs_selfservice/FS-SelfService/SelfService.pm,
          httemplate/docs/ach.html, httemplate/docs/cvv2.html,
          httemplate/edit/process/cust_main.cgi,
          FS/FS/option_Common.pm, FS/FS/part_export.pm,
          FS/FS/part_export_option.pm, FS/FS/part_pkg.pm,
          FS/FS/payment_gateway.pm, FS/FS/payment_gateway_option.pm,
-         FS/bin/freeside-setup, FS/bin/freeside-upgrade, FS/FS.pm,
-         FS/MANIFEST, FS/t/option_Common.t, FS/t/payment_gateway.t,
-         FS/t/payment_gateway_option.t, bin/generate-table-module,
-         htetc/handler.pl, httemplate/index.html,
-         httemplate/browse/agent.cgi,
+         FS/bin/freeside-setup, FS/bin/freeside-upgrade, README.1.5.8,
+         SCHEMA_CHANGE, FS/FS.pm, FS/MANIFEST, FS/t/option_Common.t,
+         FS/t/payment_gateway.t, FS/t/payment_gateway_option.t,
+         bin/generate-table-module, htetc/global.asa, htetc/handler.pl,
+         httemplate/index.html, httemplate/browse/agent.cgi,
          httemplate/browse/payment_gateway.html,
+         httemplate/docs/upgrade10.html,
          httemplate/edit/agent_payment_gateway.html,
          httemplate/edit/payment_gateway.html: infrastructure for easier
          schema changes, and: add payment_gateway, payment_gateway_option
 
 2005-08-09 14:38  ivan
 
-       * FS/: FS/part_export/radiator.pm, FS/part_export/sqlradius.pm,
-         t/part_export-radiator.t, FS/part_export/sqlradius_withdomain.pm:
-         add native Radiator export
+       * Changes.1.5.8, FS/FS/part_export/radiator.pm,
+         FS/FS/part_export/sqlradius.pm, FS/t/part_export-radiator.t,
+         FS/FS/part_export/sqlradius_withdomain.pm: add native Radiator
+         export
 
 2005-08-08 08:15  ivan
 
-       * FS/FS/part_export/everyone_net.pm: add export to everyone.net
-         outsource mail service
+       * Changes.1.5.8, FS/FS/part_export/everyone_net.pm: add export to
+         everyone.net outsource mail service
+
+2005-08-07 20:15  ivan
+
+       * httemplate/docs/selfservice.html: add some docs on
+         signup_server-payby and -realtime configuration values
 
 2005-08-06 17:41  ivan
 
 
 2005-08-06 17:40  ivan
 
-       * FS/FS/agent.pm, FS/FS/cust_pkg.pm, FS/FS/cust_svc.pm,
-         FS/FS/UI/Web.pm, httemplate/browse/agent.cgi,
+       * Changes.1.5.8, FS/FS/agent.pm, FS/FS/cust_pkg.pm,
+         FS/FS/cust_svc.pm, FS/FS/UI/Web.pm, httemplate/browse/agent.cgi,
          httemplate/search/cust_pay.cgi, httemplate/search/cust_pkg.cgi,
          httemplate/search/elements/search.html: move cust_pkg search to
          new template, add active/suspended/cancelled customer packages to
 
        * httemplate/search/cust_credit.html: fix credit searches by otaker
 
+2005-08-04 01:39  ivan
+
+       * httemplate/docs/install.html: add IPC::Run3 and instructions for
+         adding fs_queue and fs_selfservice users to install docs
+
 2005-08-03 18:42  ivan
 
        * Makefile: don't use install -D flag, doesn't work on bsd
 
 2005-07-14 03:52  ivan
 
-       * FS/MANIFEST, FS/FS/Conf.pm, FS/FS/cust_bill.pm,
+       * Changes.1.5.8, FS/MANIFEST, FS/FS/Conf.pm, FS/FS/cust_bill.pm,
          FS/FS/cust_bill_event.pm, FS/FS/cust_credit.pm,
          FS/FS/cust_main.pm, FS/FS/cust_main_Mixin.pm, FS/FS/cust_pay.pm,
          FS/FS/svc_Common.pm, FS/FS/UI/Web.pm, FS/t/cust_main_Mixin.t,
          configuration value to control which customer fields are shown on
          reports
 
+2005-07-12 04:54  ivan
+
+       * README.1.5.7: add alternative for very old Pg
+
 2005-07-12 02:31  ivan
 
-       * httemplate/browse/part_pkg.cgi: <rjbs> More of the same: these
-         patches make it safer to subclass FS::part_pkg's pkg_svc method
-         by eliminating qsearches on table pkg_svc.
+       * httemplate/: browse/part_pkg.cgi, view/cust_pkg.cgi: <rjbs> More
+         of the same: these patches make it safer to subclass
+         FS::part_pkg's pkg_svc method by eliminating qsearches on table
+         pkg_svc.
 
 2005-07-12 02:22  ivan
 
 
 2005-07-11 05:53  ivan
 
-       * httemplate/docs/index.html: note alternate instructions for
-         0pre6->7
+       * httemplate/docs/: index.html, upgrade10.html: note alternate
+         instructions for 0pre6->7
+
+2005-07-11 05:39  ivan
+
+       * Changelog, Changes.1.5.7: s/ANNOUNCE/Changelog/
 
 2005-07-11 05:22  ivan
 
        * bin/postfix.export: fix regex
 
+2005-07-11 05:22  ivan
+
+       * httemplate/browse/queue.cgi: template
+
 2005-07-11 05:21  ivan
 
        * Makefile: probably best to keep RT disabled by default, at least
          for this release
 
+2005-07-11 05:09  ivan
+
+       * ANNOUNCE.1.5: last bits
+
 2005-07-11 03:58  ivan
 
        * FS/t/ClientAPI_SessionCache.t:
        * FS/bin/freeside-daily: fix bug with new efficient
          customer-finding code.  sql isn't perl, null != 0
 
+2005-07-05 14:46  ivan
+
+       * httemplate/docs/install-rt.html: tyop
+
 2005-06-30 06:32  ivan
 
        * FS/FS/Misc.pm: pod error
        * FS/FS/cust_main.pm: oops, really fix error with new prepaid card
          foo
 
+2005-06-21 20:54  ivan
+
+       * httemplate/docs/upgrade10.html: add IPC::Run3 to install docs
+
 2005-06-16 22:31  ivan
 
        * httemplate/misc/process/link.cgi: fix preference sort order for
 
 2005-06-14 21:46  ivan
 
-       * FS/FS/cust_bill.pm: better error reporting for actual errors from
-         lpr command
+       * README.1.5.7, FS/FS/cust_bill.pm: better error reporting for
+         actual errors from lpr command
 
 2005-06-14 19:31  ivan
 
          FS/FS/part_pkg.pm, httemplate/view/cust_bill.cgi,
          FS/bin/freeside-queued, httemplate/search/elements/search.html,
          httemplate/elements/progress-init.html,
-         httemplate/elements/progress-popup.html, htetc/handler.pl: add
-         ability to search on a date range of invoice events and then
-         reprint or reemail (boy was that a bit more work than i
-         expected), closes: Bug#946
+         httemplate/elements/progress-popup.html, htetc/global.asa,
+         htetc/handler.pl: add ability to search on a date range of
+         invoice events and then reprint or reemail (boy was that a bit
+         more work than i expected), closes: Bug#946
 
 2005-06-01 17:02  ivan
 
 
        * httemplate/search/cust_bill.html: align
 
+2005-05-14 13:11  ivan
+
+       * README.1.5.7.lastbit: hmm virtual fields have no history?
+
+2005-05-14 13:11  ivan
+
+       * README.1.5.7: 0.26
+
 2005-05-14 12:57  ivan
 
-       * rt/lib/RT/URI/: freeside.pm, freeside/Internal.pm: fixup RT
-         integration grr!
+       * README.1.5.7, rt/lib/RT/URI/freeside.pm,
+         rt/lib/RT/URI/freeside/Internal.pm: fixup RT integration grr!
 
 2005-05-14 11:03  ivan
 
 
 2005-05-14 09:27  ivan
 
-       * FS/FS/Conf.pm, FS/FS/Misc.pm, FS/FS/cust_bill.pm,
+       * ANNOUNCE.1.5, FS/FS/Conf.pm, FS/FS/Misc.pm, FS/FS/cust_bill.pm,
          FS/FS/part_bill_event.pm, conf/invoice_html, conf/logo.png,
-         httemplate/view/cust_bill.cgi: html invoices!
+         httemplate/docs/billing.html, httemplate/view/cust_bill.cgi: html
+         invoices!
 
          http://chris-linfoot.net/d6plinks/CWLT-5VZD4Y
          http://www.dsv.su.se/~jpalme/ietf/mhtml.html
 
 2005-05-03 17:40  ivan
 
-       * conf/invoice_latex, conf/invoice_latexfooter, conf/logo.eps,
-         FS/FS/Conf.pm, FS/FS/cust_bill.pm: great new invoice template
-         from kristian!
+       * conf/invoice_latex, conf/invoice_latexfooter,
+         conf/invoice_latexreturnaddress, conf/logo.eps,
+         httemplate/docs/billing.html, FS/FS/Conf.pm, FS/FS/cust_bill.pm:
+         great new invoice template from kristian!
 
 2005-05-03 10:22  ivan
 
        * FS/bin/: freeside-addoutsource, freeside-addoutsourceuser: remove
          unnecessary host=localhost from outsource instance creation foo
 
+2005-05-03 05:56  ivan
+
+       * README.1.5.7: fix some wrapping
+
 2005-05-03 02:56  ivan
 
        * FS/FS/cust_pay.pm: on receipts, show "Electronic Check" instead
        * FS/FS/: svc_acct.pm, part_export/acct_sql.pm: add vpopmail
          defaults to acct_sql export
 
+2005-04-19 10:25  ivan
+
+       * README.1.5.7: update pre6 -> 7 upgrade instructions too
+
 2005-04-19 02:50  ivan
 
        * FS/FS/Conf.pm: disable RT_Libs for now
 
 2005-04-19 02:48  ivan
 
+       * httemplate/docs/install.html, httemplate/docs/upgrade10.html,
+         ANNOUNCE.1.5, README.1.5.7.lastbit, SCHEMA_CHANGE: did another
+         upgrade, fixed up the instructions
+
+2005-04-19 02:48  ivan
+
        * FS/FS/part_pkg.pm: silence an annoying but harmless perl warning
 
 2005-04-18 00:37  ivan
        * FS/FS/: h_cust_svc.pm, h_svc_forward.pm: No need to inflict
          debugging messages on everyone.
 
+2005-04-10 06:01  ivan
+
+       * httemplate/docs/selfservice.html: add apache snippet to
+         self-service install docs
+
 2005-04-10 03:16  ivan
 
        * httemplate/search/elements/search.html: add some left and right
 
 2005-04-07 03:35  ivan
 
-       * Makefile, htetc/freeside-rt.conf: add install/debian/3.1/INSTALL
-         script and script up some apache automation assuming a conf.d
-         type dir
+       * Makefile, htetc/freeside-base.conf, htetc/freeside-rt.conf: add
+         install/debian/3.1/INSTALL script and script up some apache
+         automation assuming a conf.d type dir
 
 2005-04-07 02:26  ivan
 
-       * FS/FS/Record.pm, FS/bin/freeside-setup, bin/fix-sequences: depend
-         on DBIx::DBSchema 0.26 for dbdef-create (for Pg 'public' schema
-         fix) and 0.25 in freeside-setup and Record.pm (for DBD::Pg 1.40
-         is bunk fix)
+       * FS/FS/Record.pm, FS/bin/freeside-setup, bin/dbdef-create,
+         bin/fix-sequences: depend on DBIx::DBSchema 0.26 for dbdef-create
+         (for Pg 'public' schema fix) and 0.25 in freeside-setup and
+         Record.pm (for DBD::Pg 1.40 is bunk fix)
+
+2005-04-06 23:08  ivan
+
+       * README.1.5.7.lastbit: and the history tables
 
 2005-04-06 20:28  khoff
 
          current (non-history) records in place of missing history
          records.
 
+2005-04-06 18:29  ivan
+
+       * httemplate/docs/upgrade8.html: ancient upgrade fix, oops.  thanks
+         Rick Harby <rharby at caarnet.com>
+
 2005-04-06 15:52  ivan
 
        * FS/FS/svc_forward.pm: and fix the error msg haha
        * FS/FS/svc_forward.pm: looks like a domain part for a
          literally-specified forward src or dst is required, not optional
 
+2005-04-06 03:38  ivan
+
+       * httemplate/docs/install-rt.html: correct links to some
+         atypically-named CPAN distributions
+
 2005-04-05 17:50  khoff
 
        * FS/FS/h_Common.pm: $pkey should be the primary key of the real
 
 2005-04-02 14:46  ivan
 
-       * FS/FS/cust_bill_pkg.pm, FS/FS/part_svc_router.pm,
-         FS/FS/pkg_svc.pm, FS/FS/rate_detail.pm, FS/FS/reg_code_pkg.pm,
-         FS/FS/type_pkgs.pm, FS/bin/freeside-setup,
-         httemplate/docs/schema.html: herding elephants: add primary keys
-         to *all* tables for slony
+       * README.1.5.7, README.1.5.7.lastbit, FS/FS/cust_bill_pkg.pm,
+         FS/FS/part_svc_router.pm, FS/FS/pkg_svc.pm, FS/FS/rate_detail.pm,
+         FS/FS/reg_code_pkg.pm, FS/FS/type_pkgs.pm, FS/bin/freeside-setup,
+         httemplate/docs/schema.html, httemplate/docs/upgrade10.html:
+         herding elephants: add primary keys to *all* tables for slony
 
 2005-04-02 12:34  ivan
 
        * bin/add-history-records.pl: Printing insert statements is not
          necessary
 
+2005-03-30 21:02  khoff
+
+       * httemplate/docs/upgrade10.html: Very annoying typo. >:-)
+
 2005-03-30 19:47  khoff
 
        * bin/add-history-records.pl: Committing the inserts helps.
        * FS/FS/part_export/cp.pm: according to landel CP no longer
          supports changing username
 
+2005-03-29 17:32  ivan
+
+       * httemplate/docs/selfservice.html: separate out referring customer
+         info to optional section, add a note on setting the agentnum via
+         templte
+
 2005-03-29 17:18  ivan
 
        * httemplate/search/cust_pay.cgi: fix ambiguous column error when
 
 2005-03-29 14:41  ivan
 
-       * fs_selfservice/FS-SelfService/SelfService.pm: better self-service
-         debugging, don't point to install.html for suEXEC/setuid in
-         self-service setup docs
+       * fs_selfservice/FS-SelfService/SelfService.pm,
+         httemplate/docs/selfservice.html: better self-service debugging,
+         don't point to install.html for suEXEC/setuid in self-service
+         setup docs
 
 2005-03-28 17:40  khoff
 
          child_objects can now set an alternate field for the svcnum, for
          things like forwards
 
+2005-03-22 20:16  ivan
+
+       * httemplate/docs/install-rt.html, README.1.5.7: new RT requires
+         Tree::Simple too
+
+2005-03-22 18:59  ivan
+
+       * README.1.5.7, httemplate/docs/install-rt.html: add HTML::Scrubber
+         to rt install/upgrade docs
+
+2005-03-22 10:15  ivan
+
+       * httemplate/docs/upgrade10.html: small fix for indices in upgrade
+         instructions, found by s5
+
 2005-03-21 14:13  khoff
 
        * FS/FS/Conf.pm, FS/FS/Misc.pm, FS/FS/cust_bill.pm,
          FS/FS/ClientAPI/MyAccount.pm, FS/FS/part_export/http.pm,
          FS/FS/part_export/infostreet.pm,
          FS/FS/part_export/shellcommands.pm, htetc/handler.pl,
-         httemplate/edit/cust_main.cgi,
+         httemplate/docs/install.html, httemplate/edit/cust_main.cgi,
          httemplate/edit/process/cust_main.cgi,
          httemplate/misc/fax-invoice.cgi, httemplate/view/cust_bill.cgi,
          httemplate/view/cust_main/billing.html,
 
 2005-03-18 11:21  pbowen
 
-       * FS/: FS/Conf.pm, FS/Record.pm, FS/cust_bill.pm, FS/cust_main.pm,
-         bin/freeside-setup: Added encrypted fields for Credit Cards,
-         etc... - PB
+       * FS/FS/Conf.pm, FS/FS/Record.pm, FS/FS/cust_bill.pm,
+         FS/FS/cust_main.pm, FS/bin/freeside-setup,
+         httemplate/docs/upgrade10.html: Added encrypted fields for Credit
+         Cards, etc... - PB
 
 2005-03-18 11:15  pbowen
 
        * FS/FS/Record.pm: Fixed a small bug... if replace is called by
          SUPER, @_ == 1 if it only contains an undef. -PB
 
+2005-03-18 01:58  ivan
+
+       * httemplate/docs/selfservice.html: selfservice uses HTML::Entities
+
 2005-03-18 01:15  ivan
 
        * FS/FS/cust_main_county.pm: no idea why this is only showing up on
 
        * FS/FS/cust_bill.pm: Documentation tyop.
 
+2005-03-17 13:45  ivan
+
+       * httemplate/docs/install-rt.html: Freeside side uses MIME-tools
+         now
+
 2005-03-17 13:41  khoff
 
        * FS/FS/Conf.pm, FS/FS/Misc.pm, FS/FS/cust_bill.pm,
-         httemplate/misc/email-invoice.cgi: Added options
-         invoice_email_pdf and invoice_email_pdf_note.  invoice_email_pdf
-         - Attach PDF invoice to emailed plain text invoices.
-         invoice_email_pdf_note - Replace plain text invoice with this
-         note, when attaching a PDF.
+         httemplate/docs/install.html, httemplate/misc/email-invoice.cgi:
+         Added options invoice_email_pdf and invoice_email_pdf_note.
+         invoice_email_pdf - Attach PDF invoice to emailed plain text
+         invoices.  invoice_email_pdf_note - Replace plain text invoice
+         with this note, when attaching a PDF.
 
 2005-03-16 03:31  ivan
 
 
 2005-03-12 08:07  ivan
 
-       * Makefile, rt/etc/RT_SiteConfig.pm, rt/lib/RT/URI/freeside.pm,
+       * Makefile, httemplate/docs/install-rt.html,
+         rt/etc/RT_SiteConfig.pm, rt/lib/RT/URI/freeside.pm,
          rt/lib/RT/URI/freeside/Internal.pm,
          rt/lib/RT/URI/freeside/XMLRPC.pm: popurl(3) won't give us a good
          freeside base url since RT calls it from multiple directory
 
 2005-03-12 06:31  ivan
 
-       * httemplate/docs/schema.html, FS/FS/agent.pm, FS/FS/cust_main.pm,
-         FS/FS/cust_pay.pm, FS/FS/prepay_credit.pm, FS/bin/freeside-setup,
+       * httemplate/docs/schema.html, httemplate/docs/selfservice.html,
+         httemplate/docs/upgrade10.html, README.1.5.7, ANNOUNCE.1.5,
+         FS/FS/agent.pm, FS/FS/cust_main.pm, FS/FS/cust_pay.pm,
+         FS/FS/prepay_credit.pm, FS/bin/freeside-setup,
          httemplate/view/cust_main/payment_history.html,
          httemplate/index.html, httemplate/browse/agent.cgi,
          httemplate/edit/prepay_credit.cgi,
          fs_selfservice/FS-SelfService/cgi/signup.cgi,
          fs_selfservice/FS-SelfService/cgi/signup.html,
          fs_selfservice/FS-SelfService/cgi/stateselect.html,
-         fs_selfservice/FS-SelfService/cgi/success.html, htetc/handler.pl:
-         - bring prepaid support into this century (close: Bug#1124) -
-         finally get rid of fs_signup (everything is in fs_selfservice
-         now) (Bug#413) - organize main menu sysadmin section so it is
-         slightly less confusing
+         fs_selfservice/FS-SelfService/cgi/success.html, htetc/global.asa,
+         htetc/handler.pl: - bring prepaid support into this century
+         (close: Bug#1124) - finally get rid of fs_signup (everything is
+         in fs_selfservice now) (Bug#413) - organize main menu sysadmin
+         section so it is slightly less confusing
 
 2005-03-11 02:35  ivan
 
 
        * rt/etc/RT_SiteConfig.pm: merging
 
+2005-03-11 02:18  ivan
+
+       * httemplate/docs/install-rt.html: note about RT_External
+
 2005-03-10 17:34  khoff
 
        * rt/: etc/RT_SiteConfig.pm, html/Elements/Header,
        * FS/FS/XMLRPC.pm: Add the ability to do freeside configuration
          lookups through the XMLRPC interface.
 
+2005-03-10 07:33  ivan
+
+       * README.1.5.7, httemplate/docs/install.html,
+         httemplate/docs/upgrade10.html: arg
+
+2005-03-10 07:18  ivan
+
+       * README.1.5.7, httemplate/docs/install.html,
+         httemplate/docs/upgrade10.html: add Frontier::RPC to docs too
+
+2005-03-10 04:06  ivan
+
+       * README.1.5.7, httemplate/docs/install.html,
+         httemplate/docs/upgrade10.html: add IO-stringy (IO::Scalar) to
+         instructions
+
 2005-03-10 01:56  ivan
 
        * FS/bin/freeside-daily: fine.
          package editing problem with extraneous services showing up,
          closes: Bug#1170
 
+2005-03-09 00:46  ivan
+
+       * httemplate/docs/install-rt.html: add complete apache config
+         instructions for RT, closes: Bug#1031
+
 2005-03-09 00:18  ivan
 
-       * httemplate/docs/index.html: preliminary RT docs
+       * ANNOUNCE.1.5, httemplate/docs/index.html,
+         httemplate/docs/install-rt.html, httemplate/docs/install.html:
+         preliminary RT docs
 
 2005-03-08 10:37  khoff
 
        * FS/FS/XMLRPC.pm: Minor re-work to allow for pseudo methods, like
          'version', and eventually config look-ups (next commit).
 
+2005-03-06 02:15  ivan
+
+       * ANNOUNCE.1.5: d
+
 2005-03-05 19:25  ivan
 
        * httemplate/search/elements/search.html: specity an explicit EOL
 
 2005-03-05 19:04  ivan
 
-       * httemplate/search/elements/search.html, htetc/handler.pl,
-         httemplate/index.html, httemplate/search/cust_bill.html,
+       * httemplate/search/elements/search.html, README.1.5.7,
+         htetc/global.asa, htetc/handler.pl, httemplate/index.html,
+         httemplate/docs/install.html, httemplate/docs/upgrade10.html,
+         httemplate/search/cust_bill.html,
          httemplate/search/cust_bill_event.html,
          httemplate/search/cust_credit.html,
          httemplate/search/cust_main-otaker.cgi,
+         httemplate/search/cust_main-payinfo.html,
+         httemplate/search/cust_main-quickpay.html,
          httemplate/search/cust_main.cgi,
          httemplate/search/cust_main.html, httemplate/search/cust_pay.cgi,
+         httemplate/search/cust_pay.html,
+         httemplate/search/cust_pkg_report.cgi,
          httemplate/search/reg_code.html,
          httemplate/search/report_cust_credit.html,
          httemplate/search/report_cust_pay.html,
          httemplate/search/report_prepaid_income.html,
          httemplate/search/report_tax.html,
-         httemplate/search/sqlradius.html, httemplate/search/svc_www.cgi,
+         httemplate/search/sqlradius.html,
+         httemplate/search/svc_acct.html,
+         httemplate/search/svc_domain.html, httemplate/search/svc_www.cgi,
          httemplate/view/cust_bill-pdf.cgi,
          httemplate/view/cust_bill-ps.cgi: add Excel and CSV download of
          templated reports and clean up their HTML formatting, closes;
          httemplate/search/cust_credit.html,
          httemplate/search/cust_pay.cgi,
          httemplate/search/report_cust_credit.html,
-         httemplate/search/report_cust_pay.html,
+         httemplate/search/report_cust_pay.html, ANNOUNCE.1.5,
          httemplate/search/elements/search.html: add agent selection to
          payment and credit reports, add link to agent browse, closes:
          Bug#1105
 
 2005-03-02 13:00  khoff
 
-       * eg/xmlrpc-example.pl, httemplate/misc/xmlrpc.cgi,
-         FS/FS/XMLRPC.pm, htetc/handler.pl: Initial version of the xmlrpc
-         interface for freeside.
+       * httemplate/docs/install.html, eg/xmlrpc-example.pl,
+         httemplate/misc/xmlrpc.cgi, FS/FS/XMLRPC.pm, htetc/handler.pl:
+         Initial version of the xmlrpc interface for freeside.
 
 2005-03-01 16:47  ivan
 
        * FS/FS/Record.pm: fix replacement in edge case with NULL integer
          fields in a table without a primary key
 
+2005-02-26 13:29  ivan
+
+       * README.1.5.7, ANNOUNCE.1.5, ANNOUNCE.1.5.0, README.1.5.0pre7:
+         less cracktastic version numbering
+
 2005-02-25 14:14  ivan
 
        * bin/pg-readonly: try to set the sequences right for modern Pg
          FS/FS/part_svc.pm: add progressbar to service definition add -
          duplicate checking can take a while, closes: Bug#1126
 
+2005-02-22 22:43  ivan
+
+       * httemplate/docs/install.html: update docs wrt mysql support
+
 2005-02-22 10:26  khoff
 
        * httemplate/edit/cust_pkg.cgi: Alphabetize/clean-up package list
          httemplate/elements/jsrsServer.html,
          httemplate/elements/overlibmws.js,
          httemplate/elements/progress-init.html,
-         httemplate/elements/progress-popup.html: use a javascript layer
-         instead of a browser popup (popup blockers), really generalize
-         the progressbar code to make it easy to use as a component
+         httemplate/elements/progress-popup.html,
+         httemplate/misc/progress.html: use a javascript layer instead of
+         a browser popup (popup blockers), really generalize the
+         progressbar code to make it easy to use as a component
 
 2005-02-17 00:44  ivan
 
 
 2005-02-10 22:44  ivan
 
-       * FS/FS/rate.pm, FS/FS/UI/Web.pm, htetc/handler.pl,
-         httemplate/edit/process/rate.cgi, httemplate/edit/rate.cgi:
-         generalize progressbar code in preparation for using it wherever
-         needed
+       * FS/FS/rate.pm, FS/FS/UI/Web.pm, htetc/global.asa,
+         htetc/handler.pl, httemplate/edit/process/rate.cgi,
+         httemplate/edit/rate.cgi: generalize progressbar code in
+         preparation for using it wherever needed
 
 2005-02-08 17:08  ivan
 
 
 2005-02-08 12:22  ivan
 
-       * FS/bin/freeside-setup, FS/FS.pm, FS/MANIFEST,
+       * FS/bin/freeside-setup, httemplate/docs/upgrade10.html,
+         README.1.5.0pre7, FS/FS.pm, FS/MANIFEST,
          FS/FS/ClientAPI_SessionCache.pm, FS/FS/Conf.pm,
          FS/FS/clientapi_session.pm, FS/FS/clientapi_session_field.pm,
          FS/FS/ClientAPI/Agent.pm, FS/FS/ClientAPI/MyAccount.pm,
          FS/FS/ClientAPI/Signup.pm, FS/t/ClientAPI_SessionCache.t,
          FS/t/clientapi_session.t, FS/t/clientapi_session_field.t,
-         httemplate/docs/schema.html: make self-service session cache
-         module configurable, start framework for in-database session
-         cache
+         httemplate/docs/install.html, httemplate/docs/schema.html: make
+         self-service session cache module configurable, start framework
+         for in-database session cache
 
 2005-02-05 15:39  ivan
 
 
        * httemplate/edit/cust_main.cgi: typo
 
+2005-02-02 00:06  ivan
+
+       * FS/FS/UI/: Base.pm, CGI.pm, Gtk.pm, agent.pm: removing old UI
+         experiment
+
+2005-01-29 04:51  ivan
+
+       * ANNOUNCE.1.5.0: gotta do pre7 already
+
 2005-01-29 04:49  ivan
 
        * httemplate/browse/agent.cgi, FS/FS/part_pkg/flat.pm: oops, last
 
        * FS/FS.pm, FS/FS/agent.pm, FS/FS/cust_pkg.pm, FS/FS/part_pkg.pm,
          FS/FS/reg_code.pm, FS/FS/reg_code_pkg.pm, FS/bin/freeside-setup,
-         FS/t/reg_code.t, FS/t/reg_code_pkg.t, FS/MANIFEST,
-         FS/FS/ClientAPI/Signup.pm, httemplate/docs/schema.html,
-         httemplate/edit/reg_code.cgi, httemplate/search/reg_code.html,
+         FS/t/reg_code.t, FS/t/reg_code_pkg.t, README.1.5.0pre7,
+         FS/MANIFEST, FS/FS/ClientAPI/Signup.pm,
+         httemplate/docs/install.html, httemplate/docs/schema.html,
+         httemplate/docs/upgrade10.html, httemplate/edit/reg_code.cgi,
+         httemplate/search/reg_code.html,
          httemplate/edit/process/reg_code.cgi: registration codes
 
 2005-01-27 15:01  ivan
 2005-01-27 02:21  ivan
 
        * httemplate/edit/process/rate.cgi, CREDITS, FS/FS/UID.pm,
-         FS/FS/queue.pm, FS/FS/rate.pm, httemplate/elements/jsrsClient.js,
-         FS/bin/freeside-queued, httemplate/edit/rate.cgi,
+         FS/FS/queue.pm, FS/FS/rate.pm, httemplate/docs/install.html,
+         httemplate/elements/jsrsClient.js, httemplate/misc/progress.html,
+         JSRS-LICENSE, FS/bin/freeside-queued, httemplate/edit/rate.cgi,
          httemplate/elements/qlib/box.js,
          httemplate/elements/qlib/boxctrl.js,
          httemplate/elements/qlib/boxres.js,
        * FS/FS/: cust_svc.pm, svc_acct.pm, part_pkg/voip_sqlradacct.pm:
          fix up some bugs in VoIP rating
 
+2004-12-30 15:47  ivan
+
+       * htetc/global.asa: search the current dir *first*, otherwise some
+         weird Apache::ASP bugs could crop up if things are ever named the
+         same
+
+2004-12-30 01:59  ivan
+
+       * htetc/global.asa: kludge to fix nested includes with
+         Apache::ASP... dunno how much longer i want to support that,
+         should just switch to Mason
+
 2004-12-29 17:41  ivan
 
        * FS/FS/: cust_svc.pm, domain_record.pm, Report/Table/Monthly.pm:
          FS/t/h_svc_acct.t, FS/t/h_svc_broadband.t, FS/t/h_svc_domain.t,
          FS/t/h_svc_external.t, FS/t/h_svc_forward.t, FS/t/h_svc_www.t,
          httemplate/view/cust_main.cgi,
-         httemplate/view/cust_main/packages.html: historical (immutable)
-         invoice details about services and other history infrastructure
+         httemplate/view/cust_main/packages.html, ANNOUNCE.1.5.0:
+         historical (immutable) invoice details about services and other
+         history infrastructure
 
 2004-12-28 15:30  ivan
 
        * FS/FS/part_export/sqlradius.pm: add debug flag to sqlradius
          export
 
+2004-12-27 02:23  ivan
+
+       * ANNOUNCE.1.5.0: note integrated rt is updated
+
 2004-12-27 02:19  ivan
 
        * FS/FS/: cust_pay.pm, cust_credit.pm: prevent unsuspension errors
 
 2004-12-23 00:32  ivan
 
-       * FS/bin/freeside-setup: allow NULL zip in some countries
+       * README.1.5.0pre7, FS/bin/freeside-setup,
+         httemplate/docs/upgrade10.html: allow NULL zip in some countries
 
 2004-12-23 00:00  ivan
 
-       * FS/bin/freeside-setup: going with 6 digit misnamed "npa" for now
+       * README.1.5.0pre7, FS/bin/freeside-setup,
+         httemplate/docs/upgrade10.html: going with 6 digit misnamed "npa"
+         for now
 
 2004-12-23 00:00  ivan
 
 
        * Makefile: add init script enable command in deb and redhat
 
+2004-12-18 15:32  ivan
+
+       * httemplate/docs/: billing.html, install.html: add info about
+         teTeX and Ghostscript
+
 2004-12-18 02:52  ivan
 
        * httemplate/index.html: fix spelling
        * FS/FS/Conf.pm, httemplate/index.html: add config option for
          address2 search, closes: Bug#1022
 
+2004-12-12 10:51  ivan
+
+       * httemplate/view/cust_main/quick-charge.html: fix form action url
+         for template
+
 2004-12-12 00:34  ivan
 
        * FS/FS/cust_main.pm: fix customer status display for some cases
 
        * FS/FS/part_export/acct_sql.pm: finish modification
 
+2004-12-11 14:50  ivan
+
+       * httemplate/docs/install.html: update install doc
+
 2004-12-11 12:41  ivan
 
        * FS/FS/cust_bill.pm, FS/FS/part_bill_event.pm,
 2004-12-10 23:50  ivan
 
        * FS/FS/Conf.pm, httemplate/view/cust_main.cgi,
+         httemplate/view/cust_main/order_pkg.html,
          httemplate/view/cust_main/packages.html,
-         httemplate/view/cust_main/payment_history.html: voiding of echeck
+         httemplate/view/cust_main/payment_history.html,
+         httemplate/view/cust_main/quick-charge.html: voiding of echeck
          payments instead of refunds
 
+2004-12-10 15:51  ivan
+
+       * httemplate/docs/selfservice.html: correct path to selfservice
+
 2004-12-10 14:28  ivan
 
        * FS/FS/CGI.pm: ui tweak for small customer view - line up billing
 
        * htetc/handler.pl: landing rt 3.2.2
 
-2004-12-03 12:51  ivan
+2004-12-03 13:23  ivan
 
-       * rt/: html/Elements/Footer, html/Elements/Header,
-         html/Elements/PageLayout, html/Elements/SimpleSearch,
-         html/Elements/Tabs, html/Ticket/Elements/ShowSummary,
-         html/Ticket/Elements/Tabs, sbin/rt-setup-database.in: landing rt
-         3.2.2
+       * README.1.5.0pre7: landing RT 3.2.2
 
-2004-12-03 12:40  ivan
+2004-12-03 12:51  ivan
 
-       * rt/: lib/RT/I18N/fi.po, lib/RT/I18N/zh_cn.po,
-         lib/RT/Action/AutoOpen.pm, lib/RT/Action/Autoreply.pm,
-         lib/RT/Action/CreateTickets.pm, lib/RT/Action/Notify.pm,
-         lib/RT/Action/RecordCorrespondence.pm,
-         lib/RT/Action/ResolveMembers.pm, lib/RT/Action/Generic.pm,
-         lib/RT/Action/SetPriority.pm, lib/RT/Action/UserDefined.pm,
-         lib/RT/Action/EscalatePriority.pm,
-         lib/RT/Action/NotifyAsComment.pm, lib/RT/Action/RecordComment.pm,
-         lib/RT/Action/SendEmail.pm, lib/RT/URI/fsck_com_rt.pm,
-         lib/RT/Interface/CLI.pm, lib/RT/Interface/Email.pm,
-         lib/RT/URI/base.pm, lib/RT/Interface/REST.pm,
-         lib/RT/Interface/Web.pm, lib/RT/Interface/Email/Auth/GnuPG.pm,
-         lib/RT/Interface/Email/Auth/MailFrom.pm,
-         lib/RT/Interface/Email/Filter/SpamAssassin.pm,
-         lib/RT/Condition/Overdue.pm, lib/RT/Condition/PriorityChange.pm,
-         lib/RT/Condition/QueueChange.pm,
-         lib/RT/Condition/StatusChange.pm,
-         lib/RT/Interface/Web/Handler.pm,
-         lib/RT/Search/ActiveTicketsInQueue.pm, lib/RT/Search/FromSQL.pm,
-         lib/RT/Search/Generic.pm, lib/RT/Condition/Generic.pm,
-         bin/mason_handler.scgi.in, bin/rt-crontool.in,
-         bin/standalone_httpd.in, bin/webmux.pl.in,
-         lib/RT/Condition/AnyTransaction.pm,
-         lib/RT/Condition/BeforeDue.pm, lib/RT/Condition/OwnerChange.pm,
-         lib/RT/Condition/PriorityExceeds.pm,
-         lib/RT/Condition/UserDefined.pm, bin/mason_handler.fcgi.in,
-         bin/mason_handler.svc.in, bin/rt.in, bin/rt-mailgate.in,
-         etc/schema.Sybase, etc/acl.Sybase, etc/initialdata,
-         etc/schema.Informix, etc/acl.Pg, etc/constraints.mysql,
-         etc/schema.SQLite, etc/schema.mysql, etc/drop.Oracle,
-         etc/upgrade/3.1.0/acl.Informix, etc/upgrade/3.1.0/acl.Oracle,
-         etc/upgrade/3.1.0/acl.Pg, etc/upgrade/3.1.0/acl.SQLite,
-         etc/upgrade/3.1.0/acl.mysql, etc/upgrade/3.1.0/content,
-         etc/upgrade/3.1.0/schema.Informix,
-         etc/upgrade/3.1.0/schema.Oracle, etc/upgrade/3.1.0/schema.Pg,
-         etc/upgrade/3.1.0/schema.SQLite, etc/upgrade/3.1.0/schema.mysql,
-         etc/upgrade/3.1.15/content, etc/upgrade/3.1.17/content: import rt
-         3.2.2
+       * rt/: config, config.pld, bin/rt-commit-handler.in,
+         etc/upgrade/2.1.71, html/Admin/Elements/ModifyQueue,
+         html/Admin/Elements/ModifyUser, html/Admin/Users/Prefs.html,
+         html/Elements/Footer, html/Elements/Header,
+         html/Elements/PageLayout, html/Elements/ShadedBox,
+         html/Elements/ShadedInputRow, html/Elements/ShadedRow,
+         html/Elements/SimpleSearch, html/Elements/Tabs,
+         html/Elements/ViewUser, html/NoAuth/webrt.css,
+         html/Search/Listing.html, html/Search/Elements/PickRestriction,
+         html/Search/Elements/TicketHeader,
+         html/Search/Elements/TicketHeaderCell,
+         html/Search/Elements/TicketRow, html/Ticket/Elements/EditLinks,
+         html/Ticket/Elements/ShowLink, html/Ticket/Elements/ShowLinks,
+         html/Ticket/Elements/ShowSummary, html/Ticket/Elements/Tabs,
+         sbin/rt-setup-database.in: landing rt 3.2.2
 
-2004-12-03 12:37  ivan
+2004-12-03 12:40  ivan
 
-       * rt/html/: Ticket/Elements/ShowTransactionAttachments,
-         Elements/QuickCreate, Elements/TicketList,
-         Elements/CollectionAsTable/Row: Initial revision
+       * rt/etc/upgrade/: 3.1.0/acl.Informix, 3.1.0/acl.Oracle,
+         3.1.0/acl.Pg, 3.1.0/acl.SQLite, 3.1.0/acl.mysql, 3.1.0/content,
+         3.1.0/schema.Informix, 3.1.0/schema.Oracle, 3.1.0/schema.Pg,
+         3.1.0/schema.SQLite, 3.1.0/schema.mysql, 3.1.15/content,
+         3.1.17/content: Initial revision
 
 2004-12-03 12:37  ivan
 
-       * rt/: UPGRADING, README, Makefile.in, configure, configure.ac,
-         Changelog, aclocal.m4, sbin/extract-message-catalog,
-         sbin/regression_harness, sbin/factory, sbin/license_tag,
-         sbin/rt-test-dependencies.in, sbin/extract_pod_tests,
-         html/autohandler, html/index.html, html/l,
-         html/Ticket/History.html, html/Ticket/ModifyAll.html,
-         html/Ticket/ModifyDates.html, html/Ticket/ModifyPeople.html,
-         html/Ticket/Update.html, html/Tools/MyDay.html,
-         html/Tools/Offline.html, html/Tools/Elements/Tabs,
-         html/Ticket/Modify.html, html/Ticket/ModifyLinks.html,
-         html/Ticket/ShowEmailRecord.html,
-         html/Ticket/Attachment/dhandler,
-         html/Ticket/Elements/LoadTextAttachments,
-         html/Ticket/Elements/EditCustomField,
-         html/Ticket/Elements/EditWatchers,
-         html/Ticket/Elements/ShowDependencies,
-         html/Ticket/Elements/ShowMessageHeaders,
-         html/Ticket/Elements/ShowPeople,
-         html/Ticket/Elements/ShowTransaction,
-         html/Ticket/Elements/AddWatchers, html/Ticket/Elements/BulkLinks,
-         html/Ticket/Elements/EditPeople, html/Ticket/Elements/ShowDates,
-         html/Ticket/Elements/ShowMembers,
-         html/Ticket/Elements/ShowMessageStanza,
-         html/Ticket/Elements/ShowRequestor,
-         html/Ticket/Elements/EditCustomFields,
-         html/Ticket/Elements/EditDates,
+       * rt/: html/Tools/MyDay.html, html/Tools/Offline.html,
+         html/Tools/Elements/Tabs, html/Ticket/ShowEmailRecord.html,
+         html/Ticket/Elements/ShowTransactionAttachments,
          html/Ticket/Elements/PreviewScrips,
-         html/Ticket/Elements/ShowBasics,
-         html/Ticket/Elements/ShowCustomFields,
          html/Ticket/Elements/ShowGroupMembers,
-         html/Ticket/Elements/ShowHistory,
-         html/Ticket/Elements/ShowUserEntry,
-         html/Ticket/Elements/EditBasics,
-         html/Ticket/Elements/FindAttachments,
-         html/Ticket/Elements/ShowAttachments, html/Search/Build.html,
+         html/Ticket/Elements/ShowUserEntry, html/Search/Build.html,
          html/Search/Edit.html, html/Search/Results.html,
          html/Search/Results.rdf, html/Search/Results.tsv,
          html/Search/Elements/BuildFormatString,
          html/Search/Elements/SelectLinks,
          html/Search/Elements/SelectPersonType,
          html/Search/Elements/SelectSearchesForObjects,
-         html/Approvals/Display.html, html/Approvals/index.html,
-         html/Approvals/Elements/PendingMyApproval,
          html/Search/Elements/EditFormat, html/Search/Elements/PickBasics,
          html/Search/Elements/PickCriteria,
-         html/Search/Elements/SelectSearchObject, html/Admin/index.html,
-         html/Admin/Groups/GroupRights.html,
-         html/Admin/Groups/Modify.html, html/Admin/Groups/UserRights.html,
-         html/Admin/Groups/index.html, html/Approvals/Elements/Approve,
-         html/Approvals/Elements/ShowDependency,
-         html/Approvals/Elements/Tabs, html/Admin/Global/GroupRights.html,
-         html/Admin/Global/Templates.html,
-         html/Admin/Global/UserRights.html,
-         html/Admin/Groups/Members.html,
+         html/Search/Elements/SelectSearchObject,
          html/Admin/Tools/Configuration.html, html/Admin/Tools/index.html,
-         html/Admin/Global/Scrip.html, html/Admin/Global/Scrips.html,
-         html/Admin/Global/Template.html, html/Admin/Global/index.html,
-         html/Admin/Queues/CustomField.html,
-         html/Admin/Queues/CustomFields.html,
-         html/Admin/Queues/GroupRights.html, html/Admin/Queues/Scrip.html,
-         html/Admin/Queues/Scrips.html, html/Admin/Queues/Template.html,
-         html/Admin/Queues/Templates.html,
-         html/Admin/Queues/UserRights.html, html/Admin/Users/index.html,
-         html/Admin/Elements/EditCustomField,
-         html/Admin/Elements/ListGlobalScrips,
-         html/Admin/Elements/SelectCustomFieldType,
-         html/Admin/Elements/SelectModifyUser, html/Admin/Elements/Tabs,
-         html/Admin/Elements/UserTabs, html/Admin/Queues/Modify.html,
-         html/Admin/Queues/People.html, html/Admin/Queues/index.html,
-         html/Admin/Elements/EditCustomFieldValues,
-         html/Admin/Elements/EditScrip,
-         html/Admin/Elements/EditUserComments, html/Admin/Elements/Header,
-         html/Admin/Elements/QueueTabs,
-         html/Admin/Elements/SelectModifyGroup,
-         html/Admin/Elements/SelectSingleOrMultiple,
-         html/Admin/Elements/SelectUsers, html/Admin/Elements/ToolTabs,
-         html/Admin/Elements/AddCustomFieldValue,
-         html/Admin/Elements/EditCustomFields,
-         html/Admin/Elements/EditScrips,
-         html/Admin/Elements/EditTemplates,
-         html/Admin/Elements/ModifyTemplate,
-         html/Admin/Elements/SelectGroups,
-         html/Admin/Elements/SelectNewGroupMembers,
-         html/Admin/Elements/SelectScrip,
-         html/Admin/Elements/CreateUserCalled,
-         html/Admin/Elements/EditQueueWatchers,
-         html/Admin/Elements/GroupTabs,
-         html/Admin/Elements/QueueRightsForUser,
-         html/Admin/Elements/SelectModifyQueue,
-         html/Admin/Elements/SelectRights,
-         html/Admin/Elements/SelectScripCondition,
-         html/Admin/Elements/SelectStage,
-         html/Admin/Elements/SelectTemplate,
-         html/Admin/Elements/SystemTabs,
-         html/Admin/Elements/ListGlobalCustomFields,
-         html/Admin/Elements/SelectScripAction,
-         html/SelfService/Closed.html, html/SelfService/Create.html,
-         html/SelfService/Display.html, html/SelfService/Error.html,
-         html/SelfService/Prefs.html, html/SelfService/Update.html,
-         html/SelfService/index.html, html/Elements/BevelBoxRaisedEnd,
-         html/Elements/MyRequests, html/Elements/SelectDateType,
-         html/Elements/SelectSortOrder, html/Elements/SelectStatus,
-         html/Elements/SelectTicketSortBy, html/Elements/ShowLinks,
-         html/SelfService/Attachment/dhandler,
-         html/SelfService/Elements/GotoTicket,
-         html/SelfService/Elements/Header,
-         html/SelfService/Elements/MyRequests,
-         html/SelfService/Elements/Tabs, html/Elements/Callback,
-         html/Elements/EditLinks, html/Elements/ListActions,
-         html/Elements/MessageBox, html/Elements/QueryString,
-         html/Elements/Refresh, html/Elements/SelectLinkType,
-         html/Elements/SelectMatch, html/Elements/Quicksearch,
-         html/Elements/SelectUsers, html/Elements/GotoTicket,
-         html/Elements/ScrubHTML, html/Elements/Section,
-         html/Elements/SelectBoolean, html/Elements/SelectGroups,
-         html/Elements/SelectLang, html/Elements/SelectNewTicketQueue,
-         html/Elements/SelectQueue, html/Elements/SelectTicketTypes,
-         html/Elements/TitleBoxEnd, html/Elements/Checkbox,
-         html/Elements/Error, html/Elements/Login,
-         html/Elements/SelectAttachmentField,
-         html/Elements/SelectCustomFieldOperator,
-         html/Elements/SelectOwner, html/Elements/SelectWatcherType,
-         html/Elements/SetupSessionCookie, html/Elements/ShowLink,
-         html/Elements/Submit, html/Elements/TitleBox,
-         html/Elements/BevelBoxRaisedStart, html/Elements/CreateTicket,
-         html/Elements/MyTickets, html/Elements/SelectCustomFieldValue,
-         html/Elements/SelectDateRelation,
-         html/Elements/SelectEqualityOperator,
-         html/Elements/SelectResultsPerPage,
+         html/Admin/Elements/ToolTabs, html/Elements/ShowLinks,
+         html/Elements/EditLinks, html/Elements/QuickCreate,
+         html/Elements/ScrubHTML, html/Elements/TicketList,
+         html/Elements/ShowLink, html/Elements/TitleBox,
          html/Elements/CollectionAsTable/Header,
          html/Elements/CollectionAsTable/ParseFormat,
-         html/Elements/RT__Ticket/ColumnMap, html/REST/1.0/autohandler,
-         html/REST/1.0/dhandler, html/REST/1.0/logout,
-         html/REST/1.0/ticket/merge,
-         html/REST/1.0/Forms/ticket/attachments,
-         html/REST/1.0/Forms/ticket/links, html/REST/1.0/search/dhandler,
-         html/REST/1.0/search/ticket, html/REST/1.0/ticket/comment,
-         html/REST/1.0/ticket/link, html/REST/1.0/Forms/queue/default,
-         html/REST/1.0/Forms/queue/ns, html/REST/1.0/Forms/ticket/default,
-         html/REST/1.0/Forms/ticket/history,
-         html/REST/1.0/Forms/user/default, html/REST/1.0/Forms/user/ns,
-         html/NoAuth/Logout.html, html/NoAuth/Reminder.html,
-         html/NoAuth/images/autohandler,
-         html/REST/1.0/NoAuth/mail-gateway, html/User/Delegation.html,
-         html/User/Elements/DelegateRights, html/User/Elements/GroupTabs,
-         html/User/Elements/Tabs, html/User/Groups/Members.html,
-         html/User/Groups/Modify.html, html/User/Groups/index.html,
-         lib/RT.pm.in, lib/RT/GroupMembers.pm, lib/RT/Principals.pm,
-         lib/RT/Scrips_Overlay.pm, lib/RT/Tickets.pm, lib/RT/Base.pm,
-         lib/RT/CustomField_Overlay.pm, lib/RT/Queues_Overlay.pm,
-         lib/RT/Date.pm, lib/RT/ScripConditions_Overlay.pm,
-         lib/RT/Template_Overlay.pm, lib/RT/Group.pm, lib/RT/User.pm,
-         lib/RT/System.pm, lib/RT/Attachment.pm, lib/RT/Attributes.pm,
-         lib/RT/Handle.pm, lib/RT/Principals_Overlay.pm,
-         lib/RT/Tickets_Overlay_SQL.pm, lib/RT/ACL_Overlay.pm,
-         lib/RT/Templates_Overlay.pm, lib/RT/Attribute_Overlay.pm,
-         lib/RT/EmailParser.pm, lib/RT/GroupMembers_Overlay.pm,
-         lib/RT/Tickets_Overlay.pm, lib/RT/Attributes_Overlay.pm,
-         lib/RT/CachedGroupMember.pm, lib/RT/CustomFieldValue.pm,
-         lib/RT/Transactions.pm, lib/RT/I18N.pm, lib/RT/Links.pm,
-         lib/RT/Queue.pm, lib/RT/Scrip.pm,
-         lib/RT/CachedGroupMember_Overlay.pm, lib/RT/CurrentUser.pm,
-         lib/RT/Principal.pm, lib/RT/Attachment_Overlay.pm,
-         lib/RT/CustomFieldValues.pm, lib/RT/Group_Overlay.pm,
-         lib/RT/ACE.pm, lib/RT/ScripActions.pm,
-         lib/RT/Transactions_Overlay.pm, lib/RT/Attachments.pm,
-         lib/RT/Groups.pm, lib/RT/Principal_Overlay.pm,
-         lib/RT/ScripAction.pm, lib/RT/Scrip_Overlay.pm,
-         lib/RT/GroupMember.pm, lib/RT/Links_Overlay.pm,
-         lib/RT/ScripCondition.pm, lib/RT/Transaction.pm,
-         lib/RT/Queue_Overlay.pm, lib/RT/Scrips.pm,
-         lib/RT/CachedGroupMembers.pm, lib/RT/CustomField.pm,
-         lib/RT/CustomFieldValues_Overlay.pm, lib/RT/CustomFields.pm,
-         lib/RT/Link.pm, lib/RT/Queues.pm, lib/RT/ScripActions_Overlay.pm,
-         lib/RT/ScripConditions.pm, lib/RT/Template.pm, lib/RT/ACL.pm,
-         lib/RT/Attachments_Overlay.pm, lib/RT/ScripAction_Overlay.pm,
-         lib/RT/ScripCondition_Overlay.pm, lib/RT/GroupMember_Overlay.pm,
-         lib/RT/Ticket.pm, lib/RT/ACE_Overlay.pm, lib/RT/Link_Overlay.pm,
-         lib/RT/Templates.pm, lib/RT/Attribute.pm,
-         lib/RT/CachedGroupMembers_Overlay.pm,
-         lib/RT/CustomFields_Overlay.pm, lib/RT/URI.pm, lib/RT/Users.pm,
-         lib/RT/I18N/en.po, lib/RT/I18N/i_default.pm, lib/RT/I18N/cs.pm,
-         lib/RT/I18N/cs.po, lib/RT/I18N/pt_br.po, lib/RT/I18N/fr.po,
-         lib/RT/I18N/es.po, lib/RT/I18N/nl.po, lib/RT/I18N/hu.po,
-         lib/RT/I18N/it.po, lib/RT/I18N/no.po, lib/RT/I18N/da.po,
-         lib/RT/I18N/ru.po, lib/RT/I18N/de.po, lib/RT/I18N/ja.po,
-         lib/RT/I18N/zh_tw.po, lib/RT/I18N/he.po: import rt 3.2.2
+         html/Elements/CollectionAsTable/Row,
+         html/Elements/RT__Ticket/ColumnMap,
+         html/NoAuth/images/autohandler, lib/t/05cronsupport.pl.in,
+         lib/RT/Attributes.pm, lib/RT/Attribute_Overlay.pm,
+         lib/RT/Attributes_Overlay.pm, lib/RT/Attribute.pm,
+         lib/RT/I18N/en_malkovich.po,
+         lib/RT/Action/RecordCorrespondence.pm,
+         lib/RT/Action/RecordComment.pm,
+         lib/RT/Interface/Email/Auth/GnuPG.pm,
+         lib/RT/Condition/PriorityChange.pm,
+         lib/RT/Interface/Web/Handler.pm, lib/RT/Search/FromSQL.pm,
+         bin/standalone_httpd.in, etc/schema.Sybase, etc/acl.Sybase:
+         Initial revision
+
+2004-12-03 12:27  ivan
+
+       * rt/sbin/: rt-setup-database, rt-test-dependencies: remove
+         autogenerated file
 
 2004-12-02 02:18  ivan
 
          rt/html/Ticket/Elements/ShowCustomers,
          rt/html/Ticket/Elements/ShowSummary,
          rt/html/Ticket/Elements/Tabs, FS/FS/TicketSystem/RT_Internal.pm,
-         FS/FS/TicketSystem/RT_Libs.pm, htetc/handler.pl,
-         httemplate/search/cust_main.cgi,
+         FS/FS/TicketSystem/RT_Libs.pm, htetc/global.asa,
+         htetc/handler.pl, httemplate/search/cust_main.cgi,
          rt/lib/RT/Interface/Web_Vendor.pm, rt/lib/RT/URI/freeside.pm:
          second big RT integration checkin, customer linking/delinking
          interface
          httemplate/index.html, rt/FREESIDE_MODIFIED,
          rt/html/Elements/Footer, rt/html/Elements/Header,
          rt/html/Elements/PageLayout, rt/html/Elements/SimpleSearch,
-         rt/html/Elements/Tabs, Makefile, FS/FS.pm, htetc/handler.pl,
+         rt/html/Elements/Tabs, ANNOUNCE.1.5.0, Makefile, FS/FS.pm,
+         htetc/global.asa, htetc/handler.pl, rt/html/NoAuth/webrt.css,
          rt/html/NoAuth/images/small-logo.png: ticket system integration
          framework and skin RT
 
 
 2004-11-22 10:20  ivan
 
-       * FS/FS/ClientAPI/Signup.pm, FS/bin/freeside-setup,
-         httemplate/docs/schema.html, FS/FS/Record.pm, FS/FS/cust_pkg.pm,
-         FS/FS/part_pkg.pm, httemplate/edit/cust_main.cgi,
-         httemplate/edit/part_pkg.cgi: promo codes and separate signup
-         addresses for hdn
+       * README.1.5.0pre7, FS/FS/ClientAPI/Signup.pm,
+         FS/bin/freeside-setup, httemplate/docs/schema.html,
+         httemplate/docs/upgrade10.html, FS/FS/Record.pm,
+         FS/FS/cust_pkg.pm, FS/FS/part_pkg.pm,
+         httemplate/edit/cust_main.cgi, httemplate/edit/part_pkg.cgi:
+         promo codes and separate signup addresses for hdn
 
 2004-11-22 03:11  ivan
 
        * FS/FS/cust_svc.pm, FS/FS/rate.pm, FS/FS/rate_detail.pm,
          FS/FS/rate_prefix.pm, FS/FS/rate_region.pm,
          FS/t/part_pkg-voip_sqlradacct.t, FS/t/rate.t, FS/t/rate_detail.t,
-         FS/t/rate_prefix.t, FS/t/rate_region.t,
+         FS/t/rate_prefix.t, FS/t/rate_region.t, ANNOUNCE.1.5.0,
+         README.1.5.0pre7, SCHEMA_CHANGE,
          FS/FS/part_pkg/voip_sqlradacct.pm, FS/bin/freeside-setup,
          httemplate/browse/rate.cgi, httemplate/docs/schema.html,
-         httemplate/edit/part_pkg.cgi, httemplate/edit/rate.cgi,
-         httemplate/edit/rate_region.cgi,
+         httemplate/docs/upgrade10.html, httemplate/edit/part_pkg.cgi,
+         httemplate/edit/rate.cgi, httemplate/edit/rate_region.cgi,
          httemplate/edit/process/rate.cgi,
          httemplate/edit/process/rate_region.cgi, FS/FS.pm, FS/MANIFEST,
          FS/FS/part_export/sqlradius.pm, eg/table_template.pm,
-         htetc/handler.pl, httemplate/search/sqlradius.cgi,
+         htetc/global.asa, htetc/handler.pl,
+         httemplate/search/sqlradius.cgi,
          httemplate/search/sqlradius.html: first pass at VoIP rating
 
 2004-11-17 05:22  ivan
        * rt/sbin/rt-setup-database.in: merge in changes to
          rt-setup-database
 
-2004-11-11 04:13  ivan
-
-       * rt/: bin/mason_handler.fcgi.in, bin/mason_handler.scgi.in,
-         bin/rt.in, bin/rt-crontool.in, bin/webmux.pl.in, etc/acl.mysql:
-         import rt 3.0.12
+2004-11-11 04:11  ivan
 
-2004-11-11 04:10  ivan
-
-       * rt/: Makefile.in, configure, Changelog, configure.ac,
-         sbin/rt-test-dependencies.in, html/autohandler, html/index.html,
-         html/Ticket/History.html, html/Ticket/ModifyAll.html,
-         html/Ticket/Update.html, html/Ticket/ModifyDates.html,
-         html/Ticket/ModifyLinks.html,
-         html/Ticket/Elements/LoadTextAttachments,
-         html/Ticket/Elements/ShowRequestor,
-         html/Ticket/Elements/ShowTransaction,
-         html/Ticket/Elements/FindAttachments,
-         html/Ticket/Elements/ShowAttachments,
-         html/Ticket/Elements/ShowDates, html/Ticket/Elements/ShowHistory,
-         html/Approvals/index.html, html/Admin/Global/GroupRights.html,
-         html/Admin/Global/UserRights.html,
-         html/Admin/Groups/GroupRights.html,
-         html/Admin/Groups/Members.html, html/Admin/Groups/Modify.html,
-         html/Admin/Groups/UserRights.html, html/Admin/Groups/index.html,
-         html/Admin/Global/Template.html,
-         html/Admin/Queues/GroupRights.html,
-         html/Admin/Queues/Modify.html, html/Admin/Queues/Scrip.html,
-         html/Admin/Queues/Template.html,
-         html/Admin/Queues/UserRights.html,
-         html/Admin/Elements/EditCustomField,
-         html/Admin/Elements/EditScrip, html/Admin/Elements/EditTemplates,
-         html/Admin/Elements/UserTabs,
-         html/Admin/Elements/SelectNewGroupMembers,
-         html/SelfService/Prefs.html, html/Elements/MyRequests,
-         html/SelfService/Display.html, html/Elements/MessageBox,
-         html/Elements/QueryString, html/Elements/SelectMatch,
-         html/REST/1.0/Forms/ticket/default,
-         html/REST/1.0/NoAuth/mail-gateway, html/User/Delegation.html,
-         html/User/Groups/Members.html, html/User/Groups/Modify.html,
-         lib/RT.pm.in, lib/t/data/rt-send-cc, lib/RT/Template_Overlay.pm,
-         lib/RT/Date.pm, lib/RT/StyleGuide.pod,
-         lib/RT/Tickets_Overlay_SQL.pm, lib/RT/ACL_Overlay.pm,
-         lib/RT/Handle.pm, lib/RT/Templates_Overlay.pm,
-         lib/RT/EmailParser.pm, lib/RT/GroupMembers_Overlay.pm,
-         lib/RT/Tickets_Overlay.pm, lib/RT/Attachment_Overlay.pm,
-         lib/RT/CurrentUser.pm, lib/RT/Principal_Overlay.pm,
-         lib/RT/Scrip_Overlay.pm, lib/RT/Queue_Overlay.pm,
-         lib/RT/CachedGroupMembers_Overlay.pm, lib/RT/Link_Overlay.pm,
-         lib/RT/I18N/cs.po, lib/RT/I18N/pt_br.po, lib/RT/I18N/fr.po,
-         lib/RT/I18N/es.po, lib/RT/I18N/nl.po, lib/RT/I18N/hu.po,
-         lib/RT/I18N/it.po, lib/RT/I18N/no.po, lib/RT/I18N/da.po,
-         lib/RT/I18N/ru.po, lib/RT/I18N/de.po, lib/RT/I18N/ja.po,
-         lib/RT/I18N/zh_tw.po, lib/RT/I18N/he.po, lib/RT/I18N/fi.po,
-         lib/RT/I18N/zh_cn.po, lib/RT/Action/SendEmail.pm,
-         lib/RT/Action/EscalatePriority.pm, lib/RT/Interface/Email.pm,
-         lib/RT/Interface/Web.pm, lib/RT/Interface/Email/Auth/MailFrom.pm:
-         import rt 3.0.12
+       * rt/: html/Ticket/Elements/LoadTextAttachments,
+         html/Ticket/Elements/FindAttachments, html/Elements/QueryString,
+         lib/t/data/rt-send-cc, lib/RT/I18N/hu.po, lib/RT/I18N/da.po:
+         Initial revision
 
 2004-11-09 03:42  ivan
 
 
        * bin/rollback: adding in case this is needed again
 
+2004-11-07 14:58  ivan
+
+       * ANNOUNCE.1.5.0, httemplate/docs/install.html:  update install
+         documentation for 1.5 HTML::Mason or Apache::ASP install
+
+2004-10-30 17:01  ivan
+
+       * httemplate/search/cust_main-quickpay.html: quick pay shouldnt
+         default to exact search
+
 2004-10-26 05:36  ivan
 
        * Makefile: 1.5.0pre6!
 
 2004-10-26 05:33  ivan
 
-       * httemplate/docs/: index.html, overview-new.dia, overview-new.png,
-         schema.html: slightly more up-to-date docs
+       * ANNOUNCE.1.5.0, httemplate/docs/billing.html,
+         httemplate/docs/export.html, httemplate/docs/index.html,
+         httemplate/docs/overview-new.dia,
+         httemplate/docs/overview-new.png, httemplate/docs/schema.html,
+         httemplate/docs/selfservice.html: slightly more up-to-date docs
 
 2004-10-26 05:07  ivan
 
 
        * FS/FS/CGI.pm, FS/FS/Conf.pm, FS/FS/Record.pm, FS/FS/cust_main.pm,
          FS/FS/cust_pkg.pm, FS/FS/part_export.pm, FS/FS/part_pkg.pm,
-         FS/FS/part_pkg_option.pm, FS/FS.pm, FS/MANIFEST,
-         FS/bin/freeside-setup, FS/t/part_pkg-flat.t,
-         FS/t/part_pkg-flat_comission.t,
+         FS/FS/part_pkg_option.pm, ANNOUNCE.1.5.0, README.1.5.0pre6,
+         SCHEMA_CHANGE, FS/FS.pm, FS/MANIFEST, FS/bin/freeside-setup,
+         FS/t/part_pkg-flat.t, FS/t/part_pkg-flat_comission.t,
          FS/t/part_pkg-flat_comission_cust.t,
          FS/t/part_pkg-flat_comission_pkg.t, FS/t/part_pkg-flat_delayed.t,
          FS/t/part_pkg-prorate.t, FS/t/part_pkg-sesmon_hour.t,
          FS/t/part_pkg-sql_generic.t, FS/t/part_pkg-sqlradacct_hour.t,
          FS/t/part_pkg-subscription.t, FS/t/part_pkg_option.t,
          httemplate/browse/part_pkg.cgi, httemplate/docs/schema.html,
-         httemplate/edit/part_pkg.cgi, httemplate/view/cust_main.cgi,
-         FS/FS/part_pkg/flat.pm, FS/FS/part_pkg/flat_comission.pm,
+         httemplate/docs/upgrade10.html, httemplate/edit/part_pkg.cgi,
+         httemplate/view/cust_main.cgi, FS/FS/part_pkg/flat.pm,
+         FS/FS/part_pkg/flat_comission.pm,
          FS/FS/part_pkg/flat_comission_cust.pm,
          FS/FS/part_pkg/flat_comission_pkg.pm,
          FS/FS/part_pkg/flat_delayed.pm, FS/FS/part_pkg/prorate.pm,
 
 2004-10-18 05:37  ivan
 
-       * httemplate/: index.html, images/small-logo.png: that's right, a
-         new logo
+       * httemplate/: index.html, images/mid-logo.png,
+         images/small-logo.png: that's right, a new logo
 
 2004-10-17 07:01  ivan
 
 
 2004-10-17 02:19  ivan
 
-       * FS/FS/Conf.pm, FS/FS/cust_svc.pm,
-         FS/FS/part_export/artera_turbo.pm,
-         httemplate/view/svc_external.cgi: add options to adjust UI for
-         artera turbo as svc_export
+       * FS/FS/Conf.pm, FS/FS/cust_svc.pm, bin/populate-msgcat,
+         README.1.5.0pre6, FS/FS/part_export/artera_turbo.pm,
+         httemplate/docs/upgrade10.html, httemplate/view/svc_external.cgi:
+         add options to adjust UI for artera turbo as svc_export
 
 2004-10-16 03:15  ivan
 
-       * FS/: FS/Conf.pm, FS/part_export/artera_turbo.pm,
-         FS/svc_external.pm, bin/freeside-setup: add artera turbo export
+       * FS/FS/Conf.pm, FS/FS/part_export/artera_turbo.pm,
+         README.1.5.0pre6, FS/FS/svc_external.pm, FS/bin/freeside-setup,
+         httemplate/docs/upgrade10.html: add artera turbo export
 
 2004-10-12 22:46  ivan
 
          in the parent process, this cached the $dbdef and speeds things
          up significantly
 
+2004-10-05 04:38  ivan
+
+       * ANNOUNCE.1.5.0: [no log message]
+
 2004-09-22 04:28  ivan
 
        * httemplate/search/: cust_bill_event.html,
 
        * FS/FS/Record.pm: better error message for missing tables
 
+2004-07-06 10:27  ivan
+
+       * ANNOUNCE.1.5.0: new features
+
 2004-07-06 10:26  ivan
 
        * FS/FS/Conf.pm, FS/FS/cust_main.pm, FS/FS/cust_pay.pm,
 
 2004-07-06 06:26  ivan
 
-       * FS/FS.pm, FS/FS/cust_pay.pm, FS/FS/cust_pay_void.pm,
-         FS/t/cust_pay_void.t, FS/bin/freeside-setup,
-         httemplate/docs/schema.html, httemplate/misc/void-cust_pay.cgi:
-         add cust_pay_void table and payment voiding web ui part one
+       * README.1.5.0pre1, README.1.5.0pre6, FS/FS.pm, FS/FS/cust_pay.pm,
+         FS/FS/cust_pay_void.pm, FS/t/cust_pay_void.t,
+         FS/bin/freeside-setup, httemplate/docs/schema.html,
+         httemplate/docs/upgrade10.html,
+         httemplate/misc/void-cust_pay.cgi: add cust_pay_void table and
+         payment voiding web ui part one
 
 2004-07-06 01:43  ivan
 
-       * htetc/handler.pl: 0.32 (and then some) released
+       * htetc/: global.asa, handler.pl: 0.32 (and then some) released
 
 2004-07-01 06:49  ivan
 
 
 2004-06-28 21:02  ivan
 
-       * FS/FS.pm, FS/MANIFEST, FS/FS/cust_bill_pay.pm,
-         FS/FS/cust_credit_bill.pm, FS/FS/cust_credit_refund.pm,
-         FS/FS/cust_pay.pm, FS/FS/cust_pay_refund.pm,
-         FS/FS/cust_refund.pm, FS/bin/freeside-setup,
+       * ANNOUNCE.1.5.0, README.1.5.0pre6, FS/FS.pm, FS/MANIFEST,
+         FS/FS/cust_bill_pay.pm, FS/FS/cust_credit_bill.pm,
+         FS/FS/cust_credit_refund.pm, FS/FS/cust_pay.pm,
+         FS/FS/cust_pay_refund.pm, FS/FS/cust_refund.pm,
+         FS/bin/freeside-setup, httemplate/docs/upgrade10.html,
          httemplate/view/cust_main.cgi, FS/t/cust_pay_refund.t,
          httemplate/edit/cust_bill_pay.cgi,
          httemplate/edit/process/cust_bill_pay.cgi: add cust_pay_refund
        * FS/FS/cust_bill.pm: forgotten space in typeset invoice credit
          lines
 
+2004-06-22 18:23  ivan
+
+       * httemplate/docs/upgrade10.html: escape html
+
 2004-06-21 20:12  ivan
 
        * Makefile: snapshot before schema changes
          fix: avoid newline prepend fix from borking indented first <%,
          fixes customer search by otaker under mason, closes: Bug#830
 
+2004-06-18 03:07  ivan
+
+       * httemplate/docs/install.html: recommend HTML::Mason
+
 2004-06-17 05:32  ivan
 
        * FS/FS/part_export/: www_shellcommands.pm, apache.pm: add
 
 2004-06-15 06:27  ivan
 
-       * fs_selfservice/FS-SelfService/cgi/: passwd.cgi, passwd.html:
-         moving passwd cgi to self-service
+       * fs_passwd/fs_passwd.cgi, fs_passwd/fs_passwd.html,
+         fs_selfservice/FS-SelfService/cgi/passwd.cgi,
+         fs_selfservice/FS-SelfService/cgi/passwd.html: moving passwd cgi
+         to self-service
 
 2004-06-15 03:59  ivan
 
 
 2004-06-11 06:44  ivan
 
-       * httemplate/search/report_tax.cgi: tax report!
+       * FS/bin/freeside-tax-report, httemplate/search/report_tax.cgi: tax
+         report!
 
 2004-06-11 00:37  ivan
 
 
        * Makefile: need this entry for myself though!
 
+2004-06-09 00:17  ivan
+
+       * httemplate/docs/install.html: explicitly specify Apache
+         httpd.conf.  fear.
+
 2004-06-05 05:01  ivan
 
        * Makefile: AND set its owner.  whew.
 
 2004-05-26 11:59  ivan
 
-       * FS/FS/cust_bill.pm: require the version of File::Temp with the OO
-         interface
+       * FS/FS/cust_bill.pm, httemplate/docs/upgrade-1.4.2.html: require
+         the version of File::Temp with the OO interface
 
 2004-05-26 06:07  ivan
 
        * httemplate/: index.html, search/svc_www.cgi: vary basic virtual
          host browse
 
+2004-05-10 16:16  ivan
+
+       * httemplate/docs/upgrade10.html: fix sequences in upgrade docs?
+
 2004-05-10 06:46  ivan
 
        * FS/FS/part_export/shellcommands_withdomain.pm: fix ISPMan
        * httemplate/search/cust_bill.html: handle missing customer records
          without erroring out
 
+2004-04-30 20:54  ivan
+
+       * htetc/global.asa: very weird 5.005 problem
+
 2004-04-30 14:58  ivan
 
        * FS/FS/Record.pm: accept empty zips for non-US countries...
 
 2004-04-23 06:15  ivan
 
-       * FS/MANIFEST, httemplate/index.html: add link to new credit report
-         on main menu, remove old obsolete shell-out reports
+       * FS/MANIFEST, FS/bin/freeside-cc-receipts-report,
+         FS/bin/freeside-credit-report, httemplate/index.html,
+         httemplate/search/report_cc.cgi,
+         httemplate/search/report_cc.html,
+         httemplate/search/report_credit.cgi,
+         httemplate/search/report_credit.html: add link to new credit
+         report on main menu, remove old obsolete shell-out reports
 
 2004-04-23 05:50  ivan
 
-       * Makefile: fix up includes with Apache::ASP
+       * Makefile, htetc/global.asa: fix up includes with Apache::ASP
 
 2004-04-23 05:19  ivan
 
        * FS/FS/cust_credit.pm, FS/FS/Report/Table/Monthly.pm,
+         httemplate/graph/money_time-graph.cgi,
          httemplate/graph/money_time.cgi,
          httemplate/search/cust_bill.html,
          httemplate/search/cust_credit.html,
 
        * httemplate/elements/pager.html: silly pager fix
 
+2004-04-22 00:27  ivan
+
+       * httemplate/docs/: install.html, upgrade10.html: minor doc updates
+
 2004-04-22 00:07  ivan
 
        * httemplate/search/report_cust_credit.html: initial copy from
 
        * Makefile: properly disable RT where not using
 
+2004-04-09 15:29  ivan
+
+       * fs_passwd/fs_passwd.cgi: oops, this one too
+
+2004-04-09 15:28  ivan
+
+       * fs_passwd/fs_passwd.html: fs_passwd.cgi
+
 2004-04-08 05:37  ivan
 
        * Makefile: fix psql command line options for older pg
 
 2004-04-08 05:05  ivan
 
-       * rt/sbin/rt-setup-database.in: remove accidentally doubled lines
-         in usage inst
+       * rt/sbin/: rt-setup-database, rt-setup-database.in: remove
+         accidentally doubled lines in usage inst
 
 2004-04-08 05:00  ivan
 
        * Makefile, htetc/handler.pl, rt/FREESIDE_MODIFIED,
-         rt/etc/RT_SiteConfig.pm, rt/sbin/rt-setup-database.in: beginning
-         of RT integration
+         rt/etc/RT_SiteConfig.pm, rt/sbin/rt-setup-database,
+         rt/sbin/rt-setup-database.in: beginning of RT integration
 
 2004-04-07 22:53  ivan
 
 
 2004-04-05 02:08  ivan
 
-       * htetc/handler.pl, httemplate/misc/whois.cgi,
+       * htetc/global.asa, htetc/handler.pl, httemplate/docs/install.html,
+         httemplate/docs/upgrade-1.4.2.html, httemplate/misc/whois.cgi,
          httemplate/view/svc_domain.cgi: add whois functionality
          internally instead of linking to geektools
 
 
        * httemplate/view/cust_main.cgi: comment out extraneous warning
 
+2004-04-02 16:45  ivan
+
+       * httemplate/search/cust_bill.cgi: UI: stop making things small for
+         no reason
+
 2004-04-02 05:44  ivan
 
-       * htetc/handler.pl, httemplate/view/cust_bill-pdf.cgi: remove
-         Pragma:no-cache header, and set Content-Length and Cache-Control
-         for viewing .pdf invoices with IE over SSL.
+       * htetc/global.asa, htetc/handler.pl,
+         httemplate/view/cust_bill-pdf.cgi: remove Pragma:no-cache header,
+         and set Content-Length and Cache-Control for viewing .pdf
+         invoices with IE over SSL.
          http://support.microsoft.com/default.aspx?scid=kb;en-us;323308
 
 2004-04-02 03:23  ivan
        * FS/FS/part_export/www_shellcommands.pm: fix paths to ispman
          commands
 
+2004-04-01 03:14  ivan
+
+       * httemplate/browse/part_referral.cgi: remove extraneous html
+
+2004-04-01 03:09  ivan
+
+       * httemplate/browse/part_referral.cgi: oops!
+
+2004-04-01 02:56  ivan
+
+       * httemplate/browse/part_referral.cgi: add a yesterday column and a
+         total row, closes: Bug#797
+
 2004-03-31 16:44  ivan
 
        * FS/: FS/cust_main_county.pm, bin/freeside-setup: get
          sub-countries from Locale::SubCountry now
 
+2004-03-30 09:13  ivan
+
+       * httemplate/docs/upgrade10.html: little more explanation about
+         editing Pg dumps
+
 2004-03-30 08:43  ivan
 
        * FS/FS/cust_main.pm: mutex the bill and collect functions
        * httemplate/view/: cust_main.cgi: small UI fix for unapplied
          partial credits
 
+2004-03-22 19:36  ivan
+
+       * htetc/global.asa: make Apache::ASP includes work as expected
+
+2004-03-22 19:31  ivan
+
+       * htetc/global.asa: includes fix
+
+2004-03-22 19:29  ivan
+
+       * htetc/global.asa, httemplate/docs/install.html,
+         httemplate/docs/upgrade10.html: includes with Apache::ASP
+
 2004-03-22 16:06  ivan
 
        * FS/FS/cust_main.pm, FS/FS/ClientAPI/MyAccount.pm,
-         htetc/handler.pl, httemplate/elements/small_custview.html,
+         htetc/global.asa, htetc/handler.pl,
+         httemplate/elements/small_custview.html,
          httemplate/misc/payment.cgi, httemplate/misc/process/payment.cgi,
          httemplate/view/cust_main.cgi: one-time credit card and ACH
          payments (like self-service) closes: Bug#648
 
 2004-03-22 02:16  ivan
 
-       * httemplate/view/cust_main.cgi: yay!  remove package view entirely
-         (closes: Bug#569)
+       * httemplate/: misc/expire_pkg.cgi, misc/process/expire_pkg.cgi,
+         view/cust_main.cgi: yay!  remove package view entirely (closes:
+         Bug#569)
 
 2004-03-21 18:59  ivan
 
 
 2004-03-17 13:47  ivan
 
-       * FS/FS/: ClientAPI/MyAccount.pm, svc_acct.pm, ClientAPI/passwd.pm:
-         proper self-service login supporting plaintext, crypt and MD5
-         passwords
+       * FS/FS/ClientAPI/MyAccount.pm, FS/FS/svc_acct.pm,
+         FS/FS/ClientAPI/passwd.pm, httemplate/docs/install.html,
+         httemplate/docs/upgrade-1.4.2.html: proper self-service login
+         supporting plaintext, crypt and MD5 passwords
 
 2004-03-16 12:41  ivan
 
 
 2004-03-15 22:58  ivan
 
-       * rt/: FREESIDE_MODIFIED, config.layout.in: config.layout needs to
-         be generated
+       * rt/: FREESIDE_MODIFIED, config.layout, config.layout.in:
+         config.layout needs to be generated
 
 2004-03-15 22:45  ivan
 
 
 2004-03-15 22:43  ivan
 
-       * rt/FREESIDE_MODIFIED: initial (hopefully rather unobtrusive)
-         patch
+       * rt/: FREESIDE_MODIFIED, sbin/rt-setup-database: initial
+         (hopefully rather unobtrusive) patch
 
 2004-03-15 20:36  ivan
 
 
        * httemplate/graph/money_time.cgi: fix title
 
+2004-03-12 04:10  ivan
+
+       * httemplate/docs/upgrade10.html: add history tables to field
+         change upgrade instructions, add hints for pre-5.6 perl, add
+         index on cust_pay._date
+
 2004-03-12 02:22  ivan
 
        * httemplate/index.html: add badly-named new report
 
+2004-03-12 02:19  ivan
+
+       * httemplate/docs/upgrade-1.4.2.html: few more 1.4.2 upgrade hints
+
 2004-03-12 00:56  ivan
 
        * FS/FS/Report/Table/Monthly.pm: don't run my local expenses kludge
        * FS/FS/cust_main.pm: emaildecline-exclude skips any errors that
          contain the strings now, not just match exactly
 
+2004-03-11 21:58  ivan
+
+       * httemplate/docs/upgrade10.html: document trouble schema changes
+         backported to 1.4.2
+
+2004-03-11 21:49  ivan
+
+       * httemplate/docs/upgrade10.html: remove comment
+
+2004-03-11 13:35  ivan
+
+       * httemplate/docs/upgrade10.html: add info for ancient Pg versions
+
 2004-03-11 13:19  ivan
 
        * conf/logo.eps: oops, wrong logo
 
 2004-03-10 23:33  ivan
 
-       * fs_passwd/fs_passwd: update fs_passwd stuff as wrappers around
+       * fs_passwd/: fs_passwd, fs_passwd.cgi, fs_passwd_server,
+         fs_passwdd: update fs_passwd stuff as wrappers around
          self-service
 
 2004-03-10 20:17  ivan
 
        * FS/MANIFEST: incorrect listing in MANIFEST
 
-2004-03-10 18:05  ivan
-
-       * rt/autom4te.cache/: output.0, traces.0: import of rt 3.0.9
+2004-03-10 18:03  ivan
 
-2004-03-10 18:02  ivan
-
-       * rt/: lib/RT/I18N/de.po, lib/RT/I18N/it.po, lib/RT/I18N/ru.po,
-         lib/RT/I18N/zh_cn.po, lib/RT/I18N/zh_tw.po,
-         lib/RT/Interface/Email.pm, lib/RT/Interface/REST.pm,
-         lib/RT/Interface/Web.pm, lib/RT/URI/fsck_com_rt.pm,
-         lib/t/data/crashes-file-based-parser,
-         lib/t/data/multipart-report, lib/t/data/notes-uuencoded,
-         sbin/extract-message-catalog, sbin/factory, sbin/license_tag,
-         sbin/rt-test-dependencies.in: import of rt 3.0.9
+       * rt/lib/: RT/I18N/it.po, RT/Interface/REST.pm,
+         t/data/crashes-file-based-parser, t/data/multipart-report,
+         t/data/notes-uuencoded: Initial revision
 
 2004-03-10 17:59  ivan
 
-       * rt/: Makefile.in, README, README.Oracle, UPGRADING, configure,
-         configure.ac, Changelog, bin/mason_handler.fcgi.in,
-         bin/mason_handler.scgi.in, bin/mason_handler.svc.in,
-         bin/rt-crontool.in, bin/rt-mailgate.in, bin/rt.in,
-         bin/webmux.pl.in, docs/rt3-schema-relationships.dot,
-         etc/acl.Informix, etc/acl.Oracle, etc/constraints.mysql,
-         etc/drop.Informix, etc/drop.Oracle, etc/initialdata,
-         etc/schema.Informix, etc/schema.SQLite, etc/schema.mysql,
-         html/autohandler, html/index.html,
-         html/Admin/Elements/EditCustomField,
-         html/Admin/Elements/EditCustomFieldValues,
-         html/Admin/Elements/EditCustomFields,
-         html/Admin/Elements/EditScrip, html/Admin/Elements/EditScrips,
-         html/Admin/Elements/SelectGroups,
-         html/Admin/Elements/SelectRights,
-         html/Admin/Elements/SelectStage,
-         html/Admin/Queues/CustomFields.html,
-         html/Admin/Queues/index.html, html/Admin/Users/index.html,
-         html/Approvals/Display.html, html/Elements/Callback,
-         html/Elements/MessageBox, html/Elements/MyTickets,
-         html/Elements/SelectLang, html/Elements/SelectStatus,
-         html/Elements/SelectWatcherType,
-         html/Elements/SetupSessionCookie, html/REST/1.0/autohandler,
-         html/REST/1.0/dhandler, html/REST/1.0/logout,
-         html/REST/1.0/Forms/queue/default, html/REST/1.0/Forms/queue/ns,
+       * rt/: README.Oracle, UPGRADING, bin/rt.in,
+         docs/rt3-schema-relationships.dot, etc/acl.Informix,
+         etc/drop.Informix, etc/drop.Oracle, etc/schema.Informix,
+         html/Admin/Elements/SelectStage, html/Elements/SelectLang,
+         html/REST/1.0/autohandler, html/REST/1.0/dhandler,
+         html/REST/1.0/logout, html/REST/1.0/Forms/queue/default,
+         html/REST/1.0/Forms/queue/ns,
          html/REST/1.0/Forms/ticket/attachments,
          html/REST/1.0/Forms/ticket/default,
          html/REST/1.0/Forms/ticket/history,
          html/REST/1.0/Forms/ticket/links,
          html/REST/1.0/Forms/user/default, html/REST/1.0/Forms/user/ns,
-         html/REST/1.0/NoAuth/mail-gateway, html/REST/1.0/search/dhandler,
-         html/REST/1.0/search/ticket, html/REST/1.0/ticket/comment,
-         html/REST/1.0/ticket/link, html/REST/1.0/ticket/merge,
-         html/SelfService/Display.html, html/SelfService/Update.html,
-         html/SelfService/Elements/MyRequests, html/Ticket/Modify.html,
-         html/Ticket/ModifyAll.html, html/Ticket/ModifyPeople.html,
-         html/Ticket/Update.html, html/Ticket/Attachment/dhandler,
-         html/Ticket/Elements/AddWatchers,
-         html/Ticket/Elements/EditCustomField,
-         html/Ticket/Elements/EditPeople,
-         html/Ticket/Elements/ShowAttachments,
-         html/Ticket/Elements/ShowDates, html/Ticket/Elements/ShowHistory,
-         html/Ticket/Elements/ShowMessageStanza,
-         html/Ticket/Elements/ShowPeople,
-         html/Ticket/Elements/ShowTransaction, lib/RT.pm.in,
-         lib/RT/Attachment_Overlay.pm, lib/RT/Base.pm,
-         lib/RT/CachedGroupMember_Overlay.pm,
-         lib/RT/CachedGroupMembers_Overlay.pm, lib/RT/CurrentUser.pm,
-         lib/RT/CustomField_Overlay.pm, lib/RT/EmailParser.pm,
-         lib/RT/GroupMember_Overlay.pm, lib/RT/Group_Overlay.pm,
-         lib/RT/Handle.pm, lib/RT/I18N.pm, lib/RT/Principal_Overlay.pm,
-         lib/RT/Queue_Overlay.pm, lib/RT/ScripAction_Overlay.pm,
-         lib/RT/Scrip_Overlay.pm, lib/RT/Scrips_Overlay.pm,
-         lib/RT/StyleGuide.pod, lib/RT/Template_Overlay.pm,
-         lib/RT/Tickets_Overlay.pm, lib/RT/Tickets_Overlay_SQL.pm,
-         lib/RT/URI.pm, lib/RT/Action/AutoOpen.pm,
-         lib/RT/Action/Autoreply.pm, lib/RT/Action/CreateTickets.pm,
-         lib/RT/Action/SendEmail.pm, lib/RT/I18N/cs.pm: import of rt 3.0.9
+         html/REST/1.0/search/dhandler, html/REST/1.0/search/ticket,
+         html/REST/1.0/ticket/comment, html/REST/1.0/ticket/link,
+         html/REST/1.0/ticket/merge, lib/RT/StyleGuide.pod: Initial
+         revision
 
 2004-03-10 17:05  ivan
 
 
        * httemplate/browse/router.cgi: UI cleanup.
 
+2004-03-05 16:57  ivan
+
+       * httemplate/docs/upgrade10.html: doc
+
 2004-03-05 06:34  ivan
 
        * FS/MANIFEST, FS/FS/Report.pm, FS/FS/Report/Table.pm,
          FS/FS/Report/Table/Monthly.pm, FS/t/Report-Table-Monthly.t,
-         FS/t/Report-Table.t, FS/t/Report.t, htetc/handler.pl,
+         FS/t/Report-Table.t, FS/t/Report.t, htetc/global.asa,
+         htetc/handler.pl, httemplate/graph/money_time-graph.cgi,
          httemplate/graph/money_time.cgi: beginning of OO reporting
          interface, create acadia-requested crosstab reports
 
 
        * CREDITS: credit where the typeset invoices came from!
 
+2004-02-28 14:43  ivan
+
+       * htetc/global.asa, httemplate/docs/install.html,
+         httemplate/docs/upgrade-1.4.2.html: Apache::ASP 2.55 required
+
 2004-02-28 14:40  ivan
 
        * httemplate/edit/process/cust_main_county-collapse.cgi: style
 
+2004-02-28 14:40  ivan
+
+       * httemplate/edit/process/cust_main_county.cgi: new setuptax and
+         recurtax fields
+
 2004-02-28 14:26  ivan
 
        * FS/FS/Record.pm: depend on DBIx::DBSchema 0.23 and thus DBD::Pg
 
        * FS/FS/CGI.pm: query strings get passed through sometimes?
 
+2004-02-24 19:50  ivan
+
+       * httemplate/docs/install.html: formatting
+
 2004-02-23 00:12  ivan
 
        * FS/FS/: svc_acct.pm, part_export.pm, svc_Common.pm: implement
 
        * bin/sendmail.import: it lives!
 
+2004-02-13 03:44  ivan
+
+       * httemplate/docs/upgrade10.html: workaround for older Pg
+
 2004-02-13 03:28  ivan
 
        * httemplate/: index.html, search/svc_forward.cgi,
 
 2004-02-13 02:57  ivan
 
-       * FS/bin/freeside-setup: continue adding svc_forward.src: make
-         svc_forward.srcsvc nullable
+       * FS/bin/freeside-setup, httemplate/docs/upgrade10.html: continue
+         adding svc_forward.src: make svc_forward.srcsvc nullable
 
 2004-02-13 02:35  ivan
 
        * FS/FS/svc_forward.pm, FS/bin/freeside-setup,
-         httemplate/docs/schema.html: add svc_forward.src
+         httemplate/docs/schema.html, httemplate/docs/upgrade10.html: add
+         svc_forward.src
 
 2004-02-13 00:02  ivan
 
 
 2004-02-11 22:31  ivan
 
-       * htetc/handler.pl, httemplate/misc/email-invoice.cgi,
+       * htetc/global.asa, htetc/handler.pl,
+         httemplate/misc/email-invoice.cgi,
          httemplate/misc/print-invoice.cgi, httemplate/view/cust_bill.cgi:
          re-email invoice, closes: bug#526 and have print and email
          invoice links redirect back to top of customer view page instead
        * FS/FS/part_pkg.pm, FS/FS/pkg_svc.pm,
          httemplate/browse/part_pkg.cgi, httemplate/edit/part_pkg.cgi,
          httemplate/edit/process/part_pkg.cgi, FS/bin/freeside-setup,
-         htetc/handler.pl, httemplate/docs/schema.html: add
-         pkg_svc.primary_svc flag to enable an explicit first package flag
+         htetc/global.asa, htetc/handler.pl, httemplate/docs/schema.html,
+         httemplate/docs/upgrade-1.4.2.html,
+         httemplate/docs/upgrade10.html: add pkg_svc.primary_svc flag to
+         enable an explicit first package flag
 
 2004-01-30 22:20  ivan
 
        * FS/FS/Record.pm: add ut_snumber, fix replacement of records with
          empty values in non-primary-keyed tables
 
+2004-01-30 12:40  ivan
+
+       * httemplate/docs/upgrade-1.4.2.html: not appropriate
+
 2004-01-29 19:58  ivan
 
        * FS/FS/part_export.pm: add default freebsd and linux
        * httemplate/: index.html, misc/dump.cgi: add database dump from
          web interface
 
+2004-01-19 15:21  ivan
+
+       * httemplate/docs/upgrade-1.4.2.html: typeset invoice doc update
+
 2004-01-18 13:03  ivan
 
        * FS/FS/Record.pm: revert bind_param change _again_.  passing not
        * FS/FS/cust_bill.pm: apply variable substitutions in latex notes
          also
 
+2004-01-12 12:52  ivan
+
+       * httemplate/docs/upgrade10.html: add IPC::ShareLite and
+         Locale::SubCountry
+
+2004-01-12 12:52  ivan
+
+       * httemplate/docs/upgrade-1.4.2.html: add IPC::ShareLite
+
 2004-01-12 12:40  khoff
 
        * httemplate/edit/part_virtual_field.cgi: Lists are just better
 
 2003-12-27 00:23  ivan
 
-       * httemplate/: index.html, search/cust_pkg.cgi: package reports by
-         agent
+       * httemplate/: index.html, search/cust_pkg.cgi,
+         search/cust_pkg.html, search/cust_pkg_report.cgi: package reports
+         by agent
 
 2003-12-24 10:18  khoff
 
 2003-12-22 18:36  ivan
 
        * FS/MANIFEST, FS/FS/part_export.pm, FS/t/svc_broadband.t,
-         FS/t/svc_external.t, htetc/handler.pl,
+         FS/t/svc_external.t, htetc/global.asa, htetc/handler.pl,
          httemplate/edit/part_svc.cgi, httemplate/edit/svc_external.cgi,
          httemplate/edit/process/svc_external.cgi,
          httemplate/view/svc_external.cgi: add svc_external
 
 2003-12-22 17:46  ivan
 
-       * FS/: FS.pm, FS/svc_external.pm, bin/freeside-setup,
-         FS/cust_svc.pm: add svc_external
+       * FS/FS.pm, FS/FS/svc_external.pm, FS/bin/freeside-setup,
+         httemplate/docs/upgrade10.html, FS/FS/cust_svc.pm: add
+         svc_external
 
 2003-12-22 17:10  ivan
 
        * FS/FS/: Conf.pm, cust_main.pm: allow_negative_charges config
          option
 
+2003-12-22 13:37  ivan
+
+       * httemplate/browse/cust_pay_batch.cgi: add total cards & amount to
+         pending batch screen
+
 2003-12-22 13:22  ivan
 
        * FS/FS/cust_main.pm: default to the whole-country tax rate if
        * FS/bin/freeside-addoutsourceuser: add outsourced databases with
          both addresses by default
 
+2003-12-19 19:47  ivan
+
+       * httemplate/browse/part_referral.cgi: fix inflated advertising
+         source numbers
+
 2003-12-15 00:08  ivan
 
        * conf/invoice_latex: line up w/window envelopes
 
 2003-12-10 14:51  ivan
 
-       * FS/bin/freeside-setup: add part_referral.disabled, add disabled
-         indices to agent and part_bill_event
+       * FS/bin/freeside-setup, httemplate/docs/upgrade10.html: add
+         part_referral.disabled, add disabled indices to agent and
+         part_bill_event
 
 2003-12-10 14:50  ivan
 
 
 2003-11-19 04:21  ivan
 
-       * httemplate/: edit/REAL_cust_pkg.cgi, search/report_cust_pay.html,
-         search/report_tax.html: fix jscalendar date ifFormat
+       * httemplate/: edit/REAL_cust_pkg.cgi, search/cust_pkg.html,
+         search/report_cc.html, search/report_credit.html,
+         search/report_cust_pay.html, search/report_tax.html: fix
+         jscalendar date ifFormat
 
 2003-11-18 17:37  ivan
 
          FS/part_export/communigate_pro_singledomain.pm, MANIFEST,
          FS/part_export.pm: add communigate_pro_singledomain export
 
+2003-11-18 03:17  ivan
+
+       * httemplate/docs/install.html: remove thread/PerlIO warning -
+         standard in 5.8.x and working fine
+
 2003-11-14 23:28  ivan
 
        * FS/bin/freeside-selfservice-server: kill off ssh process when
        * FS/FS/svc_Common.pm: simple change to cust_svc creation to help
          imports with svcnums
 
+2003-11-11 00:35  ivan
+
+       * httemplate/browse/part_referral.cgi: really fix advertising
+         source edit links
+
 2003-11-11 00:01  ivan
 
        * httemplate/search/report_receivables.cgi: remove spaces between
 
 2003-11-10 23:51  ivan
 
-       * httemplate/browse/svc_acct_pop.cgi: part_referral.cgi
+       * httemplate/browse/: part_referral.cgi, svc_acct_pop.cgi:
+         part_referral.cgi
 
 2003-11-10 05:54  ivan
 
        * httemplate/: index.html, search/report_receivables.cgi: "current
          receivables" -> A/R Aging summary
 
+2003-11-06 05:37  ivan
+
+       * FS/bin/freeside-receivables-report: removing (rewritten as a
+         proper html report)
+
 2003-11-05 03:13  ivan
 
        * bin/create-fetchmailrc: fixup
        * httemplate/browse/part_pkg.cgi: also show suspended and canceled
          counts on active package browse
 
+2003-10-26 09:30  ivan
+
+       * httemplate/search/cust_main-quickpay.html: default quickpay to
+         exact search
+
 2003-10-25 17:39  ivan
 
        * httemplate/search/: cust_pay.cgi, report_cust_pay.html: payment
 
        * FS/FS/ClientAPI/Signup.pm, httemplate/edit/cust_main.cgi,
          httemplate/edit/process/cust_main.cgi, httemplate/docs/cvv2.html,
-         FS/FS/cust_main.pm, FS/bin/freeside-setup,
-         httemplate/docs/schema.html: cvv!
+         httemplate/docs/upgrade10.html, FS/FS/cust_main.pm,
+         FS/bin/freeside-setup, httemplate/docs/schema.html: cvv!
 
 2003-10-23 22:51  ivan
 
        * httemplate/images/: cvv2.png, cvv2_amex.png: adding cvv2 images
 
+2003-10-23 17:50  ivan
+
+       * httemplate/browse/part_referral.cgi: UI: adjust alignment of
+         stats
+
+2003-10-23 17:39  ivan
+
+       * httemplate/browse/part_referral.cgi: referral listing now shows
+         customer signups today and past week/30/60/90/6months/year/total
+
+2003-10-23 15:37  ivan
+
+       * bin/dbdef-create: require DBIx::DBSchema 0.22 to deal with Pg
+         version problems
+
 2003-10-23 02:02  ivan
 
        * httemplate/docs/legacy.html: fix cranky verbitage at the top
 2003-10-19 21:25  ivan
 
        * FS/FS/cust_main.pm, FS/FS/part_pkg.pm,
-         httemplate/edit/part_pkg.cgi, FS/bin/freeside-setup: daily/weekly
-         billing
+         httemplate/edit/part_pkg.cgi, httemplate/docs/upgrade10.html,
+         FS/bin/freeside-setup: daily/weekly billing
+
+2003-10-19 11:08  ivan
+
+       * httemplate/docs/install.html: fix CPAN link
 
 2003-10-16 15:57  khoff
 
        * FS/FS/part_export/router.pm: Telnet/SSH router export for
          svc_broadband.
 
+2003-10-16 06:48  ivan
+
+       * httemplate/docs/billing.html: fix Text::Template link
+
 2003-10-15 16:17  khoff
 
        * httemplate/browse/router.cgi: $router isn't a global.
 
        * FS/FS/cust_pay_batch.pm: parse last line from TD Canada Trust
 
+2003-10-09 04:05  ivan
+
+       * httemplate/docs/install.html: don't install on a public server!
+
 2003-10-07 21:09  ivan
 
-       * htetc/handler.pl, httemplate/misc/upload-batch.cgi: can't use
+       * htetc/global.asa, htetc/handler.pl,
+         httemplate/misc/upload-batch.cgi: can't use
          File::Basename::basename for windows filenames!  use a regex
          instead
 
        * FS/FS/part_export/communigate_pro.pm: add suspension /
          unsuspension export to communigate
 
+2003-10-06 05:05  ivan
+
+       * httemplate/search/cust_main-quickpay.html: - put link to main
+         menu on quick payment search page
+
 2003-10-06 04:39  ivan
 
        * httemplate/search/svc_acct.cgi: fix URL argument processing for
 
        * FS/FS/agent.pm: no duplicate usernames
 
+2003-09-30 07:58  ivan
+
+       * httemplate/docs/upgrade10.html: agent schema changes
+
 2003-09-30 05:48  ivan
 
        * httemplate/misc/download-batch.cgi: IE doesn't like downloading
          httemplate/elements/calendar-win2k-2.css,
          httemplate/elements/calendar.js,
          httemplate/elements/calendar_stripped.js,
-         httemplate/images/calendar.png,
+         httemplate/images/calendar.png, httemplate/search/cust_pkg.html,
+         httemplate/search/report_cc.html,
+         httemplate/search/report_credit.html,
          httemplate/search/report_cust_pay.html,
          httemplate/search/report_tax.html: calendar popups!
 
 2003-09-30 00:04  ivan
 
-       * htetc/handler.pl: CGI.pm 2.47 required for ->upload() method
+       * htetc/global.asa, htetc/handler.pl,
+         httemplate/docs/upgrade-1.4.2.html: CGI.pm 2.47 required for
+         ->upload() method
 
 2003-09-29 03:10  ivan
 
 
 2003-09-27 19:36  ivan
 
-       * FS/FS/cust_pay_batch.pm, htetc/handler.pl,
+       * FS/FS/cust_pay_batch.pm, htetc/global.asa, htetc/handler.pl,
+         httemplate/browse/cust_pay_batch.cgi,
          httemplate/misc/upload-batch.cgi: add upload of batch result from
          TD Canada Trust some global.asa / handler.pl enhancements
 
 
        * httemplate/edit/svc_acct.cgi: $field isn't a global.
 
+2003-09-26 06:37  ivan
+
+       * httemplate/docs/upgrade10.html: sql
+
 2003-09-26 06:04  ivan
 
        * FS/: FS/cust_main.pm, bin/freeside-daily: re-setup option to
 
 2003-09-26 01:11  ivan
 
-       * httemplate/browse/cust_main_county.cgi: fix tax edit UI
+       * httemplate/: browse/cust_main_county.cgi,
+         edit/cust_main_county.cgi: fix tax edit UI
+
+2003-09-25 04:56  ivan
+
+       * httemplate/docs/upgrade10.html: new per-tax setuptax and recurtax
+         fields
 
 2003-09-25 04:49  ivan
 
-       * httemplate/browse/cust_main_county.cgi: UI for multiple named
-         taxes w/setup & recur exemptions 1.4 schema-auto-adjusting
-         backport
+       * httemplate/: browse/cust_main_county.cgi,
+         edit/cust_main_county.cgi: UI for multiple named taxes w/setup &
+         recur exemptions 1.4 schema-auto-adjusting backport
 
 2003-09-25 04:17  ivan
 
 
        * FS/FS/ClientAPI/MyAccount.pm: quiet self-service server cancels
 
+2003-09-25 02:40  ivan
+
+       * httemplate/docs/upgrade-1.4.2.html: 1.4.2 upgrade
+
+2003-09-25 02:39  ivan
+
+       * httemplate/docs/upgrade9.html: update upgrade docs for bind
+         exports
+
 2003-09-24 10:20  ivan
 
        * FS/FS/part_export/shellcommands.pm: don't change dir either when
 
        * httemplate/misc/download-batch.cgi: preliminary batch download
 
+2003-09-20 18:22  ivan
+
+       * httemplate/browse/cust_pay_batch.cgi: add link to preliminary
+         batch download
+
 2003-09-19 05:40  ivan
 
        * FS/FS/cust_main.pm: quiet option to cancel method
        * FS/FS/CGI.pm, bin/masonize, httemplate/index.html,
          httemplate/elements/header.html,
          httemplate/elements/menubar.html, httemplate/elements/pager.html,
-         httemplate/elements/table.html, httemplate/search/sql.html,
+         httemplate/elements/table.html, httemplate/search/sql.cgi,
+         httemplate/search/sql.html,
          httemplate/search/elements/search.html: - (finish) includes!
          (closes: Bug#551) - (finish) moving SQL search to including
          generic elements/search.html - new elements: menubar.html,
 
 2003-08-07 19:02  ivan
 
-       * bin/masonize, httemplate/autohandler,
+       * bin/masonize, htetc/global.asa, httemplate/autohandler,
+         httemplate/graph/money_time-graph.cgi,
          httemplate/graph/money_time.cgi, httemplate/search/sql.html,
          httemplate/search/elements/search.html: - fix Mason profiling to
          pass-through images (for graph/) - fix graph/money-time.cgi use
 
 2003-08-07 06:08  ivan
 
-       * htetc/handler.pl, httemplate/view/cust_main.cgi: - turn on
-         profiling with mason like with Apache::ASP (redirects now
-         working) - fix mason error with new view/cust_main.cgi UI
+       * htetc/global.asa, htetc/handler.pl,
+         httemplate/view/cust_main.cgi: - turn on profiling with mason
+         like with Apache::ASP (redirects now working) - fix mason error
+         with new view/cust_main.cgi UI
 
 2003-08-07 05:47  ivan
 
-       * Makefile, htetc/handler.pl, httemplate/autohandler,
-         httemplate/index.html: - switch to mason by default - minimum
-         mason version 1.1 (and doc) - evaluate .html files with mason/asp
-         - turn on profiling with mason like with Apache::ASP (redirects
-         not working) - (start of) includes
+       * Makefile, htetc/global.asa, htetc/handler.pl,
+         htetc/handler.pl-1.0x, httemplate/autohandler,
+         httemplate/index.html, httemplate/docs/install.html,
+         httemplate/docs/upgrade10.html: - switch to mason by default -
+         minimum mason version 1.1 (and doc) - evaluate .html files with
+         mason/asp - turn on profiling with mason like with Apache::ASP
+         (redirects not working) - (start of) includes
 
 2003-08-05 14:00  ivan
 
 
 2003-08-05 13:06  ivan
 
-       * htetc/handler.pl: no svc_acct_sm in 1.5
+       * htetc/: handler.pl, handler.pl-1.0x: no svc_acct_sm in 1.5
 
 2003-08-05 12:07  ivan
 
          FS/FS/router.pm, FS/FS/session.pm, FS/FS/svc_Common.pm,
          FS/FS/svc_acct.pm, FS/FS/svc_acct_pop.pm, FS/FS/svc_broadband.pm,
          FS/FS/svc_domain.pm, FS/FS/svc_forward.pm, FS/FS/svc_www.pm,
-         FS/FS/type_pkgs.pm, FS/bin/freeside-setup, htetc/handler.pl,
-         httemplate/index.html, httemplate/browse/part_svc.cgi,
+         FS/FS/type_pkgs.pm, FS/bin/freeside-setup, htetc/global.asa,
+         htetc/handler.pl, htetc/handler.pl-1.0x, httemplate/index.html,
+         httemplate/browse/part_svc.cgi,
          httemplate/browse/part_virtual_field.cgi,
-         httemplate/browse/router.cgi, httemplate/edit/part_svc.cgi,
+         httemplate/browse/router.cgi, httemplate/docs/upgrade10.html,
+         httemplate/edit/part_svc.cgi,
          httemplate/edit/part_virtual_field.cgi,
          httemplate/edit/router.cgi, httemplate/edit/svc_acct.cgi,
          httemplate/edit/svc_broadband.cgi, httemplate/edit/svc_www.cgi,
          httemplate/view/svc_forward.cgi, httemplate/view/svc_www.cgi:
          Virtual field merge
 
+2003-08-04 17:00  khoff
+
+       * FS/FS/part_router_field.pm, FS/FS/part_sb_field.pm,
+         FS/FS/router_field.pm, FS/FS/sb_field.pm,
+         httemplate/browse/part_sb_field.cgi,
+         httemplate/edit/part_router_field.cgi,
+         httemplate/edit/part_sb_field.cgi: Virtual field merge
+
 2003-07-25 09:26  ivan
 
        * FS/FS/svc_acct.pm: typo
 
 2003-07-15 06:30  ivan
 
-       * rt/: Makefile, bin/mason_handler.fcgi, bin/mason_handler.scgi,
-         bin/rt-mailgate, etc/schema.Pg, lib/RT.pm, lib/RT/Record.pm:
-         reverting to vendor branch rt 3.0.4, hopefully
-
-2003-07-15 06:16  ivan
-
-       * rt/: config.log, config.status, bin/mason_handler.svc,
-         bin/rt-commit-handler, bin/rt-crontool, etc/RT_Config.pm,
-         etc/RT_Config.pm.in, etc/RT_SiteConfig.pm,
-         html/Admin/Users/Modify.html, html/Elements/Footer,
-         html/Elements/Header, html/Elements/Menu,
-         html/Elements/PageLayout, html/Elements/SelectDate,
-         html/Elements/SimpleSearch, html/Elements/Tabs,
-         html/Elements/TitleBoxStart, html/Search/Bulk.html,
-         html/Ticket/Create.html, html/Ticket/Display.html,
-         html/Ticket/Elements/ShowSummary, html/Ticket/Elements/Tabs,
-         html/User/Prefs.html, lib/RT/Groups_Overlay.pm,
-         lib/RT/SearchBuilder.pm, lib/RT/Ticket_Overlay.pm,
-         lib/RT/Transaction_Overlay.pm, lib/RT/User_Overlay.pm,
-         lib/RT/Users_Overlay.pm, lib/t/02regression.t, lib/t/03web.pl,
-         lib/t/04_send_email.pl, sbin/rt-setup-database.in: Initial
-         revision
+       * rt/: ChangeLog, Makefile, README, TODO, bin/initacls.Oracle,
+         bin/initacls.Pg, bin/initacls.mysql, bin/mason_handler.fcgi,
+         bin/mason_handler.scgi, bin/rt, bin/rt-mailgate, bin/rtadmin,
+         bin/webmux.pl, docs/rt.gif, docs/design_docs/acls,
+         docs/design_docs/basic-definitions.txt,
+         docs/design_docs/cli_spec, docs/design_docs/evil_plans,
+         docs/design_docs/local_hacking, etc/acl.Oracle, etc/acl.Pg,
+         etc/acl.mysql, etc/config.pm, etc/schema.Oracle, etc/schema.Pg,
+         etc/schema.mysql, etc/schema.pm, lib/MANIFEST, lib/MANIFEST.SKIP,
+         lib/Makefile.PL, lib/RT.pm, lib/test.pl, lib/RT/ACE.pm,
+         lib/RT/ACL.pm, lib/RT/Attachment.pm, lib/RT/Attachments.pm,
+         lib/RT/CurrentUser.pm, lib/RT/Date.pm, lib/RT/EasySearch.pm,
+         lib/RT/Group.pm, lib/RT/GroupMember.pm, lib/RT/GroupMembers.pm,
+         lib/RT/Groups.pm, lib/RT/Handle.pm, lib/RT/Keyword.pm,
+         lib/RT/KeywordSelect.pm, lib/RT/KeywordSelects.pm,
+         lib/RT/Keywords.pm, lib/RT/Link.pm, lib/RT/Links.pm,
+         lib/RT/ObjectKeyword.pm, lib/RT/ObjectKeywords.pm,
+         lib/RT/Queue.pm, lib/RT/Queues.pm, lib/RT/Record.pm,
+         lib/RT/Scrip.pm, lib/RT/ScripAction.pm, lib/RT/ScripActions.pm,
+         lib/RT/ScripCondition.pm, lib/RT/ScripConditions.pm,
+         lib/RT/Scrips.pm, lib/RT/Template.pm, lib/RT/Templates.pm,
+         lib/RT/TestHarness.pm, lib/RT/Ticket.pm, lib/RT/Tickets.pm,
+         lib/RT/Transaction.pm, lib/RT/Transactions.pm, lib/RT/User.pm,
+         lib/RT/Users.pm, lib/RT/Watcher.pm, lib/RT/Watchers.pm,
+         lib/RT/Action/Autoreply.pm, lib/RT/Action/Generic.pm,
+         lib/RT/Action/Notify.pm, lib/RT/Action/NotifyAsComment.pm,
+         lib/RT/Action/OpenDependent.pm, lib/RT/Action/ResolveMembers.pm,
+         lib/RT/Action/SendEmail.pm, lib/RT/Action/SendPasswordEmail.pm,
+         lib/RT/Action/StallDependent.pm,
+         lib/RT/Condition/AnyTransaction.pm, lib/RT/Condition/Generic.pm,
+         lib/RT/Condition/NewDependency.pm,
+         lib/RT/Condition/StatusChange.pm, lib/RT/Interface/CLI.pm,
+         lib/RT/Interface/Email.pm, lib/RT/Interface/Web.pm: reverting to
+         vendor branch rt 3.0.4, hopefully
 
 2003-07-15 06:16  ivan
 
-       * rt/: COPYING, Makefile.in, README, aclocal.m4, Changelog,
-         configure, configure.ac, install-sh, bin/mason_handler.fcgi.in,
-         bin/mason_handler.scgi.in, bin/mason_handler.svc.in,
+       * rt/: Makefile.in, aclocal.m4, config, config.layout, Changelog,
+         config.log, config.pld, config.status, configure, configure.ac,
+         install-sh, bin/mason_handler.fcgi.in, bin/mason_handler.scgi.in,
+         bin/mason_handler.svc, bin/mason_handler.svc.in,
+         bin/rt-commit-handler, bin/rt-commit-handler.in,
          bin/rt-crontool.in, bin/rt-mailgate.in, bin/webmux.pl.in,
-         docs/README.docs, docs/Security, docs/design_docs/CARS,
-         docs/design_docs/TransactionTypes.txt, docs/design_docs/acls,
-         docs/design_docs/approval_notices,
+         bin/rt-crontool, docs/design_docs/approval_notices,
          docs/design_docs/approval_template, docs/design_docs/cf_search,
-         docs/design_docs/cli_spec, docs/design_docs/cvs_integration,
-         docs/design_docs/delegation, docs/design_docs/evil_plans,
-         docs/design_docs/groups_notes,
-         docs/design_docs/link-definitions.txt,
+         docs/design_docs/delegation, docs/design_docs/groups_notes,
          docs/design_docs/recursive_group_membership_algorithm,
          docs/design_docs/rql_parser_machine.graphviz,
          docs/design_docs/string-extraction-guide.txt,
-         docs/design_docs/subscription-definitions.txt,
-         docs/design_docs/ticket_templates, docs/design_docs/users,
-         etc/acl.Oracle, etc/acl.Pg, etc/acl.mysql, etc/constraints.mysql,
-         etc/initialdata, etc/rt.spec, etc/schema.SQLite,
-         etc/schema.mysql, html/autohandler, html/index.html, html/l,
-         html/Admin/index.html, html/Admin/Elements/AddCustomFieldValue,
+         docs/design_docs/ticket_templates, etc/RT_Config.pm,
+         etc/RT_Config.pm.in, etc/RT_SiteConfig.pm, etc/constraints.mysql,
+         etc/initialdata, etc/schema.SQLite, etc/upgrade/2.1.71,
+         html/autohandler, html/index.html, html/l, html/Admin/index.html,
+         html/Admin/Elements/AddCustomFieldValue,
          html/Admin/Elements/CreateUserCalled,
          html/Admin/Elements/EditCustomField,
          html/Admin/Elements/EditCustomFieldValues,
          html/Admin/Elements/GroupTabs, html/Admin/Elements/Header,
          html/Admin/Elements/ListGlobalCustomFields,
          html/Admin/Elements/ListGlobalScrips,
+         html/Admin/Elements/ModifyQueue,
          html/Admin/Elements/ModifyTemplate,
+         html/Admin/Elements/ModifyUser,
          html/Admin/Elements/QueueRightsForUser,
          html/Admin/Elements/QueueTabs,
          html/Admin/Elements/SelectCustomFieldType,
          html/Admin/Elements/SelectTemplate,
          html/Admin/Elements/SelectUsers, html/Admin/Elements/SystemTabs,
          html/Admin/Elements/Tabs, html/Admin/Elements/UserTabs,
+         html/Admin/Global/CustomField.html,
+         html/Admin/Global/CustomFields.html,
          html/Admin/Global/GroupRights.html, html/Admin/Global/Scrip.html,
          html/Admin/Global/Scrips.html, html/Admin/Global/Template.html,
          html/Admin/Global/Templates.html,
          html/Admin/Queues/Template.html,
          html/Admin/Queues/Templates.html,
          html/Admin/Queues/UserRights.html, html/Admin/Queues/index.html,
+         html/Admin/Users/Modify.html, html/Admin/Users/Prefs.html,
          html/Admin/Users/index.html, html/Approvals/Display.html,
          html/Approvals/index.html, html/Approvals/Elements/Approve,
          html/Approvals/Elements/PendingMyApproval,
          html/Approvals/Elements/Tabs, html/Elements/BevelBoxRaisedEnd,
          html/Elements/BevelBoxRaisedStart, html/Elements/Callback,
          html/Elements/Checkbox, html/Elements/CreateTicket,
-         html/Elements/Error, html/Elements/GotoTicket,
+         html/Elements/Error, html/Elements/Footer,
+         html/Elements/GotoTicket, html/Elements/Header,
          html/Elements/ListActions, html/Elements/Login,
-         html/Elements/MessageBox, html/Elements/MyRequests,
-         html/Elements/MyTickets, html/Elements/Quicksearch,
+         html/Elements/Menu, html/Elements/MessageBox,
+         html/Elements/MyRequests, html/Elements/MyTickets,
+         html/Elements/PageLayout, html/Elements/Quicksearch,
          html/Elements/Refresh, html/Elements/Section,
          html/Elements/SelectAttachmentField, html/Elements/SelectBoolean,
          html/Elements/SelectCustomFieldOperator,
-         html/Elements/SelectCustomFieldValue,
+         html/Elements/SelectCustomFieldValue, html/Elements/SelectDate,
          html/Elements/SelectDateRelation, html/Elements/SelectDateType,
          html/Elements/SelectEqualityOperator, html/Elements/SelectGroups,
          html/Elements/SelectLinkType, html/Elements/SelectMatch,
          html/Elements/SelectTicketSortBy,
          html/Elements/SelectTicketTypes, html/Elements/SelectUsers,
          html/Elements/SelectWatcherType,
-         html/Elements/SetupSessionCookie, html/Elements/Submit,
-         html/Elements/TitleBoxEnd, html/NoAuth/Logout.html,
-         html/NoAuth/Reminder.html, html/NoAuth/images/bplogo.gif,
-         html/NoAuth/images/favicon.png,
-         html/REST/1.0/NoAuth/mail-gateway, html/SelfService/Closed.html,
+         html/Elements/SetupSessionCookie, html/Elements/ShadedBox,
+         html/Elements/ShadedInputRow, html/Elements/ShadedRow,
+         html/Elements/SimpleSearch, html/Elements/Submit,
+         html/Elements/Tabs, html/Elements/TitleBoxEnd,
+         html/Elements/TitleBoxStart, html/Elements/ViewUser,
+         html/NoAuth/Logout.html, html/NoAuth/Reminder.html,
+         html/NoAuth/webrt.css, html/NoAuth/images/back_home.gif,
+         html/NoAuth/images/bplogo.gif, html/NoAuth/images/favicon.png,
+         html/NoAuth/images/head_requestracker.gif,
+         html/NoAuth/images/rt.jpg, html/NoAuth/images/space.gif,
+         html/NoAuth/images/spacer.gif,
+         html/NoAuth/images/squares_blue.gif,
+         html/REST/1.0/NoAuth/mail-gateway, html/Search/Bulk.html,
+         html/Search/Listing.html, html/Search/Elements/PickRestriction,
+         html/Search/Elements/TicketHeader,
+         html/Search/Elements/TicketHeaderCell,
+         html/Search/Elements/TicketRow, html/SelfService/Closed.html,
          html/SelfService/Create.html, html/SelfService/Display.html,
          html/SelfService/Error.html, html/SelfService/Prefs.html,
          html/SelfService/Update.html, html/SelfService/index.html,
          html/SelfService/Elements/GotoTicket,
          html/SelfService/Elements/Header,
          html/SelfService/Elements/MyRequests,
-         html/SelfService/Elements/Tabs, html/Ticket/History.html,
+         html/SelfService/Elements/Tabs, html/Ticket/Create.html,
+         html/Ticket/Display.html, html/Ticket/History.html,
          html/Ticket/Modify.html, html/Ticket/ModifyAll.html,
          html/Ticket/ModifyDates.html, html/Ticket/ModifyLinks.html,
          html/Ticket/ModifyPeople.html, html/Ticket/Update.html,
          html/Ticket/Elements/EditBasics,
          html/Ticket/Elements/EditCustomField,
          html/Ticket/Elements/EditCustomFields,
-         html/Ticket/Elements/EditDates, html/Ticket/Elements/EditPeople,
+         html/Ticket/Elements/EditDates, html/Ticket/Elements/EditLinks,
+         html/Ticket/Elements/EditPeople,
          html/Ticket/Elements/EditWatchers,
          html/Ticket/Elements/ShowAttachments,
          html/Ticket/Elements/ShowBasics,
          html/Ticket/Elements/ShowCustomFields,
          html/Ticket/Elements/ShowDates,
          html/Ticket/Elements/ShowDependencies,
-         html/Ticket/Elements/ShowHistory,
+         html/Ticket/Elements/ShowHistory, html/Ticket/Elements/ShowLink,
+         html/Ticket/Elements/ShowLinks,
+         html/Ticket/Elements/ShowMemberOf,
          html/Ticket/Elements/ShowMembers,
          html/Ticket/Elements/ShowMessageHeaders,
          html/Ticket/Elements/ShowMessageStanza,
          html/Ticket/Elements/ShowPeople,
+         html/Ticket/Elements/ShowReferences,
          html/Ticket/Elements/ShowRequestor,
-         html/Ticket/Elements/ShowTransaction, html/User/Delegation.html,
+         html/Ticket/Elements/ShowSummary,
+         html/Ticket/Elements/ShowTransaction, html/Ticket/Elements/Tabs,
+         html/User/Delegation.html, html/User/Prefs.html,
          html/User/Elements/DelegateRights, html/User/Elements/GroupTabs,
          html/User/Elements/Tabs, html/User/Groups/Members.html,
          html/User/Groups/Modify.html, html/User/Groups/index.html,
-         lib/RT.pm.in, lib/RT/ACE.pm, lib/RT/ACE_Overlay.pm,
-         lib/RT/ACL.pm, lib/RT/ACL_Overlay.pm, lib/RT/Attachment.pm,
-         lib/RT/Attachment_Overlay.pm, lib/RT/Attachments.pm,
-         lib/RT/Attachments_Overlay.pm, lib/RT/Base.pm,
-         lib/RT/CachedGroupMember.pm, lib/RT/CachedGroupMember_Overlay.pm,
+         lib/RT.pm.in, lib/RT/ACE_Overlay.pm, lib/RT/ACL_Overlay.pm,
+         lib/RT/Attachment_Overlay.pm, lib/RT/Attachments_Overlay.pm,
+         lib/RT/Base.pm, lib/RT/CachedGroupMember.pm,
+         lib/RT/CachedGroupMember_Overlay.pm,
          lib/RT/CachedGroupMembers.pm,
-         lib/RT/CachedGroupMembers_Overlay.pm, lib/RT/CurrentUser.pm,
-         lib/RT/CustomField.pm, lib/RT/CustomFieldValue.pm,
-         lib/RT/CustomFieldValues.pm, lib/RT/CustomFieldValues_Overlay.pm,
+         lib/RT/CachedGroupMembers_Overlay.pm, lib/RT/CustomField.pm,
+         lib/RT/CustomFieldValue.pm, lib/RT/CustomFieldValues.pm,
+         lib/RT/CustomFieldValues_Overlay.pm,
          lib/RT/CustomField_Overlay.pm, lib/RT/CustomFields.pm,
-         lib/RT/CustomFields_Overlay.pm, lib/RT/Date.pm,
-         lib/RT/EmailParser.pm, lib/RT/Group.pm, lib/RT/GroupMember.pm,
-         lib/RT/GroupMember_Overlay.pm, lib/RT/GroupMembers.pm,
-         lib/RT/GroupMembers_Overlay.pm, lib/RT/Group_Overlay.pm,
-         lib/RT/Groups.pm, lib/RT/Handle.pm, lib/RT/I18N.pm,
-         lib/RT/Link.pm, lib/RT/Link_Overlay.pm, lib/RT/Links.pm,
-         lib/RT/Links_Overlay.pm, lib/RT/Principal.pm,
-         lib/RT/Principal_Overlay.pm, lib/RT/Principals.pm,
-         lib/RT/Principals_Overlay.pm, lib/RT/Queue.pm,
-         lib/RT/Queue_Overlay.pm, lib/RT/Queues.pm,
-         lib/RT/Queues_Overlay.pm, lib/RT/Scrip.pm, lib/RT/ScripAction.pm,
-         lib/RT/ScripAction_Overlay.pm, lib/RT/ScripActions.pm,
-         lib/RT/ScripActions_Overlay.pm, lib/RT/ScripCondition.pm,
-         lib/RT/ScripCondition_Overlay.pm, lib/RT/ScripConditions.pm,
+         lib/RT/CustomFields_Overlay.pm, lib/RT/EmailParser.pm,
+         lib/RT/GroupMember_Overlay.pm, lib/RT/GroupMembers_Overlay.pm,
+         lib/RT/Group_Overlay.pm, lib/RT/Groups_Overlay.pm,
+         lib/RT/I18N.pm, lib/RT/Link_Overlay.pm, lib/RT/Links_Overlay.pm,
+         lib/RT/Principal.pm, lib/RT/Principal_Overlay.pm,
+         lib/RT/Principals.pm, lib/RT/Principals_Overlay.pm,
+         lib/RT/Queue_Overlay.pm, lib/RT/Queues_Overlay.pm,
+         lib/RT/ScripAction_Overlay.pm, lib/RT/ScripActions_Overlay.pm,
+         lib/RT/ScripCondition_Overlay.pm,
          lib/RT/ScripConditions_Overlay.pm, lib/RT/Scrip_Overlay.pm,
-         lib/RT/Scrips.pm, lib/RT/Scrips_Overlay.pm, lib/RT/System.pm,
-         lib/RT/Template.pm, lib/RT/Template_Overlay.pm,
-         lib/RT/Templates.pm, lib/RT/Templates_Overlay.pm,
-         lib/RT/Ticket.pm, lib/RT/Tickets.pm, lib/RT/Tickets_Overlay.pm,
-         lib/RT/Tickets_Overlay_SQL.pm, lib/RT/Transaction.pm,
-         lib/RT/Transactions.pm, lib/RT/Transactions_Overlay.pm,
-         lib/RT/URI.pm, lib/RT/User.pm, lib/RT/Users.pm,
-         lib/RT/Action/AutoOpen.pm, lib/RT/Action/Autoreply.pm,
-         lib/RT/Action/CreateTickets.pm,
-         lib/RT/Action/EscalatePriority.pm, lib/RT/Action/Generic.pm,
-         lib/RT/Action/Notify.pm, lib/RT/Action/NotifyAsComment.pm,
-         lib/RT/Action/ResolveMembers.pm, lib/RT/Action/SendEmail.pm,
-         lib/RT/Action/SetPriority.pm, lib/RT/Action/UserDefined.pm,
-         lib/RT/Condition/AnyTransaction.pm,
-         lib/RT/Condition/BeforeDue.pm, lib/RT/Condition/Generic.pm,
+         lib/RT/Scrips_Overlay.pm, lib/RT/SearchBuilder.pm,
+         lib/RT/System.pm, lib/RT/Template_Overlay.pm,
+         lib/RT/Templates_Overlay.pm, lib/RT/TicketCustomFieldValue.pm,
+         lib/RT/TicketCustomFieldValue_Overlay.pm,
+         lib/RT/TicketCustomFieldValues.pm,
+         lib/RT/TicketCustomFieldValues_Overlay.pm,
+         lib/RT/Ticket_Overlay.pm, lib/RT/Tickets_Overlay.pm,
+         lib/RT/Tickets_Overlay_SQL.pm, lib/RT/Transaction_Overlay.pm,
+         lib/RT/Transactions_Overlay.pm, lib/RT/URI.pm,
+         lib/RT/User_Overlay.pm, lib/RT/Users_Overlay.pm,
+         lib/RT/Action/AutoOpen.pm, lib/RT/Action/CreateTickets.pm,
+         lib/RT/Action/EscalatePriority.pm, lib/RT/Action/SetPriority.pm,
+         lib/RT/Action/UserDefined.pm, lib/RT/Condition/BeforeDue.pm,
          lib/RT/Condition/Overdue.pm, lib/RT/Condition/OwnerChange.pm,
          lib/RT/Condition/PriorityExceeds.pm,
-         lib/RT/Condition/QueueChange.pm,
-         lib/RT/Condition/StatusChange.pm,
-         lib/RT/Condition/UserDefined.pm, lib/RT/I18N/cs.pm,
-         lib/RT/I18N/cs.po, lib/RT/I18N/de.po, lib/RT/I18N/en.po,
-         lib/RT/I18N/es.po, lib/RT/I18N/fi.po, lib/RT/I18N/fr.po,
-         lib/RT/I18N/he.po, lib/RT/I18N/i_default.pm, lib/RT/I18N/ja.po,
-         lib/RT/I18N/nl.po, lib/RT/I18N/no.po, lib/RT/I18N/pt_br.po,
-         lib/RT/I18N/ru.po, lib/RT/I18N/zh_cn.po, lib/RT/I18N/zh_tw.po,
-         lib/RT/Interface/CLI.pm, lib/RT/Interface/Email.pm,
-         lib/RT/Interface/Web.pm, lib/RT/Interface/Email/Auth/MailFrom.pm,
+         lib/RT/Condition/QueueChange.pm, lib/RT/Condition/UserDefined.pm,
+         lib/RT/I18N/cs.pm, lib/RT/I18N/cs.po, lib/RT/I18N/de.po,
+         lib/RT/I18N/en.po, lib/RT/I18N/es.po, lib/RT/I18N/fi.po,
+         lib/RT/I18N/fr.po, lib/RT/I18N/he.po, lib/RT/I18N/i_default.pm,
+         lib/RT/I18N/ja.po, lib/RT/I18N/nl.po, lib/RT/I18N/no.po,
+         lib/RT/I18N/pt_br.po, lib/RT/I18N/ru.po, lib/RT/I18N/zh_cn.po,
+         lib/RT/I18N/zh_tw.po, lib/RT/Interface/Email/Auth/MailFrom.pm,
          lib/RT/Interface/Email/Filter/SpamAssassin.pm,
          lib/RT/Search/ActiveTicketsInQueue.pm, lib/RT/Search/Generic.pm,
          lib/RT/URI/base.pm, lib/RT/URI/fsck_com_rt.pm, lib/t/00smoke.t,
-         lib/t/01harness.t, lib/t/data/multipart-alternative-with-umlaut,
+         lib/t/00smoke.t.in, lib/t/01harness.t, lib/t/01harness.t.in,
+         lib/t/02regression.t, lib/t/02regression.t.in, lib/t/03web.pl,
+         lib/t/03web.pl.in, lib/t/04_send_email.pl,
+         lib/t/04_send_email.pl.in,
+         lib/t/data/multipart-alternative-with-umlaut,
          lib/t/data/nested-mime-sample, lib/t/data/nested-rfc-822,
          lib/t/data/new-ticket-from-iso-8859-1,
          lib/t/data/new-ticket-from-iso-8859-1-full,
          lib/t/data/8859-15-message-series/msg5,
          lib/t/data/8859-15-message-series/msg6,
          lib/t/data/8859-15-message-series/msg7,
-         lib/t/regression/mime_tests, m4/rt_enable_layout.m4,
-         m4/rt_expand_var.m4, m4/rt_layout.m4,
+         lib/t/regression/00placeholder, lib/t/regression/mime_tests,
+         m4/rt_enable_layout.m4, m4/rt_expand_var.m4, m4/rt_layout.m4,
          m4/rt_subst_expanded_arg.m4, sbin/extract-message-catalog,
          sbin/extract_pod_tests, sbin/factory, sbin/license_tag,
-         sbin/regression_harness, sbin/rt-test-dependencies.in,
+         sbin/regression_harness, sbin/rt-setup-database,
+         sbin/rt-setup-database.in, sbin/rt-test-dependencies.in,
          autom4te.cache/output.0, autom4te.cache/requests,
-         autom4te.cache/traces.0: import of rt 3.0.4
+         autom4te.cache/traces.0, sbin/rt-test-dependencies: Initial
+         revision
 
 2003-07-15 04:23  ivan
 
        * httemplate/view/cust_main.cgi: don't bother displaying comments
          that are only whitespace/newlines
 
+2003-07-03 20:34  ivan
+
+       * etc/acp_logfile-parse: removing obsolete file
+
 2003-07-03 20:31  ivan
 
        * etc/abbr_state.txt: adding states
 
+2003-07-03 20:27  ivan
+
+       * etc/example-direct-cardin: removing ancient cybercash example
+
 2003-07-03 18:37  ivan
 
        * FS/FS/svc_acct_pop.pm: don't populate the whole initial list if
        * FS/FS/svc_acct_pop.pm: optimize javascript to handle large
          numbers of POPs
 
+2003-07-03 16:00  ivan
+
+       * htetc/global.asa: working DBIx::Profile again
+
 2003-07-02 05:58  ivan
 
        * FS/FS/part_pkg.pm: tyop
 
 2003-07-02 05:34  ivan
 
-       * README: change license to GPL only
+       * Artistic, README: change license to GPL only
 
 2003-07-01 02:00  ivan
 
 
 2003-06-30 06:18  ivan
 
-       * FS/MANIFEST: removing deprecated freeside-overdue
+       * FS/: MANIFEST, bin/freeside-overdue: removing deprecated
+         freeside-overdue
 
 2003-06-30 05:22  ivan
 
        * FS/FS/cust_main.pm, httemplate/misc/bill.cgi: fix the credit card
          retry on change or manual "retry_card" to ONCE per invoice
 
+2003-06-22 02:11  ivan
+
+       * bin/create-history-tables: skip pg_ tables also (ewww, showing up
+         in reverse-engineered schema)
+
+2003-06-22 02:04  ivan
+
+       * bin/create-history-tables: skip history tables that exist
+         already; easier to re-run now
+
+2003-06-13 19:04  ivan
+
+       * httemplate/docs/upgrade9.html: cust_bill2 index
+
 2003-06-13 19:02  ivan
 
        * FS/bin/freeside-setup: add index on cust_bill._date
 
        * FS/FS/cust_svc.pm: add "$ignore_quantity" bypass
 
+2003-06-08 17:59  ivan
+
+       * httemplate/docs/install.html: documentation update from "Jesse D.
+         Guardiani" <jesse@wingnet.net>, thanks
+
 2003-06-06 18:58  ivan
 
        * FS/FS/cust_main.pm: and fix the error message
        * FS/FS/part_export/cp.pm: add suspend/unsuspend capability to CP
          export
 
+2003-06-05 21:42  ivan
+
+       * htetc/global.asa: database profiling bs i should just switch to
+         mason
+
 2003-06-04 17:22  khoff
 
        * FS/FS/cust_pkg.pm: order/cancel packages rewritten
 
        * Makefile: 1.5.0pre2 (too late, hehe)
 
+2003-06-03 02:34  ivan
+
+       * bin/svc_acct_sm.import: removing (very) deprecated import
+
+2003-06-03 00:54  ivan
+
+       * httemplate/docs/upgrade10.html: upgrade docs
+
+2003-06-02 23:10  ivan
+
+       * httemplate/docs/upgrade10.html: slightly better upgrade docs
+
 2003-06-02 23:09  ivan
 
        * FS/bin/freeside-setup: use serial for primary keys in new tables
 
        * FS/FS/cust_pkg.pm: add last_bill field to manpage
 
-2003-05-30 02:40  ivan
-
-       * httemplate/docs/man/FS/part_export/.cvs_is_on_crack: force
-         inclusion of httemplate/docs/man hierarchy
-
 2003-05-30 02:22  ivan
 
        * FS/FS/part_export/sqlradius.pm: sqlradius exports include "op"
        * FS/FS/cust_main.pm, FS/FS/ClientAPI/MyAccount.pm,
          fs_selfservice/FS-SelfService/cgi/make_payment.html,
          fs_selfservice/FS-SelfService/cgi/payment_results.html,
+         fs_selfservice/FS-SelfService/cgi/process_payment.html,
          fs_selfservice/FS-SelfService/cgi/selfservice.cgi: working
          self-service self-payments!
 
 
        * FS/FS/cust_main.pm, FS/FS/ClientAPI/MyAccount.pm,
          fs_selfservice/FS-SelfService/cgi/make_payment.html,
+         fs_selfservice/FS-SelfService/cgi/process_payment.html,
          fs_selfservice/FS-SelfService/cgi/selfservice.cgi: first crack at
          payment processing with self-service (step two of the process)
 
 
 2003-05-11 15:25  ivan
 
-       * htetc/handler.pl: handler.pl updates from Richard Siddall
-         <richard.siddall@elirion.net>
+       * htetc/: handler.pl, handler.pl-1.0x: handler.pl updates from
+         Richard Siddall <richard.siddall@elirion.net>
 
 2003-05-09 23:45  ivan
 
-       * httemplate/view/cust_main.cgi: first pass at new package list UI
+       * httemplate/view/: cust_main.cgi, cust_pkg.cgi: first pass at new
+         package list UI
 
 2003-05-09 22:41  ivan
 
        * Makefile, FS/FS/Record.pm: general Pg 7.3 fix for setting int
          columns to '' / NULL
 
+2003-05-06 14:15  ivan
+
+       * httemplate/view/cust_main_alt.cgi: don't create new files in lieu
+         of branches
+
+2003-05-06 13:33  khoff
+
+       * httemplate/view/cust_main_alt.cgi: Can't pull  out of thin air.
+
+2003-05-04 13:58  khoff
+
+       * httemplate/view/cust_main_alt.cgi: proposed cust_main.cgi
+
 2003-05-02 19:06  ivan
 
        * FS/FS/part_export/infostreet.pm, httemplate/edit/svc_acct.cgi:
 
 2003-04-23 16:12  ivan
 
-       * Makefile, htetc/handler.pl: compatible with mason 1.1!  closes:
+       * Makefile, htetc/handler.pl, htetc/handler.pl-1.0x,
+         httemplate/docs/install.html: compatible with mason 1.1!  closes:
          bug#492
 
 2003-04-23 15:16  ivan
 
 2003-04-21 21:39  ivan
 
-       * FS/: MANIFEST, FS/Conf.pm, FS/part_export.pm, FS/svc_domain.pm,
-         FS/svc_forward.pm, FS/part_export/domain_shellcommands.pm,
-         FS/part_export/forward_shellcommands.pm,
-         t/part_export-forward_shellcommands.t: - mysql 4.1 is available;
-         update documentation - remove last vestiges of 1.3-style
-         qmail/vpopmail exports from svc_domain and   svc_forward; add
-         appropriate exports (closes: Bug#299)
+       * FS/MANIFEST, FS/FS/Conf.pm, FS/FS/part_export.pm,
+         FS/FS/svc_domain.pm, FS/FS/svc_forward.pm,
+         FS/FS/part_export/domain_shellcommands.pm,
+         FS/FS/part_export/forward_shellcommands.pm,
+         FS/t/part_export-forward_shellcommands.t,
+         httemplate/docs/install.html: - mysql 4.1 is available; update
+         documentation - remove last vestiges of 1.3-style qmail/vpopmail
+         exports from svc_domain and   svc_forward; add appropriate
+         exports (closes: Bug#299)
 
 2003-04-21 15:40  ivan
 
 
 2003-04-21 14:29  khoff
 
-       * httemplate/edit/process/generic.cgi: Navigation fixes.
+       * httemplate/edit/: part_router_field.cgi, process/generic.cgi:
+         Navigation fixes.
 
 2003-04-21 14:13  khoff
 
 2003-04-21 13:53  ivan
 
        * FS/FS/Conf.pm, FS/FS/cust_main.pm, FS/FS/part_bill_event.pm,
-         FS/bin/freeside-daily, FS/bin/freeside-setup,
-         httemplate/docs/schema.html, httemplate/edit/cust_main.cgi,
+         FS/bin/freeside-daily, FS/bin/freeside-expiration-alerter,
+         FS/bin/freeside-setup, httemplate/docs/schema.html,
+         httemplate/edit/cust_main.cgi,
          httemplate/edit/part_bill_event.cgi,
          httemplate/edit/process/cust_main.cgi,
          httemplate/search/cust_main.cgi, httemplate/view/cust_main.cgi:
 2003-04-01 00:03  ivan
 
        * FS/FS/Record.pm, httemplate/docs/index.html,
-         httemplate/view/cust_main.cgi: - update qsearch for Pg 7.3 -
-         preliminary 1.5.0 upgrade docs - syntax error in main customer
-         view
+         httemplate/docs/upgrade10.html, httemplate/view/cust_main.cgi: -
+         update qsearch for Pg 7.3 - preliminary 1.5.0 upgrade docs -
+         syntax error in main customer view
 
 2003-03-31 22:55  ivan
 
        * FS/FS/cust_main.pm, FS/FS/cust_pkg.pm, debian/changelog,
          debian/control, httemplate/edit/REAL_cust_pkg.cgi,
          httemplate/edit/process/REAL_cust_pkg.cgi,
-         httemplate/search/cust_pkg.cgi, httemplate/view/cust_main.cgi:
-         correct last_bill problems with $0 invoice (non-existant) edge
-         cases
+         httemplate/search/cust_pkg.cgi, httemplate/view/cust_main.cgi,
+         httemplate/view/cust_pkg.cgi: correct last_bill problems with $0
+         invoice (non-existant) edge cases
 
 2003-03-31 15:49  ivan
 
          bin/apache.export, bin/bind.export, bin/bsdshell.export,
          bin/sysvshell.export: apache export!
 
+2003-03-11 16:44  ivan
+
+       * httemplate/docs/upgrade9.html: doc from 1.4 branch
+
 2003-03-11 03:40  ivan
 
        * FS/FS/svc_domain.pm: another pg7.3 fix
          FS/FS/cust_bill_pkg.pm, FS/FS/cust_bill_pkg_detail.pm,
          FS/FS/cust_main.pm, FS/bin/freeside-setup,
          FS/t/cust_bill_pkg_detail.t, httemplate/docs/schema.html,
-         httemplate/edit/part_pkg.cgi: time/data detail on invoices
+         httemplate/docs/upgrade10.html, httemplate/edit/part_pkg.cgi:
+         time/data detail on invoices
+
+2003-02-05 15:22  khoff
+
+       * FS/FS/ac.pm, FS/FS/ac_block.pm, FS/FS/ac_field.pm,
+         FS/FS/ac_type.pm, FS/FS/part_ac_field.pm,
+         httemplate/browse/ac.cgi, httemplate/browse/ac_type.cgi,
+         httemplate/edit/ac.cgi, httemplate/edit/ac_type.cgi,
+         httemplate/edit/process/ac.cgi,
+         httemplate/edit/process/ac_block.cgi,
+         httemplate/edit/process/ac_field.cgi,
+         httemplate/edit/process/ac_type.cgi,
+         httemplate/edit/process/part_ac_field.cgi: svc_broadband rewrite
 
 2003-02-05 15:17  khoff
 
-       * FS/FS/addr_block.pm, FS/FS/part_svc_router.pm, FS/FS/router.pm,
+       * FS/FS/addr_block.pm, FS/FS/part_router_field.pm,
+         FS/FS/part_sb_field.pm, FS/FS/part_svc_router.pm,
+         FS/FS/router.pm, FS/FS/router_field.pm, FS/FS/sb_field.pm,
          FS/FS/svc_broadband.pm, httemplate/browse/addr_block.cgi,
-         httemplate/browse/router.cgi, httemplate/edit/router.cgi,
+         httemplate/browse/generic.cgi,
+         httemplate/browse/part_sb_field.cgi,
+         httemplate/browse/router.cgi,
+         httemplate/edit/part_router_field.cgi,
+         httemplate/edit/part_sb_field.cgi, httemplate/edit/router.cgi,
          httemplate/edit/svc_broadband.cgi,
          httemplate/edit/process/addr_block/add.cgi,
          httemplate/edit/process/addr_block/allocate.cgi,
          FS/bin/freeside-setup, httemplate/edit/process/generic.cgi,
          httemplate/edit/process/router.cgi,
          httemplate/edit/process/svc_broadband.cgi,
-         httemplate/edit/process/addr_block/split.cgi, htetc/handler.pl,
-         httemplate/index.html, httemplate/view/svc_broadband.cgi:
-         svc_broadband rewrite
+         httemplate/edit/process/addr_block/split.cgi, htetc/global.asa,
+         htetc/handler.pl, httemplate/index.html,
+         httemplate/view/svc_broadband.cgi: svc_broadband rewrite
 
 2003-02-05 14:06  khoff
 
        * FS/FS/cust_svc.pm: ip_netmask is gone now
 
+2003-02-04 14:04  ivan
+
+       * htetc/global.asa, httemplate/docs/install.html: 1.5-specific
+         fixes
+
 2003-01-27 23:47  ivan
 
        * FS/bin/freeside-setup: eek, and this is what caused connectup to
 2003-01-14 01:26  ivan
 
        * FS/MANIFEST, FS/bin/freeside-selfservice-server,
-         init.d/freeside-init: move freeside-selfservice-server to proper
-         MakeMaker install location
+         fs_selfservice/freeside-selfservice-server, init.d/freeside-init:
+         move freeside-selfservice-server to proper MakeMaker install
+         location
 
 2003-01-14 00:49  ivan
 
 
 2002-12-24 14:41  ivan
 
-       * FS/bin/freeside-setup, httemplate/view/cust_main.cgi:
-         optimization for ginourmous numbers of packages for intergate,
-         whew
+       * README.1.5.0pre1, FS/bin/freeside-setup,
+         httemplate/view/cust_main.cgi: optimization for ginourmous
+         numbers of packages for intergate, whew
 
 2002-12-23 15:56  ivan
 
        * FS/FS/cust_pkg.pm: added stuff for selfservice_server-quiet,
          signup_server-quiet, and emailcancel messages.
 
+2002-12-23 06:38  steve
+
+       * fs_selfservice/freeside-selfservice-server: added stuff for
+         selfservice_server-quiet, signup_server-quiet, and emailcancel
+         messages.
+
 2002-12-23 06:22  steve
 
        * FS/FS/: cust_bill.pm, Conf.pm: added stuff for
        * FS/: MANIFEST, bin/freeside-sqlradius-seconds: adding
          freeside-sqlradius-seconds
 
+2002-12-16 22:36  ivan
+
+       * httemplate/docs/install.html: add PerlModule commands to install
+         instructions
+
 2002-12-16 13:52  ivan
 
        * FS/FS/part_svc.pm, httemplate/edit/part_svc.cgi: fix for Pg 7.3,
 
 2002-12-16 02:47  ivan
 
-       * httemplate/graph/money_time.cgi: working date range selector that
-         defaults to the past year!
+       * httemplate/graph/: money_time-graph.cgi, money_time.cgi: working
+         date range selector that defaults to the past year!
 
 2002-12-14 13:18  ivan
 
        * httemplate/misc/: meta-import.cgi, process/meta-import.cgi:
          beginning of web-based data importer
 
+2002-12-09 02:54  ivan
+
+       * httemplate/docs/install.html: doc
+
 2002-12-04 04:43  ivan
 
        * bin/bind.export: really fixed now
 
 2002-11-27 21:10  ivan
 
-       * FS/FS/Conf.pm: deprecate username_policy
+       * FS/FS/Conf.pm, httemplate/docs/upgrade8.html: deprecate
+         username_policy
 
 2002-11-26 03:58  ivan
 
 
 2002-11-20 01:07  ivan
 
-       * FS/bin/freeside-setup: ugh... need to increase length of payinfo
-         field in cust_pay and cust_refund for ACH
+       * FS/bin/freeside-setup, httemplate/docs/upgrade9.html: ugh... need
+         to increase length of payinfo field in cust_pay and cust_refund
+         for ACH
 
 2002-11-19 14:55  ivan
 
 
        * FS/FS/cust_main.pm: doc
 
+2002-11-05 21:41  ivan
+
+       * httemplate/graph/money_time-graph.cgi: lala
+
 2002-11-05 20:23  ivan
 
        * FS/FS/part_pkg.pm: safe regex for sqlradius hour/data billing,
 
        * FS/bin/freeside-sqlradius-radacctd: lost?
 
+2002-11-04 18:15  ivan
+
+       * httemplate/graph/money_time-graph.cgi: local kludge
+
 2002-11-04 15:40  ivan
 
        * FS/FS/CGI.pm: balance on small_custview
 
+2002-11-04 13:20  ivan
+
+       * httemplate/docs/upgrade9.html: doc
+
 2002-11-04 12:51  ivan
 
        * httemplate/view/svc_acct.cgi: fix cosmetic bug on online time
 
 2002-11-01 16:13  ivan
 
-       * httemplate/graph/money_time.cgi: whew, glad i had a copy of this
+       * httemplate/graph/: money_time-graph.cgi, money_time.cgi: whew,
+         glad i had a copy of this
 
 2002-10-28 05:22  ivan
 
 
 2002-10-19 20:28  ivan
 
-       * FS/FS/: part_export.pm, part_export/vpopmail.pm: vpopmail restart
-         export option
+       * FS/FS/part_export.pm, FS/FS/part_export/vpopmail.pm,
+         eg/vpopmailrestart: vpopmail restart export option
 
 2002-10-18 09:54  ivan
 
          httemplate/view/svc_acct.cgi: radacct update: use sqlradius for
          datasrc, not plandata options (whew)
 
+2002-10-17 04:17  ivan
+
+       * httemplate/search/cust_bill.cgi: another mason fix, this one from
+         5
+
 2002-10-15 02:54  ivan
 
        * FS/FS/cust_bill.pm: ach fix s/ECHECK/CHECK/
 
 2002-10-13 00:14  ivan
 
-       * httemplate/docs/session.html: doh
+       * httemplate/docs/: session.html, upgrade9.html: doh
+
+2002-10-13 00:13  ivan
+
+       * httemplate/docs/upgrade9.html: msgcat docs for upgrade
+
+2002-10-12 23:49  ivan
+
+       * httemplate/docs/install.html: don't use ILIKE (7.1-ism) anymore
 
 2002-10-12 18:14  ivan
 
 
 2002-10-12 06:46  ivan
 
-       * httemplate/: edit/cust_main.cgi, view/cust_main.cgi:
-         dayphone/nightphone as customizable labels, closes: Bug#464
+       * bin/populate-msgcat, httemplate/edit/cust_main.cgi,
+         httemplate/view/cust_main.cgi: dayphone/nightphone as
+         customizable labels, closes: Bug#464
 
 2002-10-12 06:26  ivan
 
 2002-10-04 05:56  ivan
 
        * FS/FS/type_pkgs.pm, FS/FS/part_export/sqlradius.pm,
-         FS/bin/freeside-setup, httemplate/edit/process/cust_pkg.cgi,
+         FS/bin/freeside-setup, httemplate/docs/install.html,
+         httemplate/edit/process/cust_pkg.cgi,
          httemplate/misc/change_pkg.cgi, httemplate/search/cust_main.cgi,
          httemplate/view/cust_main.cgi: working on the road:   - easier
          "change package" link for changing one package to another   -
 
        * FS/FS/UID.pm: don't chop blanks
 
+2002-09-26 23:00  ivan
+
+       * htetc/global.asa: only load Devel::AutoProfiler if it is
+         installed
+
 2002-09-26 22:36  ivan
 
        * FS/bin/freeside-adduser: lock mapsecrets file
 
 2002-09-25 02:11  ivan
 
-       * Makefile: doc
+       * Makefile, httemplate/docs/install.html: doc
 
 2002-09-25 02:09  ivan
 
 
 2002-09-23 07:27  ivan
 
-       * FS/FS/CGI.pm, htetc/handler.pl: global.asa changes for profiling
-         redirects header-handling changes necessary for chart .cgis
+       * FS/FS/CGI.pm, htetc/global.asa, htetc/handler.pl: global.asa
+         changes for profiling redirects header-handling changes necessary
+         for chart .cgis
 
 2002-09-23 01:50  ivan
 
 
 2002-09-21 04:17  ivan
 
-       * FS/bin/freeside-setup, httemplate/docs/schema.dia,
-         httemplate/docs/schema.html, FS/FS/cust_bill.pm,
-         FS/FS/cust_bill_pkg.pm, FS/FS/cust_main.pm,
-         FS/FS/cust_main_county.pm,
-         httemplate/browse/cust_main_county.cgi: all taxes now have names.
-         closes: Bug#15
+       * README.1.5.0pre1, FS/bin/freeside-setup,
+         httemplate/docs/schema.dia, httemplate/docs/schema.html,
+         FS/FS/cust_bill.pm, FS/FS/cust_bill_pkg.pm, FS/FS/cust_main.pm,
+         FS/FS/cust_main_county.pm, bin/create-history-tables,
+         httemplate/browse/cust_main_county.cgi,
+         httemplate/edit/cust_main_county.cgi,
+         httemplate/edit/process/cust_main_county.cgi: all taxes now have
+         names.  closes: Bug#15
 
 2002-09-20 08:49  ivan
 
 
 2002-09-20 08:47  ivan
 
-       * FS/: MANIFEST, bin/freeside-addoutsourceuser,
-         bin/freeside-deloutsource, bin/freeside-deloutsourceuser,
-         bin/freeside-deluser, bin/freeside-setup: add freeside-deluser,
-         freeside-deloutsource and freeside-deloutsourceuser
+       * FS/MANIFEST, FS/bin/freeside-addoutsourceuser,
+         FS/bin/freeside-deloutsource, FS/bin/freeside-deloutsourceuser,
+         FS/bin/freeside-deluser, FS/bin/freeside-setup,
+         bin/populate-msgcat: add freeside-deluser, freeside-deloutsource
+         and freeside-deloutsourceuser
 
 2002-09-20 08:46  ivan
 
 
 2002-09-20 05:50  ivan
 
-       * FS/bin/freeside-setup: move from bin/fs-setup to
+       * FS/bin/freeside-setup, bin/fs-setup,
+         httemplate/docs/install.html: move from bin/fs-setup to
          FS/bin/freeside-setup
 
+2002-09-20 05:04  ivan
+
+       * README.1.5.0pre1, httemplate/docs/install.html: doc NetAddr::IP
+         dependancy
+
 2002-09-20 03:16  ivan
 
-       * FS/FS/UID.pm: change otaker fields to 32 chars
+       * README.1.5.0pre1, FS/FS/UID.pm, bin/fs-setup: change otaker
+         fields to 32 chars
 
 2002-09-19 06:34  ivan
 
-       * FS/FS/Record.pm: use database SERIAL or AUTO_INCREMENT for
-         primary keys, finally, yay! closes: bug#69
+       * bin/fs-setup, FS/FS/Record.pm, bin/dbdef-create: use database
+         SERIAL or AUTO_INCREMENT for primary keys, finally, yay! closes:
+         bug#69
+
+2002-09-19 06:25  ivan
+
+       * README.1.5.0pre1: preliminary upgrade instructions
 
 2002-09-19 01:43  ivan
 
 
        * FS/FS/svc_acct.pm: remove extra definition of $cust_pkg
 
+2002-09-19 00:15  ivan
+
+       * httemplate/view/cust_pkg.cgi: cancel later in view UI... hmm
+
 2002-09-18 15:50  ivan
 
        * FS/FS/Conf.pm, FS/FS/cust_main_invoice.pm, FS/FS/svc_acct.pm,
 
 2002-09-18 05:10  ivan
 
-       * httemplate/docs/: index.html, legacy.html: doc
+       * httemplate/docs/: index.html, legacy.html, upgrade4.html,
+         upgrade5.html, upgrade6.html: doc
 
 2002-09-17 03:21  ivan
 
 
        * FS/FS.pm, FS/MANIFEST, FS/FS/InitHandler.pm, FS/FS/cust_pkg.pm,
          FS/FS/part_export.pm, FS/FS/part_svc.pm, FS/FS/svc_acct.pm,
-         httemplate/index.html, httemplate/docs/schema.dia,
-         httemplate/docs/schema.html, httemplate/edit/part_svc.cgi,
-         httemplate/edit/process/part_svc.cgi, httemplate/misc/link.cgi,
-         httemplate/search/svc_domain.cgi: remove svc_acct_sm
+         FS/FS/svc_acct_sm.pm, FS/t/svc_acct_sm.t, httemplate/index.html,
+         httemplate/docs/schema.dia, httemplate/docs/schema.html,
+         httemplate/edit/part_svc.cgi, httemplate/edit/svc_acct_sm.cgi,
+         httemplate/edit/process/part_svc.cgi,
+         httemplate/edit/process/svc_acct_sm.cgi,
+         httemplate/misc/link.cgi, httemplate/search/svc_acct_sm.cgi,
+         httemplate/search/svc_acct_sm.html,
+         httemplate/search/svc_domain.cgi,
+         httemplate/view/svc_acct_sm.cgi: remove svc_acct_sm
 
 2002-09-16 17:40  ivan
 
          stop
              overwriting existing invoice destinations
 
+2002-09-16 02:27  ivan
+
+       * FS/bin/freeside-expiration-alerter: skip empty expiration dates
+
 2002-09-11 02:28  ivan
 
        * httemplate/browse/svc_acct_pop.cgi: mason error
        * FS/FS/cust_bill.pm: Business::OnlinePaymet fix for processors w/o
          order numbers, like VirtualNet
 
+2002-09-09 17:37  ivan
+
+       * httemplate/docs/upgrade9.html: doc: need Net::SSH 0.07 for 1.4.1
+
 2002-09-09 16:05  khoff
 
-       * httemplate/: edit/svc_broadband.cgi,
+       * httemplate/: browse/ac.cgi, browse/ac_type.cgi, edit/ac.cgi,
+         edit/ac_type.cgi, edit/svc_broadband.cgi, edit/process/ac.cgi,
+         edit/process/ac_block.cgi, edit/process/ac_field.cgi,
+         edit/process/ac_type.cgi, edit/process/part_ac_field.cgi,
          edit/process/svc_broadband.cgi, view/svc_broadband.cgi:
          svc_broadband merge
 
 2002-09-09 16:01  khoff
 
-       * FS/FS/cust_svc.pm, FS/FS/part_export.pm, httemplate/index.html,
+       * FS/FS/cust_svc.pm, FS/FS/part_export.pm, bin/fs-setup,
+         htetc/global.asa, httemplate/index.html,
          httemplate/edit/part_svc.cgi,
-         httemplate/edit/process/part_svc.cgi, FS/FS/svc_broadband.pm:
-         svc_broadband merge
+         httemplate/edit/process/part_svc.cgi, FS/FS/ac.pm,
+         FS/FS/ac_block.pm, FS/FS/ac_field.pm, FS/FS/ac_type.pm,
+         FS/FS/part_ac_field.pm, FS/FS/svc_broadband.pm: svc_broadband
+         merge
+
+2002-09-09 15:57  ivan
+
+       * FS/bin/: freeside-cc-receipts-report, freeside-credit-report,
+         freeside-receivables-report, freeside-tax-report: allow . in
+         untaint_argv, for usernames
 
 2002-09-09 15:56  khoff
 
 
 2002-09-06 19:27  ivan
 
-       * httemplate/docs/index.html: 1.4.1
+       * httemplate/docs/: index.html, upgrade9.html: 1.4.1
 
 2002-09-06 19:19  ivan
 
        * FS/FS/cust_bill.pm: Business::OnlinePayment::VitualNet
          compatibility
 
+2002-09-05 06:59  ivan
+
+       * ANNOUCE.1.4.0: naw
+
 2002-09-05 06:50  ivan
 
        * httemplate/browse/part_svc.cgi: don't show "clone an existing
 
 2002-08-11 23:17  ivan
 
-       * rt/: Makefile, bin/mason_handler.fcgi, bin/mason_handler.scgi,
-         bin/rt-mailgate, etc/schema.Pg, lib/RT.pm, lib/RT/Record.pm:
-         import rt 2.0.14
+       * rt/: COPYING, ChangeLog, Makefile, README, TODO,
+         bin/initacls.Oracle, bin/initacls.Pg, bin/initacls.mysql,
+         bin/mason_handler.fcgi, bin/mason_handler.scgi, bin/rt,
+         bin/rt-mailgate, bin/rtadmin, bin/webmux.pl, docs/README.docs,
+         docs/Security, docs/rt.gif, docs/design_docs/CARS,
+         docs/design_docs/TransactionTypes.txt, docs/design_docs/acls,
+         docs/design_docs/basic-definitions.txt,
+         docs/design_docs/cli_spec, docs/design_docs/cvs_integration,
+         docs/design_docs/evil_plans,
+         docs/design_docs/link-definitions.txt,
+         docs/design_docs/local_hacking,
+         docs/design_docs/subscription-definitions.txt,
+         docs/design_docs/users, etc/acl.Oracle, etc/acl.Pg,
+         etc/acl.mysql, etc/config.pm, etc/rt.spec, etc/schema.Oracle,
+         etc/schema.Pg, etc/schema.mysql, etc/schema.pm, lib/MANIFEST,
+         lib/MANIFEST.SKIP, lib/Makefile.PL, lib/RT.pm, lib/test.pl,
+         lib/RT/ACE.pm, lib/RT/ACL.pm, lib/RT/Attachment.pm,
+         lib/RT/Attachments.pm, lib/RT/CurrentUser.pm, lib/RT/Date.pm,
+         lib/RT/EasySearch.pm, lib/RT/Group.pm, lib/RT/GroupMember.pm,
+         lib/RT/GroupMembers.pm, lib/RT/Groups.pm, lib/RT/Handle.pm,
+         lib/RT/Keyword.pm, lib/RT/KeywordSelect.pm,
+         lib/RT/KeywordSelects.pm, lib/RT/Keywords.pm, lib/RT/Link.pm,
+         lib/RT/Links.pm, lib/RT/ObjectKeyword.pm,
+         lib/RT/ObjectKeywords.pm, lib/RT/Queue.pm, lib/RT/Queues.pm,
+         lib/RT/Record.pm, lib/RT/Scrip.pm, lib/RT/ScripAction.pm,
+         lib/RT/ScripActions.pm, lib/RT/ScripCondition.pm,
+         lib/RT/ScripConditions.pm, lib/RT/Scrips.pm, lib/RT/Template.pm,
+         lib/RT/Templates.pm, lib/RT/TestHarness.pm, lib/RT/Ticket.pm,
+         lib/RT/Tickets.pm, lib/RT/Transaction.pm, lib/RT/Transactions.pm,
+         lib/RT/User.pm, lib/RT/Users.pm, lib/RT/Watcher.pm,
+         lib/RT/Watchers.pm, lib/RT/Action/Autoreply.pm,
+         lib/RT/Action/Generic.pm, lib/RT/Action/Notify.pm,
+         lib/RT/Action/NotifyAsComment.pm, lib/RT/Action/OpenDependent.pm,
+         lib/RT/Action/ResolveMembers.pm, lib/RT/Action/SendEmail.pm,
+         lib/RT/Action/SendPasswordEmail.pm,
+         lib/RT/Action/StallDependent.pm,
+         lib/RT/Condition/AnyTransaction.pm, lib/RT/Condition/Generic.pm,
+         lib/RT/Condition/NewDependency.pm,
+         lib/RT/Condition/StatusChange.pm, lib/RT/Interface/CLI.pm,
+         lib/RT/Interface/Email.pm, lib/RT/Interface/Web.pm: import rt
+         2.0.14
 
 2002-08-02 17:39  ivan
 
-       * httemplate/docs/legacy.html: remove some extra modules from
-         install doc
+       * httemplate/docs/: install.html, legacy.html: remove some extra
+         modules from install doc
 
 2002-07-31 11:55  ivan
 
        * FS/FS/: part_export.pm, part_export/shellcommands.pm:
          shellcommands edit gecos field too
 
+2002-07-25 18:38  ivan
+
+       * httemplate/docs/install.html: tyop
+
+2002-07-25 18:31  ivan
+
+       * httemplate/docs/install.html: tyop
+
 2002-07-23 05:37  ivan
 
        * FS/FS/svc_acct.pm: fix small bugs in duplicate username checking
        * FS/t/ClientAPI.t, fs_selfservice/FS-SelfService/cgi/passwd.html:
          adding
 
+2002-07-22 03:41  ivan
+
+       * httemplate/docs/install.html: no mysql in 1.4.0 release.
+         hopefully 1.4.1
+
 2002-07-22 03:20  ivan
 
-       * Makefile: 1.4.0
+       * ANNOUCE.1.4.0, Makefile, README.1.4.0pre11, README.1.4.0pre12,
+         README.1.4.0pre13, README.1.4.0pre14, README.1.4.0pre8,
+         README.1.4.0pre9: 1.4.0
 
 2002-07-22 03:18  ivan
 
 
 2002-07-16 05:28  ivan
 
-       * fs_selfservice/: DEPLOY, fs_passwd_test,
-         FS-SelfService/SelfService.pm,
+       * fs_selfservice/: DEPLOY, freeside-selfservice-server,
+         fs_passwd_test, FS-SelfService/SelfService.pm,
          FS-SelfService/freeside-selfservice-clientd,
          FS-SelfService/cgi/login.html, FS-SelfService/cgi/myaccount.html,
          FS-SelfService/cgi/selfservice.cgi,
 
 2002-07-15 01:28  ivan
 
-       * fs_selfservice/: fs_passwd_test,
+       * fs_selfservice/: freeside-selfservice-server, fs_passwd_test,
          FS-SelfService/freeside-selfservice-clientd: working framework,
          no hung clients, whew
 
 
        * bin/bind.import: finally a working DNS::ZoneParse
 
+2002-07-13 17:28  ivan
+
+       * httemplate/docs/: install.html, upgrade8.html: no mason 1.1x yet
+         :(
+
 2002-07-11 06:52  ivan
 
-       * fs_selfservice/: DEPLOY, fs_passwd_test, FS-SelfService/MANIFEST,
+       * fs_selfservice/: DEPLOY, freeside-selfservice-server,
+         fs_passwd_test, FS-SelfService/MANIFEST,
          FS-SelfService/SelfService.pm,
          FS-SelfService/freeside-selfservice-clientd: finally working
          async framework
        * httemplate/edit/: REAL_cust_pkg.cgi, process/REAL_cust_pkg.cgi:
          edit expiration dates
 
+2002-07-08 03:52  ivan
+
+       * httemplate/search/cust_bill.cgi: remove perl-side sort routines,
+         no longer needed
+
 2002-07-08 03:01  ivan
 
        * FS/FS/part_export.pm: default linux/netbsd shellcommand userdel
          should remove home directories
 
+2002-07-08 01:39  ivan
+
+       * httemplate/docs/install.html: new and improved instructions!  now
+         even more idiot proof!
+
 2002-07-07 10:49  ivan
 
        * FS/FS/svc_acct.pm: rewrite uid-dup checking to be
          new-export-aware, closes: #431
 
+2002-07-07 07:33  ivan
+
+       * httemplate/search/cust_bill.cgi: clean up after rewrite... turned
+         out rather nice
+
+2002-07-07 07:28  ivan
+
+       * httemplate/search/cust_bill.cgi: fixing 30/60/90/120...
+
+2002-07-07 07:26  ivan
+
+       * httemplate/search/cust_bill.cgi: just might work
+
+2002-07-07 07:24  ivan
+
+       * httemplate/search/cust_bill.cgi: that would be nice...
+
+2002-07-07 07:18  ivan
+
+       * httemplate/search/cust_bill.cgi: fix 30/60/90/120 browses
+
+2002-07-07 07:14  ivan
+
+       * httemplate/search/cust_bill.cgi: UI
+
+2002-07-07 07:12  ivan
+
+       * httemplate/search/cust_bill.cgi: totals and order by
+
+2002-07-07 07:00  ivan
+
+       * httemplate/search/cust_bill.cgi: try for correct totals
+
+2002-07-07 06:52  ivan
+
+       * httemplate/search/cust_bill.cgi: don't recalculate owed
+
+2002-07-07 06:31  ivan
+
+       * httemplate/search/cust_bill.cgi: comma
+
+2002-07-07 06:30  ivan
+
+       * httemplate/search/cust_bill.cgi: calculate owed as subquery here
+         too
+
+2002-07-07 06:25  ivan
+
+       * httemplate/search/cust_bill.cgi: don't forget to where the where
+         clause
+
+2002-07-07 06:23  ivan
+
+       * httemplate/search/cust_bill.cgi: try for working paged invoices,
+         this time with subqueries
+
+2002-07-07 04:45  ivan
+
+       * httemplate/search/cust_bill.cgi: wtf?
+
+2002-07-07 04:30  ivan
+
+       * httemplate/search/cust_bill.cgi: invoice search with possibly
+         working pager
+
+2002-07-07 04:03  ivan
+
+       * httemplate/search/cust_bill.cgi: move query logic from perl to
+         sql for scalability
+
+2002-07-06 05:53  ivan
+
+       * httemplate/docs/install.html: new!  improved!  now even more
+         idiot-proof!
+
 2002-07-06 05:15  ivan
 
        * Makefile: beta2
 
+2002-07-06 05:13  ivan
+
+       * bin/fs-setup: fix Can't use an undefined value as an ARRAY
+         reference at ./fs-setup line 209, <STDIN> line 3.
+
 2002-07-06 04:08  ivan
 
        * httemplate/: edit/svc_forward.cgi, view/svc_forward.cgi: fix UI
 
 2002-07-06 01:29  ivan
 
-       * httemplate/view/cust_main.cgi: speling
+       * httemplate/view/: cust_pkg.cgi, cust_main.cgi: speling
 
 2002-07-06 00:32  ivan
 
        * httemplate/edit/part_pkg.cgi: fix speling
 
+2002-07-06 00:31  ivan
+
+       * ANNOUCE.1.4.0: this file should probably go away soon...
+
 2002-07-06 00:30  ivan
 
        * FS/FS/: Conf.pm, part_export.pm, svc_www.pm,
 2002-07-04 03:35  ivan
 
        * httemplate/browse/: agent.cgi, agent_type.cgi,
-         part_bill_event.cgi, part_export.cgi, part_pkg.cgi, part_svc.cgi,
-         svc_acct_pop.cgi: move "add" links to the top
+         part_bill_event.cgi, part_export.cgi, part_pkg.cgi,
+         part_referral.cgi, part_svc.cgi, svc_acct_pop.cgi: move "add"
+         links to the top
 
 2002-07-03 07:45  ivan
 
 
        * FS/FS/part_export.pm: fix usermod commands for freebsd
 
+2002-07-02 07:38  ivan
+
+       * ANNOUCE.1.4.0: beta1!
+
 2002-07-02 07:37  ivan
 
        * Makefile: beta1!!
 
        * FS/bin/freeside-queued: grr old openssh grr freebsd
 
+2002-07-02 03:01  ivan
+
+       * httemplate/docs/install.html: freeside group
+
 2002-07-02 02:42  ivan
 
        * FS/bin/freeside-queued: fleabsd grr
 
 2002-06-30 04:01  ivan
 
-       * CREDITS: administrivia
+       * ANNOUCE.1.4.0, CREDITS: administrivia
 
 2002-06-30 00:17  ivan
 
 
 2002-06-28 13:31  ivan
 
-       * FS/FS/svc_acct.pm: better error message for illegal password
+       * FS/FS/svc_acct.pm, bin/populate-msgcat: better error message for
+         illegal password
+
+2002-06-28 13:23  ivan
+
+       * bin/fs-setup: not anymore...
 
 2002-06-28 13:21  ivan
 
 
 2002-06-26 00:42  ivan
 
-       * bin/: bsdshell.export, sysvshell.export: shell.export ->
-         bsdshell.export & sysvshell.export
+       * bin/: bsdshell.export, shell.export, sysvshell.export:
+         shell.export -> bsdshell.export & sysvshell.export
 
 2002-06-25 20:53  ivan
 
        * FS/FS/svc_acct.pm: better error messages on uid duplicates... uid
          stuff still needs to be rewritten for new exports
 
+2002-06-21 02:28  ivan
+
+       * httemplate/docs/upgrade8.html: don't forget part_svc in upgrades
+
 2002-06-21 02:15  ivan
 
        * bin/passwd.import: oops
 
        * bin/passwd.import: tiny bit better passwd.import
 
+2002-06-21 02:03  ivan
+
+       * httemplate/docs/upgrade8.html: doc
+
 2002-06-21 01:29  ivan
 
-       * httemplate/index.html: uid search on main menu, updated upgrade
-         docs
+       * httemplate/: index.html, docs/upgrade8.html: uid search on main
+         menu, updated upgrade docs
 
 2002-06-20 15:35  ivan
 
        * FS/FS/part_export/infostreet.pm: fix infostreet contact field foo
 
+2002-06-20 15:31  ivan
+
+       * httemplate/docs/install.html: doc
+
 2002-06-19 18:29  ivan
 
        * FS/FS/part_export.pm, FS/FS/part_export/shellcommands.pm,
 
 2002-06-14 04:26  ivan
 
-       * Makefile: 1.4.0pre14
+       * ANNOUCE.1.4.0, Makefile, README.1.4.0pre14: 1.4.0pre14
 
 2002-06-14 04:22  ivan
 
 
 2002-06-13 20:12  ivan
 
-       * httemplate/index.html: remove classic interface
+       * httemplate/: classic.html, index.html: remove classic interface
+
+2002-06-13 19:52  ivan
+
+       * httemplate/docs/: install.html, mysql.html: mysql support!
 
 2002-06-13 19:25  ivan
 
        * FS/FS/cust_main.pm: fix problems with code that resets invoice
          events
 
+2002-06-11 11:32  ivan
+
+       * bin/shell.export: don't export empty files
+
+2002-06-11 11:25  ivan
+
+       * bin/shell.export: use FS::cust_svc and FS::svc_acct
+
+2002-06-11 11:23  ivan
+
+       * bin/shell.export: bsd only for now
+
 2002-06-11 11:20  ivan
 
-       * bin/bind.export: perl 5.005 needs an explicit mask for mkdir
+       * bin/: bind.export, shell.export: perl 5.005 needs an explicit
+         mask for mkdir
 
 2002-06-11 02:51  ivan
 
 
 2002-06-11 02:46  ivan
 
-       * bin/bind.export: add preliminary bsd shell export
+       * bin/: bind.export, shell.export: add preliminary bsd shell export
 
 2002-06-11 02:14  ivan
 
 
 2002-06-09 18:39  khoff
 
-       * FS/FS/part_pkg.pm, FS/FS/pkg_svc.pm,
+       * FS/FS/part_pkg.pm, FS/FS/pkg_svc.pm, bin/fs-setup,
          httemplate/browse/part_pkg.cgi, httemplate/docs/schema.html,
          httemplate/edit/part_pkg.cgi: Rollback part_pkg.def_svcpart
          changes.
 
 2002-06-08 00:48  khoff
 
-       * FS/FS/part_pkg.pm, FS/FS/pkg_svc.pm,
+       * FS/FS/part_pkg.pm, FS/FS/pkg_svc.pm, bin/fs-setup,
          httemplate/browse/part_pkg.cgi, httemplate/docs/schema.html,
          httemplate/edit/part_pkg.cgi: Default svcpart support for
          part_pkg.  Fixes 'bug' with new customer and online signup.
        * httemplate/search/: cust_main.cgi, cust_pkg.cgi, svc_acct.cgi:
          more mysql goodness, thanks dale
 
+2002-06-04 10:37  ivan
+
+       * httemplate/docs/install.html: small doc patch from
+         baloo@gimpgirl.org
+
 2002-06-04 07:35  ivan
 
        * FS/FS/: cust_credit.pm, cust_pay.pm: fix unsuspendauto
 
        * conf/declinetemplate: misspelling
 
+2002-05-31 15:37  ivan
+
+       * bin/fs-setup: no state necessary in batch cards (i18n)
+
 2002-05-31 13:34  ivan
 
        * FS/FS/part_export.pm: dammit i want to catch export subclass
 
 2002-05-28 21:40  ivan
 
-       * fs_selfservice/FS-SelfService/: Changes, MANIFEST, Makefile.PL,
-         SelfService.pm, test.pl: add fs_selfservice
+       * fs_selfservice/: freeside-selfservice-server,
+         FS-SelfService/Changes, FS-SelfService/MANIFEST,
+         FS-SelfService/Makefile.PL, FS-SelfService/SelfService.pm,
+         FS-SelfService/test.pl: add fs_selfservice
 
 2002-05-28 14:22  ivan
 
-       * FS/FS/svc_acct.pm: better error message for "Illegal password"
+       * FS/FS/svc_acct.pm, bin/populate-msgcat: better error message for
+         "Illegal password"
 
 2002-05-28 00:55  ivan
 
 
 2002-05-23 06:00  ivan
 
-       * FS/FS/domain_record.pm, bin/bind.import,
-         httemplate/edit/process/domain_record.cgi,
+       * ANNOUCE.1.4.0, FS/FS/domain_record.pm, bin/bind.import,
+         bin/svc_domain.import, httemplate/edit/process/domain_record.cgi,
          httemplate/view/svc_domain.cgi: bind: allow adding slave domains
          too
 
 
        * FS/FS/part_export/sqlradius.pm: 5.6-isms
 
+2002-05-20 04:02  ivan
+
+       * bin/svc_domain.import: [no log message]
+
 2002-05-18 02:51  ivan
 
        * FS/FS/: cust_bill.pm, cust_pay.pm, svc_domain.pm: Mail::Internet
          1.44
 
+2002-05-17 06:51  ivan
+
+       * httemplate/docs/install.html: tyop
+
 2002-05-16 20:47  ivan
 
        * FS/FS/svc_acct.pm: freebsd `toor' user
          t/part_export-bsdshell.t, t/part_export-textradius.t: adding
          (stub) bsdshell and textradius exports
 
+2002-05-16 07:28  ivan
+
+       * bin/svc_acct.export: ip address is added by radius_reply method
+         already
+
 2002-05-16 07:27  ivan
 
        * FS/MANIFEST, eg/export_template.pm: add (stub) bsdshell and
 
        * FS/FS/svc_acct.pm: allow freebsd `toor' root user
 
+2002-05-16 00:53  ivan
+
+       * httemplate/docs/upgrade8.html: upgrade docs: run populate-msgcat
+
 2002-05-15 07:00  ivan
 
        * FS/FS/: queue.pm, part_export/sqlradius.pm: use job dependancies
 
 2002-05-15 06:24  ivan
 
-       * Makefile, FS/FS.pm, FS/MANIFEST, FS/FS/queue.pm,
-         FS/FS/queue_depend.pm, FS/FS/part_export/sqlradius.pm,
-         FS/bin/freeside-queued, FS/t/queue_depend.t,
-         eg/export_template.pm, httemplate/docs/schema.dia,
-         httemplate/docs/schema.html, httemplate/docs/schema.png: queue
-         dependancies
+       * ANNOUCE.1.4.0, Makefile, README.1.4.0pre13, FS/FS.pm,
+         FS/MANIFEST, FS/FS/queue.pm, FS/FS/queue_depend.pm,
+         FS/FS/part_export/sqlradius.pm, FS/bin/freeside-queued,
+         FS/t/queue_depend.t, bin/fs-setup, eg/export_template.pm,
+         httemplate/docs/install.html, httemplate/docs/schema.dia,
+         httemplate/docs/schema.html, httemplate/docs/schema.png,
+         httemplate/docs/upgrade8.html: queue dependancies
 
 2002-05-14 00:36  ivan
 
 
        * Makefile: INSTALLGROUP
 
+2002-05-09 09:41  ivan
+
+       * bin/populate-msgcat: permissions
+
 2002-05-09 08:26  ivan
 
        * Makefile: final make release?
        * httemplate/: edit/cust_main.cgi, view/cust_main.cgi:
          s/Referral/Advertising source/
 
+2002-05-09 08:14  ivan
+
+       * httemplate/docs/: install.html, mysql.html: attempt to avoid
+         people installing and asking for help with MySQL despite the VERY
+         FUCKING CLEAR instructions that it isn't supported.
+
 2002-05-09 08:12  ivan
 
        * FS/FS/cust_main_county.pm: don't duplicate state/county/country
 2002-05-09 05:38  ivan
 
        * FS/FS/Conf.pm, FS/FS/cust_main.pm, FS/FS/cust_main_county.pm,
-         FS/FS/part_pkg.pm, FS/t/cust_tax_exempt.t, htetc/handler.pl,
-         httemplate/browse/agent.cgi,
+         FS/FS/part_pkg.pm, FS/t/cust_tax_exempt.t, htetc/global.asa,
+         htetc/handler.pl, httemplate/browse/agent.cgi,
          httemplate/browse/cust_main_county.cgi,
          httemplate/edit/agent.cgi, httemplate/edit/cust_main.cgi,
          httemplate/edit/cust_main_county-expand.cgi,
+         httemplate/edit/cust_main_county.cgi,
          httemplate/edit/part_pkg.cgi,
-         httemplate/edit/process/cust_main_county-expand.cgi: texas tax!
+         httemplate/edit/process/cust_main_county-expand.cgi,
+         httemplate/edit/process/cust_main_county.cgi: texas tax!
 
 2002-05-06 06:36  ivan
 
 
 2002-05-04 08:00  ivan
 
-       * FS/FS.pm, FS/MANIFEST, FS/FS/cust_main_county.pm,
-         FS/FS/cust_tax_exempt.pm, FS/FS/part_pkg.pm,
+       * README.1.4.0pre12, FS/FS.pm, FS/MANIFEST,
+         FS/FS/cust_main_county.pm, FS/FS/cust_tax_exempt.pm,
+         FS/FS/part_pkg.pm, FS/t/cust_tax_exempt.pm, bin/fs-setup,
          httemplate/docs/admin.html, httemplate/docs/schema.dia,
-         httemplate/docs/schema.html: schema changes for proper texas tax
+         httemplate/docs/schema.html, httemplate/docs/upgrade8.html:
+         schema changes for proper texas tax
 
 2002-05-03 18:11  ivan
 
 
        * httemplate/search/cust_pkg.cgi: fix ranges on cust_pkg search
 
+2002-05-03 17:49  ivan
+
+       * httemplate/search/cust_pkg.html: point at correct .cgi
+
 2002-05-03 17:47  ivan
 
        * FS/FS/cust_pkg.pm: prevent stuff passed from template/user from
 
 2002-05-03 17:32  ivan
 
-       * httemplate/search/cust_pkg.cgi: lilunixbtch: trying to pull
-         accounts based on next billdate tofu_beast420: hmm a report
-         ordered by next bill date? tofu_beast420: i don't know how you'd
-         do that per _customer_ since a customer could have lots of
-         packages, but you could do a per-package report maybe?
+       * httemplate/search/: cust_pkg.cgi, cust_pkg.html: lilunixbtch:
+         trying to pull accounts based on next billdate tofu_beast420: hmm
+         a report ordered by next bill date? tofu_beast420: i don't know
+         how you'd do that per _customer_ since a customer could have lots
+         of packages, but you could do a per-package report maybe?
 
 2002-04-29 22:43  ivan
 
-       * FS/FS/part_export.pm: better BIND integration
+       * FS/FS/part_export.pm, bin/svc_domain.import: better BIND
+         integration
 
 2002-04-26 04:14  ivan
 
 
 2002-04-24 02:03  ivan
 
-       * FS/FS/cust_main.pm: msgcat error for credit card expiration
-         (closes: Bug#407)
+       * FS/FS/cust_main.pm, bin/populate-msgcat: msgcat error for credit
+         card expiration (closes: Bug#407)
 
 2002-04-23 00:32  ivan
 
 
 2002-04-20 05:37  ivan
 
-       * FS/FS/part_export.pm, httemplate/edit/part_export.cgi: bind
-         export
+       * ANNOUCE.1.4.0, FS/FS/part_export.pm,
+         httemplate/edit/part_export.cgi: bind export
 
 2002-04-20 04:57  ivan
 
        * FS/FS/domain_record.pm, FS/FS/part_export.pm, bin/passwd.import,
-         bin/svc_domain.erase, httemplate/docs/legacy.html:
+         bin/svc_domain.erase, bin/svc_domain.import,
+         httemplate/docs/legacy.html:
          working BIND import
 
 2002-04-20 03:49  ivan
 
        * FS/FS/domain_record.pm: allow uppercase zones...
 
+2002-04-19 23:34  ivan
+
+       * bin/populate-msgcat: perms
+
+2002-04-19 23:33  ivan
+
+       * bin/fs-setup: fixup fs-setup
+
 2002-04-19 19:06  ivan
 
        * FS/FS/: cust_pkg.pm, cust_svc.pm: fix problem with edge case
 
        * FS/FS/Record.pm: get rid of debugging cruft
 
+2002-04-16 22:48  ivan
+
+       * fs_passwd/fs_passwdd: forgotten semicolon
+
+2002-04-16 22:46  ivan
+
+       * fs_passwd/fs_passwdd: also untaint pid
+
+2002-04-16 22:44  ivan
+
+       * fs_passwd/fs_passwdd: *sigh*
+
+2002-04-16 22:42  ivan
+
+       * fs_passwd/fs_passwdd:
+         okay pid file has a change of working now
+
+2002-04-16 22:39  ivan
+
+       * fs_passwd/fs_passwdd: tyop
+
+2002-04-16 22:22  ivan
+
+       * fs_passwd/fs_passwdd: pid file foo
+
+2002-04-16 18:14  ivan
+
+       * fs_passwd/fs_passwd_server: kill off ssh kid on exit...
+
 2002-04-16 17:25  ivan
 
        * httemplate/search/cust_main.cgi: better ordering in search
 
 2002-04-16 15:52  ivan
 
-       * FS/FS/: Conf.pm, cust_bill.pm: further authorize.net description
-         debugging (agent??) and get rid of bad unique index on
-         cust_bill_event
+       * README.1.4.0pre12, FS/FS/Conf.pm, FS/FS/cust_bill.pm,
+         bin/fs-setup: further authorize.net description debugging
+         (agent??) and get rid of bad unique index on cust_bill_event
 
 2002-04-16 15:38  ivan
 
        * FS/FS/Conf.pm, FS/FS/cust_bill.pm, FS/FS/cust_bill_event.pm,
          httemplate/index.html, httemplate/search/cust_bill_event.cgi,
          httemplate/search/cust_bill_event.html,
+         httemplate/search/report_cc.html,
+         httemplate/search/report_credit.html,
          httemplate/search/report_tax.html, httemplate/view/cust_bill.cgi:
          report on failed billing events...
 
 2002-04-16 02:38  ivan
 
-       * FS/FS/Conf.pm, FS/FS/cust_bill.pm, conf/declinetemplate: - send a
-         notice to the customer when their card is declined - closes:
-         Bug#351 - freeside-expiration-alerter works fine, closes: Bug#7
+       * FS/FS/Conf.pm, FS/FS/cust_bill.pm,
+         FS/bin/freeside-expiration-alerter, conf/declinetemplate,
+         httemplate/docs/billing.html: - send a notice to the customer
+         when their card is declined - closes: Bug#351 -
+         freeside-expiration-alerter works fine, closes: Bug#7
 
 2002-04-16 01:52  ivan
 
          FS/FS/part_export/vpopmail.pm, FS/t/part_export-cp.t,
          FS/t/part_export-cyrus.t, FS/t/part_export-shellcommands.t,
          FS/t/part_export-vpopmail.t, eg/export_template.pm,
-         httemplate/docs/legacy.html, httemplate/docs/schema.dia,
-         httemplate/docs/schema.html, httemplate/docs/schema.png: - move
-         cyrus, shellcommands, CP exports exports to new-style - skeleton
-         files for vpopmail exports - documentation updates - add big
-         schema diagram to docs
+         httemplate/docs/billing.html, httemplate/docs/legacy.html,
+         httemplate/docs/schema.dia, httemplate/docs/schema.html,
+         httemplate/docs/schema.png: - move cyrus, shellcommands, CP
+         exports exports to new-style - skeleton files for vpopmail
+         exports - documentation updates - add big schema diagram to docs
+
+2002-04-13 18:36  ivan
+
+       * httemplate/docs/billing.html: docu for invoice_lines(0) with no
+         arguments
 
 2002-04-13 06:36  ivan
 
        * FS/FS.pm, FS/FS/Conf.pm, FS/FS/part_export.pm, FS/FS/svc_acct.pm,
-         FS/FS/part_export/cp.pm, FS/bin/freeside-sqlradius-reset,
+         FS/FS/part_export/cp.pm, FS/bin/freeside-overdue,
+         FS/bin/freeside-sqlradius-reset, bin/sqlradius_reset,
          httemplate/edit/part_export.cgi: - documentation updates - move
          Critical Path export to new-style export - bin/sqlradius_reset
          gets a manpage and becomes FS/bin/freeside-sqlradius-reset
        * FS/MANIFEST, FS/FS/Msgcat.pm, FS/FS/Record.pm,
          FS/FS/cust_main.pm, FS/FS/cust_main_invoice.pm, FS/FS/msgcat.pm,
          FS/FS/part_export.pm, FS/FS/svc_acct.pm, FS/t/Msgcat.t,
-         htetc/handler.pl, httemplate/browse/part_svc.cgi,
-         httemplate/edit/part_export.cgi, httemplate/edit/part_svc.cgi,
+         htetc/global.asa, htetc/handler.pl,
+         httemplate/browse/part_svc.cgi, httemplate/edit/part_export.cgi,
+         httemplate/edit/part_svc.cgi,
          httemplate/edit/process/agent_type.cgi,
          httemplate/edit/process/part_export.cgi,
          httemplate/edit/process/part_svc.cgi,
 
 2002-04-11 15:05  ivan
 
-       * FS/FS.pm, FS/MANIFEST, FS/FS/export_svc.pm, FS/FS/part_export.pm,
-         FS/FS/part_svc.pm, FS/t/export_svc.t, httemplate/index.html,
+       * README.1.4.0pre12, FS/FS.pm, FS/MANIFEST, FS/FS/export_svc.pm,
+         FS/FS/part_export.pm, FS/FS/part_svc.pm, FS/t/export_svc.t,
+         bin/fs-setup, bin/sqlradius_reset, httemplate/index.html,
          httemplate/browse/part_export.cgi,
          httemplate/browse/part_svc.cgi, httemplate/docs/schema.html,
-         httemplate/edit/part_export.cgi,
+         httemplate/docs/upgrade8.html, httemplate/edit/part_export.cgi,
          httemplate/edit/process/part_export.cgi,
          httemplate/misc/delete-part_export.cgi: (almost) everything for
          bug#375 - create export_svc table - part_svc to part_export is
 
 2002-04-10 06:42  ivan
 
-       * FS/FS/Conf.pm, FS/FS/Record.pm, FS/FS/cust_main.pm,
-         FS/FS/cust_main_invoice.pm, FS/FS/svc_acct.pm,
-         FS/FS/svc_acct_pop.pm, httemplate/browse/msgcat.cgi,
-         httemplate/docs/signup.html, httemplate/edit/msgcat.cgi,
+       * ANNOUCE.1.4.0, README.1.4.0pre12, FS/FS/Conf.pm, FS/FS/Record.pm,
+         FS/FS/cust_main.pm, FS/FS/cust_main_invoice.pm,
+         FS/FS/svc_acct.pm, FS/FS/svc_acct_pop.pm, bin/populate-msgcat,
+         httemplate/browse/msgcat.cgi, httemplate/docs/signup.html,
+         httemplate/docs/upgrade8.html, httemplate/edit/msgcat.cgi,
          httemplate/edit/process/msgcat.cgi: bulk checkin from working on
          the road:
 
          on errors - httemplate/edit/process/msgcat.cgi - don't update
          identical fields
 
+2002-04-10 01:39  ivan
+
+       * bin/fs-setup: fix mistake in part_pop_local schema (not used by
+         anyone really so no big deal)
+
 2002-04-06 22:23  ivan
 
        * FS/FS/: Conf.pm, cust_bill.pm, cust_pay.pm: send email on signup
 
 2002-04-06 21:56  ivan
 
-       * FS/FS/Conf.pm, FS/FS/msgcat.pm, conf/show-msgcat-codes,
-         httemplate/browse/msgcat.cgi, httemplate/edit/msgcat.cgi,
+       * FS/FS/Conf.pm, FS/FS/msgcat.pm, bin/populate-msgcat,
+         conf/show-msgcat-codes, httemplate/browse/msgcat.cgi,
+         httemplate/docs/install.html, httemplate/edit/msgcat.cgi,
          httemplate/edit/process/msgcat.cgi: working message catalogs (not
          used for enough yet) - almost (but not quite) closes Bug#385 -
          still have to catalog the   backend things triggered by signup
 
 2002-04-06 12:37  ivan
 
-       * httemplate/docs/signup.html: big signup server cleanups.  uses
-         Storable for network protocol now.  - makes Bugs 384 & 385 easier
-         - closes: Bug#382
+       * httemplate/docs/: install.html, signup.html: big signup server
+         cleanups.  uses Storable for network protocol now.  - makes Bugs
+         384 & 385 easier - closes: Bug#382
 
 2002-04-05 16:08  ivan
 
 
 2002-04-05 15:51  ivan
 
-       * CREDITS, Makefile, FS/MANIFEST, FS/FS/Conf.pm, FS/FS/msgcat.pm,
-         FS/FS/svc_acct.pm, FS/t/msgcat.t, bin/freeside-session-kill,
-         conf/locale, eg/table_template-svc.pm, eg/table_template.pm,
-         htetc/handler.pl, httemplate/index.html,
-         httemplate/browse/cust_main_county.cgi,
-         httemplate/browse/msgcat.cgi, httemplate/browse/svc_acct_pop.cgi,
-         httemplate/docs/schema.html, httemplate/edit/svc_acct.cgi,
+       * ANNOUCE.1.4.0, CREDITS, Makefile, README.1.4.0pre12, FS/MANIFEST,
+         FS/FS/Conf.pm, FS/FS/msgcat.pm, FS/FS/svc_acct.pm, FS/t/msgcat.t,
+         bin/freeside-session-kill, bin/fs-setup, bin/populate-msgcat,
+         bin/sqlradius_reset, conf/locale, eg/table_template-svc.pm,
+         eg/table_template.pm, htetc/global.asa, htetc/handler.pl,
+         httemplate/index.html, httemplate/browse/cust_main_county.cgi,
+         httemplate/browse/msgcat.cgi,
+         httemplate/browse/part_referral.cgi,
+         httemplate/browse/svc_acct_pop.cgi, httemplate/docs/schema.html,
+         httemplate/docs/upgrade8.html, httemplate/edit/svc_acct.cgi,
          httemplate/view/svc_acct.cgi: - add message catalog table &
          beginning of web interface - add security_phrase and conf option
          to svc_acct.pm - random other stuff
 
 2002-04-05 08:37  ivan
 
-       * eg/export_template.pm, FS/t/part_export-infostreet.t,
-         FS/t/part_export-sqlradius.t: oops forgot these from working on
-         the road
+       * eg/export_template.pm, httemplate/search/sql.cgi,
+         FS/t/part_export-infostreet.t, FS/t/part_export-sqlradius.t: oops
+         forgot these from working on the road
 
 2002-04-04 16:42  ivan
 
        * FS/MANIFEST, FS/FS/part_export.pm,
          FS/FS/part_export/infostreet.pm, FS/FS/part_export/sqlradius.pm,
-         httemplate/index.html, httemplate/edit/part_export.cgi: Checkin
-         of disparate changes from working on the road: - generic SQL
-         query - move exports out to their own files - small cleanup of
-         selfadmin server
+         httemplate/index.html, httemplate/docs/install.html,
+         httemplate/edit/part_export.cgi: Checkin of disparate changes
+         from working on the road: - generic SQL query - move exports out
+         to their own files - small cleanup of selfadmin server
+
+2002-03-29 18:35  ivan
+
+       * httemplate/edit/part_referral.cgi: finish up
+         s/referral/advertising source/
 
 2002-03-29 09:27  ivan
 
-       * htetc/handler.pl, httemplate/search/svc_acct.cgi: fix unlinked
-         svc browse!
+       * htetc/global.asa, htetc/handler.pl,
+         httemplate/search/svc_acct.cgi: fix unlinked svc browse!
+
+2002-03-27 16:18  ivan
+
+       * ANNOUCE.1.4.0: still pretty much just notes...
 
 2002-03-26 23:08  ivan
 
 2002-03-26 21:36  ivan
 
        * FS/FS/cust_main.pm, FS/FS/part_referral.pm,
-         httemplate/index.html, httemplate/docs/admin.html:
+         httemplate/index.html, httemplate/browse/part_referral.cgi,
+         httemplate/docs/admin.html, httemplate/edit/part_referral.cgi:
          s/referral/advertising source/
 
          yes, the name sucks.  got a better one?
 
+2002-03-26 15:18  ivan
+
+       * fs_passwd/fs_passwd.cgi: yay works now... just forgot to send
+         http header
+
 2002-03-26 08:24  ivan
 
        * httemplate/search/cust_main.cgi: simple visual fix: &nbsp; for
 
        * httemplate/docs/passwd.html: doc
 
+2002-03-26 05:04  ivan
+
+       * bin/create-history-tables: error message typo
+
 2002-03-26 04:35  ivan
 
        * httemplate/docs/admin.html: s/Add/Provision/
 2002-03-25 16:32  ivan
 
        * FS/FS/part_export.pm, FS/bin/freeside-queued,
-         httemplate/edit/part_export.cgi: further export bugfixing add 10
-         kid limit to freeside-queued sqlradius_reset now works (closes:
-         Bug#372)
+         bin/sqlradius_reset, httemplate/edit/part_export.cgi: further
+         export bugfixing add 10 kid limit to freeside-queued
+         sqlradius_reset now works (closes: Bug#372)
 
 2002-03-25 16:26  ivan
 
          search/cust_main.cgi: customers by otaker report (ugly
          search/cust_main.cgi mods; revert if they cause problems)
 
+2002-03-24 15:16  ivan
+
+       * bin/: icradius_reset, sqlradius_reset: s/icradius/sqlradius/
+
 2002-03-24 12:00  ivan
 
        * httemplate/: edit/cust_main.cgi, search/svc_acct.cgi,
 
 2002-03-22 10:56  ivan
 
-       * Makefile, FS/MANIFEST, FS/FS/cust_main_county.pm,
-         FS/FS/svc_acct.pm, FS/t/radius_usergroup.t,
-         httemplate/docs/schema.html, httemplate/edit/part_svc.cgi,
-         httemplate/edit/svc_acct.cgi, httemplate/view/svc_acct.cgi:
-         RADIUS groups on the way!
+       * Makefile, README.1.4.0pre12, FS/MANIFEST,
+         FS/FS/cust_main_county.pm, FS/FS/svc_acct.pm,
+         FS/t/radius_usergroup.t, bin/create-history-tables, bin/fs-setup,
+         httemplate/docs/schema.html, httemplate/docs/upgrade8.html,
+         httemplate/edit/part_svc.cgi, httemplate/edit/svc_acct.cgi,
+         httemplate/view/svc_acct.cgi: RADIUS groups on the way!
 
 2002-03-22 04:49  ivan
 
 
 2002-03-20 13:31  ivan
 
-       * FS/FS/Conf.pm, FS/FS/part_export.pm, FS/FS/part_export_option.pm,
-         FS/FS/part_svc.pm, FS/FS/svc_acct.pm, FS/bin/freeside-queued,
-         htetc/handler.pl, httemplate/edit/part_export.cgi,
+       * README.1.4.0pre12, FS/FS/Conf.pm, FS/FS/part_export.pm,
+         FS/FS/part_export_option.pm, FS/FS/part_svc.pm,
+         FS/FS/svc_acct.pm, FS/bin/freeside-queued, bin/icradius_reset,
+         bin/svc_acct.export, htetc/global.asa, htetc/handler.pl,
+         httemplate/docs/export.html, httemplate/docs/upgrade8.html,
+         httemplate/edit/part_export.cgi,
          httemplate/edit/process/part_export.cgi: new export!  infostreet
          and sqlradius provisioning switched over  (Bug #299 - doesn't
          close it, but all the groundwork is done)
        * FS/FS/: Conf.pm, Record.pm, cust_bill.pm, cust_pay.pm: fixes: bug
          #348 - adds the ability to email on deleted payments.
 
+2002-03-18 11:40  ivan
+
+       * httemplate/search/cust_main-quickpay.html: update quickpay for
+         current search capabilities
+
 2002-03-18 09:50  ivan
 
        * httemplate/config/config.cgi:
          in config editor, initial newlines in <textarea>s are lost.  even
          if you didn't mean to edit them you remove that..
 
+2002-03-18 08:07  ivan
+
+       * bin/backup-freeside: removing backup-freeside script from here
+
 2002-03-18 08:05  ivan
 
        * FS/FS/: svc_Common.pm, svc_acct.pm: handle inserting cust_svc and
 
 2002-03-18 01:10  ivan
 
-       * FS/FS/Conf.pm, FS/FS/svc_domain.pm,
+       * README.1.4.0pre12, FS/FS/Conf.pm, FS/FS/svc_domain.pm,
          httemplate/config/config-process.cgi,
-         httemplate/config/config-view.cgi, httemplate/config/config.cgi:
-         new config value `defaultrecords', documentation, javascript
-         config file editor
+         httemplate/config/config-view.cgi, httemplate/config/config.cgi,
+         httemplate/docs/upgrade8.html: new config value `defaultrecords',
+         documentation, javascript config file editor
 
 2002-03-17 00:33  ivan
 
 
 2002-03-12 07:33  ivan
 
-       * htetc/handler.pl, httemplate/edit/part_pkg.cgi,
-         httemplate/edit/part_svc.cgi: abstract stupid HTML layer trick
-         out to HTML::Widgets::SelectLayers
+       * README.1.4.0pre12, htetc/global.asa, htetc/handler.pl,
+         httemplate/docs/install.html, httemplate/docs/upgrade8.html,
+         httemplate/edit/part_pkg.cgi, httemplate/edit/part_svc.cgi:
+         abstract stupid HTML layer trick out to
+         HTML::Widgets::SelectLayers
 
 2002-03-09 02:19  khoff
 
        * FS/FS/: Conf.pm, svc_domain.pm: Support for default CNAME/A
          records
 
+2002-03-07 11:50  jeff
+
+       * FS/bin/: freeside-cc-receipts-report, freeside-credit-report,
+         freeside-expiration-alerter, freeside-receivables-report,
+         freeside-tax-report: less shelling, more perly - abolish some
+         pipes to sendmail
+
 2002-03-07 06:13  ivan
 
        * FS/FS/cust_bill.pm: better error msgs for mail errors
 
        * conf/invoice_from: oops, missing invoice_from
 
+2002-03-06 15:31  ivan
+
+       * httemplate/docs/upgrade8.html: add freeside-expiration-alerter to
+         upgrade8.html
+
 2002-03-06 14:44  jeff
 
-       * FS/MANIFEST, FS/FS/Conf.pm, conf/alerter_template,
+       * README.1.4.0pre12, FS/MANIFEST, FS/FS/Conf.pm,
+         FS/bin/freeside-expiration-alerter, conf/alerter_template,
          httemplate/docs/admin.html: billing expiration alerts
 
+2002-03-05 16:17  ivan
+
+       * FS/bin/: freeside-cc-receipts-report, freeside-credit-report,
+         freeside-receivables-report, freeside-tax-report: remove CVS Log
+         tag
+
 2002-03-05 15:13  jeff
 
-       * httemplate/search/report_tax.cgi: consistency is nice
+       * FS/bin/freeside-cc-receipts-report,
+         FS/bin/freeside-credit-report,
+         FS/bin/freeside-receivables-report, FS/bin/freeside-tax-report,
+         httemplate/search/report_cc.cgi,
+         httemplate/search/report_credit.cgi,
+         httemplate/search/report_tax.cgi: consistency is nice
+
+2002-03-05 01:44  ivan
+
+       * FS/bin/freeside-receivables-report: yes i have crazy customers
+         with 8-digit customer numbers
 
 2002-03-04 14:10  ivan
 
 
 2002-03-04 04:48  ivan
 
-       * Makefile, FS/FS/Record.pm, FS/FS/nas.pm, bin/fs-radius-add-check,
-         bin/fs-radius-add-reply: [no log message]
+       * Makefile, README.1.4.0pre12, FS/FS/Record.pm, FS/FS/nas.pm,
+         bin/create-history-tables, bin/fs-radius-add-check,
+         bin/fs-radius-add-reply, bin/fs-setup,
+         httemplate/docs/upgrade8.html: [no log message]
+
+2002-03-03 15:46  ivan
+
+       * httemplate/docs/install.html: docu
 
 2002-02-28 15:30  ivan
 
 
 2002-02-27 14:39  ivan
 
-       * FS/FS/cust_bill_event.pm, httemplate/docs/schema.html,
+       * README.1.4.0pre12, FS/FS/cust_bill_event.pm, bin/fs-setup,
+         httemplate/docs/schema.html, httemplate/docs/upgrade8.html,
          httemplate/view/cust_bill.cgi: add status and statustext fields
          to cust_bill_event
 
 
        * FS/: FS/cust_main.pm, bin/freeside-daily: better debugging
 
+2002-02-27 09:07  khoff
+
+       * httemplate/docs/upgrade8.html: Should be "CREATE TABLE" not
+         "CREATE INDEX" for part_export_option
+
 2002-02-26 14:09  ivan
 
-       * httemplate/search/: report_receivables.cgi, report_tax.cgi: fixup
-         reports for templated webUI
+       * httemplate/search/: report_cc.cgi, report_credit.cgi,
+         report_receivables.cgi, report_tax.cgi: fixup reports for
+         templated webUI
 
 2002-02-26 03:53  ivan
 
 
 2002-02-23 14:36  ivan
 
-       * httemplate/search/: report_receivables.cgi, report_tax.cgi: take
-         hardcoded paths out of report cgis
+       * httemplate/search/: report_cc.cgi, report_credit.cgi,
+         report_receivables.cgi, report_tax.cgi: take hardcoded paths out
+         of report cgis
 
 2002-02-23 03:56  ivan
 
 
 2002-02-22 18:14  jeff
 
-       * FS/FS/UID.pm, httemplate/search/report_receivables.cgi,
+       * FS/FS/UID.pm, bin/svc_acct.export,
+         httemplate/search/report_cc.cgi,
+         httemplate/search/report_credit.cgi,
+         httemplate/search/report_receivables.cgi,
          httemplate/search/report_tax.cgi: report fixes and cruft removal
 
 2002-02-22 18:02  ivan
 
-       * httemplate/index.html: UI work on main menu, remove Archive::Tar
-         from docs
+       * httemplate/: index.html, docs/install.html, docs/upgrade8.html:
+         UI work on main menu, remove Archive::Tar from docs
 
 2002-02-22 15:18  jeff
 
-       * FS/MANIFEST, httemplate/index.html,
+       * FS/MANIFEST, FS/bin/freeside-cc-receipts-report,
+         FS/bin/freeside-credit-report,
+         FS/bin/freeside-receivables-report, FS/bin/freeside-tax-report,
+         conf/report_template, httemplate/classic.html,
+         httemplate/index.html, httemplate/search/report_cc.cgi,
+         httemplate/search/report_cc.html,
+         httemplate/search/report_credit.cgi,
+         httemplate/search/report_credit.html,
          httemplate/search/report_receivables.cgi,
          httemplate/search/report_tax.cgi,
          httemplate/search/report_tax.html: add some reporting features
        * FS/FS/svc_acct.pm: freeside *SUSPENDED* -> CP set_mailbox_status
          OTHER/OTHER_BOUNCE
 
+2002-02-21 23:50  ivan
+
+       * bin/fs-setup: doh
+
 2002-02-21 22:42  ivan
 
        * FS/FS/queue.pm: UI in joblisting: don't split ( retry | remove )
 
 2002-02-21 17:07  ivan
 
-       * FS/FS/Conf.pm, httemplate/view/cust_main.cgi: UI work:
+       * FS/FS/Conf.pm, httemplate/view/cust_main.cgi,
+         httemplate/view/cust_pkg.cgi: UI work:
 
          make all functions of view/cust_pkg.cgi available on
          view/cust_main.cgi  - having them one link down in "Edit" is
 
          closes: Bug#325
 
+2002-02-21 15:17  ivan
+
+       * bin/fs-setup: queue.svcnum is nullable too, oops
+
+2002-02-21 13:43  ivan
+
+       * bin/fs-setup: looks like statustext field is missing NULL flag in
+         fs-setup
+
 2002-02-20 14:03  ivan
 
        * httemplate/index.html: invoice reports belong here too
 
 2002-02-19 17:03  ivan
 
-       * CREDITS, FS/FS/CGI.pm, FS/FS/Record.pm, FS/FS/queue.pm,
-         FS/FS/svc_acct.pm, FS/FS/svc_domain.pm, FS/FS/svc_forward.pm,
-         FS/bin/freeside-queued, htetc/handler.pl, httemplate/index.html,
-         httemplate/misc/queue.cgi, httemplate/view/svc_acct.cgi,
-         httemplate/view/svc_domain.cgi, httemplate/view/svc_forward.cgi,
-         httemplate/view/svc_www.cgi: use Net::SSH::ssh_cmd for all job
-         queueing rather than local duplicated ssh subs
+       * CREDITS, README.1.4.0pre11, README.1.4.0pre8, FS/FS/CGI.pm,
+         FS/FS/Record.pm, FS/FS/queue.pm, FS/FS/svc_acct.pm,
+         FS/FS/svc_domain.pm, FS/FS/svc_forward.pm,
+         FS/bin/freeside-queued, bin/fs-setup, htetc/global.asa,
+         htetc/handler.pl, httemplate/index.html,
+         httemplate/browse/queue.cgi, httemplate/misc/queue.cgi,
+         httemplate/view/svc_acct.cgi, httemplate/view/svc_domain.cgi,
+         httemplate/view/svc_forward.cgi, httemplate/view/svc_www.cgi: use
+         Net::SSH::ssh_cmd for all job queueing rather than local
+         duplicated ssh subs
 
          queue daemon updates: retry & remove links work, bubble up error
          message to webinterface, link to svcnum & have job listings on
 
 2002-02-19 15:43  ivan
 
-       * httemplate/docs/schema.html: set EVERYTHING=1 for your own
-         mod_perl compile
+       * httemplate/docs/: install.html, schema.html, upgrade8.html: set
+         EVERYTHING=1 for your own mod_perl compile
 
 2002-02-18 23:51  ivan
 
        * httemplate/index.html: oops
 
+2002-02-18 23:00  ivan
+
+       * httemplate/classic.html: TMTOWTDI
+
 2002-02-18 20:43  ivan
 
        * httemplate/index.html: new main menu!
 2002-02-18 00:39  ivan
 
        * FS/FS/Conf.pm, FS/FS/part_bill_event.pm, FS/FS/part_pkg.pm,
-         httemplate/edit/part_pkg.cgi: safe web demo operation!  closes:
-         Bug#217
+         htetc/global.asa, httemplate/edit/part_pkg.cgi: safe web demo
+         operation!  closes: Bug#217
 
          fix bug in edit/part_pkg: s/bkg/pkg/
 
        * httemplate/edit/part_svc.cgi: fix modified <SELECT>s under
          netcape4, use one for svc_acct.popnum too
 
+2002-02-17 17:26  ivan
+
+       * README.1.4.0pre11, httemplate/docs/install.html,
+         httemplate/docs/upgrade8.html: rsync docs
+
 2002-02-17 16:21  jeff
 
        * Makefile: keep accidentally checking in Makefile changes, gotta
 
 2002-02-17 16:13  jeff
 
-       * Makefile, FS/FS/Conf.pm: trading in tar for rsync for improved
-         vpopmail support
+       * Makefile, FS/FS/Conf.pm, bin/svc_acct.export, eg/vpopmailrestart:
+         trading in tar for rsync for improved vpopmail support
 
 2002-02-17 13:01  ivan
 
 
 2002-02-17 11:12  ivan
 
-       * FS/MANIFEST: get ride of CGIwrapper.pm
+       * README.1.4.0pre9, FS/MANIFEST, FS/FS/CGIwrapper.pm,
+         FS/t/CGIwrapper.t: get ride of CGIwrapper.pm
 
 2002-02-17 11:07  jeff
 
        * FS/FS/svc_forward.pm: queue svc_forward remote commands; better
          commands too
 
+2002-02-16 13:47  ivan
+
+       * htetc/global.asa: work with current Apache::ASP
+
+2002-02-16 10:14  ivan
+
+       * TODO: now in RT2!
+
+2002-02-15 23:27  ivan
+
+       * httemplate/docs/install.html: install warnings about mysql
+
+2002-02-15 12:21  jeff
+
+       * bin/svc_acct.export: remove arbitary uid requirement for vpasswd
+         generation
+
 2002-02-15 11:34  ivan
 
        * Makefile: keep accidentally checking in Makefile changes, gotta
 
        * Makefile, FS/FS/Conf.pm, FS/FS/svc_acct.pm: CP provisioning!!
 
+2002-02-14 14:37  jeff
+
+       * bin/svc_acct.export: fix bug in multiline radiusprepend
+
 2002-02-14 10:06  ivan
 
        * bin/: fs-radius-add-check, fs-radius-add-reply: docs?  haha
          Bill' );): Illegal or empty (text) comment:  at
          /usr/local/lib/perl5/site_perl/5.005/FS/cust_main.pm line 1141.
 
+2002-02-12 10:37  ivan
+
+       * bin/svc_acct.export: fixes:
+
+         In string, @domain now must be written as \@domain at
+         ./svc_acct.export line 292, near "^append @domain" Global symbol
+         "@domain" requires explicit package name at ./svc_acct.export
+         line 292.  Execution of ./svc_acct.export aborted due to
+         compilation errors.
+
 2002-02-11 21:58  ivan
 
-       * httemplate/docs/admin.html: fixes: bug#331
+       * README.1.4.0pre9, bin/fs-setup, httemplate/docs/admin.html:
+         fixes: bug#331
 
 2002-02-11 20:49  ivan
 
        * httemplate/edit/part_bill_event.cgi: oops
 
+2002-02-11 19:29  ivan
+
+       * README.1.4.0pre8, README.1.4.0pre9: 1.4.0pre9!!!
+
 2002-02-11 18:11  ivan
 
-       * FS/FS/Conf.pm, httemplate/config/config.cgi: add username_policy
-         "@append domain"
+       * FS/FS/Conf.pm, bin/svc_acct.export, httemplate/config/config.cgi:
+         add username_policy "@append domain"
 
          add "select" config type, mmm
 
 
 2002-02-10 11:58  ivan
 
-       * FS/MANIFEST, FS/bin/freeside-daily,
+       * FS/MANIFEST, FS/bin/freeside-bill, FS/bin/freeside-daily,
+         httemplate/docs/billing.html, httemplate/docs/upgrade8.html,
          httemplate/edit/process/part_bill_event.cgi: update billing
          documentation for the new world of invoice events added
          freeside-daily replacing freeside-bill for the new world of
 
 2002-02-10 10:56  ivan
 
-       * FS/FS/cust_pay.pm, httemplate/edit/cust_pay.cgi: use unique
-         tokens to prevent double-submission of payments in the web UI
-         (closes: Bug#320)
+       * README.1.4.0pre9, FS/FS/cust_pay.pm, bin/fs-setup,
+         httemplate/docs/upgrade8.html, httemplate/edit/cust_pay.cgi: use
+         unique tokens to prevent double-submission of payments in the web
+         UI (closes: Bug#320)
 
 2002-02-10 09:30  ivan
 
        * htetc/handler.pl, httemplate/browse/agent.cgi,
          httemplate/browse/agent_type.cgi,
          httemplate/browse/cust_main_county.cgi,
-         httemplate/browse/nas.cgi, httemplate/browse/part_bill_event.cgi,
-         httemplate/browse/part_pkg.cgi, httemplate/browse/part_svc.cgi,
+         httemplate/browse/cust_pay_batch.cgi, httemplate/browse/nas.cgi,
+         httemplate/browse/part_bill_event.cgi,
+         httemplate/browse/part_pkg.cgi,
+         httemplate/browse/part_referral.cgi,
+         httemplate/browse/part_svc.cgi, httemplate/browse/queue.cgi,
          httemplate/browse/svc_acct_pop.cgi,
          httemplate/config/config-process.cgi,
          httemplate/config/config-view.cgi, httemplate/config/config.cgi,
          httemplate/edit/cust_credit_bill.cgi,
          httemplate/edit/cust_main.cgi,
          httemplate/edit/cust_main_county-expand.cgi,
+         httemplate/edit/cust_main_county.cgi,
          httemplate/edit/cust_pay.cgi, httemplate/edit/cust_pkg.cgi,
          httemplate/edit/part_bill_event.cgi,
-         httemplate/edit/part_pkg.cgi, httemplate/edit/part_svc.cgi,
-         httemplate/edit/svc_acct.cgi, httemplate/edit/svc_acct_pop.cgi,
-         httemplate/edit/svc_domain.cgi, httemplate/edit/svc_forward.cgi,
+         httemplate/edit/part_pkg.cgi, httemplate/edit/part_referral.cgi,
+         httemplate/edit/part_svc.cgi, httemplate/edit/svc_acct.cgi,
+         httemplate/edit/svc_acct_pop.cgi,
+         httemplate/edit/svc_acct_sm.cgi, httemplate/edit/svc_domain.cgi,
+         httemplate/edit/svc_forward.cgi,
          httemplate/edit/process/quick-cust_pkg.cgi,
          httemplate/misc/bill.cgi, httemplate/misc/cancel-unaudited.cgi,
          httemplate/misc/catchall.cgi,
          httemplate/misc/delete-customer.cgi, httemplate/misc/link.cgi,
          httemplate/misc/process/link.cgi,
-         httemplate/search/cust_main.cgi, httemplate/search/cust_pay.cgi,
-         httemplate/search/cust_pkg.cgi, httemplate/search/svc_acct.cgi,
+         httemplate/search/cust_bill.cgi, httemplate/search/cust_main.cgi,
+         httemplate/search/cust_pay.cgi, httemplate/search/cust_pkg.cgi,
+         httemplate/search/svc_acct.cgi,
+         httemplate/search/svc_acct_sm.cgi,
          httemplate/search/svc_domain.cgi, httemplate/view/cust_bill.cgi,
-         httemplate/view/cust_main.cgi, httemplate/view/svc_acct.cgi,
+         httemplate/view/cust_main.cgi, httemplate/view/cust_pkg.cgi,
+         httemplate/view/svc_acct.cgi, httemplate/view/svc_acct_sm.cgi,
          httemplate/view/svc_domain.cgi, httemplate/view/svc_forward.cgi,
          httemplate/view/svc_www.cgi: *finally* seems to be working under
          Mason.  sheesh.  *finally* seems to be working under Mason.
        * htetc/handler.pl, httemplate/browse/agent.cgi,
          httemplate/browse/agent_type.cgi,
          httemplate/browse/cust_main_county.cgi,
-         httemplate/browse/nas.cgi, httemplate/browse/part_bill_event.cgi,
-         httemplate/browse/part_pkg.cgi, httemplate/browse/part_svc.cgi,
+         httemplate/browse/cust_pay_batch.cgi, httemplate/browse/nas.cgi,
+         httemplate/browse/part_bill_event.cgi,
+         httemplate/browse/part_pkg.cgi,
+         httemplate/browse/part_referral.cgi,
+         httemplate/browse/part_svc.cgi, httemplate/browse/queue.cgi,
          httemplate/browse/svc_acct_pop.cgi, httemplate/edit/agent.cgi,
          httemplate/edit/agent_type.cgi,
          httemplate/edit/cust_bill_pay.cgi,
          httemplate/edit/cust_credit_bill.cgi,
          httemplate/edit/cust_main.cgi,
          httemplate/edit/cust_main_county-expand.cgi,
+         httemplate/edit/cust_main_county.cgi,
          httemplate/edit/cust_pay.cgi, httemplate/edit/cust_pkg.cgi,
          httemplate/edit/part_bill_event.cgi,
-         httemplate/edit/part_pkg.cgi, httemplate/edit/part_svc.cgi,
-         httemplate/edit/svc_acct.cgi, httemplate/edit/svc_acct_pop.cgi,
-         httemplate/edit/svc_domain.cgi, httemplate/edit/svc_forward.cgi,
+         httemplate/edit/part_pkg.cgi, httemplate/edit/part_referral.cgi,
+         httemplate/edit/part_svc.cgi, httemplate/edit/svc_acct.cgi,
+         httemplate/edit/svc_acct_pop.cgi,
+         httemplate/edit/svc_acct_sm.cgi, httemplate/edit/svc_domain.cgi,
+         httemplate/edit/svc_forward.cgi,
          httemplate/edit/process/REAL_cust_pkg.cgi,
          httemplate/edit/process/agent.cgi,
          httemplate/edit/process/agent_type.cgi,
          httemplate/edit/process/cust_main.cgi,
          httemplate/edit/process/cust_main_county-collapse.cgi,
          httemplate/edit/process/cust_main_county-expand.cgi,
+         httemplate/edit/process/cust_main_county.cgi,
          httemplate/edit/process/cust_pay.cgi,
          httemplate/edit/process/cust_pkg.cgi,
          httemplate/edit/process/part_pkg.cgi,
+         httemplate/edit/process/part_referral.cgi,
          httemplate/edit/process/quick-cust_pkg.cgi,
          httemplate/edit/process/svc_acct.cgi,
          httemplate/edit/process/svc_acct_pop.cgi,
+         httemplate/edit/process/svc_acct_sm.cgi,
          httemplate/edit/process/svc_domain.cgi,
          httemplate/edit/process/svc_forward.cgi,
          httemplate/misc/bill.cgi, httemplate/misc/cancel-unaudited.cgi,
-         httemplate/misc/catchall.cgi,
+         httemplate/misc/cancel_pkg.cgi, httemplate/misc/catchall.cgi,
          httemplate/misc/delete-cust_pay.cgi,
-         httemplate/misc/delete-customer.cgi, httemplate/misc/link.cgi,
-         httemplate/misc/print-invoice.cgi,
+         httemplate/misc/delete-customer.cgi,
+         httemplate/misc/expire_pkg.cgi, httemplate/misc/link.cgi,
+         httemplate/misc/print-invoice.cgi, httemplate/misc/susp_pkg.cgi,
          httemplate/misc/unsusp_pkg.cgi,
          httemplate/misc/process/catchall.cgi,
          httemplate/misc/process/delete-customer.cgi,
-         httemplate/misc/process/link.cgi, httemplate/search/cust_pay.cgi,
+         httemplate/misc/process/link.cgi,
+         httemplate/search/cust_bill.cgi, httemplate/search/cust_pay.cgi,
          httemplate/search/cust_pkg.cgi, httemplate/search/svc_acct.cgi,
+         httemplate/search/svc_acct_sm.cgi,
          httemplate/search/svc_domain.cgi, httemplate/view/cust_bill.cgi,
-         httemplate/view/cust_main.cgi, httemplate/view/svc_acct.cgi,
+         httemplate/view/cust_main.cgi, httemplate/view/cust_pkg.cgi,
+         httemplate/view/svc_acct.cgi, httemplate/view/svc_acct_sm.cgi,
          httemplate/view/svc_domain.cgi, httemplate/view/svc_forward.cgi,
          httemplate/view/svc_www.cgi: removed <!-- $Id$ --> from all files
          to fix any redirects, whew
 
          add new comission plans
 
+2002-02-09 17:47  ivan
+
+       * README.1.4.0pre8, httemplate/docs/upgrade8.html,
+         FS/bin/freeside-bill: remove -i option from freeside-bill
+         (obsoleted by invoice events)
+
 2002-02-09 10:24  ivan
 
-       * FS/FS/CGI.pm, htetc/handler.pl,
+       * FS/FS/CGI.pm, htetc/global.asa, htetc/handler.pl,
          httemplate/edit/process/agent_type.cgi,
          httemplate/edit/process/cust_main_county-expand.cgi,
+         httemplate/edit/process/cust_main_county.cgi,
          httemplate/edit/process/cust_pay.cgi,
          httemplate/edit/process/part_pkg.cgi,
          httemplate/search/cust_main.cgi, httemplate/search/cust_pkg.cgi,
 
 2002-02-09 09:03  ivan
 
-       * FS/FS/CGI.pm, htetc/handler.pl: okay, both Apache::ASP and Mason
-         should set no-cache headers now (closes: Bug#23)
+       * FS/FS/CGI.pm, htetc/global.asa, htetc/handler.pl: okay, both
+         Apache::ASP and Mason should set no-cache headers now (closes:
+         Bug#23)
 
 2002-02-07 14:30  ivan
 
 
 2002-02-06 07:49  ivan
 
-       * Makefile: documentation building Makefile patch
+       * Makefile, httemplate/docs/install.html: documentation building
+         Makefile patch
 
 2002-02-06 07:36  ivan
 
        * FS/FS/part_bill_event.pm: part_bill_event.plan can contain
          punctuation
 
+2002-02-06 07:07  ivan
+
+       * bin/fs-setup: tyop
+
 2002-02-06 06:58  ivan
 
        * FS/bin/freeside-adduser: fix for non-file auth
        * FS/FS/Record.pm: better error messages if you haven't run
          fs-setup ?
 
+2002-02-05 10:24  ivan
+
+       * httemplate/docs/install.html: &nbsp; for commands; confusing
+         otherwise
+
+2002-02-05 10:04  ivan
+
+       * httemplate/docs/install.html: doc
+
 2002-02-05 08:48  ivan
 
-       * fs_passwd/fs_passwd, httemplate/docs/passwd.html: web-based
+       * fs_passwd/fs_passwd, fs_passwd/fs_passwd.cgi,
+         fs_passwd/fs_passwd.html, httemplate/docs/passwd.html: web-based
          password changer!
 
+2002-02-05 03:06  ivan
+
+       * httemplate/docs/upgrade8.html: don't need DBIx::DataSource for
+         upgrades
+
+2002-02-05 01:46  ivan
+
+       * httemplate/docs/: install.html, upgrade8.html: doc
+
+2002-02-04 23:57  ivan
+
+       * README.1.4.0pre8, httemplate/docs/upgrade8.html: fix
+         part_export_option indices
+
+2002-02-04 10:12  ivan
+
+       * httemplate/docs/install.html: doc update
+
 2002-02-04 09:06  ivan
 
-       * Makefile: 1.4.0pre8!
+       * Makefile, README.1.4.0pre4567-8, README.1.4.0pre8: 1.4.0pre8!
 
 2002-02-04 09:04  ivan
 
-       * httemplate/edit/part_bill_event.cgi: have fs-setup create the
+       * bin/fs-setup, httemplate/docs/upgrade8.html,
+         httemplate/edit/part_bill_event.cgi: have fs-setup create the
          necessary "default" billing events documentation on necessary
          "default" billing events
 
 2002-02-04 08:44  ivan
 
-       * httemplate/edit/part_bill_event.cgi,
+       * httemplate/docs/install.html, httemplate/docs/upgrade8.html,
+         httemplate/edit/part_bill_event.cgi,
          httemplate/view/cust_bill.cgi, FS/FS/cust_bill.pm,
          FS/FS/cust_main.pm: billing events!
 
 
 2002-01-30 06:18  ivan
 
-       * FS/FS/CGI.pm, htetc/handler.pl, httemplate/browse/agent.cgi,
-         httemplate/browse/agent_type.cgi,
+       * FS/FS/CGI.pm, htetc/global.asa, htetc/handler.pl,
+         httemplate/browse/agent.cgi, httemplate/browse/agent_type.cgi,
          httemplate/browse/cust_main_county.cgi,
-         httemplate/browse/nas.cgi, httemplate/browse/part_bill_event.cgi,
-         httemplate/browse/part_pkg.cgi, httemplate/browse/part_svc.cgi,
-         httemplate/browse/svc_acct_pop.cgi, httemplate/edit/agent.cgi,
-         httemplate/edit/agent_type.cgi,
+         httemplate/browse/cust_pay_batch.cgi, httemplate/browse/nas.cgi,
+         httemplate/browse/part_bill_event.cgi,
+         httemplate/browse/part_pkg.cgi,
+         httemplate/browse/part_referral.cgi,
+         httemplate/browse/part_svc.cgi, httemplate/browse/queue.cgi,
+         httemplate/browse/svc_acct_pop.cgi, httemplate/docs/install.html,
+         httemplate/edit/agent.cgi, httemplate/edit/agent_type.cgi,
          httemplate/edit/cust_bill_pay.cgi,
          httemplate/edit/cust_credit.cgi,
          httemplate/edit/cust_credit_bill.cgi,
          httemplate/edit/cust_main.cgi,
          httemplate/edit/cust_main_county-expand.cgi,
+         httemplate/edit/cust_main_county.cgi,
          httemplate/edit/cust_pay.cgi, httemplate/edit/cust_pkg.cgi,
          httemplate/edit/part_bill_event.cgi,
-         httemplate/edit/part_svc.cgi, httemplate/edit/svc_acct.cgi,
-         httemplate/edit/svc_acct_pop.cgi, httemplate/edit/svc_domain.cgi,
+         httemplate/edit/part_referral.cgi, httemplate/edit/part_svc.cgi,
+         httemplate/edit/svc_acct.cgi, httemplate/edit/svc_acct_pop.cgi,
+         httemplate/edit/svc_acct_sm.cgi, httemplate/edit/svc_domain.cgi,
          httemplate/edit/svc_forward.cgi,
          httemplate/edit/process/agent.cgi,
          httemplate/edit/process/agent_type.cgi,
          httemplate/edit/process/cust_main.cgi,
          httemplate/edit/process/cust_main_county-collapse.cgi,
          httemplate/edit/process/cust_main_county-expand.cgi,
+         httemplate/edit/process/cust_main_county.cgi,
          httemplate/edit/process/cust_pay.cgi,
          httemplate/edit/process/cust_pkg.cgi,
          httemplate/edit/process/part_pkg.cgi,
+         httemplate/edit/process/part_referral.cgi,
          httemplate/edit/process/quick-cust_pkg.cgi,
          httemplate/edit/process/svc_acct.cgi,
          httemplate/edit/process/svc_acct_pop.cgi,
+         httemplate/edit/process/svc_acct_sm.cgi,
          httemplate/edit/process/svc_domain.cgi,
          httemplate/edit/process/svc_forward.cgi,
          httemplate/misc/bill.cgi, httemplate/misc/cancel-unaudited.cgi,
-         httemplate/misc/catchall.cgi,
-         httemplate/misc/delete-customer.cgi, httemplate/misc/link.cgi,
-         httemplate/misc/print-invoice.cgi,
+         httemplate/misc/cancel_pkg.cgi, httemplate/misc/catchall.cgi,
+         httemplate/misc/delete-customer.cgi,
+         httemplate/misc/expire_pkg.cgi, httemplate/misc/link.cgi,
+         httemplate/misc/print-invoice.cgi, httemplate/misc/susp_pkg.cgi,
          httemplate/misc/unsusp_pkg.cgi,
          httemplate/misc/process/catchall.cgi,
          httemplate/misc/process/delete-customer.cgi,
          httemplate/misc/process/link.cgi,
-         httemplate/search/cust_main.cgi, httemplate/search/cust_pay.cgi,
-         httemplate/search/cust_pkg.cgi, httemplate/search/svc_acct.cgi,
+         httemplate/search/cust_bill.cgi, httemplate/search/cust_main.cgi,
+         httemplate/search/cust_pay.cgi, httemplate/search/cust_pkg.cgi,
+         httemplate/search/svc_acct.cgi,
+         httemplate/search/svc_acct_sm.cgi,
          httemplate/search/svc_domain.cgi, httemplate/view/cust_bill.cgi,
-         httemplate/view/cust_main.cgi, httemplate/view/svc_acct.cgi,
+         httemplate/view/cust_main.cgi, httemplate/view/cust_pkg.cgi,
+         httemplate/view/svc_acct.cgi, httemplate/view/svc_acct_sm.cgi,
          httemplate/view/svc_domain.cgi, httemplate/view/svc_forward.cgi,
          httemplate/view/svc_www.cgi: remove   use Module; and   $cgi =
          new CGI;   &cgisuidsetup(); from all templates.  should work
 
 2002-01-29 09:42  ivan
 
-       * FS/FS/part_bill_event.pm, httemplate/docs/schema.html: weight,
-         plan and plandata fields in part_bill_event
+       * README.1.4.0pre4567-8, FS/FS/part_bill_event.pm, bin/fs-setup,
+         httemplate/docs/schema.html, httemplate/docs/upgrade8.html:
+         weight, plan and plandata fields in part_bill_event
 
 2002-01-29 08:33  ivan
 
        * Makefile, FS/FS.pm, FS/FS/Record.pm, FS/FS/cust_main.pm,
          FS/FS/cust_pay.pm, FS/FS/cust_pkg.pm, FS/FS/cust_svc.pm,
-         FS/FS/svc_acct.pm, bin/pod2x, htetc/handler.pl,
+         FS/FS/svc_acct.pm, bin/pod2x, htetc/global.asa, htetc/handler.pl,
          httemplate/index.html, httemplate/browse/part_bill_event.cgi,
+         httemplate/docs/install.html,
          httemplate/edit/part_bill_event.cgi,
          httemplate/edit/part_pkg.cgi,
          httemplate/edit/process/part_bill_event.cgi: - web interface for
          interface - cust_pay::upgrade_replace doesn't error out if
          history includes   overapplied payments
 
+2002-01-29 03:11  ivan
+
+       * bin/fs-setup: oops bad column type for part_bill_event.payby
+
 2002-01-28 03:24  ivan
 
        * FS/FS/Record.pm: oops, syntax error in new() check for missing
 
 2002-01-27 22:57  ivan
 
-       * FS/FS/cust_bill.pm, FS/FS/cust_credit.pm, FS/FS/cust_pay.pm,
-         FS/FS/cust_refund.pm, FS/FS/part_pkg.pm, FS/FS/part_svc.pm,
-         httemplate/docs/schema.html: book closing schema changes
+       * README.1.4.0pre4567-8, FS/FS/cust_bill.pm, FS/FS/cust_credit.pm,
+         FS/FS/cust_pay.pm, FS/FS/cust_refund.pm, FS/FS/part_pkg.pm,
+         FS/FS/part_svc.pm, bin/fs-setup, httemplate/docs/schema.html,
+         httemplate/docs/upgrade8.html: book closing schema changes
 
 2002-01-27 21:15  ivan
 
-       * FS/FS/part_export.pm, FS/FS/part_export_option.pm,
-         httemplate/docs/schema.html: part_export schema changes
+       * README.1.4.0pre4567-8, FS/FS/part_export.pm,
+         FS/FS/part_export_option.pm, bin/fs-setup,
+         httemplate/docs/schema.html, httemplate/docs/upgrade8.html:
+         part_export schema changes
 
 2002-01-25 17:52  ivan
 
 
 2002-01-22 06:42  ivan
 
-       * httemplate/docs/index.html: remove old upgrade docs
+       * httemplate/docs/: index.html, upgrade.html, upgrade2.html,
+         upgrade3.html: remove old upgrade docs
 
 2002-01-21 03:30  ivan
 
 
 2002-01-14 12:28  ivan
 
-       * FS/FS/: Conf.pm, svc_acct.pm: pay some attention to 1.4 RADIUS
-         SQL export
+       * FS/FS/Conf.pm, FS/FS/svc_acct.pm, httemplate/docs/export.html:
+         pay some attention to 1.4 RADIUS SQL export
+
+2002-01-14 06:29  ivan
+
+       * FS/bin/freeside-overdue: fix -l option
+
+2002-01-11 23:23  ivan
+
+       * httemplate/docs/upgrade8.html: fix upgrade8.html to be in
+         agreement with fs-setup
 
 2002-01-09 05:29  ivan
 
 
 2002-01-03 09:40  ivan
 
-       * FS/MANIFEST, FS/FS/cust_bill_event.pm, FS/FS/part_bill_event.pm,
-         FS/t/cust_bill_event.t, FS/t/part_bill_event.t,
-         httemplate/docs/schema.html: more schema changes:
-         part_bill_event and cust_bill_event tables
+       * README.1.4.0pre2-3, README.1.4.0pre3-4, README.1.4.0pre4567-8,
+         FS/MANIFEST, FS/FS/cust_bill_event.pm, FS/FS/part_bill_event.pm,
+         FS/t/cust_bill_event.t, FS/t/part_bill_event.t, bin/fs-setup,
+         httemplate/docs/schema.html, httemplate/docs/upgrade8.html: more
+         schema changes:  part_bill_event and cust_bill_event tables
 
          remove old 1.4.0pre READMEs
 
+2001-12-28 07:17  ivan
+
+       * FS/bin/freeside-overdue: update usage message
+
 2001-12-28 07:14  ivan
 
-       * FS/FS/cust_main.pm: force printing in freeside-overdue
+       * FS/: FS/cust_main.pm, bin/freeside-overdue: force printing in
+         freeside-overdue
 
 2001-12-28 06:40  ivan
 
-       * FS/FS/cust_main.pm, httemplate/edit/cust_main.cgi,
+       * FS/FS/cust_main.pm, FS/bin/freeside-bill,
+         FS/bin/freeside-overdue, httemplate/edit/cust_main.cgi,
          httemplate/edit/part_pkg.cgi: add more options to
          freeside-overdue
 
 
 2001-12-27 01:26  ivan
 
-       * FS/FS/Record.pm, FS/FS/part_pkg.pm, FS/FS/part_svc.pm,
-         httemplate/browse/part_pkg.cgi, httemplate/browse/part_svc.cgi,
-         httemplate/edit/agent_type.cgi, httemplate/edit/cust_main.cgi,
-         httemplate/edit/cust_pkg.cgi, httemplate/edit/part_pkg.cgi,
-         httemplate/edit/part_svc.cgi,
+       * README.1.4.0pre4567-8, FS/FS/Record.pm, FS/FS/part_pkg.pm,
+         FS/FS/part_svc.pm, FS/bin/freeside-overdue, bin/fs-setup,
+         htetc/global.asa, httemplate/browse/part_pkg.cgi,
+         httemplate/browse/part_svc.cgi, httemplate/edit/agent_type.cgi,
+         httemplate/edit/cust_main.cgi, httemplate/edit/cust_pkg.cgi,
+         httemplate/edit/part_pkg.cgi, httemplate/edit/part_svc.cgi,
          httemplate/edit/process/part_pkg.cgi,
          httemplate/view/cust_main.cgi: service and package disable!
 
 2001-12-26 15:59  ivan
 
-       * httemplate/docs/schema.html: doc
+       * httemplate/docs/: install.html, schema.html, upgrade8.html: doc
 
 2001-12-26 07:41  ivan
 
 
 2001-12-26 07:08  ivan
 
-       * FS/MANIFEST: add freeside-overdue
+       * FS/: MANIFEST, bin/freeside-overdue: add freeside-overdue
 
 2001-12-26 07:07  ivan
 
        * httemplate/edit/: cust_credit.cgi, process/cust_credit.cgi: fix
          posting credit
 
+2001-12-26 03:47  ivan
+
+       * FS/bin/freeside-overdue: don't provide example crontabs that run
+         at 4:20 _PM_
+
 2001-12-26 03:17  ivan
 
-       * FS/FS/cust_main.pm: (untested eek) freeside-overdue script &
-         cust_main balance_date & total_owed_date methods
+       * FS/FS/cust_main.pm, FS/bin/freeside-overdue,
+         httemplate/docs/billing.html: (untested eek) freeside-overdue
+         script & cust_main balance_date & total_owed_date methods
 
 2001-12-26 01:18  ivan
 
-       * httemplate/: index.html, search/cust_pay.cgi, view/cust_main.cgi:
-         search by check #
+       * httemplate/: index.html, search/cust_pay.cgi,
+         search/cust_pay.html, view/cust_main.cgi: search by check #
 
 2001-12-25 23:53  ivan
 
 2001-12-25 21:19  ivan
 
        * httemplate/: index.html, edit/cust_pay.cgi,
-         edit/process/cust_pay.cgi, search/cust_main.cgi,
+         edit/process/cust_pay.cgi, search/cust_main-payinfo.html,
+         search/cust_main-quickpay.html, search/cust_main.cgi,
          search/cust_main.html: expedited check entry
 
 2001-12-25 21:02  ivan
 
 2001-12-25 20:52  ivan
 
-       * httemplate/search/: cust_bill.html, cust_main.html: same look as
-         rest of search pages
+       * httemplate/search/: cust_bill.html, svc_acct.html,
+         svc_domain.html, cust_main.html: same look as rest of search
+         pages
 
 2001-12-25 20:25  ivan
 
 
        * httemplate/edit/cust_pay.cgi: fix service display for duplicates
 
+2001-12-21 18:41  ivan
+
+       * httemplate/docs/install.html: doco on creating database manually
+
 2001-12-21 13:40  ivan
 
        * FS/FS/cust_bill.pm, httemplate/edit/cust_pay.cgi,
        * httemplate/edit/: cust_main.cgi, svc_acct.cgi: allow >8 character
          passwords in web interface
 
+2001-12-11 23:59  ivan
+
+       * bin/svc_acct.export: use pwd_mkdb to install
+         /etc/master.passwd.new instead of moving it into place
+
 2001-12-11 13:26  ivan
 
        * httemplate/search/svc_acct.cgi: missing space in SQL, oops
 
+2001-12-11 02:38  ivan
+
+       * bin/svc_acct.export, httemplate/docs/install.html: radiusprepend
+         config file for export add Archive::Tar to docs
+
 2001-12-10 04:18  ivan
 
        * FS/FS/Record.pm: Pg datatype pain
        * FS/FS/Conf.pm, httemplate/edit/cust_main.cgi:
          postalinvoicedefault config file
 
+2001-11-16 02:22  ivan
+
+       * httemplate/docs/billing.html: update link to Text::Template docs
+
 2001-11-13 13:27  ivan
 
-       * FS/MANIFEST: remove freeside-print-batch
+       * FS/: MANIFEST, bin/freeside-print-batch: remove
+         freeside-print-batch
 
 2001-11-12 05:19  ivan
 
        * FS/FS/cust_main.pm: import hack to be less strict
 
+2001-11-09 10:26  ivan
+
+       * httemplate/docs/install.html: Pg7 dependancy
+
 2001-11-08 07:26  ivan
 
        * FS/bin/freeside-queued: harmless typo noticed by "Edward
 
        * FS/FS/UID.pm: fix error message for s/htdocs/httemplate/
 
+2001-11-06 09:48  ivan
+
+       * bin/fs-setup: payinfo changed from length 16 to $char_d for
+         future expansion
+
 2001-11-05 13:30  ivan
 
        * Makefile: more fixes for fresh installation
 
        * Makefile, FS/FS/Record.pm: makefile fixups
 
+2001-11-05 10:23  ivan
+
+       * httemplate/docs/install.html: doc
+
 2001-11-05 09:00  jeff
 
        * FS/FS/svc_acct.pm: improved svc_acct replacement
        * FS/FS/Record.pm: AUTOLOAD optimizations broke things rather
          badly, oops
 
+2001-11-05 06:04  ivan
+
+       * FS/bin/freeside-bill: fixup getopt
+
 2001-11-05 06:03  ivan
 
        * Makefile: move sys-dependant stuff to vars
 
        * FS/FS/svc_acct.pm: doc tyop
 
+2001-11-05 04:07  ivan
+
+       * bin/svc_domain.import: this is unfinished and untested anyway,
+         but this corrects a silly typo
+
 2001-11-05 03:55  ivan
 
        * FS/FS/cust_main.pm: better error messages for eval'ed setup/recur
          joined searches & caching support preliminary customer browse
          optimizations, much faster!
 
+2001-11-02 00:14  ivan
+
+       * FS/bin/freeside-print-batch: silence pod complaints
+
 2001-11-01 21:28  ivan
 
        * httemplate/config/config.cgi: note config changes need
        * httemplate/search/cust_main.cgi: hit the database slightly less.
          this page still takes forever with lots of customers.
 
+2001-10-31 08:52  ivan
+
+       * httemplate/browse/queue.cgi: queue display works again, even if
+         those links don't
+
 2001-10-30 11:05  ivan
 
-       * FS/FS/cust_pay_batch.pm, httemplate/index.html,
+       * FS/FS/cust_pay_batch.pm, bin/fs-setup, httemplate/index.html,
+         httemplate/browse/cust_pay_batch.cgi,
          httemplate/docs/schema.html: depriciate cust_pay_batch.trancode
          web interface to view pending batch
 
          httemplate/browse/agent_type.cgi,
          httemplate/browse/cust_main_county.cgi,
          httemplate/browse/nas.cgi, httemplate/browse/part_pkg.cgi,
+         httemplate/browse/part_referral.cgi, httemplate/browse/queue.cgi,
          httemplate/browse/svc_acct_pop.cgi, httemplate/edit/agent.cgi,
          httemplate/edit/agent_type.cgi, httemplate/edit/cust_credit.cgi,
          httemplate/edit/cust_credit_bill.cgi,
          httemplate/edit/cust_main.cgi,
          httemplate/edit/cust_main_county-expand.cgi,
+         httemplate/edit/cust_main_county.cgi,
          httemplate/edit/cust_pay.cgi, httemplate/edit/cust_pkg.cgi,
-         httemplate/edit/svc_acct.cgi, httemplate/edit/svc_acct_pop.cgi,
-         httemplate/edit/svc_domain.cgi, httemplate/edit/svc_forward.cgi,
-         httemplate/misc/catchall.cgi,
+         httemplate/edit/part_referral.cgi, httemplate/edit/svc_acct.cgi,
+         httemplate/edit/svc_acct_pop.cgi,
+         httemplate/edit/svc_acct_sm.cgi, httemplate/edit/svc_domain.cgi,
+         httemplate/edit/svc_forward.cgi, httemplate/misc/catchall.cgi,
          httemplate/misc/delete-customer.cgi, httemplate/misc/link.cgi,
-         httemplate/search/cust_main.cgi, httemplate/search/cust_pkg.cgi,
-         httemplate/search/svc_acct.cgi, httemplate/search/svc_domain.cgi,
-         httemplate/view/cust_bill.cgi, httemplate/view/cust_main.cgi,
-         httemplate/view/svc_acct.cgi, httemplate/view/svc_domain.cgi,
-         httemplate/view/svc_forward.cgi: get rid of header foo in
-         individual templates
+         httemplate/search/cust_bill.cgi, httemplate/search/cust_main.cgi,
+         httemplate/search/cust_pkg.cgi, httemplate/search/svc_acct.cgi,
+         httemplate/search/svc_acct_sm.cgi,
+         httemplate/search/svc_domain.cgi, httemplate/view/cust_bill.cgi,
+         httemplate/view/cust_main.cgi, httemplate/view/cust_pkg.cgi,
+         httemplate/view/svc_acct.cgi, httemplate/view/svc_acct_sm.cgi,
+         httemplate/view/svc_domain.cgi, httemplate/view/svc_forward.cgi:
+         get rid of header foo in individual templates
+
+2001-10-30 06:28  ivan
+
+       * httemplate/docs/: install.html, upgrade8.html: docu
 
 2001-10-30 06:20  ivan
 
 
 2001-10-30 05:47  ivan
 
-       * Makefile, FS/bin/freeside-adduser, conf/shells, conf/smtpmachine:
-         `make create-config' installs default config (conf dir update)
-         freeside-adduser uses default secrets file
+       * Makefile, FS/bin/freeside-adduser, conf/address, conf/domain,
+         conf/secrets, conf/shells, conf/smtpmachine,
+         httemplate/docs/install.html: `make create-config' installs
+         default config (conf dir update) freeside-adduser uses default
+         secrets file
 
 2001-10-30 04:38  ivan
 
 
 2001-10-30 04:35  ivan
 
-       * Makefile: makefile typo
+       * Makefile, httemplate/docs/install.html: makefile typo
 
 2001-10-30 03:47  ivan
 
        * Makefile, FS/bin/freeside-adduser, httemplate/docs/admin.html,
-         httemplate/docs/index.html: whew more install docs and automation
+         httemplate/docs/config.html, httemplate/docs/index.html,
+         httemplate/docs/install.html: whew more install docs and
+         automation
 
 2001-10-30 02:20  ivan
 
-       * Makefile, FS/MANIFEST, FS/FS/Conf.pm, FS/bin/freeside-adduser:
-         setup/config updates.  getting easier...
+       * Makefile, FS/MANIFEST, FS/FS/Conf.pm, FS/bin/freeside-adduser,
+         httemplate/docs/install.html: setup/config updates.  getting
+         easier...
 
 2001-10-29 13:22  ivan
 
        * Makefile: fix make clean
 
+2001-10-29 12:54  ivan
+
+       * httemplate/docs/install.html: doc typo
+
 2001-10-29 12:53  ivan
 
        * FS/FS/svc_forward.pm: methods for getting the associated svc_acct
 
 2001-10-26 03:24  ivan
 
-       * FS/FS/CGI.pm, htetc/handler.pl, httemplate/browse/agent.cgi,
-         httemplate/browse/agent_type.cgi,
+       * FS/FS/CGI.pm, htetc/global.asa, htetc/handler.pl,
+         httemplate/browse/agent.cgi, httemplate/browse/agent_type.cgi,
          httemplate/browse/cust_main_county.cgi,
          httemplate/browse/nas.cgi, httemplate/browse/part_pkg.cgi,
+         httemplate/browse/part_referral.cgi, httemplate/browse/queue.cgi,
          httemplate/browse/svc_acct_pop.cgi, httemplate/edit/agent.cgi,
          httemplate/edit/agent_type.cgi, httemplate/edit/cust_credit.cgi,
          httemplate/edit/cust_credit_bill.cgi,
          httemplate/edit/cust_main.cgi,
          httemplate/edit/cust_main_county-expand.cgi,
+         httemplate/edit/cust_main_county.cgi,
          httemplate/edit/cust_pay.cgi, httemplate/edit/cust_pkg.cgi,
-         httemplate/edit/svc_acct.cgi, httemplate/edit/svc_acct_pop.cgi,
-         httemplate/edit/svc_domain.cgi, httemplate/edit/svc_forward.cgi,
-         httemplate/misc/catchall.cgi,
+         httemplate/edit/part_referral.cgi, httemplate/edit/svc_acct.cgi,
+         httemplate/edit/svc_acct_pop.cgi,
+         httemplate/edit/svc_acct_sm.cgi, httemplate/edit/svc_domain.cgi,
+         httemplate/edit/svc_forward.cgi, httemplate/misc/catchall.cgi,
          httemplate/misc/delete-customer.cgi, httemplate/misc/link.cgi,
-         httemplate/search/cust_main.cgi, httemplate/search/cust_pkg.cgi,
-         httemplate/search/svc_acct.cgi, httemplate/search/svc_domain.cgi,
-         httemplate/view/cust_bill.cgi, httemplate/view/cust_main.cgi,
-         httemplate/view/svc_acct.cgi, httemplate/view/svc_domain.cgi,
-         httemplate/view/svc_forward.cgi: cache foo *sigh*
+         httemplate/search/cust_bill.cgi, httemplate/search/cust_main.cgi,
+         httemplate/search/cust_pkg.cgi, httemplate/search/svc_acct.cgi,
+         httemplate/search/svc_acct_sm.cgi,
+         httemplate/search/svc_domain.cgi, httemplate/view/cust_bill.cgi,
+         httemplate/view/cust_main.cgi, httemplate/view/cust_pkg.cgi,
+         httemplate/view/svc_acct.cgi, httemplate/view/svc_acct_sm.cgi,
+         httemplate/view/svc_domain.cgi, httemplate/view/svc_forward.cgi:
+         cache foo *sigh*
 
 2001-10-26 02:50  ivan
 
 
        * FS/FS.pm, FS/MANIFEST, FS/FS/Conf.pm, FS/FS/ConfItem.pm,
          FS/FS/svc_acct.pm, FS/FS/svc_domain.pm, FS/t/ConfItem.t,
-         httemplate/index.html, httemplate/config/config-process.cgi,
-         httemplate/config/config-view.cgi,
-         httemplate/search/svc_acct.cgi: preliminary web config editor
+         bin/fs-setup, bin/svc_acct.export, httemplate/index.html,
+         httemplate/config/config-process.cgi,
+         httemplate/config/config-view.cgi, httemplate/docs/config.html,
+         httemplate/docs/install.html, httemplate/search/svc_acct.cgi:
+         preliminary web config editor
 
          new config files: username-ampersand, passwordmax
 
 
          documentation updates
 
+2001-10-23 17:59  ivan
+
+       * httemplate/browse/queue.cgi: Can't find string terminator "!"
+         anywhere before EOF at queue.cgi line 42
+
 2001-10-23 13:53  ivan
 
        * FS/bin/freeside-queued: Pg: FOR UPDATE LIMIT 1 mysql: LIMIT 1 FOR
 
          greeeat.
 
+2001-10-23 11:57  ivan
+
+       * httemplate/docs/: config.html, install.html: document how to set
+         MySQL with BDB default tables
+
+2001-10-23 11:15  ivan
+
+       * bin/fs-setup: mysql fixes
+
 2001-10-22 07:48  ivan
 
        * FS/FS/svc_acct.pm: fix dir check
 
 2001-10-20 05:17  ivan
 
-       * FS/FS/cust_main.pm, FS/FS/part_pkg.pm, htetc/handler.pl,
+       * README.1.4.0pre3-4, FS/FS/cust_main.pm, FS/FS/part_pkg.pm,
+         bin/fs-setup, htetc/global.asa, htetc/handler.pl,
          httemplate/browse/part_pkg.cgi, httemplate/docs/schema.html,
-         httemplate/edit/part_pkg.cgi, httemplate/edit/svc_acct.cgi,
+         httemplate/docs/upgrade8.html, httemplate/edit/part_pkg.cgi,
+         httemplate/edit/svc_acct.cgi,
          httemplate/edit/process/cust_main.cgi,
          httemplate/edit/process/part_pkg.cgi: setup and recurring fee tax
          exempt flags, UI to edit rework part_pkg editing UI some more
 
+2001-10-16 13:33  jeff
+
+       * bin/svc_acct.export: added slipip insertion for icradius and
+         vpopmail restart config
+
 2001-10-15 07:58  ivan
 
-       * FS/FS/cust_pkg.pm, htetc/handler.pl,
+       * FS/FS/cust_pkg.pm, htetc/global.asa, htetc/handler.pl,
          httemplate/edit/REAL_cust_pkg.cgi,
-         httemplate/edit/process/REAL_cust_pkg.cgi: date editing
+         httemplate/edit/process/REAL_cust_pkg.cgi,
+         httemplate/view/cust_pkg.cgi: date editing
 
 2001-10-15 05:16  ivan
 
 
 2001-10-15 03:42  ivan
 
-       * FS/FS/cust_main.pm, FS/FS/part_pkg.pm,
-         httemplate/browse/part_pkg.cgi, httemplate/docs/schema.html,
-         httemplate/edit/part_pkg.cgi, httemplate/edit/part_svc.cgi,
+       * README.1.4.0pre3-4, FS/FS/cust_main.pm, FS/FS/part_pkg.pm,
+         bin/fs-setup, httemplate/browse/part_pkg.cgi,
+         httemplate/docs/config.html, httemplate/docs/schema.html,
+         httemplate/docs/upgrade8.html, httemplate/edit/part_pkg.cgi,
+         httemplate/edit/part_svc.cgi,
          httemplate/edit/process/part_pkg.cgi: price plans web gui 1st
          pass, oh my
 
+2001-10-12 08:26  ivan
+
+       * httemplate/browse/queue.cgi: add (as yet inactive) retry & remove
+         links
+
 2001-10-11 10:46  ivan
 
-       * htetc/handler.pl: price plan uI!
+       * htetc/: global.asa, handler.pl: price plan uI!
 
 2001-10-11 10:44  ivan
 
 
 2001-10-09 16:10  ivan
 
-       * FS/FS/cust_credit.pm, FS/FS/cust_main.pm, FS/FS/cust_pay.pm,
-         FS/FS/cust_pkg.pm, httemplate/docs/schema.html: add
-         `unsuspendauto' config file: enable the automatic unsuspension of
-         suspended packages when a customer's balance due changes from
-         positive to zero or negative as the result of a payment or credit
+       * README.1.4.0pre3-4, FS/FS/cust_credit.pm, FS/FS/cust_main.pm,
+         FS/FS/cust_pay.pm, FS/FS/cust_pkg.pm,
+         httemplate/docs/config.html, httemplate/docs/install.html,
+         httemplate/docs/schema.html, httemplate/docs/upgrade8.html,
+         bin/fs-setup: add `unsuspendauto' config file: enable the
+         automatic unsuspension of suspended packages when a customer's
+         balance due changes from positive to zero or negative as the
+         result of a payment or credit
 
          add cust_pkg.manual_flag to disable this behaviour per customer
          package (no UI to set this yet)
 
+2001-10-09 06:16  ivan
+
+       * httemplate/docs/install.html: update mysql links
+
 2001-10-09 00:16  ivan
 
        * httemplate/edit/process/part_svc.cgi: that was a confusing bug to
        * FS/FS/cust_pkg.pm: fix syntax error in newly-enabled insert sub,
          sheesh
 
+2001-10-02 13:07  ivan
+
+       * httemplate/docs/upgrade8.html: doc clarification (?)
+
 2001-10-02 09:00  jeff
 
-       * FS/FS/cust_pay_batch.pm: add pkey to batch payments and fix a doc
-         typo
+       * README.1.4.0pre3-4, FS/FS/cust_pay_batch.pm, bin/fs-setup,
+         httemplate/docs/upgrade8.html: add pkey to batch payments and fix
+         a doc typo
 
 2001-10-02 04:10  ivan
 
 
 2001-09-30 13:30  ivan
 
-       * FS/FS/svc_acct.pm: username-uppercase config file
+       * FS/FS/svc_acct.pm, httemplate/docs/config.html:
+         username-uppercase config file
+
+2001-09-27 21:33  ivan
+
+       * httemplate/docs/install.html: ssh recommendations
 
 2001-09-27 14:49  ivan
 
        * httemplate/view/svc_acct.cgi: fix for pre-1.4.0 accounts with no
          domsvc
 
+2001-09-26 04:34  ivan
+
+       * README.1.4.0pre3-4: index oops
+
 2001-09-26 02:17  ivan
 
-       * FS/FS.pm, FS/MANIFEST, FS/FS/cust_credit_bill.pm,
-         FS/FS/cust_main.pm, FS/FS/part_pop_local.pm,
-         FS/FS/svc_acct_pop.pm, FS/t/part_pop_local.t,
-         httemplate/docs/schema.html: add part_pop_local table
+       * README.1.4.0pre3-4, FS/FS.pm, FS/MANIFEST,
+         FS/FS/cust_credit_bill.pm, FS/FS/cust_main.pm,
+         FS/FS/part_pop_local.pm, FS/FS/svc_acct_pop.pm,
+         FS/t/part_pop_local.t, bin/fs-setup, httemplate/docs/schema.html,
+         httemplate/docs/upgrade8.html: add part_pop_local table
 
 2001-09-25 11:03  ivan
 
 
 2001-09-25 11:01  ivan
 
-       * FS/FS/cust_main.pm: add emailinvoiceonly config file and begin to
-         use it
+       * FS/FS/cust_main.pm, httemplate/docs/config.html: add
+         emailinvoiceonly config file and begin to use it
 
 2001-09-25 08:55  ivan
 
-       * FS/FS/cust_main.pm: Business::OnlinePayment::BankOfAmerica
+       * FS/FS/cust_main.pm, httemplate/docs/config.html:
+         Business::OnlinePayment::BankOfAmerica
 
 2001-09-24 17:05  ivan
 
 
 2001-09-19 14:06  ivan
 
-       * FS/: MANIFEST, FS/svc_acct.pm, bin/freeside-apply-credits:
+       * README.1.4.0pre3-4, FS/MANIFEST, FS/FS/svc_acct.pm,
+         FS/bin/freeside-apply-credits, httemplate/docs/config.html:
          directory hashing remove jeff's lib patch from
          freeside-apply-credits add freeside-apply-credits to MANIFEST
          README for pre3-4
 2001-09-16 05:45  ivan
 
        * FS/FS/Record.pm, FS/FS/cust_main_invoice.pm, FS/FS/svc_acct.pm,
-         httemplate/index.html, httemplate/search/cust_main.cgi,
-         httemplate/view/cust_main.cgi: fix oops in
-         FS::cust_main_invoice::replace preventing package cancellation
+         httemplate/index.html, httemplate/docs/config.html,
+         httemplate/search/cust_main.cgi, httemplate/view/cust_main.cgi:
+         fix oops in FS::cust_main_invoice::replace preventing package
+         cancellation
 
          add toggle switch to cust_main searching to show/hide cancelled
          customers.  hidecancelledcustomers config file is just which
 
        * FS/FS/Record.pm: s/croak/confess/
 
+2001-09-12 08:54  ivan
+
+       * httemplate/docs/: install.html, upgrade8.html: mason warnings
+
 2001-09-12 08:45  ivan
 
        * FS/FS/part_svc.pm: oops
 2001-09-11 16:44  ivan
 
        * FS/FS/part_svc.pm, httemplate/edit/svc_acct.cgi,
-         httemplate/edit/svc_domain.cgi, httemplate/edit/svc_forward.cgi,
-         httemplate/view/svc_acct.cgi: radius attributes & default/fixed
-         values should work again now
+         httemplate/edit/svc_acct_sm.cgi, httemplate/edit/svc_domain.cgi,
+         httemplate/edit/svc_forward.cgi, httemplate/view/svc_acct.cgi:
+         radius attributes & default/fixed values should work again now
 
 2001-09-11 15:20  ivan
 
        * FS/FS/svc_Common.pm, bin/fs-radius-add-check,
-         bin/fs-radius-add-reply: fix radius attribute adding
+         bin/fs-radius-add-reply, bin/fs-setup, bin/svc_acct.export: fix
+         radius attribute adding
 
 2001-09-11 14:58  ivan
 
        * FS/bin/freeside-queued: usage sub
 
+2001-09-11 13:59  ivan
+
+       * httemplate/edit/svc_acct_sm.cgi: persistance problem not clearing
+         variables between runs
+
 2001-09-11 13:44  ivan
 
        * httemplate/search/svc_acct.cgi: getting "you should run the
 
 2001-09-11 02:56  ivan
 
-       * httemplate/: edit/process/quick-cust_pkg.cgi, view/cust_main.cgi:
-         fix quick order
+       * README.1.4.0pre2-3, httemplate/edit/process/quick-cust_pkg.cgi,
+         httemplate/view/cust_main.cgi: fix quick order
+
+2001-09-10 21:44  ivan
+
+       * httemplate/browse/queue.cgi: web queue view
 
 2001-09-10 21:17  ivan
 
-       * FS/FS/svc_acct.pm: username-noperiod config file
+       * FS/FS/svc_acct.pm, httemplate/docs/config.html: username-noperiod
+         config file
 
 2001-09-10 20:15  ivan
 
-       * FS/FS/cust_main.pm, FS/FS/svc_acct.pm, FS/bin/freeside-queued,
-         httemplate/edit/part_svc.cgi: cyrus support
+       * README.1.4.0pre2-3, FS/FS/cust_main.pm, FS/FS/svc_acct.pm,
+         FS/bin/freeside-queued, httemplate/docs/config.html,
+         httemplate/docs/export.html, httemplate/edit/part_svc.cgi: cyrus
+         support
 
 2001-09-10 18:09  ivan
 
 
 2001-09-10 17:08  ivan
 
-       * FS/FS.pm, FS/MANIFEST, FS/FS/Record.pm,
+       * README.1.4.0pre2-3, FS/FS.pm, FS/MANIFEST, FS/FS/Record.pm,
          FS/FS/cust_credit_bill.pm, FS/FS/cust_main.pm, FS/FS/part_svc.pm,
-         FS/FS/queue.pm, FS/FS/queue_arg.pm, FS/bin/freeside-queued,
-         FS/t/queue.t, FS/t/queue_arg.t, htetc/handler.pl,
-         httemplate/index.html, httemplate/browse/part_svc.cgi,
-         httemplate/docs/schema.html, httemplate/edit/part_svc.cgi,
+         FS/FS/queue.pm, FS/FS/queue_arg.pm, FS/bin/freeside-bill,
+         FS/bin/freeside-queued, FS/t/queue.t, FS/t/queue_arg.t,
+         htetc/handler.pl, httemplate/index.html,
+         httemplate/browse/part_svc.cgi, httemplate/docs/install.html,
+         httemplate/docs/schema.html, httemplate/docs/upgrade8.html,
+         httemplate/edit/part_svc.cgi,
          httemplate/edit/process/part_svc.cgi,
          httemplate/search/cust_main.cgi: faster (cached) fuzzy searches
          prelim. job queues! fixed part_svc editing
 
 2001-09-10 17:07  ivan
 
-       * bin/: freeside-init, fs-migrate-part_svc: fixing
+       * bin/: freeside-init, fs-migrate-part_svc, fs-setup: fixing
          fs-migrate-part_svc updateing fs-setup for job queues
          freeside-init for starting freeside-queued
 
+2001-09-07 17:28  khoff
+
+       * bin/fs-setup: First post.  Sorry.  Missing comma.
+
 2001-09-07 13:49  ivan
 
        * FS/FS/part_svc_column.pm: oops, forgot to add this
 2001-09-07 13:17  ivan
 
        * FS/MANIFEST, FS/FS/raddb.pm, FS/FS/svc_acct.pm, FS/t/raddb.t,
-         bin/fs-radius-add-check, bin/fs-radius-add-reply,
+         bin/fs-radius-add-check, bin/fs-radius-add-reply, bin/fs-setup,
          bin/generate-raddb: fix RADIUS attribute capitalization
 
+2001-09-06 14:43  ivan
+
+       * httemplate/docs/: install.html, postgresql.html: no more pg
+         RADIUS silliness
+
 2001-09-06 14:20  ivan
 
        * FS/FS/svc_acct.pm, httemplate/docs/schema.html: doc
 
 2001-09-06 13:41  ivan
 
-       * FS/FS.pm, FS/MANIFEST, FS/FS/UID.pm, FS/FS/part_svc.pm,
-         FS/FS/svc_Common.pm, FS/FS/svc_acct.pm, FS/FS/svc_domain.pm,
-         FS/FS/svc_forward.pm, FS/FS/svc_www.pm, FS/t/part_svc_column.t,
+       * README.1.4.0pre2-3, FS/FS.pm, FS/MANIFEST, FS/FS/UID.pm,
+         FS/FS/part_svc.pm, FS/FS/svc_Common.pm, FS/FS/svc_acct.pm,
+         FS/FS/svc_acct_sm.pm, FS/FS/svc_domain.pm, FS/FS/svc_forward.pm,
+         FS/FS/svc_www.pm, FS/t/part_svc_column.t,
          bin/fs-migrate-part_svc, bin/fs-migrate-payref,
-         bin/fs-radius-add-check, bin/fs-radius-add-reply,
+         bin/fs-radius-add-check, bin/fs-radius-add-reply, bin/fs-setup,
          httemplate/browse/part_svc.cgi, httemplate/docs/schema.html,
-         httemplate/edit/part_svc.cgi,
+         httemplate/docs/upgrade8.html, httemplate/edit/part_svc.cgi,
          httemplate/edit/process/part_svc.cgi: finally fix part_svc!!!
 
 2001-09-04 08:12  ivan
 
        * FS/FS/cust_pkg.pm, httemplate/browse/agent.cgi,
          httemplate/browse/agent_type.cgi, httemplate/browse/part_pkg.cgi,
+         httemplate/browse/part_referral.cgi,
          httemplate/browse/part_svc.cgi, httemplate/docs/admin.html,
          httemplate/edit/part_svc.cgi, httemplate/edit/svc_acct.cgi,
          httemplate/edit/process/quick-cust_pkg.cgi,
          httemplate/view/cust_main.cgi: new admin documentation, quick
          one-pkg order
 
+2001-09-04 04:15  ivan
+
+       * bin/fs-setup: rar
+
+2001-09-04 04:15  ivan
+
+       * bin/fs-setup: much better
+
+2001-09-04 04:14  ivan
+
+       * bin/fs-setup: tyops
+
+2001-09-04 04:03  ivan
+
+       * bin/fs-setup, httemplate/docs/config.html: silly syntax error and
+         doc updates
+
+2001-09-04 02:55  ivan
+
+       * httemplate/docs/install.html: better installation instructions
+
+2001-09-04 02:54  ivan
+
+       * htetc/global.asa: hehe, this should help out everybody without
+         DBIx::Profile (i.e. everybody)
+
+2001-09-03 15:16  ivan
+
+       * bin/fs-setup: this too
+
 2001-09-03 15:07  ivan
 
        * FS/FS/cust_bill.pm, FS/FS/cust_bill_pay.pm, FS/FS/cust_main.pm,
-         FS/FS/cust_pay.pm, FS/FS/cust_svc.pm,
-         httemplate/docs/signup.html, httemplate/edit/cust_credit.cgi,
+         FS/FS/cust_pay.pm, FS/FS/cust_svc.pm, FS/bin/freeside-bill,
+         httemplate/docs/signup.html, httemplate/docs/upgrade8.html,
+         httemplate/edit/cust_credit.cgi,
          httemplate/edit/cust_credit_bill.cgi,
          httemplate/edit/cust_pay.cgi,
          httemplate/edit/process/cust_pay.cgi, httemplate/misc/bill.cgi,
 
 2001-09-01 21:25  ivan
 
-       * FS/: FS.pm, MANIFEST, FS/cust_bill_pay.pm, FS/cust_main.pm,
-         FS/cust_refund.pm, t/CGI.t, t/Conf.t, t/Record.t, t/UID.t,
-         t/agent.t, t/agent_type.t, t/cust_bill.t, t/cust_bill_pay.t,
-         t/cust_bill_pkg.t, t/cust_credit.t, t/cust_credit_bill.t,
-         t/cust_credit_refund.t, t/cust_main.t, t/cust_main_county.t,
-         t/cust_main_invoice.t, t/cust_pay.t, t/cust_pay_batch.t,
-         t/cust_pkg.t, t/cust_refund.t, t/cust_svc.t, t/domain_record.t,
-         t/nas.t, t/part_pkg.t, t/part_referral.t, t/part_svc.t,
-         t/pkg_svc.t, t/port.t, t/prepay_credit.t, t/session.t,
-         t/svc_Common.t, t/svc_acct.t, t/svc_acct_pop.t, t/svc_domain.t,
+       * FS/: FS.pm, MANIFEST, test.pl, FS/cust_bill_pay.pm,
+         FS/cust_main.pm, FS/cust_refund.pm, t/CGI.t, t/CGIwrapper.t,
+         t/Conf.t, t/Record.t, t/UID.t, t/agent.t, t/agent_type.t,
+         t/cust_bill.t, t/cust_bill_pay.t, t/cust_bill_pkg.t,
+         t/cust_credit.t, t/cust_credit_bill.t, t/cust_credit_refund.t,
+         t/cust_main.t, t/cust_main_county.t, t/cust_main_invoice.t,
+         t/cust_pay.t, t/cust_pay_batch.t, t/cust_pkg.t, t/cust_refund.t,
+         t/cust_svc.t, t/domain_record.t, t/nas.t, t/part_pkg.t,
+         t/part_referral.t, t/part_svc.t, t/pkg_svc.t, t/port.t,
+         t/prepay_credit.t, t/session.t, t/svc_Common.t, t/svc_acct.t,
+         t/svc_acct_pop.t, t/svc_acct_sm.t, t/svc_domain.t,
          t/svc_forward.t, t/svc_www.t, t/type_pkgs.t: lame testsuite and
          the embarassing fixes in it found
 
+2001-09-01 20:42  ivan
+
+       * httemplate/docs/upgrade8.html: really.  backup.
+
+2001-09-01 20:20  ivan
+
+       * httemplate/docs/upgrade8.html: upgrade
+
 2001-09-01 19:53  jeff
 
        * FS/bin/freeside-apply-credits: adding a credit apply utility
 2001-09-01 19:46  ivan
 
        * FS/FS/cust_bill_pay.pm, FS/FS/cust_main.pm, FS/FS/cust_pay.pm,
-         FS/FS/cust_refund.pm, httemplate/docs/schema.html: cust_refund
-         and cust_pay get custnums
+         FS/FS/cust_refund.pm, bin/fs-setup, httemplate/docs/schema.html,
+         httemplate/docs/upgrade8.html: cust_refund and cust_pay get
+         custnums
 
 2001-09-01 18:27  ivan
 
          cust_refund.pm: more udpates for the new world of unapplied
          stuff.  yay.
 
+2001-09-01 16:41  ivan
+
+       * httemplate/docs/upgrade8.html: cust_bill_pay and
+         cust_credit_refund
+
 2001-09-01 15:28  jeff
 
-       * FS/FS/cust_main.pm: haste makes waste... and left a method out
+       * FS/FS/cust_main.pm, httemplate/docs/upgrade8.html: haste makes
+         waste... and left a method out
 
 2001-09-01 15:18  ivan
 
-       * FS/FS/cust_credit_bill.pm: add primary key
+       * FS/FS/cust_credit_bill.pm, bin/fs-setup: add primary key
 
 2001-09-01 15:01  ivan
 
 2001-09-01 14:52  jeff
 
        * FS/MANIFEST, FS/FS/cust_bill.pm, FS/FS/cust_credit.pm,
-         FS/FS/cust_credit_bill.pm, FS/FS/cust_main.pm,
+         FS/FS/cust_credit_bill.pm, FS/FS/cust_main.pm, bin/fs-setup,
+         httemplate/docs/upgrade8.html,
          httemplate/edit/cust_credit_bill.cgi,
          httemplate/edit/process/cust_credit_bill.cgi,
          httemplate/view/cust_main.cgi: add cust_credit_bill relating
 
        * FS/FS/cust_bill_pay.pm, FS/FS/cust_credit_refund.pm,
          FS/FS/cust_main.pm, FS/FS/cust_pay.pm, FS/FS/cust_refund.pm,
-         httemplate/docs/schema.html: cust_bill_pay and
+         bin/fs-setup, httemplate/docs/schema.html: cust_bill_pay and
          cust_credit_refund.  payments can apply to multiple invoices and
          refunds can apply to multiple credits.
 
+2001-09-01 05:35  ivan
+
+       * httemplate/search/cust_bill.cgi: totals
+
 2001-08-31 02:20  ivan
 
        * FS/FS/Record.pm: check US zips more strictly
 
        * httemplate/edit/agent.cgi: ui
 
+2001-08-29 01:45  ivan
+
+       * bin/fs-setup, httemplate/docs/upgrade8.html: catchall *can* be
+         NULL
+
 2001-08-28 09:58  ivan
 
-       * httemplate/: docs/signup.html, search/cust_main.cgi:
-         customer-to-customer referrals in singup server
+       * httemplate/: docs/signup.html, docs/upgrade8.html,
+         search/cust_main.cgi: customer-to-customer referrals in singup
+         server
 
 2001-08-28 07:34  ivan
 
-       * FS/FS/cust_main.pm, httemplate/edit/cust_main.cgi,
+       * FS/FS/cust_main.pm, httemplate/docs/config.html,
+         httemplate/docs/upgrade8.html, httemplate/edit/cust_main.cgi,
          httemplate/search/cust_main.cgi, httemplate/view/cust_main.cgi:
          customer-to-customer referrals!
 
 
 2001-08-21 02:34  ivan
 
-       * FS/FS/Record.pm, FS/FS/UID.pm, httemplate/browse/agent.cgi,
+       * FS/FS/Record.pm, FS/FS/UID.pm, FS/bin/freeside-bill,
+         htetc/global.asa, httemplate/browse/agent.cgi,
          httemplate/browse/agent_type.cgi,
          httemplate/browse/cust_main_county.cgi,
          httemplate/browse/part_pkg.cgi,
+         httemplate/browse/part_referral.cgi,
          httemplate/browse/svc_acct_pop.cgi: no more &swapuid
 
 2001-08-20 20:03  ivan
 2001-08-20 19:44  ivan
 
        * FS/FS/domain_record.pm, FS/FS/prepay_credit.pm, FS/FS/svc_www.pm,
-         eg/TEMPLATE_cust_main.import, eg/table_template-svc.pm: remove
-         $Log$
+         FS/bin/freeside-print-batch, eg/TEMPLATE_cust_main.import,
+         eg/table_template-svc.pm: remove $Log$
 
 2001-08-20 19:43  ivan
 
-       * bin/fs-migrate-svc_acct_sm: i think svc_acct_sm.import should go
-         away, but...
+       * bin/: dbdef-create, fs-migrate-svc_acct_sm, svc_acct_sm.import: i
+         think svc_acct_sm.import should go away, but...
 
 2001-08-20 19:32  ivan
 
 2001-08-20 19:31  ivan
 
        * httemplate/: browse/agent.cgi, browse/agent_type.cgi,
-         browse/part_pkg.cgi, browse/svc_acct_pop.cgi, edit/agent.cgi,
-         edit/agent_type.cgi, edit/cust_credit.cgi,
-         edit/cust_main_county-expand.cgi, edit/cust_pay.cgi,
-         edit/cust_pkg.cgi, edit/part_pkg.cgi, edit/svc_acct_pop.cgi,
-         edit/svc_domain.cgi, edit/svc_forward.cgi,
+         browse/part_pkg.cgi, browse/part_referral.cgi,
+         browse/svc_acct_pop.cgi, edit/agent.cgi, edit/agent_type.cgi,
+         edit/cust_credit.cgi, edit/cust_main_county-expand.cgi,
+         edit/cust_main_county.cgi, edit/cust_pay.cgi, edit/cust_pkg.cgi,
+         edit/part_pkg.cgi, edit/part_referral.cgi, edit/svc_acct_pop.cgi,
+         edit/svc_acct_sm.cgi, edit/svc_domain.cgi, edit/svc_forward.cgi,
          edit/process/agent.cgi, edit/process/agent_type.cgi,
-         edit/process/cust_credit.cgi, edit/process/cust_pay.cgi,
-         edit/process/cust_pkg.cgi, edit/process/part_pkg.cgi,
+         edit/process/cust_credit.cgi, edit/process/cust_main_county.cgi,
+         edit/process/cust_pay.cgi, edit/process/cust_pkg.cgi,
+         edit/process/part_pkg.cgi, edit/process/part_referral.cgi,
          edit/process/svc_acct.cgi, edit/process/svc_acct_pop.cgi,
-         edit/process/svc_domain.cgi, edit/process/svc_forward.cgi,
-         misc/bill.cgi, misc/cancel-unaudited.cgi, misc/catchall.cgi,
-         misc/delete-customer.cgi, misc/link.cgi, misc/print-invoice.cgi,
+         edit/process/svc_acct_sm.cgi, edit/process/svc_domain.cgi,
+         edit/process/svc_forward.cgi, misc/bill.cgi,
+         misc/cancel-unaudited.cgi, misc/cancel_pkg.cgi,
+         misc/catchall.cgi, misc/delete-customer.cgi, misc/expire_pkg.cgi,
+         misc/link.cgi, misc/print-invoice.cgi, misc/susp_pkg.cgi,
          misc/unsusp_pkg.cgi, misc/process/catchall.cgi,
          misc/process/delete-customer.cgi, misc/process/link.cgi,
-         search/svc_domain.cgi, view/cust_bill.cgi, view/svc_acct.cgi,
-         view/svc_domain.cgi, view/svc_forward.cgi: remove $Log$ messages.
-         whew.
+         search/cust_bill.cgi, search/svc_acct_sm.cgi,
+         search/svc_domain.cgi, view/cust_bill.cgi, view/cust_pkg.cgi,
+         view/svc_acct.cgi, view/svc_acct_sm.cgi, view/svc_domain.cgi,
+         view/svc_forward.cgi: remove $Log$ messages.  whew.
 
 2001-08-20 19:16  ivan
 
 
 2001-08-20 02:41  ivan
 
-       * FS/FS/: svc_acct.pm, svc_domain.pm, svc_forward.pm: dtrt when
-         deleting accouts wrt forwards, catchalls & other references to
-         svc_acct records
+       * FS/FS/: svc_acct.pm, svc_acct_sm.pm, svc_domain.pm,
+         svc_forward.pm: dtrt when deleting accouts wrt forwards,
+         catchalls & other references to svc_acct records
 
          depreciate svc_acct_sm further; move qmail catchall handling to
          svc_domain
 
 2001-08-20 02:38  ivan
 
-       * httemplate/docs/schema.html: documentation updates
+       * httemplate/docs/: config.html, export.html, schema.html:
+         documentation updates
 
 2001-08-19 08:53  jeff
 
          httemplate/view/svc_forward.cgi: added user interface for
          svc_forward and vpopmail support
 
+2001-08-19 06:50  ivan
+
+       * bin/fs-setup, httemplate/docs/upgrade8.html: indices on cust_main
+         ship_last and ship_country
+
 2001-08-19 03:25  ivan
 
        * bin/svc_acct.import: add system shells to @FS::svc_acct:shells on
          the fly, fixes: ticket #88
 
+2001-08-19 02:08  ivan
+
+       * TODO: this is what i fed to RT, might as well check it in.
+
+         no further modifications to TODO.  everything is in the ticketing
+         system now.
+
 2001-08-19 01:32  ivan
 
        * httemplate/search/cust_pkg.cgi: display bill and service
 2001-08-17 04:05  ivan
 
        * httemplate/: browse/cust_main_county.cgi,
+         edit/cust_main_county.cgi,
          edit/process/cust_main_county-collapse.cgi,
          edit/process/cust_main_county-expand.cgi: clean up tax rate
          editing:   sort by country->state->county,   add "collapse state"
 
 2001-08-17 03:57  ivan
 
-       * bin/svc_acct.import: gah
+       * bin/: dbdef-create, svc_acct.export, svc_acct.import: gah
 
 2001-08-17 03:57  ivan
 
 
 2001-08-17 03:55  ivan
 
-       * FS/FS/cust_main.pm: Business::OnlinePayment
+       * FS/FS/cust_main.pm, httemplate/docs/config.html:
+         Business::OnlinePayment
 
 2001-08-17 03:53  ivan
 
 
        * FS/FS/svc_acct.pm: untaint svcnum & domsvc
 
+2001-08-12 17:19  ivan
+
+       * bin/fs-setup: depriciate svc_acct_sm, add unique index for
+         username+domsvc on svc_acct, remove silly $Log$
+
 2001-08-12 12:41  jeff
 
        * FS/FS/svc_acct.pm, FS/FS/svc_domain.pm, FS/FS/svc_forward.pm,
-         bin/fs-migrate-svc_acct_sm: merging vpopmail support branch
+         bin/fs-migrate-svc_acct_sm, bin/fs-setup, bin/svc_acct.export,
+         bin/svc_acct_sm.export, httemplate/docs/config.html,
+         httemplate/docs/upgrade8.html: merging vpopmail support branch
 
 2001-08-12 01:56  ivan
 
        * httemplate/edit/process/part_svc.cgi: don't use
          Apache::ASP-specific $Redirect object
 
+2001-08-11 18:26  ivan
+
+       * httemplate/docs/postgresql.html: i did get it working
+
 2001-08-11 17:07  ivan
 
        * httemplate/edit/: cust_main.cgi, process/cust_main.cgi: use
 
        * httemplate/browse/part_svc.cgi: missed a variable interpolation
 
+2001-08-10 22:53  ivan
+
+       * bin/fs-setup, httemplate/docs/upgrade8.html: add comments field
+
 2001-08-10 22:52  ivan
 
        * httemplate/: edit/cust_main.cgi, view/cust_main.cgi: add customer
          httemplate/search/cust_main.cgi, httemplate/view/cust_main.cgi:
          shipping address additions
 
+2001-07-30 02:53  ivan
+
+       * httemplate/docs/upgrade8.html: Pg primary key upgrade fix (create
+         fix in new DBIx::DBSchema)
+
 2001-07-30 01:03  ivan
 
        * httemplate/: .htaccess, docs/overview.dia, docs/overview.png:
 
 2001-07-30 01:02  ivan
 
-       * htetc/handler.pl: template stuffs
+       * htetc/: global.asa, handler.pl: template stuffs
 
 2001-07-30 01:01  ivan
 
        * Makefile: need this too!
 
+2001-07-30 00:42  ivan
+
+       * bin/fs-setup: need an DBIx::DBSchema with delcolumn
+
 2001-07-30 00:36  ivan
 
        * httemplate/index.html, httemplate/browse/agent.cgi,
          httemplate/browse/agent_type.cgi,
          httemplate/browse/cust_main_county.cgi,
          httemplate/browse/nas.cgi, httemplate/browse/part_pkg.cgi,
+         httemplate/browse/part_referral.cgi,
          httemplate/browse/part_svc.cgi,
          httemplate/browse/svc_acct_pop.cgi, httemplate/docs/admin.html,
-         httemplate/docs/index.html, httemplate/docs/legacy.html,
-         httemplate/docs/passwd.html, httemplate/docs/schema.html,
-         httemplate/docs/session.html, httemplate/docs/signup.html,
-         bin/masonize, bin/pod2x, httemplate/edit/agent.cgi,
+         httemplate/docs/billing.html, httemplate/docs/config.html,
+         httemplate/docs/export.html, httemplate/docs/index.html,
+         httemplate/docs/install.html, httemplate/docs/legacy.html,
+         httemplate/docs/passwd.html, httemplate/docs/postgresql.html,
+         httemplate/docs/schema.html, httemplate/docs/session.html,
+         httemplate/docs/signup.html, httemplate/docs/trouble.html,
+         httemplate/docs/upgrade.html, httemplate/docs/upgrade2.html,
+         httemplate/docs/upgrade3.html, httemplate/docs/upgrade4.html,
+         httemplate/docs/upgrade5.html, httemplate/docs/upgrade6.html,
+         httemplate/docs/upgrade7.html, httemplate/docs/upgrade8.html,
+         bin/fs-setup, bin/masonize, bin/pod2x, httemplate/edit/agent.cgi,
          httemplate/edit/agent_type.cgi, httemplate/edit/cust_credit.cgi,
          httemplate/edit/cust_main.cgi,
          httemplate/edit/cust_main_county-expand.cgi,
+         httemplate/edit/cust_main_county.cgi,
          httemplate/edit/cust_pay.cgi, httemplate/edit/cust_pkg.cgi,
-         httemplate/edit/part_pkg.cgi, httemplate/edit/part_svc.cgi,
-         httemplate/edit/svc_acct.cgi, httemplate/edit/svc_acct_pop.cgi,
-         httemplate/edit/svc_domain.cgi,
+         httemplate/edit/part_pkg.cgi, httemplate/edit/part_referral.cgi,
+         httemplate/edit/part_svc.cgi, httemplate/edit/svc_acct.cgi,
+         httemplate/edit/svc_acct_pop.cgi,
+         httemplate/edit/svc_acct_sm.cgi, httemplate/edit/svc_domain.cgi,
          httemplate/edit/process/agent.cgi,
          httemplate/edit/process/agent_type.cgi,
          httemplate/edit/process/cust_credit.cgi,
          httemplate/edit/process/cust_main.cgi,
          httemplate/edit/process/cust_main_county-expand.cgi,
+         httemplate/edit/process/cust_main_county.cgi,
          httemplate/edit/process/cust_pay.cgi,
          httemplate/edit/process/cust_pkg.cgi,
          httemplate/edit/process/part_pkg.cgi,
+         httemplate/edit/process/part_referral.cgi,
          httemplate/edit/process/part_svc.cgi,
          httemplate/edit/process/svc_acct.cgi,
          httemplate/edit/process/svc_acct_pop.cgi,
+         httemplate/edit/process/svc_acct_sm.cgi,
          httemplate/edit/process/svc_domain.cgi,
-         httemplate/images/small-logo.png, httemplate/misc/bill.cgi,
-         httemplate/misc/cancel-unaudited.cgi,
-         httemplate/misc/delete-customer.cgi, httemplate/misc/link.cgi,
-         httemplate/misc/print-invoice.cgi,
+         httemplate/images/mid-logo.png, httemplate/images/small-logo.png,
+         httemplate/misc/bill.cgi, httemplate/misc/cancel-unaudited.cgi,
+         httemplate/misc/cancel_pkg.cgi,
+         httemplate/misc/delete-customer.cgi,
+         httemplate/misc/expire_pkg.cgi, httemplate/misc/link.cgi,
+         httemplate/misc/print-invoice.cgi, httemplate/misc/susp_pkg.cgi,
          httemplate/misc/unsusp_pkg.cgi,
          httemplate/misc/process/delete-customer.cgi,
          httemplate/misc/process/link.cgi,
+         httemplate/search/cust_bill.cgi,
          httemplate/search/cust_bill.html,
+         httemplate/search/cust_main-payinfo.html,
          httemplate/search/cust_main.cgi,
          httemplate/search/cust_main.html, httemplate/search/cust_pkg.cgi,
-         httemplate/search/svc_acct.cgi, httemplate/search/svc_domain.cgi,
-         httemplate/view/cust_bill.cgi, httemplate/view/cust_main.cgi,
-         httemplate/view/svc_acct.cgi, httemplate/view/svc_domain.cgi:
-         templates!!!
+         httemplate/search/svc_acct.cgi, httemplate/search/svc_acct.html,
+         httemplate/search/svc_acct_sm.cgi,
+         httemplate/search/svc_acct_sm.html,
+         httemplate/search/svc_domain.cgi,
+         httemplate/search/svc_domain.html, httemplate/view/cust_bill.cgi,
+         httemplate/view/cust_main.cgi, httemplate/view/cust_pkg.cgi,
+         httemplate/view/svc_acct.cgi, httemplate/view/svc_acct_sm.cgi,
+         httemplate/view/svc_domain.cgi: templates!!!
 
 2001-07-30 00:33  ivan
 
 
        * INSTALL, README: templates!
 
+2001-07-30 00:13  ivan
+
+       * TODO: todocruft
+
 2001-07-29 23:28  ivan
 
        * FS/FS/svc_acct.pm: allow !! as password for disabled accounts
 
 2001-07-29 23:07  ivan
 
-       * bin/svc_acct.import: allow !! for locked accounts instead of
-         changing to *SUSPENDED*
+       * bin/: svc_acct.export, svc_acct.import: allow !! for locked
+         accounts instead of changing to *SUSPENDED*
 
 2001-07-27 10:16  ivan
 
 
        * FS/FS/UID.pm: better error message
 
+2001-06-20 01:33  ivan
+
+       * bin/svc_acct.export: >     Use of uninitialized value in
+         concatenation (.) at svc_acct.export line
+         > 276.
+
+2001-06-06 15:22  ivan
+
+       * TODO: templating thoughts
+
 2001-06-05 14:40  ivan
 
-       * debian/: README.Debian, changelog, control, copyright, init.d.ex,
-         rules: add deb packaging foo (doesn't work yet)
+       * debian/: README.Debian, changelog, conffiles.ex, control,
+         copyright, cron.d.ex, dirs, docs, ex.doc-base.package,
+         freeside-doc.docs, freeside-doc.files, init.d.ex, manpage.1.ex,
+         manpage.sgml.ex, menu.ex, postinst.ex, postrm.ex, preinst.ex,
+         prerm.ex, rules, watch.ex: add deb packaging foo (doesn't work
+         yet)
 
 2001-06-03 10:22  ivan
 
 
        * README: 1.3.1!!!
 
+2001-06-03 07:16  ivan
+
+       * bin/fs-setup: allow empty refund reasons
+
+2001-06-03 07:15  ivan
+
+       * TODO: yes yes
+
 2001-06-03 05:36  ivan
 
        * FS/FS/svc_acct.pm: add username-letter and username-letterfirst
 
        * FS/bin/freeside-email: simple program to list all email addresses
 
+2001-05-08 03:44  ivan
+
+       * bin/: svc_acct.export, svc_acct_sm.export: fix for OO Net::SCP
+
 2001-05-07 08:42  ivan
 
        * FS/FS/Record.pm: tyop
 
 2001-04-21 18:56  ivan
 
-       * README, FS/FS.pm, FS/MANIFEST, FS/FS/svc_acct.pm,
-         FS/FS/svc_domain.pm, FS/FS/svc_www.pm, bin/svc_acct.import: get
-         rid of FS::SSH.pm (became Net::SSH and Net::SCP on CPAN)
+       * README, FS/FS.pm, FS/MANIFEST, FS/FS/SSH.pm, FS/FS/svc_acct.pm,
+         FS/FS/svc_acct_sm.pm, FS/FS/svc_domain.pm, FS/FS/svc_www.pm,
+         bin/svc_acct.export, bin/svc_acct.import, bin/svc_acct_sm.export,
+         bin/svc_acct_sm.import, bin/svc_domain.import,
+         fs_passwd/fs_passwd_server: get rid of FS::SSH.pm (became
+         Net::SSH and Net::SCP on CPAN)
 
 2001-04-21 18:38  ivan
 
-       * FS/FS/svc_domain.pm: svc_domain needs to import dbh sub from
-         Record view/cust_main.cgi needs to use ->owed method, not check
-         (depriciated) owed field search/cust_bill.cgi redirect error when
-         there's only one invoice
+       * TODO, FS/FS/svc_domain.pm: svc_domain needs to import dbh sub
+         from Record view/cust_main.cgi needs to use ->owed method, not
+         check (depriciated) owed field search/cust_bill.cgi redirect
+         error when there's only one invoice
 
 2001-04-21 17:49  ivan
 
 
        * FS/MANIFEST: no more dbdef
 
+2001-04-15 06:56  ivan
+
+       * TODO: [no log message]
+
 2001-04-15 06:35  ivan
 
        * FS/FS/: nas.pm, session.pm, svc_Common.pm, svc_domain.pm:
 
 2001-04-15 05:56  ivan
 
-       * FS/FS/Record.pm: s/dbdef/DBIx::DBSchema/
+       * TODO, FS/FS/Record.pm, FS/FS/dbdef.pm, FS/FS/dbdef_colgroup.pm,
+         FS/FS/dbdef_column.pm, FS/FS/dbdef_index.pm,
+         FS/FS/dbdef_table.pm, FS/FS/dbdef_unique.pm, bin/dbdef-create,
+         bin/fs-setup: s/dbdef/DBIx::DBSchema/
 
 2001-04-15 03:33  ivan
 
-       * CREDITS: better docs for the worst bit, finally
+       * CREDITS, TODO: better docs for the worst bit, finally
+
+2001-04-15 02:36  ivan
+
+       * bin/fs-setup:
+         http://www.sisd.com/freeside/list-archive/msg01450.html
 
 2001-04-09 16:05  ivan
 
-       * FS/FS/: cust_bill.pm, cust_credit.pm, cust_main.pm, cust_pay.pm,
-         cust_pkg.pm, cust_refund.pm, session.pm, svc_Common.pm:
-         Transactions Part I!!!
+       * TODO, FS/FS/cust_bill.pm, FS/FS/cust_credit.pm,
+         FS/FS/cust_main.pm, FS/FS/cust_pay.pm, FS/FS/cust_pkg.pm,
+         FS/FS/cust_refund.pm, FS/FS/session.pm, FS/FS/svc_Common.pm,
+         bin/fs-setup: Transactions Part I!!!
 
 2001-04-09 08:50  ivan
 
-       * CREDITS, FS/MANIFEST: rar
+       * CREDITS, TODO, FS/MANIFEST: rar
 
 2001-03-30 09:33  ivan
 
        * FS/FS/session.pm: silly typo, fix sent by Mack <mackn@mackn.net>,
          thanks!
 
+2001-02-21 15:48  ivan
+
+       * bin/svc_acct.export: add icradius_secrets config file to export
+         to a non-Freeside MySQL database for ICRADIUS
+
+2001-02-20 17:48  ivan
+
+       * FS/bin/freeside-print-batch: stupid pod errors
+
+2001-02-20 17:46  ivan
+
+       * FS/FS/: Bill.pm, Invoice.pm: cruft
+
 2001-02-20 17:45  ivan
 
        * FS/FS/nas.pm: pod tyop
 
 2001-02-03 06:03  ivan
 
-       * FS/FS/Record.pm, FS/FS/UID.pm, FS/FS/cust_main.pm,
+       * FS/FS/Record.pm, FS/FS/UID.pm, FS/FS/cust_main.pm, bin/fs-setup,
          bin/generate-prepay: time-based prepaid cards, session monitor.
          woop!
 
 2001-01-30 23:21  ivan
 
-       * FS/FS/: cust_main.pm, svc_acct.pm: fix tyops
+       * TODO, FS/FS/cust_main.pm, FS/FS/svc_acct.pm: fix tyops
 
 2001-01-30 01:08  ivan
 
 
 2000-12-26 15:51  ivan
 
-       * CREDITS: statedefault & referraldefault config files
+       * CREDITS, TODO: statedefault & referraldefault config files
+
+2000-12-10 17:30  ivan
+
+       * TODO: more ancient todo stuff from my inbox
+
+2000-12-10 17:10  ivan
+
+       * TODO: ancient stuff out of my inbox
 
 2000-12-08 14:22  ivan
 
 
        * FS/FS/Record.pm: DESTROY sub
 
+2000-12-03 16:13  ivan
+
+       * bin/fs-setup: fix nas.last type
+
 2000-12-03 12:25  ivan
 
-       * FS/FS/: Record.pm, nas.pm, port.pm, session.pm: session monitor
-         updates
+       * TODO, FS/FS/Record.pm, FS/FS/nas.pm, FS/FS/port.pm,
+         FS/FS/session.pm: session monitor updates
 
 2000-12-03 07:14  ivan
 
-       * CREDITS, FS/FS/cust_bill.pm: bugfixes from Jeff Finucane
-         <jeff@cmh.net>, thanks!
+       * CREDITS, FS/FS/cust_bill.pm, bin/svc_acct_sm.import: bugfixes
+         from Jeff Finucane <jeff@cmh.net>, thanks!
 
 2000-12-03 05:45  ivan
 
 
 2000-12-03 02:09  ivan
 
-       * FS/MANIFEST: bad caches!
+       * FS/: MANIFEST, FS/CGIwrapper.pm: bad caches!
+
+2000-12-01 10:34  ivan
+
+       * bin/fs-setup: another tyop
+
+2000-12-01 10:33  ivan
+
+       * bin/fs-setup: tyop
 
 2000-11-22 15:30  ivan
 
 
 2000-11-07 07:00  ivan
 
-       * FS/: MANIFEST, FS/Record.pm, FS/nas.pm, FS/session.pm: session
-         monitor
+       * FS/MANIFEST, FS/FS/Record.pm, FS/FS/nas.pm, FS/FS/session.pm,
+         bin/fs-setup: session monitor
+
+2000-10-30 02:47  ivan
+
+       * bin/fs-setup: nas.last can't be defined NULL if indexed
 
 2000-10-27 13:18  ivan
 
 
 2000-10-27 13:15  ivan
 
-       * FS/FS/Record.pm, eg/table_template.pm: session monitor
+       * TODO, FS/FS/Record.pm, bin/fs-setup, eg/table_template.pm:
+         session monitor
+
+2000-10-15 05:58  ivan
+
+       * TODO: roo
 
 2000-10-11 17:44  ivan
 
          print_text method is called, want to print overdue invoices if
          printed > 0, not > 1
 
+2000-08-24 00:26  ivan
+
+       * TODO: untaint template source
+
 2000-08-09 11:40  ivan
 
        * conf/invoice_template: example invoice template
 
 2000-08-09 04:30  ivan
 
-       * FS/FS/cust_bill.pm: templatable invoices
+       * TODO, FS/FS/cust_bill.pm: templatable invoices
 
 2000-07-17 06:51  ivan
 
 
        * CREDITS: rawr!
 
+2000-07-06 21:05  ivan
+
+       * fs_passwd/fs_passwd_server: wait()ing on SIGCHLD causing hangs
+         for some folks
+
 2000-07-06 06:56  ivan
 
        * FS/FS/svc_acct.pm: mis-PODed =back should have been a =cut in
          conjunction with AUTOLOAD this was sure a pain to find
 
+2000-07-06 06:23  ivan
+
+       * bin/svc_acct.export: tyop
+
 2000-07-06 06:19  ivan
 
        * bin/: fs-radius-add-check, fs-radius-add-reply: remove duplicate
 
 2000-07-06 01:57  ivan
 
-       * FS/FS/svc_acct.pm, bin/fs-radius-add-check,
-         bin/fs-radius-add-reply: support for radius check attributes
-         (except importing).  poorly documented.
+       * TODO, FS/FS/svc_acct.pm, bin/fs-radius-add,
+         bin/fs-radius-add-check, bin/fs-radius-add-reply, bin/fs-setup,
+         bin/svc_acct.export: support for radius check attributes (except
+         importing).  poorly documented.
+
+2000-07-05 20:37  ivan
+
+       * bin/svc_acct_sm.export: don't error out on invalid
+         svc_acct_sm.domuid's that can't be matched in svc_acct.uid - just
+         warn.
 
 2000-07-04 06:42  ivan
 
        * FS/FS/svc_acct.pm: noted a API inconsistancy
 
+2000-07-03 02:13  ivan
+
+       * bin/svc_acct_sm.export: get rid of double sendmailrestart
+         invocation; no need for multiple sessions
+
+2000-07-03 02:09  ivan
+
+       * bin/svc_acct_sm.export: typo
+
+2000-07-03 02:03  ivan
+
+       * TODO, bin/svc_acct_sm.export: added sendmailrestart and
+         sendmailconfigpath config files
+
+2000-06-30 03:37  ivan
+
+       * FS/FS/svc_acct_sm.pm: maildisablecatchall configuration file
+
+2000-06-29 08:01  ivan
+
+       * bin/svc_acct.export: another silly typo in svc_acct.export
+
+2000-06-29 07:02  ivan
+
+       * bin/svc_acct_sm.export: add sendmailrestart configuration file
+
 2000-06-29 05:27  ivan
 
        * bin/svc_acct.import: s/password/_password/ for PostgreSQL wasn't
          done in the import.
 
+2000-06-29 05:00  ivan
+
+       * bin/fs-setup: support for pre-encrypted md5 passwords.
+
 2000-06-29 04:56  ivan
 
        * FS/FS/svc_acct.pm: md5 passwords can are 34 characters long and
        * FS/FS/svc_domain.pm: don't block on $whois_hack trueness when
          adding new domains.
 
+2000-06-29 03:51  ivan
+
+       * bin/svc_acct_sm.import: oops, silly mistake
+
+2000-06-29 03:48  ivan
+
+       * bin/svc_acct_sm.import: make svc_acct_sm skip blank lines in
+         sendmail import
+
 2000-06-28 05:54  ivan
 
        * FS/FS/svc_acct.pm: superfluous my()
        * FS/FS/svc_acct.pm: bugfix to accept shells that evaluate to false
          in perl, like the empty string.
 
+2000-06-28 05:37  ivan
+
+       * bin/svc_acct.export: add support for config option
+         textradiusprepend
+
 2000-06-28 05:32  ivan
 
        * bin/svc_acct.import: allow RADIUS lines with "Auth-Type = Local"
        * bin/svc_acct.import: make svc_acct more forgiving about RADIUS
          users files
 
+2000-06-28 03:51  ivan
+
+       * bin/fs-radius-add: forgot to import a sub
+
+2000-06-28 03:48  ivan
+
+       * bin/fs-radius-add: quick hack to add RADIUS attributes
+
+2000-06-27 05:15  ivan
+
+       * TODO: i18n
+
 2000-06-27 05:15  ivan
 
        * FS/FS/: Record.pm, cust_main.pm: i18
 
 2000-06-23 17:28  ivan
 
-       * FS/FS/cust_main.pm: don't use Date::Manip; report correct program
-         name in freeside-bill usage msg
+       * FS/: FS/cust_main.pm, bin/freeside-bill: don't use Date::Manip;
+         report correct program name in freeside-bill usage msg
 
 2000-06-23 05:25  ivan
 
-       * CREDITS, FS/FS/Record.pm, FS/FS/UID.pm: FS::Record::qsearch -
-         more portable, doesn't depend on $sth->execute returning a number
-         of rows, uses placeholders and prepare_cached
+       * CREDITS, TODO, FS/FS/Record.pm, FS/FS/UID.pm: FS::Record::qsearch
+         - more portable, doesn't depend on $sth->execute returning a
+         number of rows, uses placeholders and prepare_cached
+
+2000-06-22 03:52  ivan
+
+       * FS/bin/freeside-bill: tyop
 
 2000-06-20 00:13  ivan
 
 
 2000-06-15 07:45  ivan
 
-       * CREDITS: text updates
+       * CREDITS, TODO: text updates
+
+2000-06-15 07:07  ivan
+
+       * bin/svc_acct.export: added ICRADIUS radreply table support,
+         courtesy of Kenny Elliott
 
 2000-06-15 06:35  ivan
 
        * FS/FS/cust_main.pm: fix for ncancelled_pkgs - when called in
          scalar context, was only returning second item
 
+2000-06-12 01:37  ivan
+
+       * bin/svc_acct_sm.export: sendmail fix from Jeff Finucane
+
+2000-05-13 14:57  ivan
+
+       * TODO, FS/bin/freeside-print-batch: add print_batch script from
+         Joel Griffiths
+
 2000-05-13 14:50  ivan
 
        * FS/FS/: CGI.pm, UID.pm: cgisuidsetup takes an Apache object as
        * FS/FS/CGI.pm: CGI.pm detects mod_perl and calls appropriate exit
          (Registry's override doesn't work here)
 
+2000-04-02 19:32  ivan
+
+       * FS/bin/freeside-bill: accept anything in ARGV for -d Date::Parse
+
 2000-03-06 08:38  ivan
 
        * FS/FS/svc_acct.pm: better error message.  bah.
 
+2000-03-06 08:00  ivan
+
+       * bin/svc_acct.export: sync up with working versoin
+
+2000-03-06 07:59  ivan
+
+       * bin/svc_acct.export: finally get MySQL locking working for
+         ICRADIUS export
+
+2000-03-06 07:15  ivan
+
+       * FS/FS/SSH.pm: backout silly change
+
+2000-03-06 07:04  ivan
+
+       * FS/FS/SSH.pm: bug in IPC::Open3 documentation?
+
+2000-03-06 06:59  ivan
+
+       * bin/svc_acct.export: s/sshopen2/sshopen3/ to prevent spurious
+         mysql "Enter password: " dialog from showing up in cron/terminal
+
+2000-03-06 06:51  ivan
+
+       * bin/svc_acct.export: eek
+
+2000-03-06 06:50  ivan
+
+       * bin/svc_acct.export: oop
+
+2000-03-06 06:48  ivan
+
+       * bin/svc_acct.export: s/icradiusmachine/machine/
+
+2000-03-06 06:46  ivan
+
+       * bin/svc_acct.export: not setuid or run by malicious user - no -T
+         necessary
+
+2000-03-06 06:19  ivan
+
+       * bin/svc_acct.export: ICRADIUS export bugfix
+
+2000-03-06 06:12  ivan
+
+       * TODO, bin/svc_acct.export: ICRADIUS export support
+
 2000-03-03 10:45  ivan
 
        * FS/FS/CGI.pm: use Apache::exit instead of exit in &eidiot -
        * FS/FS/Record.pm: changes backported from 1.2.3 release, bugfix
          from web demo
 
+2000-03-01 23:44  ivan
+
+       * bin/fs-setup: typo forgot closing '
+
 2000-03-01 00:13  ivan
 
        * FS/: MANIFEST, FS/svc_domain.pm, FS/svc_www.pm: compilation
 2000-02-02 21:16  ivan
 
        * FS/FS/cust_pkg.pm, FS/FS/domain_record.pm, FS/FS/svc_domain.pm,
-         FS/FS/svc_www.pm, bin/svc_acct.import: beginning of DNS and
-         Apache support
+         FS/FS/svc_www.pm, bin/fs-setup, bin/svc_acct.import,
+         bin/svc_acct_sm.import, bin/svc_domain.import: beginning of DNS
+         and Apache support
 
 2000-02-02 12:22  ivan
 
 
 2000-01-30 21:22  ivan
 
-       * FS/FS/: cust_main.pm, prepay_credit.pm: prepaid "internet cards"
+       * FS/FS/cust_main.pm, FS/FS/prepay_credit.pm, bin/fs-setup: prepaid
+         "internet cards"
 
 2000-01-30 00:18  ivan
 
        * CREDITS: [no log message]
 
+2000-01-29 22:11  ivan
+
+       * TODO: [no log message]
+
+2000-01-29 22:03  ivan
+
+       * bin/fs-setup: postgres 6.5 finally supports decimal(10,2)
+
 2000-01-29 13:10  ivan
 
        * FS/FS/svc_domain.pm: doc update
 
 2000-01-28 14:53  ivan
 
-       * FS/FS/svc_acct_pop.pm: track full phone number
+       * bin/fs-setup, FS/FS/svc_acct_pop.pm: track full phone number
 
 2000-01-26 16:37  ivan
 
        * README: ack
 
+2000-01-26 16:27  ivan
+
+       * TODO: update TODO
+
 1999-11-08 13:38  ivan
 
        * FS/FS/cust_pkg.pm: remove services using pkg_svc table now, oops!
 
+1999-10-04 01:23  ivan
+
+       * FS/bin/freeside-bill: silly 'use of unitialized value' errors
+
+1999-09-22 15:06  ivan
+
+       * TODO: ya todo update
+
+1999-08-26 23:25  ivan
+
+       * TODO: [no log message]
+
 1999-08-23 05:26  ivan
 
        * test/cgi-test: need to untaint the command line
        * FS/FS/svc_acct.pm: configurable min/max username length, min
          password length, periods in usernames
 
+1999-08-11 13:51  ivan
+
+       * FS/bin/freeside-bill: [no log message]
+
 1999-08-11 13:41  ivan
 
-       * FS/: MANIFEST, Makefile.PL, FS/svc_domain.pm: new bill script,
+       * FS/MANIFEST, FS/Makefile.PL, FS/FS/svc_domain.pm,
+         FS/bin/freeside-bill, bin/bill: new bill script,
+
+1999-08-11 07:42  ivan
+
+       * bin/backup-freeside: [no log message]
 
 1999-08-11 06:12  ivan
 
        * FS/FS/svc_domain.pm: require a working Net::Whois version
 
+1999-08-10 05:06  ivan
+
+       * fs_passwd/fs_passwdd: even though you should probably set this
+         for your installation
+
 1999-08-04 05:42  ivan
 
        * bin/pod2x: new, kludgy-but-working html generator
 
 1999-08-04 02:03  ivan
 
-       * FS/: MANIFEST, MANIFEST.SKIP, FS/CGI.pm, FS/Conf.pm,
-         FS/Record.pm, FS/UID.pm, FS/agent.pm, FS/agent_type.pm,
-         FS/cust_bill.pm, FS/cust_bill_pkg.pm, FS/cust_credit.pm,
-         FS/cust_main.pm, FS/cust_main_county.pm, FS/cust_main_invoice.pm,
-         FS/cust_pay.pm, FS/cust_pay_batch.pm, FS/cust_pkg.pm,
-         FS/cust_refund.pm, FS/cust_svc.pm, FS/part_pkg.pm,
-         FS/part_referral.pm, FS/part_svc.pm, FS/pkg_svc.pm,
-         FS/svc_Common.pm, FS/svc_acct.pm, FS/svc_acct_pop.pm,
-         FS/svc_domain.pm, FS/type_pkgs.pm: initial checkin of module
-         files for proper perl installation
+       * FS/: MANIFEST, MANIFEST.SKIP, README, FS/Bill.pm, FS/CGI.pm,
+         FS/Conf.pm, FS/Invoice.pm, FS/Record.pm, FS/SSH.pm, FS/UID.pm,
+         FS/agent.pm, FS/agent_type.pm, FS/cust_bill.pm,
+         FS/cust_bill_pkg.pm, FS/cust_credit.pm, FS/cust_main.pm,
+         FS/cust_main_county.pm, FS/cust_main_invoice.pm, FS/cust_pay.pm,
+         FS/cust_pay_batch.pm, FS/cust_pkg.pm, FS/cust_refund.pm,
+         FS/cust_svc.pm, FS/dbdef.pm, FS/dbdef_colgroup.pm,
+         FS/dbdef_column.pm, FS/dbdef_index.pm, FS/dbdef_table.pm,
+         FS/dbdef_unique.pm, FS/part_pkg.pm, FS/part_referral.pm,
+         FS/part_svc.pm, FS/pkg_svc.pm, FS/svc_Common.pm, FS/svc_acct.pm,
+         FS/svc_acct_pop.pm, FS/svc_acct_sm.pm, FS/svc_domain.pm,
+         FS/type_pkgs.pm, FS/UI/Base.pm, FS/UI/CGI.pm, FS/UI/Gtk.pm,
+         FS/UI/agent.pm: initial checkin of module files for proper perl
+         installation
 
 1999-08-04 01:03  ivan
 
 
 1999-08-03 21:15  ivan
 
-       * FS/: Changes, FS.pm, MANIFEST, Makefile.PL: initial h2xs
+       * FS/: Changes, FS.pm, MANIFEST, Makefile.PL, test.pl: initial h2xs
+
+1999-08-03 00:43  ivan
+
+       * TODO: use Net::Whois;
+
+1999-07-29 12:13  ivan
+
+       * TODO: [no log message]
+
+1999-07-29 01:50  ivan
+
+       * bin/fs-setup: wrong type for cust_pay_batch.exp
+
+1999-07-15 17:20  ivan
+
+       * TODO: [no log message]
+
+1999-07-15 16:50  ivan
+
+       * TODO: [no log message]
 
 1999-07-08 04:40  ivan
 
-       * CREDITS, README: [no log message]
+       * CREDITS, README, TODO: [no log message]
 
 1999-07-07 19:32  ivan
 
        * bin/svc_acct.import: updates to avoid -w warnings from Joel
          Griffiths <griff@aver-computer.com>
 
+1999-07-07 18:02  ivan
+
+       * TODO: [no log message]
+
+1999-04-29 02:37  ivan
+
+       * TODO: [no log message]
+
 1999-04-19 03:32  ivan
 
        * etc/megapop.pl: if you are a megapop customer...
 
+1999-04-15 15:46  ivan
+
+       * bin/fs-setup: TT isn't a state!
+
+1999-04-14 06:14  ivan
+
+       * TODO: configuration option to edit referrals of existing
+         customers
+
+1999-04-14 04:27  ivan
+
+       * TODO: showpasswords config option to show passwords
+
+1999-04-14 01:58  ivan
+
+       * TODO: [no log message]
+
+1999-04-14 00:58  ivan
+
+       * bin/fs-setup: export getsecrets from FS::UID instead of calling
+         it explicitly
+
+1999-04-08 20:52  ivan
+
+       * TODO: [no log message]
+
 1999-04-08 06:21  ivan
 
-       * CREDITS: [no log message]
+       * CREDITS, conf/address: [no log message]
 
 1999-04-08 06:11  ivan
 
 
        * test/cgi-test: web interface tester / sample data creator
 
+1999-04-08 06:03  ivan
+
+       * TODO: [no log message]
+
 1999-03-26 05:15  ivan
 
        * eg/TEMPLATE_cust_main.import: s/create/new/, use all necessary
          FS::table_names to avoid warnings
 
+1999-03-26 05:00  ivan
+
+       * fs_passwd/fs_passwd_server: s/create/new/
+
 1999-03-25 00:42  ivan
 
-       * bin/svc_acct.import: import stuff uses Term::Query and spits out
-         (some kinds of) nonsensical input
+       * bin/: svc_acct.import, svc_acct_sm.import: import stuff uses
+         Term::Query and spits out (some kinds of) nonsensical input
+
+1999-03-23 16:51  ivan
+
+       * bin/svc_acct_sm.import: die if no relevant services... cvspain
 
 1999-03-23 16:43  ivan
 
        * bin/svc_acct.import: die if no relevant services
 
+1999-02-28 11:44  ivan
+
+       * bin/fs-setup: constructors s/create/new/ pointed out by "Bao C.
+         Ha" <bao@hacom.net>
+
+1999-02-27 13:06  ivan
+
+       * bin/fs-setup: cust_main.paydate should be varchar(10), not
+         @date_type ; problem reported by Ben Leibig <leibig@colorado.edu>
+
+1999-02-23 00:09  ivan
+
+       * TODO: beginnings of one-screen new customer entry and some other
+         miscellania
+
 1999-02-10 01:02  ivan
 
        * etc/sql-reserved-words.txt: some new doc files
 
+1999-02-10 00:27  ivan
+
+       * TODO: [no log message]
+
+1999-02-09 01:56  ivan
+
+       * TODO: [no log message]
+
 1999-02-07 01:59  ivan
 
-       * CREDITS: more mod_perl fixes, and bugfixes Peter Wemm sent via
-         email
+       * CREDITS, TODO, bin/fs-setup: more mod_perl fixes, and bugfixes
+         Peter Wemm sent via email
 
 1999-02-06 14:43  ivan
 
-       * CREDITS: don't use [e]idiot; display error messages on the form
-         page
+       * CREDITS, TODO: don't use [e]idiot; display error messages on the
+         form page
+
+1999-02-03 22:09  ivan
+
+       * bin/fs-setup: add AU provences
+
+1999-02-03 02:42  ivan
+
+       * bin/fs-setup: [no log message]
+
+1999-01-25 04:09  ivan
+
+       * TODO: yet more mod_perl stuff
+
+1999-01-18 15:05  ivan
+
+       * TODO: update TODO for stuff that was done etc.
+
+1999-01-16 19:11  ivan
+
+       * bin/fs-setup: remove preliminary completehost changes
 
 1999-01-15 16:24  ivan
 
 
        * CREDITS: [no log message]
 
+1998-12-30 15:03  ivan
+
+       * TODO: bugfixes; fields isn't exported by derived classes
+
+1998-12-29 03:59  ivan
+
+       * TODO: mostly properly OO, some work still to be done with svc_
+         stuff
+
+1998-12-15 22:05  ivan
+
+       * bin/fs-setup: add table cust_main_invoice
+
+1998-12-15 21:38  ivan
+
+       * TODO: [no log message]
+
+1998-12-15 21:32  ivan
+
+       * fs_passwd/fs_passwd_server: adminsuidsetup now requires user
+
 1998-12-15 21:29  ivan
 
        * eg/TEMPLATE_cust_main.import: adminsuidsetup now need user
 
+1998-12-14 20:36  ivan
+
+       * bin/fs-setup: s/croak/die/; #oops
+
+1998-12-14 20:33  ivan
+
+       * bin/fs-setup: dies if it isn't running as the freeside user
+
 1998-12-09 23:23  ivan
 
-       * bin/svc_acct.import: use FS::Conf, need user (for datasrc)
+       * bin/: svc_acct.export, svc_acct.import, svc_acct_sm.export,
+         svc_acct_sm.import: use FS::Conf, need user (for datasrc)
 
 1998-12-01 17:23  ivan
 
-       * CREDITS: [no log message]
+       * TODO, CREDITS: [no log message]
+
+1998-11-19 03:17  ivan
+
+       * bin/dbdef-create: adminsuidsetup requires argument
 
 1998-11-18 01:01  ivan
 
-       * CREDITS: i18n! i18n!
+       * CREDITS, TODO, bin/fs-setup: i18n! i18n!
+
+1998-11-15 05:18  ivan
+
+       * bin/fs-setup: remove debugging
+
+1998-11-15 01:43  ivan
+
+       * bin/fs-setup: update for new config file syntax, new
+         adminsuidsetup
+
+1998-11-14 18:53  ivan
+
+       * bin/bill: afterthought
+
+1998-11-14 18:51  ivan
+
+       * bin/bill: adminsuidsetup needs user, pod, cleanup
+
+1998-11-13 01:56  ivan
+
+       * TODO: change configuration file layout to support multiple
+         distinct databases (with own set of config files, export, etc.)
 
 1998-11-07 17:09  ivan
 
        * README: don't use depriciated FS::Bill and FS::Invoice, other
          miscellania
 
+1998-11-07 00:25  ivan
+
+       * TODO: [no log message]
+
+1998-11-07 00:21  ivan
+
+       * bin/bill: missing use
+
+1998-11-07 00:19  ivan
+
+       * bin/bill:
+         still need to bless into FS::cust_main (for now)
+
+1998-11-07 00:08  ivan
+
+       * bin/bill:
+         Removed depriciated FS::Bill (now in FS::cust_main)
+
+1998-10-22 08:51  ivan
+
+       * bin/fs-setup: also varchar with no length specified - postgresql
+         fix broke mysql.
+
+1998-10-22 08:46  ivan
+
+       * bin/fs-setup: now smallint is illegal, so remove that too.
+
 1998-10-14 00:05  ivan
 
-       * README: 1.1.4 release, fix postgresql
+       * README, bin/fs-setup: 1.1.4 release, fix postgresql
+
+1998-10-13 05:49  ivan
+
+       * TODO: [no log message]
 
 1998-10-13 05:07  ivan
 
-       * bin/svc_acct.import: Assigns password from the shadow file for
-         RADIUS password "UNIX"
+       * TODO, bin/svc_acct.import: Assigns password from the shadow file
+         for RADIUS password "UNIX"
+
+1998-10-13 02:17  ivan
+
+       * TODO: [no log message]
+
+1998-10-12 14:22  ivan
+
+       * TODO: [no log message]
+
+1998-10-12 14:15  ivan
+
+       * TODO: [no log message]
+
+1998-10-12 02:12  ivan
+
+       * TODO: remove adding cvs from the todo
+
+1998-10-12 02:09  ivan
+
+       * TODO: [no log message]
+
+1998-10-12 02:09  ivan
+
+       * TODO: Id to Header
+
+1998-10-12 02:07  ivan
+
+       * TODO: Test keyword substitution
+
+1998-10-12 01:59  ivan
+
+       * TODO: Commiting sample change.
 
 1998-10-12 00:15  ivan
 
 
 1998-10-12 00:12  ivan
 
-       * conf/: home, lpr: Initial import into CVS
+       * conf/: address, home, lpr, secrets, smtpmachine, domain: Initial
+         revision
+
+1998-10-12 00:08  ivan
 
-1998-10-12 00:12  ivan
+       * TODO: Initial revision
 
-       * conf/smtpmachine: Initial revision
+1998-10-12 00:03  ivan
+
+       * bin/fs-setup: Initial revision
 
 1998-10-11 23:56  ivan
 
 
        * bin/pod2x: Initial revision
 
+1998-09-17 22:43  ivan
+
+       * bin/svc_acct.export: Initial revision
+
 1998-09-02 21:50  ivan
 
        * CREDITS: Initial revision
 
+1998-08-23 20:12  ivan
+
+       * fs_passwd/fs_passwd_server: Initial revision
+
 1998-08-23 20:04  ivan
 
        * fs_passwd/fs_passwd: Initial revision
 
+1998-08-23 19:01  ivan
+
+       * bin/bill: Initial revision
+
 1998-08-19 21:42  ivan
 
        * eg/TEMPLATE_cust_main.import: Initial revision
 
        * bin/svc_acct.import: Initial revision
 
+1998-08-14 15:11  ivan
+
+       * bin/svc_acct_sm.export: Initial revision
+
+1998-08-12 20:55  ivan
+
+       * Artistic: Initial revision
+
 1998-07-18 00:11  ivan
 
-       * etc/domain-template.txt: Initial import into CVS
+       * etc/domain-template.txt: Initial revision
 
-1998-03-22 23:46  ivan
+1998-07-17 00:43  ivan
+
+       * bin/svc_acct_sm.import: Initial revision
+
+1998-06-03 00:22  ivan
+
+       * bin/dbdef-create: Initial revision
+
+1998-03-23 00:20  ivan
 
-       * etc/countries.txt: Initial import into CVS
+       * fs_passwd/fs_passwdd: Initial revision
 
 1998-03-22 23:46  ivan
 
-       * INSTALL: Initial revision
+       * GPL, INSTALL, etc/acp_logfile-parse, etc/countries.txt,
+         etc/example-direct-cardin: Initial revision
 
index 4bc5504..7024d60 100644 (file)
--- a/FS/FS.pm
+++ b/FS/FS.pm
@@ -126,6 +126,12 @@ L<FS::registrar> - Domain registrar class
 
 L<FS::svc_forward> - Mail forwarding class
 
+L<FS::svc_mailinglist> - (Customer) Mailing list class
+
+L<FS::mailinglist> - Mailing list class
+
+L<FS::mailinglistmember> - Mailing list member class
+
 L<FS::svc_www> - Web virtual host class.
 
 L<FS::svc_broadband> - DSL, wireless and other broadband class.
@@ -346,8 +352,12 @@ L<FS::h_svc_external> - Historical externally tracked service objects
 
 L<FS::h_svc_forward> - Historical mail forwarding alias objects
 
+L<FS::h_svc_mailinglist> - Historical mailing list objects
+
 L<FS::h_svc_phone> - Historical phone number objects
 
+L<FS::h_svc_pbx> - Historical PBX objects
+
 L<FS::h_svc_www> - Historical web virtual host objects
 
 =head2 Remote API modules
index 46e740c..03b9876 100644 (file)
@@ -94,6 +94,7 @@ tie my %rights, 'Tie::IxHash',
     'View customer',
     #'View Customer | View tickets',
     'Edit customer',
+    'Edit referring customer',
     'View customer history',
     'Cancel customer',
     'Complimentary customer', #aka users-allow_comp 
index dbc3552..50dc89c 100644 (file)
@@ -1,5 +1,6 @@
 package FS::ClientAPI::MyAccount;
 
+use 5.008; #require 5.8+ for Time::Local 1.05+
 use strict;
 use vars qw( $cache $DEBUG $me );
 use subs qw( _cache _provision );
@@ -8,6 +9,7 @@ use Digest::MD5 qw(md5_hex);
 use Date::Format;
 use Business::CreditCard;
 use Time::Duration;
+use Time::Local qw(timelocal_nocheck);
 use FS::UI::Web::small_custview qw(small_custview); #less doh
 use FS::UI::Web;
 use FS::UI::bytecount qw( display_bytecount );
@@ -29,18 +31,11 @@ use FS::cust_pkg;
 use FS::payby;
 use FS::acct_rt_transaction;
 use HTML::Entities;
+use FS::TicketSystem;
 
-$DEBUG = 2;
+$DEBUG = 0;
 $me = '[FS::ClientAPI::MyAccount]';
 
-#false laziness with FS::cust_main
-BEGIN {
-  eval "use Time::Local;";
-  die "Time::Local minimum version 1.05 required with Perl versions before 5.6"
-    if $] < 5.006 && !defined($Time::Local::VERSION);
-  eval "use Time::Local qw(timelocal_nocheck);";
-}
-
 use vars qw( @cust_main_editable_fields );
 @cust_main_editable_fields = qw(
   first last company address1 address2 city
@@ -100,7 +95,20 @@ sub skin_info {
       ( map { $_ => scalar( $conf->config($_, $agentnum) ) }
         qw( company_name ) ),
       ( map { $_ => scalar( $conf->config("selfservice-$_", $agentnum ) ) }
-        qw( body_bgcolor box_bgcolor) ),
+        qw( body_bgcolor box_bgcolor
+            text_color link_color vlink_color hlink_color alink_color
+            font title_color title_align title_size menu_bgcolor menu_fontsize
+          )
+      ),
+      ( map { $_ => $conf->exists("selfservice-$_", $agentnum ) }
+        qw( menu_skipblanks menu_skipheadings menu_nounderline )
+      ),
+      ( map { $_ => scalar($conf->config_binary("selfservice-$_", $agentnum)) }
+        qw( title_left_image title_right_image
+            menu_top_image menu_body_image menu_bottom_image
+          )
+      ),
+      'logo' => scalar($conf->config_binary('logo.png', $agentnum )),
       ( map { $_ => join("\n", $conf->config("selfservice-$_", $agentnum ) ) }
         qw( head body_header body_footer company_address ) ),
     };
@@ -489,6 +497,8 @@ sub payment_info {
       'show_ss'  => $conf->exists('show_ss'),
       'show_stateid' => $conf->exists('show_stateid'),
       'show_paystate' => $conf->exists('show_bankstate'),
+
+      'save_unchecked' => $conf->exists('selfservice-save_unchecked'),
     };
 
   }
@@ -571,6 +581,11 @@ sub process_payment {
   my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
     or return { 'error' => "unknown custnum $custnum" };
 
+  $p->{'amount'} =~ /^\s*(\d+(\.\d{2})?)\s*$/
+    or return { 'error' => gettext('illegal_amount') };
+  my $amount = $1;
+  return { error => 'Amount must be greater than 0' } unless $amount > 0;
+
   $p->{'payname'} =~ /^([\w \,\.\-\']+)$/
     or return { 'error' => gettext('illegal_name'). " payname: ". $p->{'payname'} };
   my $payname = $1;
@@ -641,7 +656,7 @@ sub process_payment {
     'CHEK' => [ qw( ss paytype paystate stateid stateid_state payip ) ],
   );
 
-  my $error = $cust_main->realtime_bop( $FS::payby::payby2bop{$payby}, $p->{'amount'},
+  my $error = $cust_main->realtime_bop( $FS::payby::payby2bop{$payby}, $amount,
     'quiet'    => 1,
     'payinfo'  => $payinfo,
     'paydate'  => $p->{'year'}. '-'. $p->{'month'}. '-01',
@@ -671,8 +686,21 @@ sub process_payment {
     $new->set( 'payinfo' => $payinfo );
     $new->set( 'paydate' => $p->{'year'}. '-'. $p->{'month'}. '-01' );
     my $error = $new->replace($cust_main);
-    return { 'error' => $error } if $error;
-    $cust_main = $new;
+    if ( $error ) {
+      #no, this causes customers to process their payments again
+      #return { 'error' => $error };
+      #XXX just warn verosely for now so i can figure out how these happen in
+      # the first place, eventually should redirect them to the "change
+      #address" page but indicate the payment did process??
+      delete($p->{'payinfo'}); #don't want to log this!
+      warn "WARNING: error changing customer info when processing payment (not returning to customer as a processing error): $error\n".
+           "NEW: ". Dumper($new)."\n".
+           "OLD: ". Dumper($cust_main)."\n".
+           "PACKET: ". Dumper($p)."\n";
+    #} else {
+      #not needed...
+      #$cust_main = $new;
+    }
   }
 
   return { 'error' => '' };
@@ -1636,6 +1664,43 @@ sub myaccount_passwd {
 
 }
 
+sub create_ticket {
+  my $p = shift;
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
+
+  warn "$me create_ticket: initializing ticket system\n" if $DEBUG;
+  FS::TicketSystem->init();
+
+  my $conf = new FS::Conf;
+  my $queue = $p->{'queue'}
+              || $conf->config('ticket_system-selfservice_queueid')
+              || $conf->config('ticket_system-default_queueid');
+
+  warn "$me create_ticket: creating ticket\n" if $DEBUG;
+  my $err_or_ticket = FS::TicketSystem->create_ticket(
+    '', #create RT session based on FS CurrentUser (fs_selfservice)
+    'queue'   => $queue,
+    'custnum' => $custnum,
+    'svcnum'  => $session->{'svcnum'},
+    map { $_ => $p->{$_} } qw( requestor cc subject message mime_type )
+  );
+
+  if ( ref($err_or_ticket) ) {
+    warn "$me create_ticket: sucessful: ". $err_or_ticket->id. "\n"
+      if $DEBUG;
+    return { 'error'     => '',
+             'ticket_id' => $err_or_ticket->id,
+           };
+  } else {
+    warn "$me create_ticket: unsucessful: $err_or_ticket\n"
+      if $DEBUG;
+    return { 'error' => $err_or_ticket };
+  }
+
+
+}
+
 #--
 
 sub _custoragent_session_custnum {
index f2960cd..45d11c4 100644 (file)
@@ -564,6 +564,14 @@ worry that config_items is freeside-specific and icky.
                    logo.eps
                  );
 
+#Billing (81 items)
+#Invoicing (50 items)
+#UI (69 items)
+#Self-service (29 items)
+#...
+#Unclassified (77 items)
+
+
 @config_items = map { new FS::ConfItem $_ } (
 
   {
@@ -721,6 +729,7 @@ worry that config_items is freeside-specific and icky.
     'type'        => 'select',
     'select_hash' => [
                        '%m/%d/%Y' => 'MM/DD/YYYY',
+                       '%d/%m/%Y' => 'DD/MM/YYYY',
                       '%Y/%m/%d' => 'YYYY/MM/DD',
                      ],
   },
@@ -814,35 +823,35 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'emailinvoiceonly',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Disables postal mail invoices',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'disablepostalinvoicedefault',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Disables postal mail invoices as the default option in the UI.  Be careful not to setup customers which are not sent invoices.  See <a href ="#emailinvoiceauto">emailinvoiceauto</a>.',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'emailinvoiceauto',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Automatically adds new accounts to the email invoice list',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'emailinvoiceautoalways',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Automatically adds new accounts to the email invoice list even when the list contains email addresses',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'emailinvoice-apostrophe',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Allows the apostrophe (single quote) character in the email addresses in the email invoice list.',
     'type'        => 'checkbox',
   },
@@ -892,7 +901,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'invoice_subject',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Subject: header on email invoices.  Defaults to "Invoice".  The following substitutions are available: $name, $name_short, $invoice_number, and $invoice_date.',
     'type'        => 'text',
     'per_agent'   => 1,
@@ -900,21 +909,21 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'invoice_usesummary',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Indicates that html and latex invoices should be in summary style and make use of invoice_latexsummary.',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'invoice_template',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Text template file for invoices.  Used if no invoice_html template is defined, and also seen by users using non-HTML capable mail clients.  See the <a href="http://www.freeside.biz/mediawiki/index.php/Freeside:1.7:Documentation:Administration#Plaintext_invoice_templates">billing documentation</a> for details.',
     'type'        => 'textarea',
   },
 
   {
     'key'         => 'invoice_html',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Optional HTML template for invoices.  See the <a href="http://www.freeside.biz/mediawiki/index.php/Freeside:1.7:Documentation:Administration#HTML_invoice_templates">billing documentation</a> for details.',
 
     'type'        => 'textarea',
@@ -922,7 +931,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'invoice_htmlnotes',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Notes section for HTML invoices.  Defaults to the same data in invoice_latexnotes if not specified.',
     'type'        => 'textarea',
     'per_agent'   => 1,
@@ -930,7 +939,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'invoice_htmlfooter',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Footer for HTML invoices.  Defaults to the same data in invoice_latexfooter if not specified.',
     'type'        => 'textarea',
     'per_agent'   => 1,
@@ -938,7 +947,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'invoice_htmlsummary',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Summary initial page for HTML invoices.',
     'type'        => 'textarea',
     'per_agent'   => 1,
@@ -946,21 +955,21 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'invoice_htmlreturnaddress',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Return address for HTML invoices.  Defaults to the same data in invoice_latexreturnaddress if not specified.',
     'type'        => 'textarea',
   },
 
   {
     'key'         => 'invoice_latex',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Optional LaTeX template for typeset PostScript invoices.  See the <a href="http://www.freeside.biz/mediawiki/index.php/Freeside:1.7:Documentation:Administration#Typeset_.28LaTeX.29_invoice_templates">billing documentation</a> for details.',
     'type'        => 'textarea',
   },
 
   {
     'key'         => 'invoice_latexnotes',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Notes section for LaTeX typeset PostScript invoices.',
     'type'        => 'textarea',
     'per_agent'   => 1,
@@ -968,7 +977,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'invoice_latexfooter',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Footer for LaTeX typeset PostScript invoices.',
     'type'        => 'textarea',
     'per_agent'   => 1,
@@ -976,7 +985,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'invoice_latexsummary',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Summary initial page for LaTeX typeset PostScript invoices.',
     'type'        => 'textarea',
     'per_agent'   => 1,
@@ -984,7 +993,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'invoice_latexcoupon',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Remittance coupon for LaTeX typeset PostScript invoices.',
     'type'        => 'textarea',
     'per_agent'   => 1,
@@ -992,14 +1001,14 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'invoice_latexreturnaddress',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Return address for LaTeX typeset PostScript invoices.',
     'type'        => 'textarea',
   },
 
   {
     'key'         => 'invoice_latexsmallfooter',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Optional small footer for multi-page LaTeX typeset PostScript invoices.',
     'type'        => 'textarea',
     'per_agent'   => 1,
@@ -1007,14 +1016,14 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'invoice_email_pdf',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Send PDF invoice as an attachment to emailed invoices.  By default, includes the plain text invoice as the email body, unless invoice_email_pdf_note is set.',
     'type'        => 'checkbox'
   },
 
   {
     'key'         => 'invoice_email_pdf_note',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'If defined, this text will replace the default plain text invoice as the body of emailed PDF invoices.',
     'type'        => 'textarea'
   },
@@ -1022,7 +1031,7 @@ worry that config_items is freeside-specific and icky.
 
   { 
     'key'         => 'invoice_default_terms',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Optional default invoice term, used to calculate a due date printed on invoices.',
     'type'        => 'select',
     'select_enum' => [ '', 'Payable upon receipt', 'Net 0', 'Net 10', 'Net 15', 'Net 20', 'Net 30', 'Net 45', 'Net 60' ],
@@ -1030,35 +1039,35 @@ worry that config_items is freeside-specific and icky.
 
   { 
     'key'         => 'invoice_show_prior_due_date',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Show previous invoice due dates when showing prior balances.  Default is to show invoice date.',
     'type'        => 'checkbox',
   },
 
   { 
     'key'         => 'invoice_include_aging',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Show an aging line after the prior balance section.  Only valud when invoice_sections is enabled.',
     'type'        => 'checkbox',
   },
 
   { 
     'key'         => 'invoice_sections',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Split invoice into sections and label according to package category when enabled.',
     'type'        => 'checkbox',
   },
 
   { 
     'key'         => 'usage_class_as_a_section',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Split usage into sections and label according to usage class name when enabled.  Only valid when invoice_sections is enabled.',
     'type'        => 'checkbox',
   },
 
   { 
     'key'         => 'svc_phone_sections',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Create a section for each svc_phone when enabled.  Only valid when invoice_sections is enabled.',
     'type'        => 'checkbox',
   },
@@ -1072,7 +1081,7 @@ worry that config_items is freeside-specific and icky.
 
   { 
     'key'         => 'separate_usage',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Split the rated call usage into a separate line from the recurring charges.',
     'type'        => 'checkbox',
   },
@@ -1103,6 +1112,13 @@ worry that config_items is freeside-specific and icky.
   },
 
   {
+    'key'         => 'trigger_export_insert_on_payment',
+    'section'     => 'billing',
+    'description' => 'Enable exports on payment application.',
+    'type'        => 'checkbox',
+  },
+
+  {
     'key'         => 'lpr',
     'section'     => 'required',
     'description' => 'Print command for paper invoices, for example `lpr -h\'',
@@ -1257,6 +1273,32 @@ worry that config_items is freeside-specific and icky.
   },
 
   {
+    'key'         => 'smtp-username',
+    'section'     => '',
+    'description' => 'Optional SMTP username for Freeside\'s outgoing mail',
+    'type'        => 'text',
+  },
+
+  {
+    'key'         => 'smtp-password',
+    'section'     => '',
+    'description' => 'Optional SMTP password for Freeside\'s outgoing mail',
+    'type'        => 'text',
+  },
+
+  {
+    'key'         => 'smtp-encryption',
+    'section'     => '',
+    'description' => 'Optional SMTP encryption method.  The STARTTLS methods require smtp-username and smtp-password to be set.',
+    'type'        => 'select',
+    'select_hash' => [ '25'           => 'None (port 25)',
+                       '25-starttls'  => 'STARTTLS (port 25)',
+                       '587-starttls' => 'STARTTLS / submission (port 587)',
+                       '465-tls'      => 'SMTPS (SSL) (port 465)',
+                     ],
+  },
+
+  {
     'key'         => 'soadefaultttl',
     'section'     => 'BIND',
     'description' => 'SOA default TTL for new domains.',
@@ -1470,15 +1512,22 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'signup_server-payby',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Acceptable payment types for the signup server',
     'type'        => 'selectmultiple',
     'select_enum' => [ qw(CARD DCRD CHEK DCHK LECB PREPAY BILL COMP) ],
   },
 
   {
+    'key'         => 'selfservice-save_unchecked',
+    'section'     => 'self-service',
+    'description' => 'In self-service, uncheck "Remember information" checkboxes by default (normally, they are checked by default).',
+    'type'        => 'checkbox',
+  },
+
+  {
     'key'         => 'signup_server-default_agentnum',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Default agent for the signup server',
     'type'        => 'select-sub',
     'options_sub' => sub { require FS::Record;
@@ -1497,7 +1546,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'signup_server-default_refnum',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Default advertising source for the signup server',
     'type'        => 'select-sub',
     'options_sub' => sub { require FS::Record;
@@ -1517,21 +1566,21 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'signup_server-default_pkgpart',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Default package for the signup server',
     'type'        => 'select-part_pkg',
   },
 
   {
     'key'         => 'signup_server-default_svcpart',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Default service definition for the signup server - only necessary for services that trigger special provisioning widgets (such as DID provisioning).',
     'type'        => 'select-part_svc',
   },
 
   {
     'key'         => 'signup_server-mac_addr_svcparts',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Service definitions which can receive mac addresses (current mapped to username for svc_acct).',
     'type'        => 'select-part_svc',
     'multiple'    => 1,
@@ -1539,14 +1588,14 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'signup_server-nomadix',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Signup page Nomadix integration',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'signup_server-service',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Service for the signup server - "Account (svc_acct)" is the default setting, or "Phone number (svc_phone)" for ITSP signup',
     'type'        => 'select',
     'select_hash' => [
@@ -1557,7 +1606,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'selfservice_server-base_url',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Base URL for the self-service web interface - necessary for some widgets to find their way, including retrieval of non-US state information and phone number provisioning.',
     'type'        => 'text',
   },
@@ -1571,27 +1620,27 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'signup_server-realtime',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Run billing for signup server signups immediately, and do not provision accounts which subsequently have a balance.',
     'type'        => 'checkbox',
   },
   {
     'key'         => 'signup_server-classnum2',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Package Class for first optional purchase',
     'type'        => 'select-pkg_class',
   },
 
   {
     'key'         => 'signup_server-classnum3',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Package Class for second optional purchase',
     'type'        => 'select-pkg_class',
   },
 
   {
     'key'         => 'backend-realtime',
-    'section'     => '',
+    'section'     => 'billing',
     'description' => 'Run billing for backend signups immediately.',
     'type'        => 'checkbox',
   },
@@ -1788,7 +1837,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'svc_acct-notes',
-    'section'     => 'UI',
+    'section'     => 'deprecated',
     'description' => 'Extra HTML to be displayed on the Account View screen.',
     'type'        => 'textarea',
   },
@@ -1798,7 +1847,7 @@ worry that config_items is freeside-specific and icky.
     'section'     => '',
     'description' => 'RADIUS attribute for plain-text passwords.',
     'type'        => 'select',
-    'select_enum' => [ 'Password', 'User-Password' ],
+    'select_enum' => [ 'Password', 'User-Password', 'Cleartext-Password' ],
   },
 
   {
@@ -1926,7 +1975,7 @@ worry that config_items is freeside-specific and icky.
   {
     'key'         => 'cust_pkg-change_pkgpart-bill_now',
     'section'     => '',
-    'description' => "When changing packages, bill the new package immediately.  Useful for prepaid situations with RADIUS where an Expiration attribute base don the package must be present at all times.",
+    'description' => "When changing packages, bill the new package immediately.  Useful for prepaid situations with RADIUS where an Expiration attribute baseon the package must be present at all times.",
     'type'        => 'checkbox',
   },
 
@@ -1954,21 +2003,21 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'selfservice_server-primary_only',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Only allow primary accounts to access self-service functionality.',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'selfservice_server-phone_login',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Allow login to self-service with phone number and PIN.',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'selfservice_server-single_domain',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'If specified, only use this one domain for self-service access.',
     'type'        => 'text',
   },
@@ -2055,6 +2104,34 @@ worry that config_items is freeside-specific and icky.
   },
 
   {
+    'key'         => 'ticket_system-selfservice_queueid',
+    'section'     => '',
+    'description' => 'Queue used when creating new customer tickets from self-service.  Defautls to ticket_system-default_queueid if not specified.',
+    #false laziness w/above
+    'type'        => 'select-sub',
+    'options_sub' => sub {
+                           my $conf = new FS::Conf;
+                           if ( $conf->config('ticket_system') ) {
+                             eval "use FS::TicketSystem;";
+                             die $@ if $@;
+                             FS::TicketSystem->queues();
+                           } else {
+                             ();
+                           }
+                         },
+    'option_sub'  => sub { 
+                           my $conf = new FS::Conf;
+                           if ( $conf->config('ticket_system') ) {
+                             eval "use FS::TicketSystem;";
+                             die $@ if $@;
+                             FS::TicketSystem->queue(shift);
+                           } else {
+                             '';
+                           }
+                         },
+  },
+
+  {
     'key'         => 'ticket_system-priority_reverse',
     'section'     => '',
     'description' => 'Enable this to consider lower numbered priorities more important.  A bad habit we picked up somewhere.  You probably want to avoid it and use the default.',
@@ -2169,7 +2246,7 @@ worry that config_items is freeside-specific and icky.
   },
 
   { 'key'         => 'selfservice_server-cache_module',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Module used to store self-service session information.  All modules handle any number of self-service servers.  Cache::SharedMemoryCache is appropriate for a single database / single Freeside server.  Cache::FileCache is useful for multiple databases on a single server, or when IPC::ShareLite is not available (i.e. FreeBSD).', #  _Database stores session information in the database and is appropriate for multiple Freeside servers, but may be slower.',
     'type'        => 'select',
     'select_enum' => [ 'Cache::SharedMemoryCache', 'Cache::FileCache', ], # '_Database' ],
@@ -2184,7 +2261,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'cust_bill-ftpformat',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Enable FTP of raw invoice data - format.',
     'type'        => 'select',
     'select_enum' => [ '', 'default', 'billco', ],
@@ -2192,35 +2269,35 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'cust_bill-ftpserver',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Enable FTP of raw invoice data - server.',
     'type'        => 'text',
   },
 
   {
     'key'         => 'cust_bill-ftpusername',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Enable FTP of raw invoice data - server.',
     'type'        => 'text',
   },
 
   {
     'key'         => 'cust_bill-ftppassword',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Enable FTP of raw invoice data - server.',
     'type'        => 'text',
   },
 
   {
     'key'         => 'cust_bill-ftpdir',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Enable FTP of raw invoice data - server.',
     'type'        => 'text',
   },
 
   {
     'key'         => 'cust_bill-spoolformat',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Enable spooling of raw invoice data - format.',
     'type'        => 'select',
     'select_enum' => [ '', 'default', 'billco', ],
@@ -2228,7 +2305,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'cust_bill-spoolagent',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Enable per-agent spooling of raw invoice data.',
     'type'        => 'checkbox',
   },
@@ -2341,6 +2418,13 @@ worry that config_items is freeside-specific and icky.
   },
 
   {
+    'key'         => 'svc_forward-no_srcsvc',
+    'section'     => '',
+    'description' => "Don't allow forwards from existing accounts, only arbitrary addresses.  Useful when exporting to systems such as Communigate Pro which treat forwards in this fashion.",
+    'type'        => 'checkbox',
+  },
+
+  {
     'key'         => 'svc_forward-arbitrary_dst',
     'section'     => '',
     'description' => "Allow forwards to point to arbitrary strings that don't necessarily look like email addresses.  Only used when using forwards for weird, non-email things.",
@@ -2363,28 +2447,28 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'invoice-ship_address',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Include the shipping address on invoices.',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'invoice-unitprice',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Enable unit pricing on invoices.',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'invoice-smallernotes',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Display the notes section in a smaller font on invoices.',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'invoice-smallerfooter',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Display footers in a smaller font on invoices.',
     'type'        => 'checkbox',
   },
@@ -2637,7 +2721,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'logo.png',
-    'section'     => 'billing',  #? 
+    'section'     => 'UI',  #'invoicing' ?
     'description' => 'Company logo for HTML invoices and the backoffice interface, in PNG format.  Suggested size somewhere near 92x62.',
     'type'        => 'image',
     'per_agent'   => 1, #XXX just view/logo.cgi, which is for the global
@@ -2646,7 +2730,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'logo.eps',
-    'section'     => 'billing',  #? 
+    'section'     => 'invoicing',
     'description' => 'Company logo for printed and PDF invoices, in EPS format.',
     'type'        => 'image',
     'per_agent'   => 1, #XXX as above, kinda
@@ -2654,14 +2738,14 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'selfservice-ignore_quantity',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Ignores service quantity restrictions in self-service context.  Strongly not recommended - just set your quantities correctly in the first place.',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'selfservice-session_timeout',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Self-service session timeout.  Defaults to 1 hour.',
     'type'        => 'select',
     'select_enum' => [ '1 hour', '2 hours', '4 hours', '8 hours', '1 day', '1 week', ],
@@ -2778,7 +2862,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'signup_credit_type',
-    'section'     => 'billing',
+    'section'     => 'billing', #self-service?
     'description' => 'The group to use for new, automatically generated credit reasons resulting from signup and self-service declines.',
     'type'        => 'select-sub',
     'options_sub' => sub { require FS::Record;
@@ -2825,14 +2909,14 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'disable_previous_balance',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Disable inclusion of previous balancem payment, and credit lines on invoices',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'previous_balance-summary_only',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Only show a single line summarizing the total previous balance rather than one line per invoice.',
     'type'        => 'checkbox',
   },
@@ -2941,14 +3025,14 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'cust_bill-max_same_services',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Maximum number of the same service to list individually on invoices before condensing to a single line listing the number of services.  Defaults to 5.',
     'type'        => 'text',
   },
 
   {
     'key'         => 'cust_bill-consolidate_services',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Consolidate service display into fewer lines on invoices rather than one per service.',
     'type'        => 'checkbox',
   },
@@ -2969,7 +3053,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'selfservice-head',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'HTML for the HEAD section of the self-service interface, typically used for LINK stylesheet tags',
     'type'        => 'textarea', #htmlarea?
     'per_agent'   => 1,
@@ -2978,7 +3062,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'selfservice-body_header',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'HTML header for the self-service interface',
     'type'        => 'textarea', #htmlarea?
     'per_agent'   => 1,
@@ -2986,8 +3070,8 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'selfservice-body_footer',
-    'section'     => '',
-    'description' => 'HTML header for the self-service interface',
+    'section'     => 'self-service',
+    'description' => 'HTML footer for the self-service interface',
     'type'        => 'textarea', #htmlarea?
     'per_agent'   => 1,
   },
@@ -2995,7 +3079,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'selfservice-body_bgcolor',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'HTML background color for the self-service interface, for example, #FFFFFF',
     'type'        => 'text',
     'per_agent'   => 1,
@@ -3003,15 +3087,166 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'selfservice-box_bgcolor',
-    'section'     => '',
-    'description' => 'HTML color for self-service interface input boxes, for example, #C0C0C0"',
+    'section'     => 'self-service',
+    'description' => 'HTML color for self-service interface input boxes, for example, #C0C0C0',
+    'type'        => 'text',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-text_color',
+    'section'     => 'self-service',
+    'description' => 'HTML text color for the self-service interface, for example, #000000',
+    'type'        => 'text',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-link_color',
+    'section'     => 'self-service',
+    'description' => 'HTML link color for the self-service interface, for example, #0000FF',
+    'type'        => 'text',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-vlink_color',
+    'section'     => 'self-service',
+    'description' => 'HTML visited link color for the self-service interface, for example, #FF00FF',
+    'type'        => 'text',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-hlink_color',
+    'section'     => 'self-service',
+    'description' => 'HTML hover link color for the self-service interface, for example, #808080',
+    'type'        => 'text',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-alink_color',
+    'section'     => 'self-service',
+    'description' => 'HTML active (clicked) link color for the self-service interface, for example, #808080',
+    'type'        => 'text',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-font',
+    'section'     => 'self-service',
+    'description' => 'HTML font CSS for the self-service interface, for example, 0.9em/1.5em Arial, Helvetica, Geneva, sans-serif',
+    'type'        => 'text',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-title_color',
+    'section'     => 'self-service',
+    'description' => 'HTML color for the self-service title, for example, #000000',
+    'type'        => 'text',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-title_align',
+    'section'     => 'self-service',
+    'description' => 'HTML alignment for the self-service title, for example, center',
+    'type'        => 'text',
+    'per_agent'   => 1,
+  },
+  {
+    'key'         => 'selfservice-title_size',
+    'section'     => 'self-service',
+    'description' => 'HTML font size for the self-service title, for example, 3',
+    'type'        => 'text',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-title_left_image',
+    'section'     => 'self-service',
+    'description' => 'Image used for the top of the menu in the self-service interface, in PNG format.',
+    'type'        => 'image',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-title_right_image',
+    'section'     => 'self-service',
+    'description' => 'Image used for the top of the menu in the self-service interface, in PNG format.',
+    'type'        => 'image',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-menu_skipblanks',
+    'section'     => 'self-service',
+    'description' => 'Skip blank (spacer) entries in the self-service menu',
+    'type'        => 'checkbox',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-menu_skipheadings',
+    'section'     => 'self-service',
+    'description' => 'Skip the unclickable heading entries in the self-service menu',
+    'type'        => 'checkbox',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-menu_bgcolor',
+    'section'     => 'self-service',
+    'description' => 'HTML color for the self-service menu, for example, #C0C0C0',
+    'type'        => 'text',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-menu_fontsize',
+    'section'     => 'self-service',
+    'description' => 'HTML font size for the self-service menu, for example, -1',
     'type'        => 'text',
     'per_agent'   => 1,
   },
+  {
+    'key'         => 'selfservice-menu_nounderline',
+    'section'     => 'self-service',
+    'description' => 'Styles menu links in the self-service without underlining.',
+    'type'        => 'checkbox',
+    'per_agent'   => 1,
+  },
+
+
+  {
+    'key'         => 'selfservice-menu_top_image',
+    'section'     => 'self-service',
+    'description' => 'Image used for the top of the menu in the self-service interface, in PNG format.',
+    'type'        => 'image',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-menu_body_image',
+    'section'     => 'self-service',
+    'description' => 'Repeating image used for the body of the menu in the self-service interface, in PNG format.',
+    'type'        => 'image',
+    'per_agent'   => 1,
+  },
+
+  {
+    'key'         => 'selfservice-menu_bottom_image',
+    'section'     => 'self-service',
+    'description' => 'Image used for the bottom of the menu in the self-service interface, in PNG format.',
+    'type'        => 'image',
+    'per_agent'   => 1,
+  },
 
   {
     'key'         => 'selfservice-bulk_format',
-    'section'     => '',
+    'section'     => 'deprecated',
     'description' => 'Parameter arrangement for selfservice bulk features',
     'type'        => 'select',
     'select_enum' => [ '', 'izoom-soap', 'izoom-ftp' ],
@@ -3020,7 +3255,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'selfservice-bulk_ftp_dir',
-    'section'     => '',
+    'section'     => 'deprecated',
     'description' => 'Enable bulk ftp provisioning in this folder',
     'type'        => 'text',
     'per_agent'   => 1,
@@ -3028,21 +3263,21 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'signup-no_company',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => "Don't display a field for company name on signup.",
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'signup-recommend_email',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Encourage the entry of an invoicing email address on signup.',
     'type'        => 'checkbox',
   },
 
   {
     'key'         => 'signup-recommend_daytime',
-    'section'     => '',
+    'section'     => 'self-service',
     'description' => 'Encourage the entry of a daytime phone number  invoicing email address on signup.',
     'type'        => 'checkbox',
   },
@@ -3062,6 +3297,20 @@ worry that config_items is freeside-specific and icky.
   },
 
   {
+    'key'         => 'svc_phone-domain',
+    'section'     => '',
+    'description' => 'Track an optional domain association with each phone service.',
+    'type'        => 'checkbox',
+  },
+
+  {
+    'key'         => 'svc_phone-phone_name-max_length',
+    'section'     => '',
+    'description' => 'Maximum length of the phone service "Name" field (svc_phone.phone_name).  Sometimes useful to limit this (to 15?) when exporting as Caller ID data.',
+    'type'        => 'text',
+  },
+
+  {
     'key'         => 'default_phone_countrycode',
     'section'     => '',
     'description' => 'Default countrcode',
@@ -3182,7 +3431,7 @@ worry that config_items is freeside-specific and icky.
 
   {
     'key'         => 'agent-invoice_template',
-    'section'     => 'billing',
+    'section'     => 'invoicing',
     'description' => 'Enable display/edit of old-style per-agent invoice template selection',
     'type'        => 'checkbox',
   },
@@ -3290,6 +3539,20 @@ worry that config_items is freeside-specific and icky.
     'type'        => 'checkbox',
   },
 
+  {
+    'key'         => 'svc_domain-edit_domain',
+    'section'     => '',
+    'description' => 'Enable domain renaming',
+    'type'        => 'checkbox',
+  },
+
+  {
+    'key'         => 'enable_legacy_prepaid_income',
+    'section'     => '',
+    'description' => "Enable legacy prepaid income reporting.  Only useful when you have imported pre-Freeside packages with longer-than-monthly duration, and need to do prepaid income reporting on them before they've been invoiced the first time.",
+    'type'        => 'checkbox',
+  },
+
   { key => "apacheroot", section => "deprecated", description => "<b>DEPRECATED</b>", type => "text" },
   { key => "apachemachine", section => "deprecated", description => "<b>DEPRECATED</b>", type => "text" },
   { key => "apachemachines", section => "deprecated", description => "<b>DEPRECATED</b>", type => "text" },
index e732eb7..cc2bdcc 100644 (file)
@@ -172,6 +172,7 @@ if ( -e $addl_handler_use_file ) {
   use FS::part_export;
   use FS::part_export_option;
   use FS::export_svc;
+  use FS::export_device;
   use FS::msgcat;
   use FS::rate;
   use FS::rate_region;
@@ -220,6 +221,8 @@ if ( -e $addl_handler_use_file ) {
   #use FS::h_phone_device;
   use FS::h_svc_www;
   use FS::cust_statement;
+  use FS::svc_pbx;
+  use FS::svc_mailinglist;
   # Sammath Naur
 
   if ( $FS::Mason::addl_handler_use ) {
index 5231350..71670f7 100644 (file)
@@ -216,9 +216,10 @@ encoding which, if specified, overrides the default "7bit".
 
 use vars qw( $conf );
 use Date::Format;
-use Mail::Header;
-use Mail::Internet 2.00;
 use MIME::Entity;
+use Email::Sender::Simple qw(sendmail);
+use Email::Sender::Transport::SMTP;
+use Email::Sender::Transport::SMTP::TLS;
 use FS::UID;
 
 FS::UID->install_callback( sub {
@@ -234,7 +235,6 @@ sub send_email {
 #         join("\n", map { "  $_: ". $options{$_} } keys %options ). "\n"
   }
 
-  $ENV{MAILADDRESS} = $options{'from'};
   my $to = ref($options{to}) ? join(', ', @{ $options{to} } ) : $options{to};
 
   my @mimeargs = ();
@@ -287,7 +287,7 @@ sub send_email {
     $domain = $1;
   } else {
     warn 'no domain found in invoice from address '. $options{'from'}.
-         '; constructing Message-ID @example.com'; 
+         '; constructing Message-ID (and saying HELO) @example.com'; 
     $domain = 'example.com';
   }
   my $message_id = join('.', rand()*(2**32), $$, time). "\@$domain";
@@ -333,101 +333,32 @@ sub send_email {
 
   }
 
-  my $smtpmachine = $conf->config('smtpmachine');
-  $!=0;
+  #send the email
 
-  $message->mysmtpsend( 'Host'     => $smtpmachine,
-                        'MailFrom' => $options{'from'},
-                      );
+  my %smtp_opt = ( 'host' => $conf->config('smtpmachine'),
+                   'helo' => $domain,
+                 );
 
-}
-
-#this kludges a "mysmtpsend" method into Mail::Internet for send_email above
-#now updated for MailTools v2!
-package Mail::Internet;
-
-use Mail::Address;
-use Net::SMTP;
-use Net::Domain;
-
-sub Mail::Internet::mysmtpsend($@) {
-    my ($self, %opt) = @_;
-
-    my $host     = $opt{Host};
-    my $envelope = $opt{MailFrom}; # || mailaddress();
-    my $quit     = 1;
-
-    my ($smtp, @hello);
-
-    push @hello, Hello => $opt{Hello}
-        if defined $opt{Hello};
-
-    push @hello, Port => $opt{Port}
-        if exists $opt{Port};
-
-    push @hello, Debug => $opt{Debug}
-        if exists $opt{Debug};
-
-#    if(!defined $host)
-#    {   local $SIG{__DIE__};
-#        my @hosts = qw(mailhost localhost);
-#        unshift @hosts, split /\:/, $ENV{SMTPHOSTS}
-#            if defined $ENV{SMTPHOSTS};
-#
-#        foreach $host (@hosts)
-#        {   $smtp = eval { Net::SMTP->new($host, @hello) };
-#            last if defined $smtp;
-#        }
-#    }
-#    elsif(ref($host) && UNIVERSAL::isa($host,'Net::SMTP'))
-    if(ref($host) && UNIVERSAL::isa($host,'Net::SMTP'))
-    {   $smtp = $host;
-        $quit = 0;
-    }
-    else
-    {   #local $SIG{__DIE__};
-        #$smtp = eval { Net::SMTP->new($host, @hello) };
-        $smtp = Net::SMTP->new($host, @hello);
-    }
+  my($port, $enc) = split('-', ($conf->config('smtp-encryption') || '25') );
+  $smtp_opt{'port'} = $port;
 
-    unless ( defined($smtp) ) {
-      my $err = $!;
-      $err =~ s/Invalid argument/Unknown host/;
-      return "can't connect to $host: $err"
+  my $transport;
+  if ( defined($enc) && $enc eq 'starttls' ) {
+    $smtp_opt{$_} = $conf->config("smtp-$_") for qw(username password);
+    $transport = Email::Sender::Transport::SMTP::TLS->new( %smtp_opt );
+  } else {
+    if ( $conf->exists('smtp-username') && $conf->exists('smtp-password') ) {
+      $smtp_opt{"sasl_$_"} = $conf->config("smtp-$_") for qw(username password);
     }
+    $smtp_opt{'ssl'} = 1 if defined($enc) && $enc eq 'tls';
+    $transport = Email::Sender::Transport::SMTP->new( %smtp_opt );
+  }
 
-    my $head = $self->cleaned_header_dup;
-
-    $head->delete('Bcc');
-
-    # Who is it to
-
-    my @rcpt = map { ref $_ ? @$_ : $_ } grep { defined } @opt{'To','Cc','Bcc'};
-    @rcpt    = map { $head->get($_) } qw(To Cc Bcc)
-        unless @rcpt;
-
-    my @addr = map {$_->address} Mail::Address->parse(@rcpt);
-    #@addr or return ();
-    return 'No valid destination addresses found!'
-       unless(@addr);
-
-    # Send it
-
-    my $ok = $smtp->mail($envelope)
-          && $smtp->to(@addr)
-          && $smtp->data(join("", @{$head->header}, "\n", @{$self->body}));
+  eval { sendmail($message, { transport => $transport }); };
+  ref($@) ? ( $@->code ? $@->code.' ' : '' ). $@->message
+          : $@;
 
-    #$quit && $smtp->quit;
-    #$ok ? @addr : ();
-    if ( $ok ) {
-      $quit && $smtp->quit;
-      return '';
-    } else {
-      return $smtp->code. ' '. $smtp->message;
-    }
 }
-package FS::Misc;
-#eokludge
 
 =item send_fax OPTION => VALUE ...
 
index 201e7b2..3b1967e 100644 (file)
@@ -2140,7 +2140,7 @@ sub ut_alpha {
   '';
 }
 
-=item ut_alpha COLUMN
+=item ut_alphan COLUMN
 
 Check/untaint alphanumeric strings (no spaces).  May be null.  If there is an
 error, returns the error, otherwise returns false.
@@ -2155,6 +2155,22 @@ sub ut_alphan {
   '';
 }
 
+=item ut_alphasn COLUMN
+
+Check/untaint alphanumeric strings, spaces allowed.  May be null.  If there is
+an error, returns the error, otherwise returns false.
+
+=cut
+
+sub ut_alphasn {
+  my($self,$field)=@_;
+  $self->getfield($field) =~ /^([\w ]*)$/ 
+    or return "Illegal (alphanumeric) $field: ". $self->getfield($field);
+  $self->setfield($field,$1);
+  '';
+}
+
+
 =item ut_alpha_lower COLUMN
 
 Check/untaint lowercase alphanumeric strings (no spaces).  May not be null.  If
index e5bb4fe..660a072 100644 (file)
@@ -102,6 +102,10 @@ sub dbdef_dist {
       my %hash = map { $_ => shift @coldef }
                      qw( name type null length default local );
 
+      #can be removed once we depend on DBIx::DBSchema 0.39;
+      $hash{'type'} = 'LONGTEXT'
+        if $hash{'type'} =~ /^TEXT$/i && $datasrc =~ /^dbi:mysql/i;
+
       unless ( defined $hash{'default'} ) {
         warn "$tablename:\n".
              join('', map "$_ => $hash{$_}\n", keys %hash) ;# $stop = <STDIN>;
@@ -113,7 +117,17 @@ sub dbdef_dist {
     #false laziness w/sub indices in DBIx::DBSchema::DBD (well, sorta)
     #and sub sql_create_table in DBIx::DBSchema::Table (slighty more?)
     my $unique = $tables_hashref->{$tablename}{'unique'};
-    my $index  = $tables_hashref->{$tablename}{'index'};
+    my @index  = @{ $tables_hashref->{$tablename}{'index'} };
+
+    # kludge to avoid avoid "BLOB/TEXT column 'statustext' used in key
+    #  specification without a key length".
+    # better solution: teach DBIx::DBSchema to specify a default length for
+    #  MySQL indices on text columns, or just to support an index length at all
+    #  so we can pass something in.
+    # best solution: eliminate need for this index in cust_main::retry_realtime
+    @index = grep { @{$_}[0] ne 'statustext' } @index
+      if $datasrc =~ /^dbi:mysql/i;
+
     my @indices = ();
     push @indices, map {
                          DBIx::DBSchema::Index->new({
@@ -130,7 +144,7 @@ sub dbdef_dist {
                            'columns' => $_,
                          });
                        }
-                       @$index;
+                       @index;
 
     DBIx::DBSchema::Table->new({
       'name'          => $tablename,
@@ -641,10 +655,11 @@ sub tables_hashref {
         'addlinfo', 'text', 'NULL', '', '', '',
         'closed',    'char', 'NULL', 1, '', '', 
         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
+        'eventnum', 'int', 'NULL', '', '', '', #triggering event for commission
       ],
       'primary_key' => 'crednum',
       'unique' => [],
-      'index' => [ ['custnum'], ['_date'] ],
+      'index' => [ ['custnum'], ['_date'], ['eventnum'] ],
     },
 
     'cust_credit_bill' => {
@@ -1353,8 +1368,8 @@ sub tables_hashref {
     'part_pkg_taxoverride' => { 
       'columns' => [
         'taxoverridenum', 'serial', '', '', '', '',
-        'pkgpart',        'serial', '', '', '', '',
-        'taxclassnum',    'serial', '', '', '', '',
+        'pkgpart',           'int', '', '', '', '',
+        'taxclassnum',       'int', '', '', '', '',
         'usage_class',    'varchar', 'NULL', $char_d, '', '', 
       ],
       'primary_key' => 'taxoverridenum',
@@ -1475,14 +1490,26 @@ sub tables_hashref {
         'downbytes_threshold',   'bigint', 'NULL',   '', '', '',
         'totalbytes','bigint', 'NULL',   '', '', '',
         'totalbytes_threshold',   'bigint', 'NULL',   '', '', '',
-        'domsvc',    'int', '',   '', '', '', 
+        'domsvc',    'int',     '', '', '', '', 
+        'pbxsvc',    'int', 'NULL', '', '', '',
         'last_login',  @date_type, '', '', 
         'last_logout', @date_type, '', '', 
+        #communigate pro fields (quota = MaxAccountSize)
+        'file_quota',      'varchar', 'NULL', $char_d, '', '', #MaxWebSize
+        'file_maxnum',     'varchar', 'NULL', $char_d, '', '', #MaxWebFiles
+        'file_maxsize',    'varchar', 'NULL', $char_d, '', '', #MaxFileSize
+        'cgp_accessmodes', 'varchar', 'NULL',     255, '', '', #AccessModes
+        'password_selfchange','char', 'NULL',       1, '', '', #PWDAllowed
+        'password_recover',   'char', 'NULL',       1, '', '', #PasswordRecovery
+        'cgp_type',        'varchar', 'NULL', $char_d, '', '', #AccountType
+        'cgp_aliases',     'varchar', 'NULL',     255, '', '',
+        'cgp_deletemode',  'varchar', 'NULL', $char_d, '', '', #DeleteMode
+        'cgp_emptytrash',  'varchar', 'NULL', $char_d, '', '', #EmptyTrash
       ],
       'primary_key' => 'svcnum',
       #'unique' => [ [ 'username', 'domsvc' ] ],
       'unique' => [],
-      'index' => [ ['username'], ['domsvc'] ],
+      'index' => [ ['username'], ['domsvc'], ['pbxsvc'] ],
     },
 
     'acct_rt_transaction' => {
@@ -1518,9 +1545,22 @@ sub tables_hashref {
        'parent_svcnum',    'int', 'NULL',       '', '', '',
        'registrarnum',     'int', 'NULL',       '', '', '',
        'registrarkey', 'varchar', 'NULL',      512, '', '',
-       'setup_date',  @date_type, '', '',
+       'setup_date',      @date_type, '', '',
        'renewal_interval', 'int', 'NULL',       '', '', '',
        'expiration_date', @date_type, '', '',
+        #communigate pro fields (quota = MaxAccountSize)
+        'max_accounts',     'int', 'NULL',       '', '', '',
+        'cgp_aliases',  'varchar', 'NULL',      255, '', '',
+        'cgp_accessmodes','varchar','NULL',     255, '', '', #DomainAccessModes
+        'acct_def_password_selfchange','char', 'NULL',       1, '', '', 
+        'acct_def_password_recover',   'char', 'NULL',       1, '', '', 
+        'acct_def_cgp_accessmodes', 'varchar', 'NULL',     255, '', '',
+        'acct_def_quota',           'varchar', 'NULL', $char_d, '', '',
+        'acct_def_file_quota',      'varchar', 'NULL', $char_d, '', '',
+        'acct_def_file_maxnum',     'varchar', 'NULL', $char_d, '', '',
+        'acct_def_file_maxsize',    'varchar', 'NULL', $char_d, '', '',
+        'acct_def_cgp_deletemode',  'varchar', 'NULL', $char_d, '', '',
+        'acct_def_cgp_emptytrash',  'varchar', 'NULL', $char_d, '', '',
       ],
       'primary_key' => 'svcnum',
       'unique' => [ ],
@@ -1696,6 +1736,17 @@ sub tables_hashref {
       'index'       => [ [ 'exportnum' ], [ 'svcpart' ] ],
     },
 
+    'export_device' => {
+      'columns' => [
+        'exportdevicenum' => 'serial', '', '', '', '', 
+        'exportnum'    => 'int', '', '', '', '', 
+        'devicepart'      => 'int', '', '', '', '', 
+      ],
+      'primary_key' => 'exportdevicenum',
+      'unique'      => [ [ 'exportnum', 'devicepart' ] ],
+      'index'       => [ [ 'exportnum' ], [ 'devicepart' ] ],
+    },
+
     'part_export' => {
       'columns' => [
         'exportnum', 'serial', '', '', '', '', 
@@ -1933,16 +1984,17 @@ sub tables_hashref {
 
     'rate_detail' => {
       'columns' => [
-        'ratedetailnum',   'serial', '', '', '', '', 
-        'ratenum',         'int',     '', '', '', '', 
-        'orig_regionnum',  'int', 'NULL', '', '', '', 
-        'dest_regionnum',  'int',     '', '', '', '', 
-        'min_included',    'int',     '', '', '', '', 
-        #'min_charge',      @money_type, '', '', 
-        'min_charge',      'decimal', '', '10,5', '', '', 
-        'sec_granularity', 'int',     '', '', '', '', 
+        'ratedetailnum',   'serial',  '',     '', '', '', 
+        'ratenum',         'int',     '',     '', '', '', 
+        'orig_regionnum',  'int', 'NULL',     '', '', '', 
+        'dest_regionnum',  'int',     '',     '', '', '', 
+        'min_included',    'int',     '',     '', '', '', 
+        'conn_charge',     @money_type, '0', '', #'decimal','','10,5','0','',
+        'conn_sec',        'int',     '',     '', '0', '',
+        'min_charge',      'decimal', '', '10,5', '', '', #@money_type, '', '', 
+        'sec_granularity', 'int',     '',     '', '', '', 
         #time period (link to table of periods)?
-        'classnum',        'int',     'NULL', '', '', '', 
+        'classnum',        'int', 'NULL',     '', '', '', 
       ],
       'primary_key' => 'ratedetailnum',
       'unique'      => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
@@ -2329,11 +2381,12 @@ sub tables_hashref {
         '_password', 'varchar', '', $char_d, '', '',
         'last',      'varchar', '', $char_d, '', '', 
         'first',     'varchar', '', $char_d, '', '', 
+        'user_custnum',  'int', 'NULL',  '', '', '',
         'disabled',     'char', 'NULL',   1, '', '', 
       ],
       'primary_key' => 'usernum',
       'unique' => [ [ 'username' ] ],
-      'index'  => [],
+      'index'  => [ [ 'user_custnum' ] ],
     },
 
     'access_user_pref' => {
@@ -2401,10 +2454,15 @@ sub tables_hashref {
         'pin',          'varchar', 'NULL', $char_d, '', '',
         'sip_password', 'varchar', 'NULL', $char_d, '', '',
         'phone_name',   'varchar', 'NULL', $char_d, '', '',
+        'pbxsvc',           'int', 'NULL',      '', '', '',
+        'domsvc',           'int', 'NULL',      '', '', '', 
+        'locationnum',      'int', 'NULL', '', '', '',
       ],
       'primary_key' => 'svcnum',
       'unique' => [],
-      'index'  => [ [ 'countrycode', 'phonenum' ] ],
+      'index'  => [ ['countrycode', 'phonenum'], ['pbxsvc'], ['domsvc'],
+                    ['locationnum'],
+                  ],
     },
 
     'phone_device' => {
@@ -2499,6 +2557,58 @@ sub tables_hashref {
       'unique'      => [ [ 'pkgnum', 'refnum' ] ],
       'index'       => [ [ 'pkgnum' ], [ 'refnum' ] ],
     },
+
+    'svc_pbx' => {
+      'columns' => [
+        'svcnum',         'int',     '',      '', '', '', 
+        'id',             'int', 'NULL',      '', '', '', 
+        'title',      'varchar', 'NULL', $char_d, '', '', 
+        'max_extensions', 'int', 'NULL',      '', '', '',
+      ],
+      'primary_key' => 'svcnum',
+      'unique' => [],
+      'index'  => [ [ 'id' ] ],
+    },
+
+    'svc_mailinglist' => { #svc_group?
+      'columns' => [
+        'svcnum',            'int',     '',            '', '', '', 
+        'username',      'varchar',     '', $username_len, '', '',
+        'domsvc',            'int',     '',            '', '', '', 
+        'listnum',           'int',     '',            '', '', '',
+        'reply_to',         'char', 'NULL',             1, '', '',#SetReplyTo
+        'remove_from',      'char', 'NULL',             1, '', '',#RemoveAuthor
+        'reject_auto',      'char', 'NULL',             1, '', '',#RejectAuto
+        'remove_to_and_cc', 'char', 'NULL',             1, '', '',#RemoveToAndCc
+      ],
+      'primary_key' => 'svcnum',
+      'unique' => [],
+      'index'  => [ ['username'], ['domsvc'], ['listnum'] ],
+    },
+
+    'mailinglist' => {
+      'columns' => [
+        'listnum',   'serial', '',      '', '', '',
+        'listname', 'varchar', '', $char_d, '', '',
+      ],
+      'primary_key' => 'listnum',
+      'unique' => [],
+      'index'  => [],
+    },
+
+    'mailinglistmember' => {
+      'columns' => [
+        'membernum',        'serial',     '',   '', '', '',
+        'listnum',             'int',     '',   '', '', '',
+        'svcnum',              'int', 'NULL',   '', '', '', 
+        'email',           'varchar', 'NULL',  255, '', '', 
+      ],
+      'primary_key' => 'membernum',
+      'unique'      => [],
+      'index'       => [['listnum'],['svcnum'],['email']],
+    },
+
+
     # name type nullability length default local
 
     #'new_table' => {
index 8ccc937..46af1f5 100644 (file)
@@ -247,7 +247,7 @@ sub href_customer_tickets {
 
 }
 
-sub href_new_ticket {
+sub href_params_new_ticket {
   my( $self, $custnum_or_cust_main, $requestors ) = @_;
 
   my( $custnum, $cust_main );
@@ -258,14 +258,25 @@ sub href_new_ticket {
     $custnum = $custnum_or_cust_main;
     $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } );
   }
-  my $queueid = $cust_main->agent->ticketing_queueid || $default_queueid;
-
-  $self->baseurl.
-  'Ticket/Create.html?'.
-    "Queue=$queueid".
-    "&new-MemberOf=freeside://freeside/cust_main/$custnum".
-    ( $requestors ? '&Requestors='. uri_escape($requestors) : '' )
-    ;
+
+  my %param = (
+    'Queue'       => ($cust_main->agent->ticketing_queueid || $default_queueid),
+    'new-MemberOf'=> "freeside://freeside/cust_main/$custnum",
+    'Requestors'  => $requestors,
+  );
+
+  ( $self->baseurl.'Ticket/Create.html', %param );
+}
+
+sub href_new_ticket {
+  my $self = shift;
+
+  my( $base, %param ) = $self->href_params_new_ticket(@_);
+
+  my $uri = new URI $base;
+  $uri->query_form(%param);
+  $uri;
+
 }
 
 sub href_ticket {
@@ -356,5 +367,9 @@ sub access_right {
   0;
 }
 
+sub create_ticket {
+  return 'create_ticket unimplemented w/external RT (write something w/RT::Client::REST?)';
+}
+
 1;
 
index 033c746..52e3922 100644 (file)
@@ -1,7 +1,9 @@
 package FS::TicketSystem::RT_Internal;
 
 use strict;
-use vars qw( @ISA $DEBUG );
+use vars qw( @ISA $DEBUG $me );
+use Data::Dumper;
+use MIME::Entity;
 use FS::UID qw(dbh);
 use FS::CGI qw(popurl);
 use FS::TicketSystem::RT_Libs;
@@ -10,6 +12,7 @@ use RT::CurrentUser;
 @ISA = qw( FS::TicketSystem::RT_Libs );
 
 $DEBUG = 0;
+$me = '[FS::TicketSystem::RT_Internal]';
 
 sub sql_num_customer_tickets {
   "( select count(*) from tickets
@@ -36,24 +39,190 @@ sub access_right {
   #return '' unless $conf->config('ticket_system');
   return '' unless FS::Conf->new->config('ticket_system');
 
-  $self->_web_external_auth($session)
-    unless $session
-    && $session->{'CurrentUser'};
+  $session = $self->session($session);
 
   $session->{'CurrentUser'}->HasRight( Right  => $right,
                                        Object => $RT::System );
 }
 
+sub session {
+  my( $self, $session ) = @_;
+
+  if ( $session && $session->{'Current_User'} ) {
+    warn "$me session: using existing session and CurrentUser: \n".
+         Dumper($session->{'CurrentUser'})
+      if $DEBUG;
+ } else {
+    warn "$me session: loading session and CurrentUser\n" if $DEBUG > 1;
+    $session = $self->_web_external_auth($session);
+  }
+
+  $session;
+}
+
+sub init {
+  my $self = shift;
+
+  warn "$me init: loading RT libraries\n" if $DEBUG;
+  eval '
+    use lib ( "/opt/rt3/local/lib", "/opt/rt3/lib" );
+    use RT;
+    #it looks like the rest are taken care of these days in RT::InitClasses
+    #use RT::Ticket;
+    #use RT::Transactions;
+    #use RT::Users;
+    #use RT::CurrentUser;
+    #use RT::Templates;
+    #use RT::Queues;
+    #use RT::ScripActions;
+    #use RT::ScripConditions;
+    #use RT::Scrips;
+    #use RT::Groups;
+    #use RT::GroupMembers;
+    #use RT::CustomFields;
+    #use RT::CustomFieldValues;
+    #use RT::ObjectCustomFieldValues;
+
+    #for web external auth...
+    use RT::Interface::Web;
+  ';
+  die $@ if $@;
+
+  warn "$me init: loading RT config\n" if $DEBUG;
+  {
+    local $SIG{__DIE__};
+    eval 'RT::LoadConfig();';
+  }
+  die $@ if $@;
+
+  warn "$me init: initializing RT\n" if $DEBUG;
+  {
+    local $SIG{__DIE__};
+    eval 'RT::Init("NoSignalHandlers"=>1);';
+  }
+  die $@ if $@;
+
+  warn "$me init: complete" if $DEBUG;
+}
+
+=item create_ticket SESSION_HASHREF, OPTION => VALUE ...
+
+Class method.  Creates a ticket.  If there is an error, returns the scalar
+error, otherwise returns the newly created RT::Ticket object.
+
+Accepts the following options:
+
+=over 4
+
+=item queue
+
+Queue name or Id
+
+=item subject
+
+Ticket subject
+
+=item requestor
+
+Requestor email address or arrayref of addresses
+
+=item cc
+
+Cc: email address or arrayref of addresses
+
+=item message
+
+Ticket message
+
+=item mime_type
+
+MIME type to use for message.  Defaults to text/plain.  Specifying text/html
+can be useful to use HTML markup in message.
+
+=item custnum
+
+Customer number (see L<FS::cust_main>) to associate with ticket.
+
+=item svcnum
+
+Service number (see L<FS::cust_svc>) to associate with ticket.  Will also
+associate the customer who has this service (unless the service is unlinked).
+
+=back
+
+=cut
+
+sub create_ticket {
+  my($self, $session, %param) = @_;
+
+  $session = $self->session($session);
+
+  my $Queue = RT::Queue->new($session->{'CurrentUser'});
+  $Queue->Load( $param{'queue'} );
+
+  my $req = ref($param{'requestor'})
+              ? $param{'requestor'}
+              : ( $param{'requestor'} ? [ $param{'requestor'} ] : [] );
+
+  my $cc = ref($param{'cc'})
+             ? $param{'cc'}
+             : ( $param{'cc'} ? [ $param{'cc'} ] : [] );
+
+  my $mimeobj = MIME::Entity->build(
+    'Data' => $param{'message'},
+    'Type' => ( $param{'mime_type'} || 'text/plain' ),
+  );
+
+  my %ticket = (
+    'Queue'     => $Queue->Id,
+    'Subject'   => $param{'subject'},
+    'Requestor' => $req,
+    'Cc'        => $cc,
+    'MIMEObj'   => $mimeobj,
+  );
+  warn Dumper(\%ticket) if $DEBUG > 1;
+
+  my $Ticket = RT::Ticket->new($session->{'CurrentUser'});
+  my( $id, $Transaction, $ErrStr );
+  {
+    local $SIG{__DIE__};
+    ( $id, $Transaction, $ErrStr ) = $Ticket->Create( %ticket );
+  }
+  return $ErrStr if $id == 0;
+
+  warn "ticket got id $id\n" if $DEBUG;
+
+  #XXX check errors adding custnum/svcnum links (put it in a transaction)...
+  # but we do already know they're good
+
+  if ( $param{'custnum'} ) {
+    my( $val, $msg ) = $Ticket->_AddLink(
+     'Type'   => 'MemberOf',
+     'Target' => 'freeside://freeside/cust_main/'. $param{'custnum'},
+    );
+  }
+
+  if ( $param{'svcnum'} ) {
+    my( $val, $msg ) = $Ticket->_AddLink(
+     'Type'   => 'MemberOf',
+     'Target' => 'freeside://freeside/cust_svc/'. $param{'svcnum'},
+    );
+  }
+
+  $Ticket;
+}
+
 #shameless false laziness w/rt/html/autohandler to get logged into RT from afar
 sub _web_external_auth {
   my( $self, $session ) = @_;
 
   my $user = $FS::CurrentUser::CurrentUser->username;
 
+  $session ||= {};
   $session->{'CurrentUser'} = RT::CurrentUser->new();
 
-  warn "loading RT user for $user\n"
-    if $DEBUG;
+  warn "$me _web_external_auth loading RT user for $user\n"
+    if $DEBUG > 1;
 
   $session->{'CurrentUser'}->Load($user);
 
@@ -132,6 +301,8 @@ sub _web_external_auth {
       #}
   }
 
+  $session;
+
 }
 
 1;
index 148085c..5e98742 100644 (file)
@@ -270,6 +270,7 @@ sub cust_header {
   );
   my %header2align = (
     'Cust. Status' => 'c',
+    'Cust#'        => 'r',
   );
 
   my $cust_fields;
@@ -373,12 +374,10 @@ sub cust_fields {
   my $seen_unlinked = 0;
   map { 
     if ( $record->custnum ) {
-      warn "  $record -> $_"
-        if $DEBUG > 1;
+      warn "  $record -> $_" if $DEBUG > 1;
       $record->$_(@_);
     } else {
-      warn "  ($record unlinked)"
-        if $DEBUG > 1;
+      warn "  ($record unlinked)" if $DEBUG > 1;
       $seen_unlinked++ ? '' : '(unlinked)';
     }
   } @cust_fields;
index e3a4604..e042c05 100644 (file)
@@ -128,7 +128,7 @@ sub forksuidsetup {
     }
 
   } else {
-    warn "NO CONFIGURATION TABLE FOUND";
+    warn "NO CONFIGURATION TABLE FOUND" unless $FS::Schema::setup_hack;
   }
 
   unless ( $callback_hack ) {
index c39680e..ff577f2 100644 (file)
@@ -99,7 +99,6 @@ sub upgrade_data {
 
     #reason type and reasons
     'reason_type'     => [],
-    'reason'          => [],
     'cust_pkg_reason' => [],
 
     #need part_pkg before cust_credit...
@@ -129,9 +128,6 @@ sub upgrade_data {
     #fixup access rights
     'access_right' => [],
 
-    #change tax_rate column types
-    'tax_rate' => [],
-
     #change recur_flat and enable_prorate
     'part_pkg_option' => [],
 
index 8cc8b64..1bf6e93 100644 (file)
@@ -10,6 +10,7 @@ use FS::option_Common;
 use FS::access_user_pref;
 use FS::access_usergroup;
 use FS::agent;
+use FS::cust_main;
 
 @ISA = qw( FS::m2m_Common FS::option_Common FS::Record );
 #@ISA = qw( FS::m2m_Common FS::option_Common );
@@ -220,6 +221,9 @@ sub replace {
       $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
       return $error;
     }
+  } elsif ( $old->disabled && !$new->disabled
+              && $new->_password =~ /changeme/i ) {
+    return "Must change password when enabling this account";
   }
 
   my $error = $new->SUPER::replace($old, @_);
@@ -254,6 +258,7 @@ sub check {
     || $self->ut_text('_password')
     || $self->ut_text('last')
     || $self->ut_text('first')
+    || $self->ut_foreign_keyn('user_custnum', 'cust_main', 'custnum')
     || $self->ut_enum('disabled', [ '', 'Y' ] )
   ;
   return $error if $error;
@@ -272,6 +277,18 @@ sub name {
   $self->get('last'). ', '. $self->first;
 }
 
+=item user_cust_main
+
+Returns the FS::cust_main object (see L<FS::cust_main>), if any, for this
+user.
+
+=cut
+
+sub user_cust_main {
+  my $self = shift;
+  qsearchs( 'cust_main', { 'custnum' => $self->user_custnum } );
+}
+
 =item access_usergroup
 
 Returns links to the the groups this user is a part of, as FS::access_usergroup
index 0f08aaa..28a7257 100644 (file)
@@ -1,7 +1,7 @@
 package FS::cust_bill;
 
 use strict;
-use vars qw( @ISA $DEBUG $me $conf $money_char $date_format );
+use vars qw( @ISA $DEBUG $me $conf $money_char $date_format $rdate_format );
 use vars qw( $invoice_lines @buf ); #yuck
 use Fcntl qw(:flock); #for spool_csv
 use List::Util qw(min max);
@@ -43,8 +43,9 @@ $me = '[FS::cust_bill]';
 #ask FS::UID to run this stuff for us later
 FS::UID->install_callback( sub { 
   $conf = new FS::Conf;
-  $money_char = $conf->config('money_char') || '$';  
-  $date_format = $conf->config('date_format') || '%x';  
+  $money_char   = $conf->config('money_char')  || '$';  
+  $date_format  = $conf->config('date_format') || '%x';  
+  $rdate_format = $conf->config('date_format') || '%m/%d/%Y';  
 } );
 
 =head1 NAME
@@ -2293,7 +2294,7 @@ sub print_generic {
     'template'        => $template, #params{'template'},
     'notice_name'     => ($params{'notice_name'} || 'Invoice'),#escape_function?
     'current_charges' => sprintf("%.2f", $self->charged),
-    'duedate'         => $self->due_date2str('%m/%d/%Y'), #date_format?
+    'duedate'         => $self->due_date2str($rdate_format), #date_format?
 
     #customer info
     'custnum'         => $cust_main->display_custnum,
@@ -2630,7 +2631,9 @@ sub print_generic {
   $invoice_data{current_less_finance} =
     sprintf('%.2f', $self->charged - $invoice_data{finance_amount} );
 
-  if ( $multisection && !$conf->exists('disable_previous_balance') ) {
+  if ( $multisection && !$conf->exists('disable_previous_balance')
+    || $conf->exists('previous_balance-summary_only') )
+  {
     unshift @sections, $previous_section if $pr_total;
   }
 
@@ -3151,7 +3154,7 @@ sub balance_due_msg {
   my $msg = 'Balance Due';
   return $msg unless $self->terms;
   if ( $self->due_date ) {
-    $msg .= ' - Please pay by '. $self->due_date2str('%x');
+    $msg .= ' - Please pay by '. $self->due_date2str($date_format);
   } elsif ( $self->terms ) {
     $msg .= ' - '. $self->terms;
   }
@@ -3163,7 +3166,7 @@ sub balance_due_date {
   my $duedate = '';
   if (    $conf->exists('invoice_default_terms') 
        && $conf->config('invoice_default_terms')=~ /^\s*Net\s*(\d+)\s*$/ ) {
-    $duedate = time2str("%m/%d/%Y", $self->_date + ($1*86400) );
+    $duedate = time2str($rdate_format, $self->_date + ($1*86400) );
   }
   $duedate;
 }
@@ -3188,7 +3191,7 @@ Returns a string with the date, for example: "3/20/2008"
 
 sub _date_pretty {
   my $self = shift;
-  time2str('%x', $self->_date);
+  time2str($date_format, $self->_date);
 }
 
 use vars qw(%pkg_category_cache);
@@ -3823,9 +3826,7 @@ sub _items_previous {
   foreach ( @pr_cust_bill ) {
     my $date = $conf->exists('invoice_show_prior_due_date')
                ? 'due '. $_->due_date2str($date_format)
-               : time2str('%x', $_->_date); # date_format here, too,
-                                            # but fix _items_cust_bill_pkg,
-                                            # header, others?
+               : time2str($date_format, $_->_date);
     push @b, {
       'description' => 'Previous Balance, Invoice #'. $_->invnum. " ($date)",
       #'pkgpart'     => 'N/A',
@@ -3994,8 +3995,8 @@ sub _items_cust_bill_pkg {
                             ? "Usage charges" : $desc;
 
           unless ( $conf->exists('disable_line_item_date_ranges') ) {
-            $description .= " (" . time2str("%x", $cust_bill_pkg->sdate).
-                            " - ". time2str("%x", $cust_bill_pkg->edate). ")";
+            $description .= " (" . time2str($date_format, $cust_bill_pkg->sdate).
+                            " - ". time2str($date_format, $cust_bill_pkg->edate). ")";
           }
 
           my @d = ();
@@ -4087,8 +4088,8 @@ sub _items_cust_bill_pkg {
         if ( $cust_bill_pkg->recur != 0 ) {
           push @b, {
             'description' => "$desc (".
-                             time2str("%x", $cust_bill_pkg->sdate). ' - '.
-                             time2str("%x", $cust_bill_pkg->edate). ')',
+                             time2str($date_format, $cust_bill_pkg->sdate). ' - '.
+                             time2str($date_format, $cust_bill_pkg->edate). ')',
             'amount'      => sprintf("%.2f", $cust_bill_pkg->recur),
           };
         }
@@ -4132,7 +4133,7 @@ sub _items_credits {
       #                 " (". time2str("%x",$_->cust_credit->_date) .")".
       #                 $reason,
       'description' => 'Credit applied '.
-                       time2str("%x",$_->cust_credit->_date). $reason,
+                       time2str($date_format,$_->cust_credit->_date). $reason,
       'amount'      => sprintf("%.2f",$_->amount),
     };
   }
@@ -4152,7 +4153,7 @@ sub _items_payments {
 
     push @b, {
       'description' => "Payment received ".
-                       time2str("%x",$_->cust_pay->_date ),
+                       time2str($date_format,$_->cust_pay->_date ),
       'amount'      => sprintf("%.2f", $_->amount )
     };
   }
index 7449679..8ba57f3 100644 (file)
@@ -203,7 +203,7 @@ sub apply_to_lineitems {
     my %saw = ();
     my @weights = sort { $b <=> $a }     # highest weight first
                   grep { ! $saw{$_}++ }  # want a list of unique weights
-                 map  { $_->[1] }
+                  map  { $_->[1] }
                        @openweight;
   
     my $remaining_amount = $self->amount;
@@ -224,83 +224,85 @@ sub apply_to_lineitems {
       #if some items are less than applytotal/num_items, then apply then in full
       my $lessflag;
       do {
-       $lessflag = 0;
+        $lessflag = 0;
 
-       #no, not sprintf("%.2f",
-       # we want this rounded DOWN for purposes of checking for line items
-       # less than it, we don't want .66666 becoming .67 and causing this
-       # to trigger when it shouldn't
+        #no, not sprintf("%.2f",
+        # we want this rounded DOWN for purposes of checking for line items
+        # less than it, we don't want .66666 becoming .67 and causing this
+        # to trigger when it shouldn't
         my $applyeach = int( 100 * $applytotal / scalar(@items) ) / 100;
 
-       my @newitems = ();
-       foreach my $item ( @items ) {
-         my $itemamount = $item->setup || $item->recur;
+        my @newitems = ();
+        foreach my $item ( @items ) {
+          my $itemamount = $item->setup || $item->recur;
           if ( $itemamount < $applyeach ) {
-           warn "$me applying full $itemamount".
-                " to small line item (cust_bill_pkg ". $item->billpkgnum. ")\n"
-             if $DEBUG;
-           push @apply, [ $item, $itemamount ];
-           $applytotal -= $itemamount;
+            warn "$me applying full $itemamount".
+                 " to small line item (cust_bill_pkg ". $item->billpkgnum. ")\n"
+              if $DEBUG;
+            push @apply, [ $item, $itemamount ];
+            $applytotal -= $itemamount;
             $lessflag=1;
-         } else {
-           push @newitems, $item;
-         }
-       }
-       @items = @newitems;
-
-      } while ( $lessflag );
-
-      #and now that we've fallen out of the loop, distribute the rest equally...
-
-      # should cust_bill_pay_pkg and cust_credit_bill_pkg amount columns
-      # become real instead of numeric(10,2) ???  no..
-      my $applyeach = sprintf("%.2f", $applytotal / scalar(@items) );
-
-      my @equi_apply = map { [ $_, $applyeach ] } @items;
-
-      # or should we futz with pennies instead?  yes, bah!
-      my $diff =
-        sprintf('%.0f', 100 * ( $applytotal - $applyeach * scalar(@items) ) );
-      $diff = 0 if $diff eq '-0'; #yay ieee fp
-      if ( abs($diff) > scalar(@items) ) {
-        #we must have done something really wrong, the difference is more than
-       #a penny an item
-       $dbh->rollback if $oldAutoCommit;
-       return 'Error distributing pennies applying '. $self->_app_source_name.
-              " - can't distribute difference of $diff pennies".
-              ' among '. scalar(@items). ' line items';
-      }
-
-      warn "$me futzing with $diff pennies difference\n"
-        if $DEBUG && $diff;
-
-      my $futz = 0;
-      while ( $diff != 0 && $futz < scalar(@equi_apply) ) {
-        if ( $diff > 0 ) { 
-         $equi_apply[$futz++]->[1] += .01;
-         $diff -= 1;
-       } elsif ( $diff < 0 ) {
-         $equi_apply[$futz++]->[1] -= .01;
-         $diff += 1;
-       } else {
-         die "guru exception #5 (in fortran tongue the answer)";
-       }
-      }
+          } else {
+            push @newitems, $item;
+          }
+        }
+        @items = @newitems;
+
+      } while ( $lessflag && @items );
+
+      if ( @items ) {
+
+        #and now that we've fallen out of the loop, distribute the rest equally
+
+        # should cust_bill_pay_pkg and cust_credit_bill_pkg amount columns
+        # become real instead of numeric(10,2) ???  no..
+        my $applyeach = sprintf("%.2f", $applytotal / scalar(@items) );
+
+        my @equi_apply = map { [ $_, $applyeach ] } @items;
+
+        # or should we futz with pennies instead?  yes, bah!
+        my $diff =
+          sprintf('%.0f', 100 * ( $applytotal - $applyeach * scalar(@items) ) );
+        $diff = 0 if $diff eq '-0'; #yay ieee fp
+        if ( abs($diff) > scalar(@items) ) {
+          #we must have done something really wrong, the difference is more than
+          #a penny an item
+          $dbh->rollback if $oldAutoCommit;
+          return 'Error distributing pennies applying '.$self->_app_source_name.
+                 " - can't distribute difference of $diff pennies".
+                 ' among '. scalar(@items). ' line items';
+        }
+
+        warn "$me futzing with $diff pennies difference\n"
+          if $DEBUG && $diff;
+
+        my $futz = 0;
+        while ( $diff != 0 && $futz < scalar(@equi_apply) ) {
+          if ( $diff > 0 ) { 
+            $equi_apply[$futz++]->[1] += .01;
+            $diff -= 1;
+          } elsif ( $diff < 0 ) {
+            $equi_apply[$futz++]->[1] -= .01;
+            $diff += 1;
+          } else {
+            die "guru exception #5 (in fortran tongue the answer)";
+          }
+        }
+
+        if ( sprintf('%.0f', $diff ) ) {
+          $dbh->rollback if $oldAutoCommit;
+          return "couldn't futz with pennies enough: still $diff left";
+        }
+
+        if ( $DEBUG ) {
+          warn "$me applying ". $_->[1].
+               " to line item (cust_bill_pkg ". $_->[0]->billpkgnum. ")\n"
+            foreach @equi_apply;
+        }
+        push @apply, @equi_apply;
 
-      if ( sprintf('%.0f', $diff ) ) {
-        $dbh->rollback if $oldAutoCommit;
-       return "couldn't futz with pennies enough: still $diff left";
       }
 
-      if ( $DEBUG ) {
-        warn "$me applying ". $_->[1].
-            " to line item (cust_bill_pkg ". $_->[0]->billpkgnum. ")\n"
-         foreach @equi_apply;
-      }
-
-
-      push @apply, @equi_apply;
-
       #$remaining_amount -= $applytotal;
       last unless $remaining_amount;
 
index f2e60d2..4d9ee81 100644 (file)
@@ -241,8 +241,8 @@ sub _upgrade_data { # class method
 
   warn "$me upgrading $class\n" if $DEBUG;
 
-  my $columndef = dbdef->table($class->table)->column('classnum');
-  unless ($columndef->type eq 'int4') {
+  my $type = dbdef->table($class->table)->column('classnum')->type;
+  unless ( $type =~ /^int/i || $type =~ /int$/i ) {
 
     my $dbh = dbh;
     if ( $dbh->{Driver}->{Name} eq 'Pg' ) {
index 6c3effa..d0aa3a4 100644 (file)
@@ -14,6 +14,7 @@ use FS::cust_credit_bill;
 use FS::part_pkg;
 use FS::reason_type;
 use FS::reason;
+use FS::cust_event;
 
 @ISA = qw( FS::cust_main_Mixin FS::Record );
 $me = '[ FS::cust_credit ]';
@@ -301,6 +302,7 @@ sub check {
     || $self->ut_textn('addlinfo')
     || $self->ut_enum('closed', [ '', 'Y' ])
     || $self->ut_foreign_keyn('pkgnum', 'cust_pkg', 'pkgnum')
+    || $self->ut_foreign_keyn('eventnum', 'cust_event', 'eventnum')
   ;
   return $error if $error;
 
index d2fcfc1..52b5911 100644 (file)
@@ -1,18 +1,16 @@
 package FS::cust_event;
 
 use strict;
+use base qw( FS::cust_main_Mixin FS::Record );
 use vars qw( @ISA $DEBUG $me );
 use Carp qw( croak confess );
 use FS::Record qw( qsearch qsearchs dbdef );
-use FS::cust_main_Mixin;
 use FS::part_event;
 #for cust_X
 use FS::cust_main;
 use FS::cust_pkg;
 use FS::cust_bill;
 
-@ISA = qw(FS::cust_main_Mixin FS::Record);
-
 $DEBUG = 0;
 $me = '[FS::cust_event]';
 
@@ -230,7 +228,7 @@ sub do_event {
   my $error;
   {
     local $SIG{__DIE__}; # don't want Mason __DIE__ handler active
-    $error = eval { $part_event->do_action($object); };
+    $error = eval { $part_event->do_action($object, $self); };
   }
 
   my $status = '';
index 87c6c3e..a90fbe1 100644 (file)
@@ -225,6 +225,20 @@ sub line {
   $self->location_label;
 }
 
+=item location_hash
+
+Returns a list of key/value pairs, with the following keys: address1, adddress2,
+city, county, state, zip, country.
+
+=cut
+
+#geocode?  not yet set
+
+sub location_hash {
+  my $self = shift;
+  map { $_ => $self->$_ } qw( address1 address2 city county state zip country );
+}
+
 =back
 
 =head1 BUGS
index 4b712de..88aceb9 100644 (file)
@@ -1910,6 +1910,25 @@ sub has_ship_address {
   scalar( grep { $self->getfield("ship_$_") ne '' } $self->addr_fields );
 }
 
+=item location_hash
+
+Returns a list of key/value pairs, with the following keys: address1, adddress2,
+city, county, state, zip, country.  The shipping address is used if present.
+
+=cut
+
+#geocode?  dependent on tax-ship_address config, not available in cust_location
+#mostly.  not yet then.
+
+sub location_hash {
+  my $self = shift;
+  my $prefix = $self->has_ship_address ? 'ship_' : '';
+
+  map { $_ => $self->get($prefix.$_) }
+      qw( address1 address2 city county state zip country geocode );
+      #fields that cust_location has
+}
+
 =item all_pkgs [ EXTRA_QSEARCH_PARAMS_HASHREF ]
 
 Returns all packages (see L<FS::cust_pkg>) for this customer.
@@ -3815,7 +3834,7 @@ sub due_cust_event {
 
   warn "    invalid conditions not eliminated with condition_sql:\n".
        join('', map "      $_: ".$unsat{$_}."\n", keys %unsat )
-    if $DEBUG; # > 1;
+    if keys %unsat && $DEBUG; # > 1;
 
   ##
   # insert
@@ -4768,9 +4787,19 @@ sub realtime_refund_bop {
   ) {
     warn "  attempting void\n" if $DEBUG > 1;
     my $void = new Business::OnlinePayment( $processor, @bop_options );
-    $content{'card_number'} = $cust_pay->payinfo
-      if $cust_pay->payby eq 'CARD'
-      && $void->can('info') && $void->info('CC_void_requires_card');
+    if ( $void->can('info') ) {
+      if ( $cust_pay->payby eq 'CARD'
+           && $void->info('CC_void_requires_card') )
+      {
+        $content{'card_number'} = $cust_pay->payinfo
+      } elsif ( $cust_pay->payby eq 'CHEK'
+                && $void->info('ECHECK_void_requires_account') )
+      {
+        ( $content{'account_number'}, $content{'routing_code'} ) =
+          split('@', $cust_pay->payinfo);
+        $content{'name'} = $self->get('first'). ' '. $self->get('last');
+      }
+    }
     $void->content( 'action' => 'void', %content );
     $void->submit();
     if ( $void->is_success ) {
@@ -6111,9 +6140,19 @@ sub _new_realtime_refund_bop {
   ) {
     warn "  attempting void\n" if $DEBUG > 1;
     my $void = new Business::OnlinePayment( $processor, @bop_options );
-    $content{'card_number'} = $cust_pay->payinfo
-      if $cust_pay->payby eq 'CARD'
-      && $void->can('info') && $void->info('CC_void_requires_card');
+    if ( $void->can('info') ) {
+      if ( $cust_pay->payby eq 'CARD'
+           && $void->info('CC_void_requires_card') )
+      {
+        $content{'card_number'} = $cust_pay->payinfo;
+      } elsif ( $cust_pay->payby eq 'CHEK'
+                && $void->info('ECHECK_void_requires_account') )
+      {
+        ( $content{'account_number'}, $content{'routing_code'} ) =
+          split('@', $cust_pay->payinfo);
+        $content{'name'} = $self->get('first'). ' '. $self->get('last');
+      }
+    }
     $void->content( 'action' => 'void', %content );
     $void->submit();
     if ( $void->is_success ) {
@@ -7281,7 +7320,7 @@ sub referral_cust_main_ncancelled {
 
 Like referral_cust_main, except returns a flat list of all unsuspended (and
 uncancelled) packages for each customer.  The number of items in this list may
-be useful for comission calculations (perhaps after a C<grep { my $pkgpart = $_->pkgpart; grep { $_ == $pkgpart } @commission_worthy_pkgparts> } $cust_main-> ).
+be useful for commission calculations (perhaps after a C<grep { my $pkgpart = $_->pkgpart; grep { $_ == $pkgpart } @commission_worthy_pkgparts> } $cust_main-> ).
 
 =cut
 
@@ -7343,8 +7382,10 @@ sub credit {
     $cust_credit->set('reason', $reason)
   }
 
-  $cust_credit->addlinfo( delete $options{'addlinfo'} )
-    if exists($options{'addlinfo'});
+  for (qw( addlinfo eventnum )) {
+    $cust_credit->$_( delete $options{$_} )
+      if exists($options{$_});
+  }
 
   $cust_credit->insert(%options);
 
index 8415d62..89eadd5 100644 (file)
@@ -1,17 +1,19 @@
 package FS::cust_pkg;
 
 use strict;
+use base qw( FS::cust_main_Mixin FS::location_Mixin
+             FS::m2m_Common FS::option_Common FS::Record
+           );
 use vars qw(@ISA $disable_agentcheck $DEBUG $me);
 use Carp qw(cluck);
 use Scalar::Util qw( blessed );
 use List::Util qw(max);
 use Tie::IxHash;
+use Time::Local qw( timelocal_nocheck );
 use MIME::Entity;
 use FS::UID qw( getotaker dbh );
 use FS::Misc qw( send_email );
 use FS::Record qw( qsearch qsearchs );
-use FS::m2m_Common;
-use FS::cust_main_Mixin;
 use FS::cust_svc;
 use FS::part_pkg;
 use FS::cust_main;
@@ -38,8 +40,6 @@ use FS::svc_forward;
 # for sending cancel emails in sub cancel
 use FS::Conf;
 
-@ISA = qw( FS::m2m_Common FS::cust_main_Mixin FS::option_Common FS::Record );
-
 $DEBUG = 0;
 $me = '[FS::cust_pkg]';
 
@@ -250,6 +250,26 @@ an optional queue name for ticket additions
 sub insert {
   my( $self, %options ) = @_;
 
+  if ( $self->part_pkg->option('start_1st', 1) && !$self->start_date ) {
+    my ($sec,$min,$hour,$mday,$mon,$year) = (localtime(time) )[0,1,2,3,4,5];
+    $mon += 1 unless $mday == 1;
+    until ( $mon < 12 ) { $mon -= 12; $year++; }
+    $self->start_date( timelocal_nocheck(0,0,0,1,$mon,$year) );
+  }
+
+  my $expire_months = $self->part_pkg->option('expire_months', 1);
+  if ( $expire_months && !$self->expire ) {
+    my $start = $self->start_date || $self->setup || time;
+
+    #false laziness w/part_pkg::add_freq
+    my ($sec,$min,$hour,$mday,$mon,$year) = (localtime($start) )[0,1,2,3,4,5];
+    $mon += $expire_months;
+    until ( $mon < 12 ) { $mon -= 12; $year++; }
+
+    #$self->expire( timelocal_nocheck($sec,$min,$hour,$mday,$mon,$year) );
+    $self->expire( timelocal_nocheck(0,0,0,$mday,$mon,$year) );
+  }
+
   local $SIG{HUP} = 'IGNORE';
   local $SIG{INT} = 'IGNORE';
   local $SIG{QUIT} = 'IGNORE';
@@ -1683,7 +1703,9 @@ sub extra_part_svc {
 
 #seems to benchmark slightly faster...
   qsearch( {
-    'select'      => 'DISTINCT ON (svcpart) part_svc.*',
+    #'select'      => 'DISTINCT ON (svcpart) part_svc.*',
+    #MySQL doesn't grok DISINCT ON
+    'select'      => 'DISTINCT part_svc.*',
     'table'       => 'part_svc',
     'addl_from'   =>
       'LEFT JOIN pkg_svc  ON (     pkg_svc.svcpart   = part_svc.svcpart 
@@ -1925,41 +1947,24 @@ sub cust_main {
   qsearchs( 'cust_main', { 'custnum' => $self->custnum } );
 }
 
+#these subs are in location_Mixin.pm now... unfortunately the POD doesn't mixin
+
 =item cust_location
 
 Returns the location object, if any (see L<FS::cust_location>).
 
-=cut
-
-sub cust_location {
-  my $self = shift;
-  return '' unless $self->locationnum;
-  qsearchs( 'cust_location', { 'locationnum' => $self->locationnum } );
-}
-
 =item cust_location_or_main
 
 If this package is associated with a location, returns the locaiton (see
 L<FS::cust_location>), otherwise returns the customer (see L<FS::cust_main>).
 
-=cut
-
-sub cust_location_or_main {
-  my $self = shift;
-  $self->cust_location || $self->cust_main;
-}
-
 =item location_label [ OPTION => VALUE ... ]
 
 Returns the label of the location object (see L<FS::cust_location>).
 
 =cut
 
-sub location_label {
-  my $self = shift;
-  my $object = $self->cust_location_or_main;
-  $object->location_label(@_);
-}
+#end of subs in location_Mixin.pm now... unfortunately the POD doesn't mixin
 
 =item seconds_since TIMESTAMP
 
index 3c28204..3ce1314 100644 (file)
@@ -251,6 +251,18 @@ sub replace {
     }
   }
 
+#  #trigger a re-export on pkgnum changes?
+#  # (of prepaid packages), for Expiration RADIUS attribute
+#  if ( $new->pkgnum != $old->pkgnum && $new->cust_pkg->part_pkg->is_prepaid ) {
+#    my $svc_x = $new->svc_x;
+#    local($FS::Record::nowarn_identical) = 1;
+#    my $error = $svc_x->export('replace');
+#    if ( $error ) {
+#      $dbh->rollback if $oldAutoCommit;
+#      return $error if $error;
+#    }
+#  }
+
   #my $error = $new->SUPER::replace($old, @_);
   my $error = $new->SUPER::replace($old);
   if ( $error ) {
@@ -411,7 +423,7 @@ sub _svc_label {
 
 =item export_links
 
-Returns a list of html elements associated with this services exports.
+Returns a listref of html elements associated with this service's exports.
 
 =cut
 
@@ -423,6 +435,21 @@ sub export_links {
   $svc_x->export_links;
 }
 
+=item export_getsettings
+
+Returns two hashrefs of settings associated with this service's exports.
+
+=cut
+
+sub export_getsettings {
+  my $self = shift;
+  my $svc_x = $self->svc_x
+    or return "can't find ". $self->part_svc->svcdb. '.svcnum '. $self->svcnum;
+
+  $svc_x->export_getsettings;
+}
+
+
 =item svc_x
 
 Returns the FS::svc_XXX object for this service (i.e. an FS::svc_acct object or
diff --git a/FS/FS/h_svc_mailinglist.pm b/FS/FS/h_svc_mailinglist.pm
new file mode 100644 (file)
index 0000000..3d1fd27
--- /dev/null
@@ -0,0 +1,33 @@
+package FS::h_svc_mailinglist;
+
+use strict;
+use vars qw( @ISA );
+use FS::h_Common;
+use FS::svc_mailinglist;
+
+@ISA = qw( FS::h_Common FS::svc_mailinglist );
+
+sub table { 'h_svc_mailinglist' };
+
+=head1 NAME
+
+FS::h_svc_mailinglist - Historical mailing list objects
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+An FS::h_svc_mailinglist object represents a historical mailing list.
+FS::h_svc_mailinglist inherits from FS::h_Common and FS::svc_mailinglist.
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+L<FS::h_Common>, L<FS::svc_mailinglist>, L<FS::Record>, schema.html from the
+base documentation.
+
+=cut
+
+1;
+
diff --git a/FS/FS/h_svc_pbx.pm b/FS/FS/h_svc_pbx.pm
new file mode 100644 (file)
index 0000000..db702f3
--- /dev/null
@@ -0,0 +1,33 @@
+package FS::h_svc_pbx;
+
+use strict;
+use vars qw( @ISA );
+use FS::h_Common;
+use FS::svc_pbx;
+
+@ISA = qw( FS::h_Common FS::svc_pbx );
+
+sub table { 'h_svc_pbx' };
+
+=head1 NAME
+
+FS::h_svc_pbx - Historical PBX objects
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+An FS::h_svc_pbx object represents a historical PBX tenant.  FS::h_svc_pbx
+inherits from FS::h_Common and FS::svc_pbx.
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+L<FS::h_Common>, L<FS::svc_pbx>, L<FS::Record>, schema.html from the base
+documentation.
+
+=cut
+
+1;
+
diff --git a/FS/FS/location_Mixin.pm b/FS/FS/location_Mixin.pm
new file mode 100644 (file)
index 0000000..d457386
--- /dev/null
@@ -0,0 +1,57 @@
+package FS::location_Mixin;
+
+use strict;
+use FS::Record qw( qsearchs );
+use FS::cust_location;
+
+=item cust_location
+
+Returns the location object, if any (see L<FS::cust_location>).
+
+=cut
+
+sub cust_location {
+  my $self = shift;
+  return '' unless $self->locationnum;
+  qsearchs( 'cust_location', { 'locationnum' => $self->locationnum } );
+}
+
+=item cust_location_or_main
+
+If this package is associated with a location, returns the locaiton (see
+L<FS::cust_location>), otherwise returns the customer (see L<FS::cust_main>).
+
+=cut
+
+sub cust_location_or_main {
+  my $self = shift;
+  $self->cust_location || $self->cust_main;
+}
+
+=item location_label [ OPTION => VALUE ... ]
+
+Returns the label of the location object (see L<FS::cust_location>).
+
+=cut
+
+sub location_label {
+  my $self = shift;
+  my $object = $self->cust_location_or_main;
+  $object->location_label(@_);
+}
+
+=item location_hash
+
+Returns a hash of values for the location, either from the location object,
+the cust_main shipping address, or the cust_main address, whichever is present
+first.
+
+=cut
+
+sub location_hash {
+  my $self = shift;
+  my $object = $self->cust_location_or_main;
+  $object->location_hash(@_);
+}
+
+1;
diff --git a/FS/FS/mailinglist.pm b/FS/FS/mailinglist.pm
new file mode 100644 (file)
index 0000000..1294610
--- /dev/null
@@ -0,0 +1,173 @@
+package FS::mailinglist;
+
+use strict;
+use base qw( FS::Record );
+use FS::Record qw( qsearch qsearchs dbh );
+use FS::mailinglistmember;
+use FS::svc_mailinglist;
+
+=head1 NAME
+
+FS::mailinglist - Object methods for mailinglist records
+
+=head1 SYNOPSIS
+
+  use FS::mailinglist;
+
+  $record = new FS::mailinglist \%hash;
+  $record = new FS::mailinglist { 'column' => 'value' };
+
+  $error = $record->insert;
+
+  $error = $new_record->replace($old_record);
+
+  $error = $record->delete;
+
+  $error = $record->check;
+
+=head1 DESCRIPTION
+
+An FS::mailinglist object represents a mailing list  FS::mailinglist inherits
+from FS::Record.  The following fields are currently supported:
+
+=over 4
+
+=item listnum
+
+primary key
+
+=item listname
+
+Mailing list name
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item new HASHREF
+
+Creates a new mailing list.  To add the mailing list to the database, see
+L<"insert">.
+
+Note that this stores the hash reference, not a distinct copy of the hash it
+points to.  You can ask the object for a copy with the I<hash> method.
+
+=cut
+
+# the new method can be inherited from FS::Record, if a table method is defined
+
+sub table { 'mailinglist'; }
+
+=item insert
+
+Adds this record to the database.  If there is an error, returns the error,
+otherwise returns false.
+
+=cut
+
+# the insert method can be inherited from FS::Record
+
+=item delete
+
+Delete this record from the database.
+
+=cut
+
+sub delete {
+  my $self = shift;
+
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  foreach my $member ( $self->mailinglistmember ) {
+    my $error = $member->delete;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error;
+    }
+  }
+
+  my $error = $self->SUPER::delete;
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+  '';
+
+}
+
+=item replace OLD_RECORD
+
+Replaces the OLD_RECORD with this one in the database.  If there is an error,
+returns the error, otherwise returns false.
+
+=cut
+
+# the replace method can be inherited from FS::Record
+
+=item check
+
+Checks all fields to make sure this is a valid mailing list.  If there is
+an error, returns the error, otherwise returns false.  Called by the insert
+and replace methods.
+
+=cut
+
+# the check method should currently be supplied - FS::Record contains some
+# data checking routines
+
+sub check {
+  my $self = shift;
+
+  my $error = 
+    $self->ut_numbern('listnum')
+    || $self->ut_text('listname')
+  ;
+  return $error if $error;
+
+  $self->SUPER::check;
+}
+
+=item mailinglistmember
+
+=cut
+
+sub mailinglistmember {
+  my $self = shift;
+  qsearch('mailinglistmember', { 'listnum' => $self->listnum } );
+}
+
+=item svc_mailinglist
+
+=cut
+
+sub svc_mailinglist {
+  my $self = shift;
+  qsearchs('svc_mailinglist', { 'listnum' => $self->listnum } );
+}
+
+=back
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+L<FS::mailinglistmember>, L<FS::svc_mailinglist>, L<FS::Record>, schema.html
+from the base documentation.
+
+=cut
+
+1;
+
diff --git a/FS/FS/mailinglistmember.pm b/FS/FS/mailinglistmember.pm
new file mode 100644 (file)
index 0000000..8655d61
--- /dev/null
@@ -0,0 +1,239 @@
+package FS::mailinglistmember;
+
+use strict;
+use base qw( FS::Record );
+use Scalar::Util qw( blessed );
+use FS::Record qw( dbh qsearchs ); # qsearch );
+use FS::mailinglist;
+use FS::svc_acct;
+
+=head1 NAME
+
+FS::mailinglistmember - Object methods for mailinglistmember records
+
+=head1 SYNOPSIS
+
+  use FS::mailinglistmember;
+
+  $record = new FS::mailinglistmember \%hash;
+  $record = new FS::mailinglistmember { 'column' => 'value' };
+
+  $error = $record->insert;
+
+  $error = $new_record->replace($old_record);
+
+  $error = $record->delete;
+
+  $error = $record->check;
+
+=head1 DESCRIPTION
+
+An FS::mailinglistmember object represents a mailing list member.
+FS::mailinglistmember inherits from FS::Record.  The following fields are
+currently supported:
+
+=over 4
+
+=item membernum
+
+primary key
+
+=item listnum
+
+listnum
+
+=item svcnum
+
+svcnum
+
+=item email
+
+email
+
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item new HASHREF
+
+Creates a new mailing list member.  To add the member to the database, see
+ L<"insert">.
+
+Note that this stores the hash reference, not a distinct copy of the hash it
+points to.  You can ask the object for a copy with the I<hash> method.
+
+=cut
+
+# the new method can be inherited from FS::Record, if a table method is defined
+
+sub table { 'mailinglistmember'; }
+
+=item insert
+
+Adds this record to the database.  If there is an error, returns the error,
+otherwise returns false.
+
+=cut
+
+sub insert {
+  my $self = shift;
+
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  my $error =    $self->SUPER::insert
+              || $self->export('mailinglistmember_insert');
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+  '';
+}
+
+=item delete
+
+Delete this record from the database.
+
+=cut
+
+sub delete {
+  my $self = shift;
+
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  my $error =    $self->SUPER::delete
+              || $self->export('mailinglistmember_delete');
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+  '';
+}
+
+=item replace OLD_RECORD
+
+Replaces the OLD_RECORD with this one in the database.  If there is an error,
+returns the error, otherwise returns false.
+
+=cut
+
+sub replace {
+  my $new = shift;
+
+  my $old = ( blessed($_[0]) && $_[0]->isa('FS::Record') )
+              ? shift
+              : $new->replace_old;
+
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  my $error =    $new->SUPER::replace($old)
+              || $new->export('mailinglistmember_replace', $old);
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+  '';
+}
+
+=item check
+
+Checks all fields to make sure this is a valid member.  If there is
+an error, returns the error, otherwise returns false.  Called by the insert
+and replace methods.
+
+=cut
+
+# the check method should currently be supplied - FS::Record contains some
+# data checking routines
+
+sub check {
+  my $self = shift;
+
+  my $error = 
+    $self->ut_numbern('membernum')
+    || $self->ut_foreign_key('listnum', 'mailinglist', 'listnum')
+    || $self->ut_foreign_keyn('svcnum', 'svc_acct', 'svcnum')
+    || $self->ut_textn('email') #XXX ut_email! from svc_forward, cust_main_invoice
+  ;
+  return $error if $error;
+
+  $self->SUPER::check;
+}
+
+=item mailinglist
+
+=cut
+
+sub mailinglist {
+  my $self = shift;
+  qsearchs('mailinglist', { 'listnum' => $self->listnum } );
+}
+
+=item email_address
+
+=cut
+
+sub email_address {
+  my $self = shift;
+  #XXX svcnum
+  $self->email;
+}
+
+=item export
+
+=cut
+
+sub export {
+  my( $self, $method ) = ( shift, shift );
+  my $svc_mailinglist = $self->mailinglist->svc_mailinglist
+    or return '';
+  $svc_mailinglist->export($method, $self, @_);
+}
+
+=back
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+L<FS::Record>, schema.html from the base documentation.
+
+=cut
+
+1;
+
diff --git a/FS/FS/part_event/Action/Mixin/credit_pkg.pm b/FS/FS/part_event/Action/Mixin/credit_pkg.pm
new file mode 100644 (file)
index 0000000..aeda92f
--- /dev/null
@@ -0,0 +1,63 @@
+package FS::part_event::Action::Mixin::credit_pkg;
+
+use strict;
+
+sub eventtable_hashref {
+  { 'cust_pkg' => 1 };
+}
+
+sub option_fields {
+  ( 
+    'reasonnum' => { 'label'        => 'Credit reason',
+                     'type'         => 'select-reason',
+                     'reason_class' => 'R',
+                   },
+    'percent'   => { 'label'   => 'Percent',
+                     'type'    => 'input-percentage',
+                     'default' => '100',
+                   },
+    'what' => { 'label'   => 'Of',
+                'type'    => 'select',
+                #add additional ways to specify in the package def
+                'options' => [ qw( base_recur_permonth unit_setup recur_cost_permonth setup_cost ) ],
+                'labels'  => { 'base_recur_permonth' => 'Base monthly fee',
+                               'unit_setup'          => 'Setup fee',
+                               'recur_cost_permonth' => 'Monthly cost',
+                               'setup_cost'          => 'Setup cost',
+                             },
+              },
+  );
+
+}
+
+#my %no_cust_pkg = ( 'setup_cost' => 1 );
+
+sub _calc_credit {
+  my( $self, $cust_pkg ) = @_;
+
+  my $cust_main = $self->cust_main($cust_pkg);
+
+  my $part_pkg = $cust_pkg->part_pkg;
+
+  my $what = $self->option('what');
+
+  #false laziness w/Condition/cust_payments_pkg.pm
+  if ( $what =~ /_permonth$/ ) { #huh.  yuck.
+    if ( $part_pkg->freq !~ /^\d+$/ ) {
+      die 'WARNING: Not crediting for package '. $cust_pkg->pkgnum.
+          ' ( customer '. $cust_pkg->custnum. ')'.
+          ' - credits not (yet) available for '.
+          ' packages with '. $part_pkg->freq_pretty. ' frequency';
+    }
+  }
+
+  my $percent = $self->option('percent');
+
+  #my @arg = $no_cust_pkg{$what} ? () : ($cust_pkg);
+  my @arg = ($what eq 'setup_cost') ? () : ($cust_pkg);
+
+  sprintf('%.2f', $part_pkg->$what(@arg) * $percent / 100 );
+
+}
+
+1;
diff --git a/FS/FS/part_event/Action/pkg_agent_credit.pm b/FS/FS/part_event/Action/pkg_agent_credit.pm
new file mode 100644 (file)
index 0000000..4bcee98
--- /dev/null
@@ -0,0 +1,39 @@
+package FS::part_event::Action::pkg_agent_credit;
+
+use strict;
+use base qw( FS::part_event::Action::pkg_referral_credit );
+
+sub description { 'Credit the agent a specific amount'; }
+
+#a little false laziness w/pkg_referral_credit
+sub do_action {
+  my( $self, $cust_pkg, $cust_event ) = @_;
+
+  my $cust_main = $self->cust_main($cust_pkg);
+
+  my $agent = $cust_main->agent;
+  return "No customer record for agent ". $agent->agent
+    unless $agent->agent_custnum;
+
+  my $agent_cust_main = $agent->agent_cust_main;
+    #? or return "No customer record for agent ". $agent->agent;
+
+  my $amount    = $self->_calc_credit($cust_pkg);
+  return '' unless $amount > 0;
+
+  my $reasonnum = $self->option('reasonnum');
+
+  my $error = $agent_cust_main->credit(
+    $amount, 
+    \$reasonnum,
+    'eventnum' => $cust_event->eventnum,
+    'addlinfo' => 'for customer #'. $cust_main->display_custnum.
+                               ': '.$cust_main->name,
+  );
+  die "Error crediting customer ". $agent_cust_main->custnum.
+      " for agent commission: $error"
+    if $error;
+
+}
+
+1;
diff --git a/FS/FS/part_event/Action/pkg_agent_credit_pkg.pm b/FS/FS/part_event/Action/pkg_agent_credit_pkg.pm
new file mode 100644 (file)
index 0000000..b3e1181
--- /dev/null
@@ -0,0 +1,9 @@
+package FS::part_event::Action::pkg_agent_credit_pkg;
+
+use strict;
+use base qw( FS::part_event::Action::Mixin::credit_pkg
+             FS::part_event::Action::pkg_agent_credit );
+
+sub description { 'Credit the agent an amount based on the referred package'; }
+
+1;
diff --git a/FS/FS/part_event/Action/pkg_employee_credit.pm b/FS/FS/part_event/Action/pkg_employee_credit.pm
new file mode 100644 (file)
index 0000000..e4913a2
--- /dev/null
@@ -0,0 +1,44 @@
+package FS::part_event::Action::pkg_employee_credit;
+
+use strict;
+use base qw( FS::part_event::Action::pkg_referral_credit );
+use FS::Record qw(qsearchs);
+use FS::access_user;
+
+sub description { 'Credit the ordering employee a specific amount'; }
+
+#a little false laziness w/pkg_referral_credit
+sub do_action {
+  my( $self, $cust_pkg, $cust_event ) = @_;
+
+  my $cust_main = $self->cust_main($cust_pkg);
+
+  #yuck.  this is why text $otaker is gone in 2.1
+  my $otaker = $cust_pkg->otaker;
+  my $employee = qsearchs('access_user', { 'username' => $otaker } )
+    or return "No employee for username $otaker";
+  return "No customer record for employee ". $employee->username
+    unless $employee->user_custnum;
+
+  my $employee_cust_main = $employee->user_cust_main;
+    #? or return "No customer record for employee ". $employee->username;
+
+  my $amount    = $self->_calc_credit($cust_pkg);
+  return '' unless $amount > 0;
+
+  my $reasonnum = $self->option('reasonnum');
+
+  my $error = $employee_cust_main->credit(
+    $amount, 
+    \$reasonnum,
+    'eventnum' => $cust_event->eventnum,
+    'addlinfo' => 'for customer #'. $cust_main->display_custnum.
+                               ': '.$cust_main->name,
+  );
+  die "Error crediting customer ". $employee_cust_main->custnum.
+      " for employee commission: $error"
+    if $error;
+
+}
+
+1;
diff --git a/FS/FS/part_event/Action/pkg_employee_credit_pkg.pm b/FS/FS/part_event/Action/pkg_employee_credit_pkg.pm
new file mode 100644 (file)
index 0000000..e3b867f
--- /dev/null
@@ -0,0 +1,9 @@
+package FS::part_event::Action::pkg_employee_credit_pkg;
+
+use strict;
+use base qw( FS::part_event::Action::Mixin::credit_pkg
+             FS::part_event::Action::pkg_employee_credit );
+
+sub description { 'Credit the ordering employee an amount based on the referred package'; }
+
+1;
index 98d9820..e7c92d6 100644 (file)
@@ -22,9 +22,8 @@ sub option_fields {
 
 }
 
-#a little false laziness w/pkg_referral_credit_pkg
 sub do_action {
-  my( $self, $cust_pkg ) = @_;
+  my( $self, $cust_pkg, $cust_event ) = @_;
 
   my $cust_main = $self->cust_main($cust_pkg);
 
@@ -36,14 +35,17 @@ sub do_action {
   return 'Referring customer is cancelled'
     if $referring_cust_main->status eq 'cancelled';
 
-  my $amount    = $self->_calc_referral_credit($cust_pkg);
+  my $amount    = $self->_calc_credit($cust_pkg);
+  return '' unless $amount > 0;
+
   my $reasonnum = $self->option('reasonnum');
 
   my $error = $referring_cust_main->credit(
     $amount, 
     \$reasonnum,
-    'addlinfo' =>
-      'for customer #'. $cust_main->display_custnum. ': '.$cust_main->name,
+    'eventnum' => $cust_event->eventnum,
+    'addlinfo' => 'for customer #'. $cust_main->display_custnum.
+                               ': '.$cust_main->name,
   );
   die "Error crediting customer ". $cust_main->referral_custnum.
       " for referral: $error"
@@ -51,7 +53,7 @@ sub do_action {
 
 }
 
-sub _calc_referral_credit {
+sub _calc_credit {
   my( $self, $cust_pkg ) = @_;
 
   $self->option('amount');
index eb9b510..667c4ce 100644 (file)
@@ -1,58 +1,9 @@
 package FS::part_event::Action::pkg_referral_credit_pkg;
 
 use strict;
-use base qw( FS::part_event::Action::pkg_referral_credit );
+use base qw( FS::part_event::Action::Mixin::credit_pkg
+             FS::part_event::Action::pkg_referral_credit );
 
 sub description { 'Credit the referring customer an amount based on the referred package'; }
 
-#sub eventtable_hashref {
-#  { 'cust_pkg' => 1 };
-#}
-
-sub option_fields {
-  ( 
-    'reasonnum' => { 'label'        => 'Credit reason',
-                     'type'         => 'select-reason',
-                     'reason_class' => 'R',
-                   },
-    'percent'   => { 'label'   => 'Percent',
-                     'type'    => 'input-percentage',
-                     'default' => '100',
-                   },
-    'what' => { 'label'   => 'Of',
-                'type'    => 'select',
-                #also add some way to specify in the package def, no?
-                'options' => [ qw( base_recur_permonth ) ],
-                'labels'  => { 'base_recur_permonth' => 'Base monthly fee', },
-              },
-  );
-
-}
-
-sub _calc_referral_credit {
-  my( $self, $cust_pkg ) = @_;
-
-  my $cust_main = $self->cust_main($cust_pkg);
-
-  my $part_pkg = $cust_pkg->part_pkg;
-
-  my $what = $self->option('what');
-
-  #false laziness w/Condition/cust_payments_pkg.pm
-  if ( $what eq 'base_recur_permonth' ) { #huh.  yuck.
-    if ( $part_pkg->freq !~ /^\d+$/ ) {
-      die 'WARNING: Not crediting customer '. $cust_main->referral_custnum.
-          ' for package '. $cust_pkg->pkgnum.
-          ' ( customer '. $cust_pkg->custnum. ')'.
-          ' - Referral credits not (yet) available for '.
-          ' packages with '. $part_pkg->freq_pretty. ' frequency';
-    }
-  }
-
-  my $percent = $self->option('percent');
-
-  sprintf('%.2f', $part_pkg->$what($cust_pkg) * $percent / 100 );
-
-}
-
 1;
index 65670c0..3b8854a 100644 (file)
@@ -40,7 +40,7 @@ sub condition_sql {
 
   my $balance_sql = FS::cust_main->balance_sql;
 
-  "$balance_sql > CAST( $over AS numeric )";
+  "$balance_sql > CAST( $over AS DECIMAL(10,2) )";
 
 }
 
index f1a9707..fc34612 100644 (file)
@@ -38,7 +38,7 @@ sub condition_sql {
 
   my $balance_sql = FS::cust_main->balance_date_sql( $age );
 
-  "$balance_sql > CAST( $over AS numeric )";
+  "$balance_sql > CAST( $over AS DECIMAL(10,2) )";
 }
 
 sub order_sql {
index 9c71590..2002c70 100644 (file)
@@ -34,7 +34,7 @@ sub condition_sql {
 
   my $balance_sql = FS::cust_main->balance_sql;
 
-  "$balance_sql <= CAST( $under AS numeric )";
+  "$balance_sql <= CAST( $under AS DECIMAL(10,2) )";
 
 }
 
index 91d75dd..d85af26 100644 (file)
@@ -38,14 +38,16 @@ sub condition {
 }
 
 sub condition_sql {
-  my( $class, $table ) = @_;
+  my( $class, $table, %opt ) = @_;
+
+  my $integer = $opt{'driver_name'} =~ /^mysql/ ? 'UNSIGNED INTEGER' : 'INTEGER';
   
   my $servicenum = $class->condition_sql_option('has_service');
   my $sql = qq| 0 < ( SELECT COUNT(cs.svcpart)
      FROM cust_bill_pkg cbp, cust_svc cs
     WHERE cbp.invnum = cust_bill.invnum
       AND cs.pkgnum = cbp.pkgnum
-      AND cs.svcpart = CAST( $servicenum AS integer )
+      AND cs.svcpart = CAST( $servicenum AS $integer )
   )
   |;
   return $sql;
index 0fd9922..d8c77c7 100644 (file)
@@ -48,7 +48,7 @@ sub condition_sql {
 
   my $owed_sql = FS::cust_bill->owed_sql;
 
-  "$owed_sql > CAST( $over AS numeric )";
+  "$owed_sql > CAST( $over AS DECIMAL(10,2) )";
 }
 
 1;
index a0bf92f..4eb6439 100644 (file)
@@ -43,7 +43,7 @@ sub condition_sql {
 
   my $owed_sql = FS::cust_bill->owed_sql;
 
-  "$owed_sql <= CAST( $under AS numeric )";
+  "$owed_sql <= CAST( $under AS DECIMAL(10,2) )";
 }
 
 1;
index 3408b0a..1910674 100644 (file)
@@ -50,7 +50,7 @@ sub condition {
     or die "unparsable retry_delay: $retry_delay";
   my $date_after = $time - $1 * $after{$2};
 
-  my $sth = dbh->prepare("$sql AND date > ?") # AND status = 'failed' "
+  my $sth = dbh->prepare("$sql AND _date > ?") # AND status = 'failed' "
     or die  dbh->errstr. " preparing: $sql";
   $sth->execute($self->eventpart, $tablenum, $date_after)
     or die $sth->errstr. " executing: $sql";
index d13e849..32f19a3 100644 (file)
@@ -2,7 +2,7 @@ package FS::part_event_condition;
 
 use strict;
 use vars qw( @ISA $DEBUG @SKIP_CONDITION_SQL );
-use FS::UID qw(dbh);
+use FS::UID qw( dbh driver_name );
 use FS::Record qw( qsearch qsearchs );
 use FS::option_Common;
 use FS::part_event; #for order_conditions_sql...
@@ -285,7 +285,9 @@ sub where_conditions_sql {
     map {
           my $conditionname = $_;
           my $coderef = $conditions{$conditionname}->{condition_sql};
-          my $sql = &$coderef( $eventtable, 'time'=>$time );
+          my $sql = &$coderef( $eventtable, 'time'        => $time,
+                                            'driver_name' => driver_name(),
+                             );
           die "$coderef is not a CODEREF" unless ref($coderef) eq 'CODE';
           "( cond_$conditionname.conditionname IS NULL OR $sql )";
         }
index 16aad6d..588606d 100644 (file)
@@ -226,6 +226,17 @@ sub export_svc {
   qsearch('export_svc', { 'exportnum' => $self->exportnum } );
 }
 
+=item export_device
+
+Returns a list of associated FS::export_device records.
+
+=cut
+
+sub export_device {
+  my $self = shift;
+  qsearch('export_device', { 'exportnum' => $self->exportnum } );
+}
+
 =item part_export_option
 
 Returns all options as FS::part_export_option objects (see
@@ -365,6 +376,15 @@ Adds a list of web elements to ARRAYREF specific to this export and SVC_OBJECT.
 The elements are displayed in the UI to lead the the operator to external
 configuration, monitoring, and similar tools.
 
+=item export_getsettings SVC_OBJECT SETTINGS_HASHREF DEFAUTS_HASHREF
+
+Adds a hashref of settings to SETTINGSREF specific to this export and
+SVC_OBJECT.  The elements can be displayed in the UI on the service view.
+
+DEFAULTSREF is a hashref with the same keys where true values indicate the
+setting is a default (and thus can be displayed in the UI with less emphasis,
+or hidden by default).
+
 =cut
 
 =back
index ecb3780..7f5cece 100644 (file)
@@ -1,35 +1,43 @@
 package FS::part_export::communigate_pro;
 
-use vars qw(@ISA %info %options);
+use strict;
+use vars qw(@ISA %info %options %quotas $DEBUG);
+use Data::Dumper;
 use Tie::IxHash;
 use FS::part_export;
 use FS::queue;
 
 @ISA = qw(FS::part_export);
 
+$DEBUG = 1;
+
 tie %options, 'Tie::IxHash',
-  'port'     => { label=>'Port number', default=>'106', },
-  'login'    => { label=>'The administrator account name.  The name can contain a domain part.', },
-  'password' => { label=>'The administrator account password.', },
-  'accountType' => { label=>'Type for newly-created accounts',
-                     type=>'select',
-                     options=>[qw( MultiMailbox TextMailbox MailDirMailbox )],
-                     default=>'MultiMailbox',
-                   },
-  'externalFlag' => { label=> 'Create accounts with an external (visible for legacy mailers) INBOX.',
-                      type=>'checkbox',
-                    },
-  'AccessModes' => { label=>'Access modes',
-                     default=>'Mail POP IMAP PWD WebMail WebSite',
-                   },
+  'port'          => { label   =>'Port number', default=>'106', },
+  'login'         => { label   =>'The administrator account name.  The name can contain a domain part.', },
+  'password'      => { label   =>'The administrator account password.', },
+  'accountType'   => { label   => 'Type for newly-created accounts (default when not specified in service)',
+                       type    => 'select',
+                       options => [qw(MultiMailbox TextMailbox MailDirMailbox AGrade BGrade CGrade)],
+                       default => 'MultiMailbox',
+                     },
+  'externalFlag'  => { label   => 'Create accounts with an external (visible for legacy mailers) INBOX.',
+                       type    => 'checkbox',
+                     },
+  'AccessModes'   => { label   => 'Access modes (default when not specified in service)',
+                       default => 'Mail POP IMAP PWD WebMail WebSite',
+                     },
+  'create_domain' => { label   => 'Domain creation API call',
+                       type    => 'select',
+                       options => [qw( CreateDomain CreateSharedDomain )],
+                     }
 ;
 
 %info = (
-  'svc'     => 'svc_acct',
-  'desc'    => 'Real-time export to a CommuniGate Pro mail server',
+  'svc'     => [qw( svc_acct svc_domain svc_forward svc_mailinglist )],
+  'desc'    => 'Real-time export of accounts, domains, mail forwards and mailing lists to a CommuniGate Pro mail server',
   'options' => \%options,
   'notes'   => <<'END'
-Real time export to a
+Real time export of accounts, domains, mail forwards and mailing lists to a
 <a href="http://www.stalker.com/CommuniGatePro/">CommuniGate Pro</a>
 mail server.  The
 <a href="http://www.stalker.com/CGPerl/">CommuniGate Pro Perl Interface</a>
@@ -37,6 +45,13 @@ must be installed as CGP::CLI.
 END
 );
 
+%quotas = (
+  'quota'        => 'MaxAccountSize',
+  'file_quota'   => 'MaxWebSize',
+  'file_maxnum'  => 'MaxWebFiles',
+  'file_maxsize' => 'MaxFileSize',
+);
+
 sub rebless { shift; }
 
 sub export_username {
@@ -45,82 +60,727 @@ sub export_username {
 }
 
 sub _export_insert {
+  my( $self, $svc_x ) = (shift, shift);
+
+  my $table = $svc_x->table;
+  my $method = "_export_insert_$table";
+  $self->$method($svc_x, @_);
+}
+
+sub _export_insert_svc_acct {
   my( $self, $svc_acct ) = (shift, shift);
-  my @options = ( $svc_acct->svcnum, 'CreateAccount',
-    'accountName'    => $self->export_username($svc_acct),
-    'accountType'    => $self->option('accountType'),
-    'AccessModes'    => $self->option('AccessModes'),
+
+  my %settings = (
+    'AccessModes'    => [ split(' ', ( $svc_acct->cgp_accessmodes
+                                       || $self->option('AccessModes') )
+                               )
+                        ],
     'RealName'       => $svc_acct->finger,
     'Password'       => $svc_acct->_password,
+    map { $quotas{$_} => $svc_acct->$_() }
+        grep $svc_acct->$_(), keys %quotas
+  );
+  #phase 2: pwdallowed, passwordrecovery, allowed mail rules,
+  # RPOP modifications, accepts mail to all, add trailer to sent mail
+  #phase 3: archive messages, mailing lists
+
+  my @options = ( 'CreateAccount',
+    'accountName'    => $self->export_username($svc_acct),
+    'accountType'    => ( $svc_acct->cgp_type
+                          || $self->option('accountType') ), 
+    'settings'       => \%settings
   );
-  push @options, 'MaxAccountSize' => $svc_acct->quota if $svc_acct->quota;
+
   push @options, 'externalFlag'   => $self->option('externalFlag')
     if $self->option('externalFlag');
 
-  $self->communigate_pro_queue( @options );
+  #let's do the create realtime too, for much the same reasons, and to avoid
+  #pain of trying to queue w/dep the prefs & aliases
+  eval { $self->communigate_pro_runcommand( @options ) };
+  return $@ if $@;
+
+  #preferences
+  my %prefs = ();
+  $prefs{'DeleteMode'} = $svc_acct->cgp_deletemode if $svc_acct->cgp_deletemode;
+  $prefs{'EmptyTrash'} = $svc_acct->cgp_emptytrash if $svc_acct->cgp_emptytrash;
+  #phase 2: language, time zone, layout, pronto style, send read receipts
+  if ( keys %prefs ) {
+    my $pref_err = $self->communigate_pro_queue( $svc_acct->svcnum,
+      'UpdateAccountPrefs',
+      $self->export_username($svc_acct),
+      %prefs,
+    );
+   warn "WARNING: error queueing UpdateAccountPrefs job: $pref_err"
+    if $pref_err;
+  }
+
+  #aliases
+  if ( $svc_acct->cgp_aliases ) {
+    my $alias_err = $self->communigate_pro_queue( $svc_acct->svcnum,
+      'SetAccountAliases',
+      $self->export_username($svc_acct),
+      [ split(/\s*[,\s]\s*/, $svc_acct->cgp_aliases) ],
+    );
+    warn "WARNING: error queueing SetAccountAliases job: $alias_err"
+      if $alias_err;
+  }
+
+  '';
+
+}
+
+sub _export_insert_svc_domain {
+  my( $self, $svc_domain ) = (shift, shift);
+
+  my $create = $self->option('create_domain') || 'CreateDomain';
+
+  my %settings = (
+    'DomainAccessModes'    => [ split(' ', $svc_domain->cgp_accessmodes ) ],
+  );
+  $settings{'AccountsLimit'} = $svc_domain->max_accounts
+    if $svc_domain->max_accounts;
+  $settings{'AdminDomainName'} = $svc_domain->parent_svc_x->domain
+    if $svc_domain->parent_svcnum;
+
+  my @options = ( $create, $svc_domain->domain, \%settings );
+
+  eval { $self->communigate_pro_runcommand( @options ) };
+  return $@ if $@;
+
+  #aliases
+  if ( $svc_domain->cgp_aliases ) {
+    my $alias_err = $self->communigate_pro_queue( $svc_domain->svcnum,
+      'SetDomainAliases',
+      $svc_domain->domain,
+      split(/\s*[,\s]\s*/, $svc_domain->cgp_aliases),
+    );
+    warn "WARNING: error queueing SetDomainAliases job: $alias_err"
+      if $alias_err;
+  }
+
+  #account defaults
+  my $def_err = $self->communigate_pro_queue( $svc_domain->svcnum,
+    'SetAccountDefaults',
+    $svc_domain->domain,
+    'PWDAllowed'     =>($svc_domain->acct_def_password_selfchange ? 'YES':'NO'),
+    'PasswordRecovery' => ($svc_domain->acct_def_password_recover ? 'YES':'NO'),
+    'AccessModes'      => $svc_domain->acct_def_cgp_accessmodes,
+    'MaxAccountSize'   => $svc_domain->acct_def_quota,
+    'MaxWebSize'       => $svc_domain->acct_def_file_quota,
+    'MaxWebFile'       => $svc_domain->acct_def_file_maxnum,
+    'MaxFileSize'      => $svc_domain->acct_def_file_maxsize,
+  );
+  warn "WARNING: error queueing SetAccountDefaults job: $def_err"
+    if $def_err;
+
+  #account defaults prefs
+  my $pref_err = $self->communigate_pro_queue( $svc_domain->svcnum,
+    'SetAccountDefaultPrefs',
+    $svc_domain->domain,
+    'DeleteMode' => $svc_domain->acct_def_cgp_deletemode,
+    'EmptyTrash' => $svc_domain->acct_def_cgp_emptytrash,
+  );
+  warn "WARNING: error queueing SetAccountDefaultPrefs job: $pref_err"
+    if $pref_err;
+
+  '';
+
+}
+
+sub _export_insert_svc_forward {
+  my( $self, $svc_forward ) = (shift, shift);
+
+  my $src = $svc_forward->src || $svc_forward->srcsvc_acct->email;
+  my $dst = $svc_forward->dst || $svc_forward->dstsvc_acct->email;
+
+  #real-time here, presuming CGP does some dup detection?
+  eval { $self->communigate_pro_runcommand( 'CreateForwarder', $src, $dst); };
+  return $@ if $@;
+
+  '';
+}
+
+sub _export_insert_svc_mailinglist {
+  my( $self, $svc_mlist ) = (shift, shift);
+
+  my @members = map $_->email_address,
+                    $svc_mlist->mailinglist->mailinglistmember;
+
+  #real-time here, presuming CGP does some dup detection
+  eval { $self->communigate_pro_runcommand(
+           'CreateGroup',
+           $svc_mlist->username.'@'.$svc_mlist->domain,
+           { 'RealName'      => $svc_mlist->listname,
+             'SetReplyTo'    => ( $svc_mlist->reply_to         ? 'YES' : 'NO' ),
+             'RemoveAuthor'  => ( $svc_mlist->remove_from      ? 'YES' : 'NO' ),
+             'RejectAuto'    => ( $svc_mlist->reject_auto      ? 'YES' : 'NO' ),
+             'RemoveToAndCc' => ( $svc_mlist->remove_to_and_cc ? 'YES' : 'NO' ),
+             'Members'       => \@members,
+           }
+         );
+       };
+  return $@ if $@;
+
+  '';
+
 }
 
 sub _export_replace {
   my( $self, $new, $old ) = (shift, shift, shift);
-  return "can't (yet) change username with CommuniGate Pro"
-    if $old->username ne $new->username;
-  return "can't (yet) change domain with CommuniGate Pro"
-    if $self->export_username($old) ne $self->export_username($new);
-  return "can't (yet) change GECOS with CommuniGate Pro"
+
+  my $table = $new->table;
+  my $method = "_export_replace_$table";
+  $self->$method($new, $old, @_);
+}
+
+sub _export_replace_svc_acct {
+  my( $self, $new, $old ) = (shift, shift, shift);
+
+  #let's just do the rename part realtime rather than trying to queue
+  #w/dependencies.  we don't want FS winding up out-of-sync with the wrong
+  #username and a queued job anyway.  right??
+  if ( $self->export_username($old) ne $self->export_username($new) ) {
+    eval { $self->communigate_pro_runcommand(
+      'RenameAccount',
+      $self->export_username($old),
+      $self->export_username($new),
+    ) };
+    return $@ if $@;
+  }
+
+  if ( $new->_password ne $old->_password
+       && '*SUSPENDED* '.$old->_password ne $new->_password
+  ) {
+    $self->communigate_pro_queue( $new->svcnum, 'SetAccountPassword',
+                                  $self->export_username($new), $new->_password
+                                );
+  }
+
+  my %settings = ();
+
+  $settings{'RealName'} = $new->finger
     if $old->finger ne $new->finger;
-  return "can't (yet) change quota with CommuniGate Pro"
-    if $old->quota ne $new->quota;
-  return '' unless $old->username ne $new->username
-                || $old->_password ne $new->_password
-                || $old->finger ne $new->finger
-                || $old->quota ne $new->quota;
+  $settings{$quotas{$_}} = $new->$_()
+    foreach grep $old->$_() ne $new->$_(), keys %quotas;
+  $settings{'accountType'} = $new->cgp_type
+    if $old->cgp_type ne $new->cgp_type;
+  $settings{'AccessModes'} = $new->cgp_accessmodes
+    if $old->cgp_accessmodes ne $new->cgp_accessmodes
+    || $old->cgp_type ne $new->cgp_type;
+
+  #phase 2: pwdallowed, passwordrecovery, allowed mail rules,
+  # RPOP modifications, accepts mail to all, add trailer to sent mail
+  #phase 3: archive messages, mailing lists
 
-  return '' if '*SUSPENDED* '. $old->_password eq $new->_password;
+  if ( keys %settings ) {
+    my $error = $self->communigate_pro_queue(
+      $new->svcnum,
+      'UpdateAccountSettings',
+      $self->export_username($new),
+      %settings,
+    );
+    return $error if $error;
+  }
 
-  #my $err_or_queue = $self->communigate_pro_queue( $new->svcnum,'RenameAccount',
-  #  $old->email, $new->email );
-  #return $err_or_queue unless ref($err_or_queue);
-  #my $jobnum = $err_or_queue->jobnum;
+  #preferences
+  my %prefs = ();
+  $prefs{'DeleteMode'} = $new->cgp_deletemode
+    if $old->cgp_deletemode ne $new->cgp_deletemode;
+  $prefs{'EmptyTrash'} = $new->cgp_emptytrash
+    if $old->cgp_emptytrash ne $new->cgp_emptytrash;
+  #phase 2: language, time zone, layout, pronto style, send read receipts
+  if ( keys %prefs ) {
+    my $pref_err = $self->communigate_pro_queue( $new->svcnum,
+      'UpdateAccountPrefs',
+      $self->export_username($new),
+      %prefs,
+    );
+   warn "WARNING: error queueing UpdateAccountPrefs job: $pref_err"
+    if $pref_err;
+  }
 
-  $self->communigate_pro_queue( $new->svcnum, 'SetAccountPassword',
-                                $self->export_username($new), $new->_password        )
-    if $new->_password ne $old->_password;
+  if ( $old->cgp_aliases ne $new->cgp_aliases ) {
+    my $error = $self->communigate_pro_queue(
+      $new->svcnum,
+      'SetAccountAliases',
+      $self->export_username($new),
+      [ split(/\s*[,\s]\s*/, $new->cgp_aliases) ],
+    );
+    return $error if $error;
+  }
+
+  '';
+
+}
+
+sub _export_replace_svc_domain {
+  my( $self, $new, $old ) = (shift, shift, shift);
+
+  if ( $old->domain ne $new->domain ) {
+    my $error = $self->communigate_pro_queue( $new->svcnum, 'RenameDomain',
+      $old->domain, $new->domain,
+    );
+    return $error if $error;
+  }
+  my %settings = ();
+  $settings{'AccountsLimit'} = $new->max_accounts
+    if $old->max_accounts ne $new->max_accounts;
+  $settings{'DomainAccessModes'} = $new->cgp_accessmodes
+    if $old->cgp_accessmodes ne $new->cgp_accessmodes;
+  $settings{'AdminDomainName'} =
+    $new->parent_svcnum ? $new->parent_svc_x->domain : ''
+      if $old->parent_svcnum != $new->parent_svcnum;
+
+  if ( keys %settings ) {
+    my $error = $self->communigate_pro_queue( $new->svcnum,
+      'UpdateDomainSettings',
+      $new->domain,
+      %settings,
+    );
+    return $error if $error;
+  }
+
+  if ( $old->cgp_aliases ne $new->cgp_aliases ) {
+    my $error = $self->communigate_pro_queue( $new->svcnum,
+      'SetDomainAliases',
+      $new->domain,
+      split(/\s*[,\s]\s*/, $new->cgp_aliases),
+    );
+    return $error if $error;
+  }
+
+  #below this identical to insert... any value to doing an Update here?
+  #not seeing any big one... i guess it would be nice to avoid the update
+  #when things haven't changed
+
+  #account defaults
+  my $def_err = $self->communigate_pro_queue( $new->svcnum,
+    'SetAccountDefaults',
+    $new->domain,
+    'PWDAllowed'       => ( $new->acct_def_password_selfchange ? 'YES' : 'NO' ),
+    'PasswordRecovery' => ( $new->acct_def_password_recover    ? 'YES' : 'NO' ),
+    'AccessModes'      => $new->acct_def_cgp_accessmodes,
+    'MaxAccountSize'   => $new->acct_def_quota,
+    'MaxWebSize'       => $new->acct_def_file_quota,
+    'MaxWebFile'       => $new->acct_def_file_maxnum,
+    'MaxFileSize'      => $new->acct_def_file_maxsize,
+  );
+  warn "WARNING: error queueing SetAccountDefaults job: $def_err"
+    if $def_err;
+
+  #account defaults prefs
+  my $pref_err = $self->communigate_pro_queue( $new->svcnum,
+    'SetAccountDefaultPrefs',
+    $new->domain,
+    'DeleteMode' => $new->acct_def_cgp_deletemode,
+    'EmptyTrash' => $new->acct_def_cgp_emptytrash,
+  );
+  warn "WARNING: error queueing SetAccountDefaultPrefs job: $pref_err"
+    if $pref_err;
+
+  '';
+}
+
+sub _export_replace_svc_forward {
+  my( $self, $new, $old ) = (shift, shift, shift);
+
+  my $osrc = $old->src || $old->srcsvc_acct->email;
+  my $nsrc = $new->src || $new->srcsvc_acct->email;
+  my $odst = $old->dst || $old->dstsvc_acct->email;
+  my $ndst = $new->dst || $new->dstsvc_acct->email;
+
+  if ( $odst ne $ndst ) {
+
+    #no change command, so delete and create (real-time)
+    eval { $self->communigate_pro_runcommand('DeleteForwarder', $osrc) };
+    return $@ if $@;
+    eval { $self->communigate_pro_runcommand('CreateForwarder', $nsrc, $ndst)};
+    return $@ if $@;
+
+  } elsif ( $osrc ne $nsrc ) {
+
+    #real-time here, presuming CGP does some dup detection?
+    eval { $self->communigate_pro_runcommand( 'RenameForwarder', $osrc, $nsrc)};
+    return $@ if $@;
+
+  } else {
+    warn "communigate replace called for svc_forward with no changes\n";#confess
+  }
+
+  '';
+}
+
+sub _export_replace_svc_mailinglist {
+  my( $self, $new, $old ) = (shift, shift, shift);
+
+  my $oldGroupName = $old->username.'@'.$old->domain;
+  my $newGroupName = $new->username.'@'.$new->domain;
+
+  if ( $oldGroupName ne $newGroupName ) {
+    eval { $self->communigate_pro_runcommand(
+             'RenameGroup', $oldGroupName, $newGroupName ); };
+    return $@ if $@;
+  }
+
+  my @members = map $_->email_address,
+                $new->mailinglist->mailinglistmember;
+
+  #real-time here, presuming CGP does some dup detection
+  eval { $self->communigate_pro_runcommand(
+           'SetGroup', $newGroupName,
+           { 'RealName'      => $new->listname,
+             'SetReplyTo'    => ( $new->reply_to         ? 'YES' : 'NO' ),
+             'RemoveAuthor'  => ( $new->remove_from      ? 'YES' : 'NO' ),
+             'RejectAuto'    => ( $new->reject_auto      ? 'YES' : 'NO' ),
+             'RemoveToAndCc' => ( $new->remove_to_and_cc ? 'YES' : 'NO' ),
+             'Members'       => \@members,
+           }
+         );
+       };
+  return $@ if $@;
+
+  '';
 
 }
 
 sub _export_delete {
+  my( $self, $svc_x ) = (shift, shift);
+
+  my $table = $svc_x->table;
+  my $method = "_export_delete_$table";
+  $self->$method($svc_x, @_);
+}
+
+sub _export_delete_svc_acct {
   my( $self, $svc_acct ) = (shift, shift);
+
   $self->communigate_pro_queue( $svc_acct->svcnum, 'DeleteAccount',
     $self->export_username($svc_acct),
   );
 }
 
+sub _export_delete_svc_domain {
+  my( $self, $svc_domain ) = (shift, shift);
+
+  $self->communigate_pro_queue( $svc_domain->svcnum, 'DeleteDomain',
+    $svc_domain->domain,
+    #XXX turn on force option for domain deletion?
+  );
+}
+
+sub _export_delete_svc_forward {
+  my( $self, $svc_forward ) = (shift, shift);
+
+  $self->communigate_pro_queue( $svc_forward->svcnum, 'DeleteForwarder',
+    ($svc_forward->src || $svc_forward->srcsvc_acct->email),
+  );
+}
+
+sub _export_delete_svc_mailinglist {
+  my( $self, $svc_mailinglist ) = (shift, shift);
+
+  #real-time here, presuming CGP does some dup detection
+  eval { $self->communigate_pro_runcommand(
+           'DeleteGroup',
+           $svc_mailinglist->username.'@'.$svc_mailinglist->domain,
+         );
+       };
+  return $@ if $@;
+
+  '';
+
+}
+
 sub _export_suspend {
+  my( $self, $svc_x ) = (shift, shift);
+
+  my $table = $svc_x->table;
+  my $method = "_export_suspend_$table";
+  $self->$method($svc_x, @_);
+
+}
+
+sub _export_suspend_svc_acct {
   my( $self, $svc_acct ) = (shift, shift);
-  $self->communigate_pro_queue( $svc_acct->svcnum, 'UpdateAccountSettings',
-    'accountName' => $self->export_username($svc_acct),
+
+  #XXX is this the desired suspnsion action?
+
+   $self->communigate_pro_queue(
+    $svc_acct->svcnum,
+    'UpdateAccountSettings',
+    $self->export_username($svc_acct),
     'AccessModes' => 'Mail',
   );
+
+}
+
+sub _export_suspend_svc_domain {
+  my( $self, $svc_domain) = (shift, shift);
+
+  #XXX domain operations
+  '';
+
 }
 
 sub _export_unsuspend {
+  my( $self, $svc_x ) = (shift, shift);
+
+  my $table = $svc_x->table;
+  my $method = "_export_unsuspend_$table";
+  $self->$method($svc_x, @_);
+
+}
+
+sub _export_unsuspend_svc_acct {
   my( $self, $svc_acct ) = (shift, shift);
-  $self->communigate_pro_queue( $svc_acct->svcnum, 'UpdateAccountSettings',
-    'accountName' => $self->export_username($svc_acct),
-    'AccessModes' => $self->option('AccessModes'),
+
+  $self->communigate_pro_queue(
+    $svc_acct->svcnum,
+    'UpdateAccountSettings',
+    $self->export_username($svc_acct),
+    'AccessModes' => ( $svc_acct->cgp_accessmodes
+                         || $self->option('AccessModes') ),
+  );
+
+}
+
+sub _export_unsuspend_svc_domain {
+  my( $self, $svc_domain) = (shift, shift);
+
+  #XXX domain operations
+  '';
+
+}
+
+sub export_mailinglistmember_insert {
+  my( $self, $svc_mailinglist, $mailinglistmember ) = (shift, shift, shift);
+  $svc_mailinglist->replace();
+}
+
+sub export_mailinglistmember_replace {
+  my( $self, $svc_mailinglist, $new, $old ) = (shift, shift, shift, shift);
+  die "no way to do this from the UI right now";
+}
+
+sub export_mailinglistmember_delete {
+  my( $self, $svc_mailinglist, $mailinglistmember ) = (shift, shift, shift);
+  $svc_mailinglist->replace();
+}
+
+sub export_getsettings {
+  my($self, $svc_x) = (shift, shift);
+
+  my $table = $svc_x->table;
+  my $method = "export_getsettings_$table";
+
+  $self->can($method) ? $self->$method($svc_x, @_) : '';
+
+}
+
+sub export_getsettings_svc_domain {
+  my($self, $svc_domain, $settingsref, $defaultref ) = @_;
+
+  my $settings = eval { $self->communigate_pro_runcommand(
+    'GetDomainSettings',
+    $svc_domain->domain
+  ) };
+  return $@ if $@;
+
+  my $effective_settings = eval { $self->communigate_pro_runcommand(
+    'GetDomainEffectiveSettings',
+    $svc_domain->domain
+  ) };
+  return $@ if $@;
+
+  my $acct_defaults = eval { $self->communigate_pro_runcommand(
+    'GetAccountDefaults',
+    $svc_domain->domain
+  ) };
+  return $@ if $@;
+
+  my $acct_defaultprefs = eval { $self->communigate_pro_runcommand(
+    'GetAccountDefaultPrefs',
+    $svc_domain->domain
+  ) };
+  return $@ if $@;
+
+  %$effective_settings = (
+    %$effective_settings,
+    ( map { ("Acct. Default $_" => $acct_defaults->{$_}); }
+          keys(%$acct_defaults)
+    ),
+    ( map { ("Acct. Default $_" => $acct_defaultprefs->{$_}); } #diff label??
+          keys(%$acct_defaultprefs)
+    ),
   );
+  %$settings = (
+    %$settings,
+    ( map { ("Acct. Default $_" => $acct_defaults->{$_}); }
+          keys(%$acct_defaults)
+    ),
+    ( map { ("Acct. Default $_" => $acct_defaultprefs->{$_}); } #diff label??
+          keys(%$acct_defaultprefs)
+    ),
+  );
+
+  #aliases too
+  my $aliases = eval { $self->communigate_pro_runcommand(
+    'GetDomainAliases',
+    $svc_domain->domain
+  ) };
+  return $@ if $@;
+
+  $effective_settings->{'Aliases'} = join(', ', @$aliases);
+  $settings->{'Aliases'}           = join(', ', @$aliases);
+
+
+  #false laziness w/below
+  
+  my %defaults = map { $_ => 1 }
+                   grep !exists(${$settings}{$_}), keys %$effective_settings;
+
+  foreach my $key ( grep ref($effective_settings->{$_}),
+                    keys %$effective_settings )
+  {
+    my $value = $effective_settings->{$key};
+    if ( ref($value) eq 'ARRAY' ) {
+      $effective_settings->{$key} = join(' ', @$value);
+    } else {
+      #XXX
+      warn "serializing ". ref($value). " for table display not yet handled";
+    }
+  }
+
+  %{$settingsref} = %$effective_settings;
+  %{$defaultref} = %defaults;
+
+  '';
+}
+
+sub export_getsettings_svc_acct {
+  my($self, $svc_acct, $settingsref, $defaultref ) = @_;
+
+  my $settings = eval { $self->communigate_pro_runcommand(
+    'GetAccountSettings',
+    $svc_acct->email
+  ) };
+  return $@ if $@;
+
+  delete($settings->{'Password'});
+
+  my $effective_settings = eval { $self->communigate_pro_runcommand(
+    'GetAccountEffectiveSettings',
+    $svc_acct->email
+  ) };
+  return $@ if $@;
+
+  delete($effective_settings->{'Password'});
+
+  #prefs/effectiveprefs too
+
+  my $prefs = eval { $self->communigate_pro_runcommand(
+    'GetAccountPrefs',
+    $svc_acct->email
+  ) };
+  return $@ if $@;
+
+  my $effective_prefs = eval { $self->communigate_pro_runcommand(
+    'GetAccountEffectivePrefs',
+    $svc_acct->email
+  ) };
+  return $@ if $@;
+
+  %$effective_settings = ( %$effective_settings,
+                           map { ("Pref $_" => $effective_prefs->{$_}); }
+                               keys(%$effective_prefs)
+                         );
+  %$settings = ( %$settings,
+                 map { ("Pref $_" => $prefs->{$_}); }
+                     keys(%$prefs)
+               );
+
+  #aliases too
+
+  my $aliases = eval { $self->communigate_pro_runcommand(
+    'GetAccountAliases',
+    $svc_acct->email
+  ) };
+  return $@ if $@;
+
+  $effective_settings->{'Aliases'} = join(', ', @$aliases);
+  $settings->{'Aliases'}           = join(', ', @$aliases);
+
+  #false laziness w/above
+
+  my %defaults = map { $_ => 1 }
+                   grep !exists(${$settings}{$_}), keys %$effective_settings;
+
+  foreach my $key ( grep ref($effective_settings->{$_}),
+                    keys %$effective_settings )
+  {
+    my $value = $effective_settings->{$key};
+    if ( ref($value) eq 'ARRAY' ) {
+      $effective_settings->{$key} = join(' ', @$value);
+    } else {
+      #XXX
+      warn "serializing ". ref($value). " for table display not yet handled";
+    }
+  }
+
+  %{$settingsref} = %$effective_settings;
+  %{$defaultref} = %defaults;
+
+  '';
+
+}
+
+sub export_getsettings_svc_mailinglist {
+  my($self, $svc_mailinglist, $settingsref, $defaultref ) = @_;
+
+  my $settings = eval { $self->communigate_pro_runcommand(
+    'GetGroup',
+    $svc_mailinglist->username.'@'.$svc_mailinglist->domain,
+  ) };
+  return $@ if $@;
+
+  $settings->{'Members'} = join(', ', @{ $settings->{'Members'} } );
+
+  %{$settingsref} = %$settings;
+
+  '';
 }
 
 sub communigate_pro_queue {
   my( $self, $svcnum, $method ) = (shift, shift, shift);
-  my @kludge_methods = qw(CreateAccount UpdateAccountSettings);
-  my $sub = 'communigate_pro_command';
-  $sub = $method if grep { $method eq $_ } @kludge_methods;
+  my $jobnum = ''; #don't actually care
+  $self->communigate_pro_queue_dep( \$jobnum, $svcnum, $method, @_);
+}
+
+sub communigate_pro_queue_dep {
+  my( $self, $jobnumref, $svcnum, $method ) = splice(@_,0,4);
+
+  my %kludge_methods = (
+    #'CreateAccount'             => 'CreateAccount',
+    'UpdateAccountSettings'     => 'UpdateAccountSettings',
+    'UpdateAccountPrefs'        => 'cp_Scalar_Hash',
+    #'CreateDomain'              => 'cp_Scalar_Hash',
+    #'CreateSharedDomain'        => 'cp_Scalar_Hash',
+    'UpdateDomainSettings'      => 'cp_Scalar_settingsHash',
+    'SetDomainAliases'          => 'cp_Scalar_Array',
+    'SetAccountDefaults'        => 'cp_Scalar_settingsHash',
+    'UpdateAccountDefaults'     => 'cp_Scalar_settingsHash',
+    'SetAccountDefaultPrefs'    => 'cp_Scalar_settingsHash',
+    'UpdateAccountDefaultPrefs' => 'cp_Scalar_settingsHash',
+  );
+  my $sub = exists($kludge_methods{$method})
+              ? $kludge_methods{$method}
+              : 'communigate_pro_command';
+
   my $queue = new FS::queue {
     'svcnum' => $svcnum,
     'job'    => "FS::part_export::communigate_pro::$sub",
   };
-  $queue->insert(
+  my $error = $queue->insert(
     $self->machine,
     $self->option('port'),
     $self->option('login'),
@@ -128,31 +788,76 @@ sub communigate_pro_queue {
     $method,
     @_,
   );
+  $$jobnumref = $queue->jobnum unless $error;
 
+  return $error;
 }
 
-sub CreateAccount {
-  my( $machine, $port, $login, $password, $method, %args ) = @_;
-  my $accountName  = delete $args{'accountName'};
-  my $accountType  = delete $args{'accountType'};
-  my $externalFlag = delete $args{'externalFlag'};
-  $args{'AccessModes'} = [ split(' ', $args{'AccessModes'}) ];
-  my @args = ( accountName => $accountName,
-               accountType  => $accountType,
-               settings     => \%args,
-             );
-               #externalFlag => $externalFlag,
-  push @args, externalFlag => $externalFlag if $externalFlag;
+sub communigate_pro_runcommand {
+  my( $self, $method ) = (shift, shift);
+
+  communigate_pro_command(
+    $self->machine,
+    $self->option('port'),
+    $self->option('login'),
+    $self->option('password'),
+    $method,
+    @_,
+  );
 
+}
+
+#XXX one sub per arg prototype is lame.  more magic?  i suppose queue needs
+# to store data strctures properly instead of just an arg list.  right.
+
+sub cp_Scalar_Hash {
+  my( $machine, $port, $login, $password, $method, $scalar, %hash ) = @_;
+  my @args = ( $scalar, \%hash );
+  communigate_pro_command( $machine, $port, $login, $password, $method, @args );
+}
+
+sub cp_Scalar_Array {
+  my( $machine, $port, $login, $password, $method, $scalar, @array ) = @_;
+  my @args = ( $scalar, \@array );
   communigate_pro_command( $machine, $port, $login, $password, $method, @args );
+}
+
+#sub cp_Hash {
+#  my( $machine, $port, $login, $password, $method, %hash ) = @_;
+#  my @args = ( \%hash );
+#  communigate_pro_command( $machine, $port, $login, $password, $method, @args );
+#}
 
+sub cp_Scalar_settingsHash {
+  my( $machine, $port, $login, $password, $method, $domain, %settings ) = @_;
+  for (qw( AccessModes DomainAccessModes )) {
+    $settings{$_} = [split(' ',$settings{$_})] if $settings{$_};
+  }
+  my @args = ( 'domain' => $domain, 'settings' => \%settings );
+  communigate_pro_command( $machine, $port, $login, $password, $method, @args );
 }
 
+#sub CreateAccount {
+#  my( $machine, $port, $login, $password, $method, %args ) = @_;
+#  my $accountName  = delete $args{'accountName'};
+#  my $accountType  = delete $args{'accountType'};
+#  my $externalFlag = delete $args{'externalFlag'};
+#  $args{'AccessModes'} = [ split(' ', $args{'AccessModes'}) ];
+#  my @args = ( accountName  => $accountName,
+#               accountType  => $accountType,
+#               settings     => \%args,
+#             );
+#               #externalFlag => $externalFlag,
+#  push @args, externalFlag => $externalFlag if $externalFlag;
+#
+#  communigate_pro_command( $machine, $port, $login, $password, $method, @args );
+#
+#}
+
 sub UpdateAccountSettings {
-  my( $machine, $port, $login, $password, $method, %args ) = @_;
-  my $accountName  = delete $args{'accountName'};
+  my( $machine, $port, $login, $password, $method, $accountName, %args ) = @_;
   $args{'AccessModes'} = [ split(' ', $args{'AccessModes'}) ];
-  @args = ( $accountName, \%args );
+  my @args = ( $accountName, \%args );
   communigate_pro_command( $machine, $port, $login, $password, $method, @args );
 }
 
@@ -168,10 +873,15 @@ sub communigate_pro_command { #subroutine, not method
     'password' => $password,
   } ) or die "Can't login to CGPro: $CGP::ERR_STRING\n";
 
-  $cli->$method(@args) or die "CGPro error: ". $cli->getErrMessage;
+  #warn "$method ". Dumper(@args) if $DEBUG;
+
+  my $return = $cli->$method(@args)
+    or die "Communigate Pro error: ". $cli->getErrMessage. "\n";
 
   $cli->Logout; # or die "Can't logout of CGPro: $CGP::ERR_STRING\n";
 
+  $return;
+
 }
 
 1;
index 994c113..582e292 100644 (file)
@@ -26,7 +26,7 @@ tie my %options, 'Tie::IxHash',
   'options' => \%options,
   'notes'   => <<'END'
 Run remote commands via SSH, for domains.  You will need to
-<a href="../docs/ssh.html">setup SSH for unattended operation</a>.
+<a href="http://www.freeside.biz/mediawiki/index.php/Freeside:1.9:Documentation:Administration:SSH_Keys">setup SSH for unattended operation</a>.
 <BR><BR>Use these buttons for some useful presets:
 <UL>
   <LI>
index cee24e4..0f79ede 100644 (file)
@@ -26,7 +26,7 @@ tie my %options, 'Tie::IxHash',
   'options' => \%options,
   'notes'   => <<'END'
 Run remote commands via SSH, for forwards.  You will need to
-<a href="../docs/ssh.html">setup SSH for unattended operation</a>.
+<a href="http://www.freeside.biz/mediawiki/index.php/Freeside:1.9:Documentation:Administration:SSH_Keys">setup SSH for unattended operation</a>.
 <BR><BR>Use these buttons for some useful presets:
 <UL>
   <LI>
diff --git a/FS/FS/part_export/grandstream.pm b/FS/FS/part_export/grandstream.pm
new file mode 100644 (file)
index 0000000..5c6f1ed
--- /dev/null
@@ -0,0 +1,257 @@
+package FS::part_export::grandstream;
+
+use base 'FS::part_export';
+use vars qw($DEBUG $me %info $GAPSLITE_HOME $JAVA_HOME);
+use URI;
+use MIME::Base64;
+use Tie::IxHash;
+use IPC::Run qw(run);
+use FS::CGI qw(rooturl);
+
+$DEBUG = 0;
+
+$me = '[' . __PACKAGE__ . ']';
+$GAPSLITE_HOME = '/usr/local/src/GS_CFG_GEN/';
+
+my @java = qw( /usr/lib/jvm/default-java/ /usr/java/default/
+               /usr/lib/jvm/java-6-sun/
+               /usr/lib/jvm/java-1.4.2-gcj-4.1-1.4.2.0/
+             ); #add more common places distros and people put their JREs
+
+$JAVA_HOME = (grep { -e $_ } @java)[0];
+
+tie my %options, 'Tie::IxHash',
+  'upload'          => { label=>'Enable upload to TFTP server via SSH',
+                         type=>'checkbox',
+                       },
+  'user'            => { label=>'User name for SSH to TFTP server' },
+  'tftproot'        => { label=>'Directory in which to upload configuration' },
+  'java_home'       => { label=>'Path to java to be used',
+                         default=>$JAVA_HOME,
+                       },
+  'gapslite_home'   => { label=>'Path to grandstream configuration tool',
+                         default=>$GAPSLITE_HOME,
+                       },
+  'template'        => { label=>'Configuration template',
+                         type=>'textarea',
+                         notes=>'Type or paste the configuration template here',
+                       },
+;
+
+%info = (
+  'svc'      => [ qw( part_device ) ], # svc_phone
+  'desc'     => 'Provision phone numbers to Grandstream Networks phones/ATAs',
+  'options'  => \%options,
+  'notes'    => 'Provision phone numbers to Grandstream Networks phones/ATAs.  Requires a Java runtime environment and the Grandstream configuration tool to be installed.',
+);
+
+sub rebless { shift; }
+
+sub gs_create_config {
+  my($self, $mac, %opt) = (@_);
+
+  eval "use Net::SCP;";
+  die $@ if $@;
+
+  warn "gs_create_config called with mac of $mac\n" if $DEBUG;
+  $mac = sprintf('%012s', lc($mac));
+  my $dir = '%%%FREESIDE_CONF%%%/cache.'. $FS::UID::datasrc;
+
+  my $fh = new File::Temp(
+    TEMPLATE => "grandstream.$mac.XXXXXXXX",
+    DIR      => $dir,
+    UNLINK   => 0,
+  );
+
+  my $filename = $fh->filename;
+
+  #my $template = new Text::Template (
+  #  TYPE       => 'ARRAY',
+  #  SOURCE     => $self->option('template'),
+  #  DELIMITERS => $delimiters,
+  #  OUTPUT     => $fh,
+  #);
+
+  #$template->compile or die "Can't compile template: $Text::Template::ERROR\n";
+
+  #my $config = $template->fill_in( HASH => { mac_addr => $mac } );
+
+  print $fh $self->option('template') or die "print failed: $!";
+  close $fh;
+
+  #system( "export GAPSLITE_HOME=$GAPSLITE_HOME; export JAVA_HOME=$JAVA_HOME; ".
+  #        "cd $dir; $GAPSLITE_HOME/bin/encode.sh $mac $filename $dir/cfg$mac"
+  #      ) == 0
+  #  or die "grandstream encode failed: $!";
+  my $out_and_err = '';
+  my @cmd = ( "$JAVA_HOME/bin/java",
+              '-classpath', "$GAPSLITE_HOME/lib/gapslite.jar:$GAPSLITE_HOME/lib/bcprov-jdk14-124.jar:$GAPSLITE_HOME/config",
+              'com.grandstream.cmd.TextEncoder',
+              $mac, $filename, "$dir/cfg$mac",
+            );
+  run \@cmd, '>&', \$out_and_err
+    or die "grandstream encode failed: $out_and_err";
+
+  unlink $filename;
+
+  open my $encoded, "$dir/cfg$mac"  or die "open cfg$mac failed: $!";
+  
+  my $content;
+
+  if ($opt{upload}) {
+    if ($self->option('upload')) {
+      my $scp = new Net::SCP ( {
+        'host' => $self->machine,
+        'user' => $self->option('user'),
+        'cwd'  => $self->option('tftproot'),
+      } );
+
+      $scp->put( "$dir/cfg$mac" ) or die "upload failed: ". $scp->errstr;
+    }
+  } else {
+    local $/;
+    $content = <$encoded>;
+  }
+
+  close $encoded;
+  unlink "$dir/cfg$mac";
+
+  $content;
+}
+
+sub gs_create {
+  my($self, $mac) = (shift, shift);
+
+  return unless $mac;  # be more alarmed?  Or check upstream?
+
+  $self->gs_create_config($mac, 'upload' => 1);
+  '';
+}
+
+sub gs_delete {
+  my($self, $mac) = (shift, shift);
+
+  $mac = sprintf('%012s', lc($mac));
+
+  ssh_cmd( user => $self->option('user'),
+           host => $self->machine,
+           command => 'rm',
+           args    => [ '-f', $self->option('tftproot'). "/cfg$mac" ],
+         );
+  '';
+
+}
+
+sub ssh_cmd { #subroutine, not method
+  use Net::SSH '0.08';
+  &Net::SSH::ssh_cmd( { @_ } );
+}
+
+sub _export_insert {
+#  my( $self, $svc_phone ) = (shift, shift);
+#  $self->gs_create($svc_phone->mac_addr);
+  '';
+}
+
+sub _export_replace {
+#  my( $self, $new_svc, $old_svc ) = (shift, shift, shift);
+#  $self->gs_delete($old_svc->mac_addr);
+#  $self->gs_create($new_svc->mac_addr);
+  '';
+}
+
+sub _export_delete {
+#  my( $self, $svc_phone ) = (shift, shift);
+#  $self->gs_delete($svc_phone->mac_addr);
+  '';
+}
+
+sub _export_suspend {
+  '';
+}
+
+sub _export_unsuspend {
+  '';
+}
+
+sub export_device_insert {
+  my( $self, $svc_phone, $phone_device ) = (shift, shift, shift);
+  $self->gs_create($phone_device->mac_addr);
+  '';
+}
+
+sub export_device_delete {
+  my( $self, $svc_phone, $phone_device ) = (shift, shift, shift);
+  $self->gs_delete($phone_device->mac_addr);
+  '';
+}
+
+sub export_device_config {
+  my( $self, $svc_phone, $phone_device ) = (shift, shift, shift);
+
+  my $mac;
+#  if ($phone_device) {
+    $mac = $phone_device->mac_addr;
+#  } else {
+#    $mac = $svc_phone->mac_addr;
+#  }
+
+  return '' unless $mac;  # be more alarmed?  Or check upstream?
+
+  $self->gs_create_config($mac);
+}
+
+
+sub export_device_replace {
+  my( $self, $svc_phone, $new_svc_or_device, $old_svc_or_device ) =
+    (shift, shift, shift, shift);
+
+  $self->gs_delete($old_svc_or_device->mac_addr);
+  $self->gs_create($new_svc_or_device->mac_addr);
+  '';
+}
+
+# bad overloading?
+sub export_links {
+  my($self, $svc_phone, $arrayref) = (shift, shift, shift);
+
+  return;  # remove if we actually support being an export for svc_phone;
+
+  my @deviceparts = map { $_->devicepart } $self->export_device;
+  my @devices = grep { my $part = $_->devicepart;
+                       scalar( grep { $_ == $part } @deviceparts );
+                     } $svc_phone->phone_device;
+
+  my $export = $self->exportnum;
+  my $fsurl = rooturl();
+  if (@devices) {
+    foreach my $device ( @devices ) {
+      next unless $device->mac_addr;
+      my $num = $device->devicenum;
+      push @$arrayref,
+        qq!<A HREF="$fsurl/misc/phone_device_config.html?exportnum=$export;devicenum=$num">!.
+        qq! Phone config </A>!;
+      }
+  } elsif ($svc_phone->mac_addr) {
+    my $num = $svc_phone->svcnum;
+    push @$arrayref,
+      qq!<A HREF="$fsurl/misc/phone_device_config.html?exportnum=$export;svcnum=$num">!.
+      qq! Phone config </A>!;
+  } #else
+  '';
+}
+
+sub export_device_links {
+  my($self, $svc_phone, $device, $arrayref) = (shift, shift, shift, shift);
+  warn "export_device_links $self $svc_phone $device $arrayref\n" if $DEBUG;
+  return unless $device && $device->mac_addr;
+  my $export = $self->exportnum;
+  my $fsurl = rooturl();
+  my $num = $device->devicenum;
+  push @$arrayref,
+    qq!<A HREF="$fsurl/misc/phone_device_config.html?exportnum=$export;devicenum=$num">!.
+    qq! Phone config </A>!;
+  '';
+}
+
+1;
diff --git a/FS/FS/part_export/indosoft.pm b/FS/FS/part_export/indosoft.pm
new file mode 100644 (file)
index 0000000..b573401
--- /dev/null
@@ -0,0 +1,219 @@
+package FS::part_export::indosoft;
+
+use vars qw(@ISA %info $insert_hack);
+use Tie::IxHash;
+use Date::Format;
+use FS::part_export;
+
+@ISA = qw(FS::part_export);
+
+tie my %options, 'Tie::IxHash',
+   'url'        => { label => 'Voicebridge API URL' },
+   'account_id' => { label => 'Voicebridge Account ID' },
+;
+
+%info = (
+  'svc'      => 'svc_phone', #svc_bridge?  svc_confbridge?
+  'desc'     =>
+    'Export conferences to the Indosoft Conference Bridge',
+  'options'  => \%options,
+  'notes'    => <<'END'
+Export conferences to the Indosoft conference bridge.
+Net::Indosoft::Voicebridge is required.
+END
+);
+
+$insert_hack = 0;
+
+sub rebless { shift; }
+
+sub _export_insert {
+  my($self, $svc_phone) = (shift, shift);
+
+  my $cust_main = $svc_phone->cust_svc->cust_pkg->cust_main;
+
+  my $address = $cust_main->address1;
+  $address .= ' '.$cust_main->address2 if $cust_main->address2;
+
+  my $phone = $cust_main->daytime || $cust_main->night;
+
+  my @email = $cust_main->invoicing_list_emailonly;
+
+  #svc_phone->location_hash stuff?  well that was for e911.. this shouldn't
+  # even be svc_phone
+
+  #add client
+  my $client_return = eval {
+    indosoft_runcommand( 'addClient',
+      'account_id' => $self->option('account_id'),
+
+      'client_contact_name'     => $cust_main->name, #or just first last?
+      'client_contact_password' => $svc_phone->sip_password, # ?
+
+      'client_contact_addr'     => $address,
+      'client_contact_city'     => $cust_main->city,
+      'client_contact_state'    => $cust_main->state,
+      'client_contact_country'  => $cust_main->country,
+      'client_contact_zip'      => $cust_main->zip,
+
+      'client_contact_phone'    => $phone,
+      'client_contact_fax'      => $cust_main->fax,
+      'client_contact_email'    => $email[0],
+    );
+  };
+  return $@ if $@;
+
+  my $client_id = $client_return->{client_id};
+
+  #add conference
+  my $conf_return = eval {
+    indosoft_runcommand( 'addConference',
+      'client_id'          => $client_id,
+      'conference_name'    => $cust_main->name,
+      'conference_desc'    => $svc_phone->svcnum. ' for '. $cust_main->name,
+      'start_time'         => time2str('%Y-%d-$m %T', time), #now, right??  '2010-20-04 16:20:00',
+      #'moderated_flag'     => 0,
+      #'entry_ann_flag'     => 0
+      #'record_flag'        => 0
+      #'moh_flag'           => 0
+      #'talk_detect_flag'   => 0
+      #'play_user_cnt_flag' => 0
+      #'wait_for_admin'     => 0
+      #'stop_on_admin_exit' => 0
+      #'second_pin'         => 0
+      #'secondary_pin'      => 0,
+      #'allow_sub-conf'     => 0,
+      #'duration'           => 0,
+      #'conference_type' => 'reservation', #'reservationless',
+    );
+  };
+  return $@ if $@;
+
+  my $conference_id = $conf_return->{conference_id};
+
+  #put conference_id in svc_phone.phonenum (and client_id in... phone_name???)
+  local($insert_hack) = 1;
+  $svc_phone->phonenum($conference_id);
+  $svc_phone->phone_name($client_id);
+  #my $error = $svc_phone->replace;
+  #return $error if $error;
+  $svc_phone->replace;
+
+}
+
+sub _export_replace {
+  my( $self, $new, $old ) = (shift, shift, shift);
+  return "can't change phone number as conference_id with indosoft"
+    if $old->phonenum ne $new->phonenum && ! $insert_hack;
+  return '';
+
+  #change anything?
+}
+
+sub _export_delete {
+  my( $self, $svc_phone ) = (shift, shift);
+
+  #delete conference
+  my $conf_return = eval {
+    indosoft_runcommand( 'deleteConference',
+      'conference_id' => $svc_phone->phonenum,
+    );
+  };
+  return $@ if $@;
+
+  #delete client
+  my $client_return = eval {
+    indosoft_runcommand( 'deleteClient',
+      'client_id' => $svc_phone->phone_name,
+    )
+  };
+  return $@ if $@;
+
+  '';
+
+}
+
+# #these three are optional
+# # fallback for svc_acct will change and restore password
+# sub _export_suspend {
+#   my( $self, $svc_phone ) = (shift, shift);
+#   $err_or_queue = $self->indosoft_queue( $svc_phone->svcnum,
+#     'suspend', $svc_phone->username );
+#   ref($err_or_queue) ? '' : $err_or_queue;
+# }
+# 
+# sub _export_unsuspend {
+#   my( $self, $svc_phone ) = (shift, shift);
+#   $err_or_queue = $self->indosoft_queue( $svc_phone->svcnum,
+#     'unsuspend', $svc_phone->username );
+#   ref($err_or_queue) ? '' : $err_or_queue;
+# }
+# 
+# sub export_links {
+#   my($self, $svc_phone, $arrayref) = (shift, shift, shift);
+#   #push @$arrayref, qq!<A HREF="http://example.com/~!. $svc_phone->username.
+#   #                 qq!">!. $svc_phone->username. qq!</A>!;
+#   '';
+# }
+
+###
+
+sub indosoft_runcommand {
+  my( $self, $method ) = (shift, shift);
+
+  indosoft_command(
+    $self->option('url'),
+    $method,
+    @_,
+  );
+
+}
+
+sub indosoft_command {
+  my( $url, $method, @args ) = @_;
+
+  eval 'use Net::Indosoft::Voicebridge;';
+  die $@ if $@;
+
+  my $vb = new Net::Indosoft::Voicebridge( 'url' => $url );
+
+  my $return = $vb->$method( @args );
+
+  die "Indosoft error: ". $return->{'error'} if $return->{'error'};
+
+  $return;
+
+}
+
+
+# #a good idea to queue anything that could fail or take any time
+# sub indosoft_queue {
+#   my( $self, $svcnum, $method ) = (shift, shift, shift);
+#   my $queue = new FS::queue {
+#     'svcnum' => $svcnum,
+#     'job'    => "FS::part_export::indosoft::indosoft_$method",
+#   };
+#   $queue->insert( @_ ) or $queue;
+# }
+# 
+# sub indosoft_insert { #subroutine, not method
+#   my( $username, $password ) = @_;
+#   #do things with $username and $password
+# }
+# 
+# sub indosoft_replace { #subroutine, not method
+# }
+# 
+# sub indosoft_delete { #subroutine, not method
+#   my( $username ) = @_;
+#   #do things with $username
+# }
+# 
+# sub indosoft_suspend { #subroutine, not method
+# }
+# 
+# sub indosoft_unsuspend { #subroutine, not method
+# }
+
+
+1;
index 332edcc..83f0f01 100644 (file)
@@ -21,7 +21,7 @@ tie my %options, 'Tie::IxHash',
 ;
 
 %info = (
-  'svc'      => 'svc_phone',
+  'svc'      => [ 'svc_phone', ], # 'part_device',
   'desc'     => 'Provision phone numbers to NetSapiens',
   'options'  => \%options,
   'notes'    => <<'END'
@@ -72,10 +72,15 @@ sub _ns_command {
   $ns;
 }
 
+sub ns_domain {
+  my($self, $svc_phone) = (shift, shift);
+  $svc_phone->domain || $self->option('domain');
+}
+
 sub ns_subscriber {
   my($self, $svc_phone) = (shift, shift);
 
-  my $domain = $self->option('domain');
+  my $domain = $self->ns_domain($svc_phone);
   my $phonenum = $svc_phone->phonenum;
 
   "/domains_config/$domain/subscriber_config/$phonenum";
@@ -91,7 +96,7 @@ sub ns_registrar {
 sub ns_devicename {
   my( $self, $svc_phone ) = (shift, shift);
 
-  my $domain = $self->option('domain');
+  my $domain = $self->ns_domain($svc_phone);
   #my $countrycode = $svc_phone->countrycode;
   my $phonenum    = $svc_phone->phonenum;
 
@@ -121,7 +126,7 @@ sub ns_device {
 sub ns_create_or_update {
   my($self, $svc_phone, $dial_policy) = (shift, shift, shift);
 
-  my $domain = $self->option('domain');
+  my $domain = $self->ns_domain($svc_phone);
   #my $countrycode = $svc_phone->countrycode;
   my $phonenum    = $svc_phone->phonenum;
 
@@ -238,7 +243,7 @@ sub _export_unsuspend {
 sub export_device_insert {
   my( $self, $svc_phone, $phone_device ) = (shift, shift, shift);
 
-  #my $domain = $self->option('domain');
+  my $domain = $self->ns_domain($svc_phone);
   my $countrycode = $svc_phone->countrycode;
   my $phonenum    = $svc_phone->phonenum;
 
@@ -256,7 +261,7 @@ sub export_device_insert {
 
       #'notes' => 
       'server'       => 'SiPbx',
-      'domain'       => $self->option('domain'),
+      'domain'       => $domain,
 
       'brand'        => $phone_device->part_device->devicename,
       
index fbb7a0b..040af27 100644 (file)
@@ -27,7 +27,7 @@ tie my %options, 'Tie::IxHash',
   'options' => \%options,
   'notes'   => <<'END'
 Run remote commands via SSH, for phone numbers.  You will need to
-<a href="../docs/ssh.html">setup SSH for unattended operation</a>.
+<a href="http://www.freeside.biz/mediawiki/index.php/Freeside:1.9:Documentation:Administration:SSH_Keys">setup SSH for unattended operation</a>.
 <BR><BR>Use these buttons for some useful presets:
 <UL>
   <LI>
index 0b9e475..ec861d3 100644 (file)
@@ -95,7 +95,7 @@ tie my %options, 'Tie::IxHash',
 Run remote commands via SSH.  Usernames are considered unique (also see
 shellcommands_withdomain).  You probably want this if the commands you are
 running will not accept a domain as a parameter.  You will need to
-<a href="../docs/ssh.html">setup SSH for unattended operation</a>.
+<a href="http://www.freeside.biz/mediawiki/index.php/Freeside:1.9:Documentation:Administration:SSH_Keys">setup SSH for unattended operation</a>.
 
 <BR><BR>Use these buttons for some useful presets:
 <UL>
index c209002..d5a6187 100644 (file)
@@ -77,7 +77,7 @@ Run remote commands via SSH.  username@domain (rather than just usernames) are
 considered unique (also see shellcommands).  You probably want this if the
 commands you are running will accept a domain as a parameter, and will allow
 the same username with different domains.  You will need to
-<a href="../docs/ssh.html">setup SSH for unattended operation</a>.
+<a href="http://www.freeside.biz/mediawiki/index.php/Freeside:1.9:Documentation:Administration:SSH_Keys">setup SSH for unattended operation</a>.
 
 <BR><BR>Use these buttons for some useful presets:
 <UL>
index 3cd7039..869c7c7 100644 (file)
@@ -25,7 +25,7 @@ Requires installation of
 from CPAN.  If using RADIUS::UserFile 1.01, make sure to apply
 <a href="http://rt.cpan.org/NoAuth/Bug.html?id=1210">this patch</a>.  Also
 make sure <a href="http://rsync.samba.org/">rsync</a> is installed on the
-remote machine, and <a href="../docs/ssh.html">SSH is setup for unattended
+remote machine, and <a href="http://www.freeside.biz/mediawiki/index.php/Freeside:1.9:Documentation:Administration:SSH_Keys">SSH is setup for unattended
 operation</a>.
 END
 );
diff --git a/FS/FS/part_export/thirdlane.pm b/FS/FS/part_export/thirdlane.pm
new file mode 100644 (file)
index 0000000..60c0997
--- /dev/null
@@ -0,0 +1,348 @@
+package FS::part_export::thirdlane;
+
+use base qw( FS::part_export );
+
+use vars qw(%info $me);
+use Tie::IxHash;
+use URI::Escape;
+use Frontier::Client;
+
+$me = '['.__PACKAGE__.']';
+
+tie my %options, 'Tie::IxHash',
+  #'server'           => { label => 'Thirdlane server name or IP address', },
+  'username'         => { label => 'Thirdlane username', },
+  'password'         => { label => 'Thirdlane password', },
+  'ssl'              => { label => 'Enable HTTPS (SSL) connection',
+                          type  => 'checkbox',
+                        },
+  'port'             => { label => 'Port number if not 80 or 443', },
+  'prototype_tenant' => { label => 'Prototype tenant name', },
+  'omit_countrycode' => { label => 'Omit country code', type => 'checkbox' },
+  'debug'            => { label => 'Checkbox label', type => 'checkbox' },
+#  'select_option'   => { label   => 'Select option description',
+#                         type    => 'select', options=>[qw(chocolate vanilla)],
+#                         default => 'vanilla',
+#                       },
+#  'textarea_option' => { label   => 'Textarea option description',
+#                         type    => 'textarea',
+#                         default => 'Default text.',
+#                      },
+;
+
+%info = (
+  'svc'      => [qw( svc_pbx svc_phone svc_acct )],
+  'desc'     =>
+    'Export tenants, DIDs and admins to Thirdlane PBX manager',
+  'options'  => \%options,
+  'notes'    => <<'END'
+Exports tenants, DIDs and admins to Thirdlane PBX manager using the XML-RPC API.
+END
+);
+
+sub rebless { shift; }
+
+sub _export_insert {
+  my($self, $svc_x) = (shift, shift);
+
+  if ( $svc_x->isa('FS::svc_pbx') ) {
+
+    return 'Name must be 19 characters or less (thirdlane restriction?)'
+      if length($svc_x->title) > 19;
+
+    return 'Name must consist of alphanumerics and spaces only (thirdlane restriction?)'
+      unless $svc_x->title =~ /^[\w\s]+$/;
+
+    my $tenant = {
+      'tenant'   => $svc_x->title,
+      'maxusers' => $svc_x->max_extensions,
+      #others?  will they not clone?
+    };
+
+    @what_to_clone = qw(routes schedules menus queues voiceprompts moh);
+
+    my $result = $self->_thirdlane_command( 'asterisk::rpc_tenant_create',
+                                            $tenant,
+                                            $self->option('prototype_tenant'),
+                                            \@what_to_clone,
+                                          );
+
+    #use Data::Dumper;
+    #warn Dumper(\$result);
+    $result eq '0' ? '' : 'Thirdlane API failure (rpc_tenant_create)';
+
+  } elsif ( $svc_x->isa('FS::svc_phone') ) {
+
+    my $result = $self->_thirdlane_command(
+      'asterisk::rpc_did_create',
+      $self->_thirdlane_did($svc_x)
+    );
+
+    #use Data::Dumper;
+    #warn Dumper(\$result);
+    $result eq '0' or return 'Thirdlane API failure (rpc_did_create)';
+
+    return '' unless $svc_x->pbxsvc;
+
+    $result = $self->_thirdlane_command(
+      'asterisk::rpc_did_assign',
+      $self->_thirdlane_did($svc_x),
+      $svc_x->pbx_title,
+    );
+
+    #use Data::Dumper;
+    #warn Dumper(\$result);
+    $result eq '0' ? '' : 'Thirdlane API failure (rpc_did_assign)';
+
+  } elsif ( $svc_x->isa('FS::svc_acct') ) {
+
+    return 'Must select a PBX' unless $svc_x->pbxsvc;
+
+    my $result = $self->_thirdlane_command(
+      'asterisk::rpc_admin_create',
+      $svc_x->username,
+      $svc_x->_password,
+      $svc_x->pbx_title,
+    );
+
+    #use Data::Dumper;
+    #warn Dumper(\$result);
+    $result eq '0' ? '' : 'Thirdlane API failure (rpc_admin_create)';
+
+  } else {
+    die "guru meditation #10: $svc_x is not FS::svc_pbx, FS::svc_phone or FS::svc_acct";
+  }
+
+}
+
+sub _export_replace {
+  my($self, $new, $old) = (shift, shift, shift);
+
+#  #return "can't change username with thirdlane"
+#  #  if $old->username ne $new->username;
+#  #return '' unless $old->_password ne $new->_password;
+#  $err_or_queue = $self->thirdlane_queue( $new->svcnum,
+#    'replace', $new->username, $new->_password );
+#  ref($err_or_queue) ? '' : $err_or_queue;
+
+  if ( $new->isa('FS::svc_pbx') ) {
+
+    #need more info on how the API works for changing names.. can it?
+    return "can't change PBX name with thirdlane (yet?)"
+      if $old->title ne $new->title;
+
+    my $tenant = {
+      'tenant'   => $old->title,
+      'maxusers' => $new->max_extensions,
+      #others?  will they not clone?
+    };
+
+    my $result = $self->_thirdlane_command( 'asterisk::rpc_tenant_update',
+                                            $tenant
+                                          );
+
+    #use Data::Dumper;
+    #warn Dumper(\$result);
+    $result eq '0' ? '' : 'Thirdlane API failure (rpc_tenant_update)';
+
+  } elsif ( $new->isa('FS::svc_phone') ) {
+
+    return "can't change DID countrycode with thirdlane"
+      if $old->countrycode ne $new->countrycode;
+    return "can't change DID number with thirdlane"
+      if $old->phonenum ne $new->phonenum;
+
+    if ( $old->pbxsvc != $new->pbxsvc ) {
+
+      if ( $old->pbxsvc ) {
+        my $result = $self->_thirdlane_command(
+          'asterisk::rpc_did_unassign',
+          $self->_thirdlane_did($old),
+        );
+        $result eq '0' or return 'Thirdlane API failure (rpc_did_unassign)';
+      }
+
+      if ( $new->pbxsvc ) {
+        my $result = $self->_thirdlane_command(
+          'asterisk::rpc_did_assign',
+          $self->_thirdlane_did($new),
+          $new->pbx_title,
+        );
+        $result eq '0' or return 'Thirdlane API failure (rpc_did_assign)';
+      }
+
+
+    }
+
+    '';
+
+  } elsif ( $new->isa('FS::svc_acct') ) {
+
+    return "can't change uesrname with thirdlane"
+      if $old->username ne $new->username;
+
+    return "can't change password with thirdlane"
+      if $old->_password ne $new->_password;
+
+    return "can't change PBX for user with thirdlane"
+      if $old->pbxsvc != $new->pbxsvc;
+
+    ''; #we don't care then
+
+  } else {
+    die "guru meditation #11: $new is not FS::svc_pbx, FS::svc_phone or FS::svc_acct";
+  }
+
+}
+
+sub _export_delete {
+  my($self, $svc_x) = (shift, shift);
+  #my( $self, $svc_something ) = (shift, shift);
+  #$err_or_queue = $self->thirdlane_queue( $svc_something->svcnum,
+  #  'delete', $svc_something->username );
+  #ref($err_or_queue) ? '' : $err_or_queue;
+
+  if ( $svc_x->isa('FS::svc_pbx') ) {
+
+    my $result = $self->_thirdlane_command( 'asterisk::rpc_tenant_delete',
+                                            $svc_x->title,
+                                          );
+
+    #use Data::Dumper;
+    #warn Dumper(\$result);
+    #$result eq '0' ? '' : 'Thirdlane API failure (rpc_tenant_delete)';
+    warn "Thirdlane API failure (rpc_tenant_delete); deleting anyway\n"
+      if $result ne '0';
+    '';
+
+  } elsif ( $svc_x->isa('FS::svc_phone') ) {
+
+    if ( $svc_x->pbxsvc ) {
+      my $result = $self->_thirdlane_command(
+        'asterisk::rpc_did_unassign',
+        $self->_thirdlane_did($svc_x),
+      );
+      $result eq '0' or return 'Thirdlane API failure (rpc_did_unassign)';
+    }
+
+    my $result = $self->_thirdlane_command(
+      'asterisk::rpc_did_delete',
+      $self->_thirdlane_did($svc_x),
+    );
+    $result eq '0' ? '' : 'Thirdlane API failure (rpc_did_delete)';
+
+  } elsif ( $svc_x->isa('FS::svc_acct') ) {
+
+    return '' unless $svc_x->pbxsvc; #error out?  nah
+
+    my $result = $self->_thirdlane_command(
+      'asterisk::rpc_admin_delete',
+      $svc_x->username,
+      $svc_x->pbx_title,
+    );
+
+    #use Data::Dumper;
+    #warn Dumper(\$result);
+    #$result eq '0' ? '' : 'Thirdlane API failure (rpc_admin_delete)';
+    warn "Thirdlane API failure (rpc_admin_delete); deleting anyway\n"
+      if $result ne '0';
+    '';
+
+  } else {
+    die "guru meditation #12: $svc_x is not FS::svc_pbx, FS::svc_phone or FS::svc_acct";
+  }
+
+}
+
+sub _thirdlane_command {
+  my($self, @param) = @_;
+
+  my $url = $self->option('ssl') ? 'https://' : 'http://';
+  $url .= uri_escape($self->option('username')). ':'.
+          uri_escape($self->option('password')). '@'.
+          $self->machine;
+  $url .= ':'. $self->option('port') if $self->option('port');
+  $url .= '/xmlrpc.cgi';
+
+  warn "$me connecting to $url\n"
+    if $self->option('debug');
+  my $conn = Frontier::Client->new( 'url'   => $url,
+                                    #no, spews output to browser
+                                    #'debug' => $self->option('debug'),
+                                  );
+
+  warn "$me sending command: ". join(' ', @param). "\n"
+    if $self->option('debug');
+  $conn->call(@param);
+  
+}
+
+sub _thirdlane_did {
+  my($self, $svc_phone) = @_;
+  if ( $self->option('omit_countrycode') ) {
+    $svc_phone->phonenum;
+  } else {
+    $svc_phone->countrycode. $svc_phone->phonenum;
+  }
+}
+
+  #my( $self, $svc_something ) = (shift, shift);
+  #$err_or_queue = $self->thirdlane_queue( $svc_something->svcnum,
+  #  'delete', $svc_something->username );
+  #ref($err_or_queue) ? '' : $err_or_queue;
+
+#these three are optional
+## fallback for svc_acct will change and restore password
+#sub _export_suspend {
+#  my( $self, $svc_something ) = (shift, shift);
+#  $err_or_queue = $self->thirdlane_queue( $svc_something->svcnum,
+#    'suspend', $svc_something->username );
+#  ref($err_or_queue) ? '' : $err_or_queue;
+#}
+#
+#sub _export_unsuspend {
+#  my( $self, $svc_something ) = (shift, shift);
+#  $err_or_queue = $self->thirdlane_queue( $svc_something->svcnum,
+#    'unsuspend', $svc_something->username );
+#  ref($err_or_queue) ? '' : $err_or_queue;
+#}
+#
+#sub export_links {
+#  my($self, $svc_something, $arrayref) = (shift, shift, shift);
+#  #push @$arrayref, qq!<A HREF="http://example.com/~!. $svc_something->username.
+#  #                 qq!">!. $svc_something->username. qq!</A>!;
+#  '';
+#}
+
+####
+#
+##a good idea to queue anything that could fail or take any time
+#sub thirdlane_queue {
+#  my( $self, $svcnum, $method ) = (shift, shift, shift);
+#  my $queue = new FS::queue {
+#    'svcnum' => $svcnum,
+#    'job'    => "FS::part_export::thirdlane::thirdlane_$method",
+#  };
+#  $queue->insert( @_ ) or $queue;
+#}
+#
+#sub thirdlane_insert { #subroutine, not method
+#  my( $username, $password ) = @_;
+#  #do things with $username and $password
+#}
+#
+#sub thirdlane_replace { #subroutine, not method
+#}
+#
+#sub thirdlane_delete { #subroutine, not method
+#  my( $username ) = @_;
+#  #do things with $username
+#}
+#
+#sub thirdlane_suspend { #subroutine, not method
+#}
+#
+#sub thirdlane_unsuspend { #subroutine, not method
+#}
+
+1;
index 4cda657..799a8e1 100644 (file)
@@ -30,7 +30,7 @@ export that uses vpopmail CLI commands instead.<BR>
 Real time export to <a href="http://inter7.com/vpopmail/">vpopmail</a> text
 files.  <a href="http://search.cpan.org/dist/File-Rsync">File::Rsync</a>
 must be installed, and you will need to
-<a href="../docs/ssh.html">setup SSH for unattended operation</a>
+<a href="http://www.freeside.biz/mediawiki/index.php/Freeside:1.9:Documentation:Administration:SSH_Keys">setup SSH for unattended operation</a>
 to <b>vpopmail</b>@<i>export.host</i>. 
 END
 );
index 7e4be9c..91b294e 100644 (file)
@@ -32,7 +32,7 @@ tie my %options, 'Tie::IxHash',
   'options' => \%options,
   'notes'   => <<'END'
 Run remote commands via SSH, for virtual web sites.  You will need to
-<a href="../docs/ssh.html">setup SSH for unattended operation</a>.
+<a href="http://www.freeside.biz/mediawiki/index.php/Freeside:1.9:Documentation:Administration:SSH_Keys">setup SSH for unattended operation</a>.
 <BR><BR>Use these buttons for some useful presets:
 <UL>
   <LI>
index 46f4e72..276889d 100644 (file)
@@ -1179,6 +1179,18 @@ sub calc_units  { 0; }
 #fallback for everything except bulk.pm
 sub hide_svc_detail { 0; }
 
+=item recur_cost_permonth CUST_PKG
+
+recur_cost divided by freq (only supported for monthly and longer frequencies)
+
+=cut
+
+sub recur_cost_permonth {
+  my($self, $cust_pkg) = @_;
+  return 0 unless $self->freq =~ /^\d+$/ && $self->freq > 0;
+  sprintf('%.2f', $self->recur_cost / $self->freq );
+}
+
 =item format OPTION DATA
 
 Returns data formatted according to the function 'format' described
index f9aaebe..be17fd8 100644 (file)
@@ -104,19 +104,30 @@ tie my %temporalities, 'Tie::IxHash',
                              'type' => 'select',
                              'select_options' => \%temporalities,
                            },
-
-    %usage_fields,
-    %usage_recharge_fields,
-
     'unused_credit' => { 'name' => 'Credit the customer for the unused portion'.
                                    ' of service at cancellation',
                          'type' => 'checkbox',
                        },
+
+    #used in cust_pkg.pm so could add to any price plan
+    'expire_months' => { 'name' => 'Auto-add an expiration date this number of months out',
+                       },
+    #used in cust_pkg.pm so could add to any price plan where it made sense
+    'start_1st'     => { 'name' => 'Auto-add a start date to the 1st, ignoring the current month.',
+                         'type' => 'checkbox',
+                       },
+
+    %usage_fields,
+    %usage_recharge_fields,
+
     'externalid' => { 'name'   => 'Optional External ID',
                       'default' => '',
                     },
   },
-  'fieldorder' => [ qw( setup_fee recur_fee recur_temporality unused_credit ),
+  'fieldorder' => [ qw( setup_fee recur_fee
+                        recur_temporality unused_credit
+                        expire_months start_1st
+                      ),
                     @usage_fieldorder, @usage_recharge_fieldorder,
                     qw( externalid ),
                   ],
index 70f9f04..effc101 100644 (file)
@@ -1,12 +1,10 @@
 package FS::part_pkg::sql_external;
 
 use strict;
-use vars qw(@ISA %info);
+use base qw( FS::part_pkg::recur_Common );
+use vars qw( %info );
 use DBI;
 #use FS::Record qw(qsearch qsearchs);
-use FS::part_pkg::flat;
-
-@ISA = qw(FS::part_pkg::flat);
 
 %info = (
   'name' => 'Base charge plus additional fees for external services from a configurable SQL query',
@@ -22,6 +20,17 @@ use FS::part_pkg::flat;
                                    ' of service at cancellation',
                          'type' => 'checkbox',
                        },
+    'cutoff_day'    => { 'name' => 'Billing Day (1 - 28) for prorating or '.
+                                   'subscription',
+                         'default' => '1',
+                       },
+
+    'recur_method'  => { 'name' => 'Recurring fee method',
+                         #'type' => 'radio',
+                         #'options' => \%recur_method,
+                         'type' => 'select',
+                         'select_options' => \%FS::part_pkg::recur_Common::recur_method,
+                       },
     'datasrc' => { 'name' => 'DBI data source',
                    'default' => '',
                  },
@@ -35,14 +44,17 @@ use FS::part_pkg::flat;
                  'default' => '',
                },
   },
-  'fieldorder' => [qw( setup_fee recur_fee unused_credit datasrc db_username db_password query )],
-  #'setup' => 'what.setup_fee.value',
-  #'recur' => q!'my $dbh = DBI->connect("' + what.datasrc.value + '", "' + what.db_username.value + '", "' + what.db_password.value + '" ) or die $DBI::errstr; my $sth = $dbh->prepare("' + what.query.value + '") or die $dbh->errstr; my $price = ' + what.recur_fee.value + '; foreach my $cust_svc ( grep { $_->part_svc->svcdb eq "svc_external" } $cust_pkg->cust_svc ){ my $id = $cust_svc->svc_x->id; $sth->execute($id) or die $sth->errstr; $price += $sth->fetchrow_arrayref->[0]; } $price;'!,
+  'fieldorder' => [qw( setup_fee recur_fee unused_credit recur_method cutoff_day
+                       datasrc db_username db_password query 
+                  )],
   'weight' => '58',
 );
 
 sub calc_recur {
-  my($self, $cust_pkg ) = @_;
+  my $self = shift;
+  my($cust_pkg) = @_; #, $sdate, $details, $param ) = @_;
+
+  my $price = $self->calc_recur_Common(@_);
 
   my $dbh = DBI->connect( map { $self->option($_) }
                               qw( datasrc db_username db_password )
@@ -52,8 +64,6 @@ sub calc_recur {
   my $sth = $dbh->prepare( $self->option('query') )
     or die $dbh->errstr;
 
-  my $price = $self->option('recur_fee');
-
   foreach my $cust_svc (
     grep { $_->part_svc->svcdb eq "svc_external" } $cust_pkg->cust_svc
   ) {
@@ -69,9 +79,4 @@ sub is_free {
   0;
 }
 
-sub base_recur {
-  my($self, $cust_pkg) = @_;
-  $self->option('recur_fee');
-}
-
 1;
index 0c87581..38e5941 100644 (file)
@@ -535,6 +535,9 @@ sub calc_usage {
                       # length($cdr->billsec) ? $cdr->billsec : $cdr->duration;
           $seconds = $use_duration ? $cdr->duration : $cdr->billsec;
 
+          $seconds -= $rate_detail->conn_sec;
+          $seconds = 0 if $seconds < 0;
+
           $seconds += $granularity - ( $seconds % $granularity )
             if $seconds      # don't granular-ize 0 billsec calls (bills them)
             && $granularity; # 0 is per call
@@ -546,12 +549,15 @@ sub calc_usage {
 
           $included_min{$regionnum} -= $minutes;
 
+          $charge = sprintf('%.2f', $rate_detail->conn_charge);
+
           if ( $included_min{$regionnum} < 0 ) {
             my $charge_min = 0 - $included_min{$regionnum}; #XXX should preserve
                                                             #(display?) this
             $included_min{$regionnum} = 0;
-            $charge = sprintf('%.2f', ( $rate_detail->min_charge * $charge_min )
-                                      + 0.00000001 ); #so 1.005 rounds to 1.01
+            $charge += sprintf('%.2f', ($rate_detail->min_charge * $charge_min)
+                                       + 0.00000001 ); #so 1.005 rounds to 1.01
+            $charge = sprintf('%.2f', $charge);
             $charges += $charge;
           }
 
index db39ea9..3ed153e 100644 (file)
@@ -724,7 +724,18 @@ sub process {
     ref($param->{'svc_acct__usergroup'})
       ? join(',', @{$param->{'svc_acct__usergroup'}} )
       : $param->{'svc_acct__usergroup'};
+
+  #unmunge cgp_accessmodes (falze laziness-ish w/edit/process/svc_acct.cgi)
+  $param->{'svc_acct__cgp_accessmodes'} ||=
+    join(' ', sort
+      grep { $_ !~ /^(flag|label)$/ }
+           map { /^svc_acct__cgp_accessmodes_([\w\/]+)$/ or die "no way"; $1; }
+               grep $param->{$_},
+                    grep /^svc_acct__cgp_accessmodes_([\w\/]+)$/,
+                         keys %$param
+        );
   
+
   my $new = new FS::part_svc ( {
     map {
       $_ => $param->{$_};
index b7b23ba..f6cdedf 100644 (file)
@@ -232,6 +232,31 @@ sub granularities {
   %granularities;
 }
 
+=item conn_secs
+
+  Returns an (ordered) hash of conn_sec => name pairs
+
+=cut
+
+tie my %conn_secs, 'Tie::IxHash',
+    '0' => 'connection',
+    '1' => 'first second',
+    '6' => 'first 6 seconds',
+   '30' => 'first 30 seconds', # '1/2 minute',
+   '60' => 'first minute',
+  '120' => 'first 2 minutes',
+  '180' => 'first 3 minutes',
+  '300' => 'first 5 minutes',
+;
+
+sub conn_secs {
+  %conn_secs;
+}
+
+=item process_edit_import
+
+=cut
+
 use Storable qw(thaw);
 use Data::Dumper;
 use MIME::Base64;
@@ -311,6 +336,10 @@ sub process_edit_import {
 
 }
 
+=item edit_import
+
+=cut
+
 #false laziness w/ #FS::Record::batch_import, grep "edit_import" for differences
 #could be turned into callbacks or something
 use Text::CSV_XS;
@@ -569,8 +598,6 @@ sub edit_import {
 
 }
 
-
-
 =back
 
 =head1 BUGS
index 5311ec5..377da49 100644 (file)
@@ -114,60 +114,6 @@ sub reasontype {
   qsearchs( 'reason_type', { 'typenum' => shift->reason_type } );
 }
 
-# _upgrade_data
-#
-# Used by FS::Upgrade to migrate to a new database.
-#
-#
-
-sub _upgrade_data {  # class method
-  my ($self, %opts) = @_;
-  my $dbh = dbh;
-
-  warn "$me upgrading $self\n" if $DEBUG;
-
-  my $column = dbdef->table($self->table)->column('reason');
-  unless ($column->type eq 'text') { # assume history matches main table
-
-    # ideally this would be supported in DBIx-DBSchema and friends
-    warn "$me Shifting reason column to type 'text'\n" if $DEBUG;
-    foreach my $table ( $self->table, 'h_'. $self->table ) {
-      my @sql = ();
-
-      $column = dbdef->table($self->table)->column('reason');
-      my $columndef = $column->line($dbh);
-      $columndef =~ s/varchar\(\d+\)/text/i;
-
-      if ( $dbh->{Driver}->{Name} eq 'Pg' ) {
-
-        my $notnull = $columndef =~ s/not null//i;
-        push @sql,"ALTER TABLE $table RENAME reason TO freeside_upgrade_reason";
-        push @sql,"ALTER TABLE $table ADD $columndef";
-        push @sql,"UPDATE $table SET reason = freeside_upgrade_reason";
-        push @sql,"ALTER TABLE $table ALTER reason SET NOT NULL"
-          if $notnull;
-        push @sql,"ALTER TABLE $table DROP freeside_upgrade_reason";
-
-      } elsif ( $dbh->{Driver}->{Name} =~ /^mysql/i ){
-
-        #crap, this isn't working
-        #push @sql,"ALTER TABLE $table MODIFY reason ". $column->line($dbh);
-        warn "WARNING: reason table upgrade not yet supported for mysql, sorry";
-
-      } else {
-        die "watchu talkin' 'bout, Willis? (unsupported database type)";
-      }
-
-      foreach (@sql) {
-        my $sth = $dbh->prepare($_) or die $dbh->errstr;
-        $sth->execute or die $sth->errstr;
-      }
-    }
-  }
-
- '';
-
-}
 =back
 
 =head1 BUGS
index a67504a..fd2745d 100644 (file)
@@ -401,7 +401,7 @@ sub replace {
   local $FS::UID::AutoCommit = 0;
   my $dbh = dbh;
 
-  my $error = $new->set_auto_inventory;
+  my $error = $new->set_auto_inventory($old);
   if ( $error ) {
     $dbh->rollback if $oldAutoCommit;
     return $error;
@@ -586,15 +586,115 @@ sub part_svc {
 
 }
 
+=item svc_pbx
+
+Returns the FS::svc_pbx record for this service, if any (see L<FS::svc_pbx>).
+
+Only makes sense if the service has a pbxsvc field (currently, svc_phone and
+svc_acct).
+
+=cut
+
+# XXX FS::h_svc_{acct,phone} could have a history-aware svc_pbx override
+
+sub svc_pbx {
+  my $self = shift;
+  return '' unless $self->pbxsvc;
+  qsearchs( 'svc_pbx', { 'svcnum' => $self->pbxsvc } );
+}
+
+=item pbx_title
+
+Returns the title of the FS::svc_pbx record associated with this service, if
+any.
+
+Only makes sense if the service has a pbxsvc field (currently, svc_phone and
+svc_acct).
+
+=cut
+
+sub pbx_title {
+  my $self = shift;
+  my $svc_pbx = $self->svc_pbx or return '';
+  $svc_pbx->title;
+}
+
+=item pbx_select_hash %OPTIONS
+
+Can be called as an object method or a class method.
+
+Returns a hash SVCNUM => TITLE ...  representing the PBXes this customer
+that may be associated with this service.
+
+Currently available options are: I<pkgnum> I<svcpart>
+
+Only makes sense if the service has a pbxsvc field (currently, svc_phone and
+svc_acct).
+
+=cut
+
+#false laziness w/svc_acct::domain_select_hash
+sub pbx_select_hash {
+  my ($self, %options) = @_;
+  my %pbxes = ();
+  my $part_svc;
+  my $cust_pkg;
+
+  if (ref($self)) {
+    $part_svc = $self->part_svc;
+    $cust_pkg = $self->cust_svc->cust_pkg
+      if $self->cust_svc;
+  }
+
+  $part_svc = qsearchs('part_svc', { 'svcpart' => $options{svcpart} })
+    if $options{'svcpart'};
+
+  $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $options{pkgnum} })
+    if $options{'pkgnum'};
+
+  if ($part_svc && ( $part_svc->part_svc_column('pbxsvc')->columnflag eq 'S'
+                  || $part_svc->part_svc_column('pbxsvc')->columnflag eq 'F')) {
+    %pbxes = map { $_->svcnum => $_->title }
+             map { qsearchs('svc_pbx', { 'svcnum' => $_ }) }
+             split(',', $part_svc->part_svc_column('pbxsvc')->columnvalue);
+  } elsif ($cust_pkg) { # && !$conf->exists('svc_acct-alldomains') ) {
+    %pbxes = map { $_->svcnum => $_->title }
+             map { qsearchs('svc_pbx', { 'svcnum' => $_->svcnum }) }
+             map { qsearch('cust_svc', { 'pkgnum' => $_->pkgnum } ) }
+             qsearch('cust_pkg', { 'custnum' => $cust_pkg->custnum });
+  } else {
+    #XXX agent-virt
+    %pbxes = map { $_->svcnum => $_->title } qsearch('svc_pbx', {} );
+  }
+
+  if ($part_svc && $part_svc->part_svc_column('pbxsvc')->columnflag eq 'D') {
+    my $svc_pbx = qsearchs('svc_pbx',
+      { 'svcnum' => $part_svc->part_svc_column('pbxsvc')->columnvalue } );
+    if ( $svc_pbx ) {
+      $pbxes{$svc_pbx->svcnum}  = $svc_pbx->title;
+    } else {
+      warn "unknown svc_pbx.svcnum for part_svc_column pbxsvc: ".
+           $part_svc->part_svc_column('pbxsvc')->columnvalue;
+
+    }
+  }
+
+  (%pbxes);
+
+}
+
 =item set_auto_inventory
 
-Sets any fields which auto-populate from inventory (see L<FS::part_svc>).
+Sets any fields which auto-populate from inventory (see L<FS::part_svc>), and
+also check any manually populated inventory fields.
+
 If there is an error, returns the error, otherwise returns false.
 
 =cut
 
 sub set_auto_inventory {
   my $self = shift;
+  my $old = @_ ? shift : '';
 
   my $error =
     $self->ut_numbern('svcnum')
@@ -618,39 +718,69 @@ sub set_auto_inventory {
   #set default/fixed/whatever fields from part_svc
   my $table = $self->table;
   foreach my $field ( grep { $_ ne 'svcnum' } $self->fields ) {
+
     my $part_svc_column = $part_svc->part_svc_column($field);
-    if ( $part_svc_column->columnflag eq 'A' && $self->$field() eq '' ) {
-
-      my $classnum = $part_svc_column->columnvalue;
-      my $inventory_item = qsearchs({
-        'table'     => 'inventory_item',
-        'hashref'   => { 'classnum' => $classnum, 
-                         'svcnum'   => '',
-                       },
-        'extra_sql' => 'LIMIT 1 FOR UPDATE',
-      });
+    my $columnflag = $part_svc_column->columnflag;
+    next unless $columnflag =~ /^[AM]$/;
 
-      unless ( $inventory_item ) {
-        $dbh->rollback if $oldAutoCommit;
-        my $inventory_class =
-          qsearchs('inventory_class', { 'classnum' => $classnum } );
-        return "Can't find inventory_class.classnum $classnum"
-          unless $inventory_class;
-        return "Out of ". $inventory_class->classname. "s\n"; #Lingua:: BS
-                                                              #for pluralizing
-      }
+    next if $columnflag eq 'A' && $self->$field() ne '';
 
-      $inventory_item->svcnum( $self->svcnum );
-      my $ierror = $inventory_item->replace();
-      if ( $ierror ) {
-        $dbh->rollback if $oldAutoCommit;
-        return "Error provisioning inventory: $ierror";
-        
-      }
+    my $classnum = $part_svc_column->columnvalue;
+    my %hash = ( 'classnum' => $classnum );
+
+    if ( $columnflag eq 'A' && $self->$field() eq '' ) {
+      $hash{'svcnum'} = '';
+    } elsif ( $columnflag eq 'M' ) {
+      return "Select inventory item for $field" unless $self->getfield($field);
+      $hash{'item'} = $self->getfield($field);
+    }
+
+    my $inventory_item = qsearchs({
+      'table'     => 'inventory_item',
+      'hashref'   => \%hash,
+      'extra_sql' => 'LIMIT 1 FOR UPDATE',
+    });
+
+    unless ( $inventory_item ) {
+      $dbh->rollback if $oldAutoCommit;
+      my $inventory_class =
+        qsearchs('inventory_class', { 'classnum' => $classnum } );
+      return "Can't find inventory_class.classnum $classnum"
+        unless $inventory_class;
+      return "Out of ". $inventory_class->classname. "s\n"; #Lingua:: BS
+                                                            #for pluralizing
+    }
+
+    next if $columnflag eq 'M' && $inventory_item->svcnum == $self->svcnum;
 
-      $self->setfield( $field, $inventory_item->item );
+    $self->setfield( $field, $inventory_item->item );
+      #if $columnflag eq 'A' && $self->$field() eq '';
 
+    $inventory_item->svcnum( $self->svcnum );
+    my $ierror = $inventory_item->replace();
+    if ( $ierror ) {
+      $dbh->rollback if $oldAutoCommit;
+      return "Error provisioning inventory: $ierror";
     }
+
+    if ( $old && $old->$field() && $old->$field() ne $self->$field() ) {
+      my $old_inv = qsearchs({
+        'table'   => 'inventory_item',
+        'hashref' => { 'classnum' => $classnum,
+                       'svcnum'   => $old->svcnum,
+                       'item'     => $old->$field(),
+                     },
+      });
+      if ( $old_inv ) {
+        $old_inv->svcnum('');
+        my $oerror = $old_inv->replace;
+        if ( $oerror ) {
+          $dbh->rollback if $oldAutoCommit;
+          return "Error unprovisioning inventory: $oerror";
+        }
+      }
+    }
+
   }
 
  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
@@ -757,6 +887,25 @@ sub export_links {
   $return;
 }
 
+=item export_getsettings
+
+Runs export_getsettings callbacks and returns the two hashrefs.
+
+=cut
+
+sub export_getsettings {
+  my $self = shift;
+  my %settings = ();
+  my %defaults = ();
+  my $error = $self->export('getsettings', \%settings, \%defaults);
+  if ( $error ) {
+    #XXX bubble this up better
+    warn "error running export_getsetings: $error";
+    return ( {}, {} );
+  }
+  ( \%settings, \%defaults );
+}
+
 =item export HOOK [ EXPORT_ARGS ]
 
 Runs the provided export hook (i.e. "suspend", "unsuspend") for this service.
diff --git a/FS/FS/svc_Domain_Mixin.pm b/FS/FS/svc_Domain_Mixin.pm
new file mode 100644 (file)
index 0000000..202899c
--- /dev/null
@@ -0,0 +1,134 @@
+package FS::svc_Domain_Mixin;
+
+use strict;
+use FS::Conf;
+use FS::Record qw(qsearch qsearchs);
+use FS::part_svc;
+use FS::cust_pkg;
+use FS::cust_svc;
+use FS::svc_domain;
+
+=head1 NAME
+
+FS::svc_Domain_Mixin - Mixin class for svc_classes with a domsvc field
+
+=head1 SYNOPSIS
+
+package FS::svc_table;
+use base qw( FS::svc_Domain_Mixin FS::svc_Common );
+
+=head1 DESCRIPTION
+
+This is a mixin class for svc_ classes that contain a domsvc field linking to
+a domain (see L<FS::svc_domain>).
+
+=head1 METHODS
+
+=over 4
+
+=item domain [ END_TIMESTAMP [ START_TIMESTAMP ] ]
+
+Returns the domain associated with this account.
+
+END_TIMESTAMP and START_TIMESTAMP can optionally be passed when dealing with
+history records.
+
+=cut
+
+sub domain {
+  my $self = shift;
+  #die "svc_acct.domsvc is null for svcnum ". $self->svcnum unless $self->domsvc;
+  return '' unless $self->domsvc;
+  my $svc_domain = $self->svc_domain(@_)
+    or die "no svc_domain.svcnum for domsvc ". $self->domsvc;
+  $svc_domain->domain;
+}
+
+=item svc_domain
+
+Returns the FS::svc_domain record for this account's domain (see
+L<FS::svc_domain>).
+
+=cut
+
+# FS::h_svc_acct has a history-aware svc_domain override
+
+sub svc_domain {
+  my $self = shift;
+  $self->{'_domsvc'}
+    ? $self->{'_domsvc'}
+    : qsearchs( 'svc_domain', { 'svcnum' => $self->domsvc } );
+}
+
+=item domain_select_hash %OPTIONS
+
+Object or class method.
+
+Returns a hash SVCNUM => DOMAIN ...  representing the domains this customer
+may at present purchase.
+
+Currently available options are: I<pkgnum> and I<svcpart>.
+
+=cut
+
+sub domain_select_hash {
+  my ($self, %options) = @_;
+  my %domains = ();
+
+  my $conf = new FS::Conf;
+
+  my $part_svc;
+  my $cust_pkg;
+
+  if (ref($self)) {
+    $part_svc = $self->part_svc;
+    $cust_pkg = $self->cust_svc->cust_pkg
+      if $self->cust_svc;
+  }
+
+  $part_svc = qsearchs('part_svc', { 'svcpart' => $options{svcpart} })
+    if $options{'svcpart'};
+
+  $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $options{pkgnum} })
+    if $options{'pkgnum'};
+
+  if ($part_svc && ( $part_svc->part_svc_column('domsvc')->columnflag eq 'S'
+                  || $part_svc->part_svc_column('domsvc')->columnflag eq 'F')) {
+    %domains = map { $_->svcnum => $_->domain }
+               map { qsearchs('svc_domain', { 'svcnum' => $_ }) }
+               split(',', $part_svc->part_svc_column('domsvc')->columnvalue);
+  }elsif ($cust_pkg && !$conf->exists('svc_acct-alldomains') ) {
+    %domains = map { $_->svcnum => $_->domain }
+               map { qsearchs('svc_domain', { 'svcnum' => $_->svcnum }) }
+               map { qsearch('cust_svc', { 'pkgnum' => $_->pkgnum } ) }
+               qsearch('cust_pkg', { 'custnum' => $cust_pkg->custnum });
+  }else{
+    %domains = map { $_->svcnum => $_->domain } qsearch('svc_domain', {} );
+  }
+
+  if ($part_svc && $part_svc->part_svc_column('domsvc')->columnflag eq 'D') {
+    my $svc_domain = qsearchs('svc_domain',
+      { 'svcnum' => $part_svc->part_svc_column('domsvc')->columnvalue } );
+    if ( $svc_domain ) {
+      $domains{$svc_domain->svcnum}  = $svc_domain->domain;
+    }else{
+      warn "unknown svc_domain.svcnum for part_svc_column domsvc: ".
+           $part_svc->part_svc_column('domsvc')->columnvalue;
+
+    }
+  }
+
+  (%domains);
+}
+
+=back
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+L<FS::svc_Common>, L<FS::Record>
+
+=cut
+
+1;
index 3e264e6..fbf4707 100644 (file)
@@ -1,7 +1,8 @@
 package FS::svc_acct;
 
 use strict;
-use vars qw( @ISA $DEBUG $me $conf $skip_fuzzyfiles
+use base qw( FS::svc_Domain_Mixin FS::svc_Common );
+use vars qw( $DEBUG $me $conf $skip_fuzzyfiles
              $dir_prefix @shells $usernamemin
              $usernamemax $passwordmin $passwordmax
              $username_ampersand $username_letter $username_letterfirst
@@ -32,12 +33,11 @@ use FS::Msgcat qw(gettext);
 use FS::UI::bytecount;
 use FS::UI::Web;
 use FS::part_pkg;
-use FS::svc_Common;
-use FS::cust_svc;
 use FS::part_svc;
 use FS::svc_acct_pop;
 use FS::cust_main_invoice;
 use FS::svc_domain;
+use FS::svc_pbx;
 use FS::raddb;
 use FS::queue;
 use FS::radius_usergroup;
@@ -47,8 +47,6 @@ use FS::svc_forward;
 use FS::svc_www;
 use FS::cdr;
 
-@ISA = qw( FS::svc_Common );
-
 $DEBUG = 0;
 $me = '[FS::svc_acct]';
 
@@ -161,45 +159,71 @@ FS::svc_Common.  The following fields are currently supported:
 
 =over 4
 
-=item svcnum - primary key (assigned automatcially for new accounts)
+=item svcnum
+
+Primary key (assigned automatcially for new accounts)
 
 =item username
 
-=item _password - generated if blank
+=item _password
+
+generated if blank
+
+=item _password_encoding
+
+plain, crypt, ldap (or empty for autodetection)
+
+=item sec_phrase
 
-=item _password_encoding - plain, crypt, ldap (or empty for autodetection)
+security phrase
 
-=item sec_phrase - security phrase
+=item popnum
 
-=item popnum - Point of presence (see L<FS::svc_acct_pop>)
+Point of presence (see L<FS::svc_acct_pop>)
 
 =item uid
 
 =item gid
 
-=item finger - GECOS
+=item finger
 
-=item dir - set automatically if blank (and uid is not)
+GECOS
+
+=item dir
+
+set automatically if blank (and uid is not)
 
 =item shell
 
-=item quota - (unimplementd)
+=item quota
+
+=item slipip
+
+IP address
+
+=item seconds
+
+=item upbytes
 
-=item slipip - IP address
+=item downbyte
 
-=item seconds - 
+=item totalbytes
 
-=item upbytes - 
+=item domsvc
+
+svcnum from svc_domain
+
+=item pbxsvc
 
-=item downbytes - 
+Optional svcnum from svc_pbx
 
-=item totalbytes - 
+=item radius_I<Radius_Attribute>
 
-=item domsvc - svcnum from svc_domain
+I<Radius-Attribute> (reply)
 
-=item radius_I<Radius_Attribute> - I<Radius-Attribute> (reply)
+=item rc_I<Radius_Attribute>
 
-=item rc_I<Radius_Attribute> - I<Radius-Attribute> (check)
+I<Radius-Attribute> (check)
 
 =back
 
@@ -244,8 +268,64 @@ sub table_info {
                          disable_fixed => 1,
                          disable_select => 1,
                        },
+        'cgp_type'=> { 
+                       label => 'Communigate account type',
+                       type => 'select',
+                       select_list => [qw( MultiMailbox TextMailbox MailDirMailbox AGrade BGrade CGrade )],
+                       disable_inventory => 1,
+                       disable_select    => 1,
+                     },
+        'cgp_accessmodes' => { 
+                               label => 'Communigate enabled services',
+                               type  => 'communigate_pro-accessmodes',
+                               disable_inventory => 1,
+                               disable_select    => 1,
+                             },
+        'cgp_aliases' => { 
+                           label => 'Communigate aliases',
+                           type  => 'text',
+                           disable_inventory => 1,
+                           disable_select    => 1,
+                         },
+        'password_selfchange' => { label => 'Password modification',
+                                   type  => 'checkbox',
+                                 },
+        'password_recover'    => { label => 'Password recovery',
+                                   type  => 'checkbox',
+                                 },
+        'cgp_deletemode' => { 
+                              label => 'Communigate message delete method',
+                              type  => 'select',
+                              select_list => [ 'Move To Trash', 'Immediately', 'Mark' ],
+                              disable_inventory => 1,
+                              disable_select    => 1,
+                            },
+        'cgp_emptytrash' => { 
+                              label => 'Communigate on logout remove trash',
+                              type  => 'text',
+                              disable_inventory => 1,
+                              disable_select    => 1,
+                            },
         'quota'     => { 
-                         label => 'Quota',
+                         label => 'Quota', #Mail storage limit
+                         type => 'text',
+                         disable_inventory => 1,
+                         disable_select => 1,
+                       },
+        'file_quota'=> { 
+                         label => 'File storage limit',
+                         type => 'text',
+                         disable_inventory => 1,
+                         disable_select => 1,
+                       },
+        'file_maxnum'=> { 
+                         label => 'Number of files limit',
+                         type => 'text',
+                         disable_inventory => 1,
+                         disable_select => 1,
+                       },
+        'file_maxsize'=> { 
+                         label => 'File size limit',
                          type => 'text',
                          disable_inventory => 1,
                          disable_select => 1,
@@ -273,7 +353,11 @@ sub table_info {
                          select_key   => 'svcnum',
                          select_label => 'domain',
                          disable_inventory => 1,
-
+                       },
+        'pbxsvc'    => { label => 'PBX',
+                         type  => 'select-svc_pbx.html',
+                         disable_inventory => 1,
+                         disable_select => 1, #UI wonky, pry works otherwise
                        },
         'usergroup' => {
                          label => 'RADIUS groups',
@@ -656,13 +740,16 @@ sub insert {
 }
 
 # set usage fields and thresholds if unset but set in a package def
+# AND the package already has a last bill date (otherwise they get double added)
 sub preinsert_hook_first {
   my $self = shift;
 
   return '' unless $self->pkgnum;
 
   my $cust_pkg = qsearchs( 'cust_pkg', { 'pkgnum' => $self->pkgnum } );
-  my $part_pkg = $cust_pkg->part_pkg if $cust_pkg;
+  return '' unless $cust_pkg && $cust_pkg->last_bill;
+
+  my $part_pkg = $cust_pkg->part_pkg;
   return '' unless $part_pkg && $part_pkg->can('usage_valuehash');
 
   my %values = $part_pkg->usage_valuehash;
@@ -1011,15 +1098,21 @@ sub check {
 
   my $error = $self->ut_numbern('svcnum')
               #|| $self->ut_number('domsvc')
-              || $self->ut_foreign_key('domsvc', 'svc_domain', 'svcnum' )
+              || $self->ut_foreign_key( 'domsvc', 'svc_domain', 'svcnum' )
+              || $self->ut_foreign_keyn('pbxsvc', 'svc_pbx',    'svcnum' )
               || $self->ut_textn('sec_phrase')
               || $self->ut_snumbern('seconds')
               || $self->ut_snumbern('upbytes')
               || $self->ut_snumbern('downbytes')
               || $self->ut_snumbern('totalbytes')
-              || $self->ut_enum( '_password_encoding',
-                                 [ '', qw( plain crypt ldap ) ]
-                               )
+              || $self->ut_enum('_password_encoding', ['',qw(plain crypt ldap)])
+              || $self->ut_enum('password_selfchange', [ '', 'Y' ])
+              || $self->ut_enum('password_recover',    [ '', 'Y' ])
+              || $self->ut_textn('cgp_accessmodes')
+              || $self->ut_alphan('cgp_type')
+              || $self->ut_textn('cgp_aliases' ) #well
+              || $self->ut_alphasn('cgp_deletemode')
+              || $self->ut_alphan('cgp_emptytrash')
   ;
   return $error if $error;
 
@@ -1155,8 +1248,12 @@ sub check {
       or return "Illegal finger: ". $self->getfield('finger');
   $self->setfield('finger', $1);
 
-  $recref->{quota} =~ /^(\w*)$/ or return "Illegal quota";
-  $recref->{quota} = $1;
+  for (qw( quota file_quota file_maxsize )) {
+    $recref->{$_} =~ /^(\w*)$/ or return "Illegal $_";
+    $recref->{$_} = $1;
+  }
+  $recref->{file_maxnum} =~ /^\s*(\d*)\s*$/ or return "Illegal file_maxnum";
+  $recref->{file_maxnum} = $1;
 
   unless ( $part_svc->part_svc_column('slipip')->columnflag eq 'F' ) {
     if ( $recref->{slipip} eq '' ) {
@@ -1289,80 +1386,81 @@ is >0), one will be generated randomly.
 =cut
 
 sub set_password {
-  my $self = shift;
-  my $pass = shift;
-  my ($encoding, $encryption);
+  my( $self, $pass ) = ( shift, shift );
+
+  warn "[$me] set_password (to $pass) called on $self: ". Dumper($self)
+     if $DEBUG;
+
   my $failure = gettext('illegal_password'). " $passwordmin-$passwordmax ".
                 FS::Msgcat::_gettext('illegal_password_characters').
                 ": ". $pass;
 
-  if(($passwordmin and length($pass) < $passwordmin) or 
-     ($passwordmax and length($pass) > $passwordmax)) {
-    return $failure;
-  }
+  my( $encoding, $encryption ) = ('', '');
 
-  if($self->_password_encoding) {
+  if ( $self->_password_encoding ) {
     $encoding = $self->_password_encoding;
     # identify existing encryption method, try to use it.
     $encryption = $self->_password_encryption;
-    if(!$encryption) {
+    if (!$encryption) {
       # use the system default
       undef $encoding;
     }
   }
 
-  if(!$encoding) {
+  if ( !$encoding ) {
     # set encoding to system default
-    ($encoding, $encryption) = split(/-/, lc($conf->config('default-password-encoding')));
+    ($encoding, $encryption) =
+      split(/-/, lc($conf->config('default-password-encoding')));
     $encoding ||= 'legacy';
     $self->_password_encoding($encoding);
   }
 
-  if($encoding eq 'legacy') {
+  if ( $encoding eq 'legacy' ) {
+
     # The legacy behavior from check():
     # If the password is blank, randomize it and set encoding to 'plain'.
     if(!defined($pass) or (length($pass) == 0 and $passwordmin)) {
       $pass = join('',map($pw_set[ int(rand $#pw_set) ], (0..7) ) );
       $self->_password_encoding('plain');
-    }
-    else {
+    } else {
       # Prefix + valid-length password
       if ( $pass =~ /^((\*SUSPENDED\* |!!?)?)([^\t\n]{$passwordmin,$passwordmax})$/ ) {
         $pass = $1.$3;
         $self->_password_encoding('plain');
-      }
       # Prefix + crypt string
-      elsif ( $pass =~ /^((\*SUSPENDED\* |!!?)?)([\w\.\/\$\;\+]{13,64})$/ ) {
+      elsif ( $pass =~ /^((\*SUSPENDED\* |!!?)?)([\w\.\/\$\;\+]{13,64})$/ ) {
         $pass = $1.$3;
         $self->_password_encoding('crypt');
-      }
       # Various disabled crypt passwords
-      elsif ( $pass eq '*' or
-              $pass eq '!' or
-              $pass eq '!!' ) {
+      } elsif ( $pass eq '*' || $pass eq '!' || $pass eq '!!' ) {
         $self->_password_encoding('crypt');
-      }
-      else {
+      } else {
         return $failure;
       }
-   }
+    }
+
+    $self->_password($pass);
+    return;
+
   }
-  elsif($encoding eq 'crypt') {
-    if($encryption eq 'md5') {
+
+  return $failure
+    if $passwordmin && length($pass) < $passwordmin
+    or $passwordmax && length($pass) > $passwordmax;
+
+  if ( $encoding eq 'crypt' ) {
+    if ($encryption eq 'md5') {
       $pass = unix_md5_crypt($pass);
-    }
-    elsif($encryption eq 'des') {
+    } elsif ($encryption eq 'des') {
       $pass = crypt($pass, $saltset[int(rand(64))].$saltset[int(rand(64))]);
     }
-  }
-  elsif($encoding eq 'ldap') {
-    if($encryption eq 'md5') {
+
+  } elsif ( $encoding eq 'ldap' ) {
+    if ($encryption eq 'md5') {
       $pass = md5_base64($pass);
-    }
-    elsif($encryption eq 'sha1') {
+    } elsif ($encryption eq 'sha1') {
       $pass = sha1_base64($pass);
-    }
-    elsif($encryption eq 'crypt') {
+    } elsif ($encryption eq 'crypt') {
       $pass = crypt($pass, $saltset[int(rand(64))].$saltset[int(rand(64))]);
     }
     # else $encryption eq 'plain', do nothing
@@ -1630,30 +1728,20 @@ for the password.
 sub radius_password {
   my $self = shift;
 
-  my($pw_attrib, $password);
+  my $pw_attrib;
   if ( $self->_password_encoding eq 'ldap' ) {
-
     $pw_attrib = 'Password-With-Header';
-    $password = $self->_password;
-
   } elsif ( $self->_password_encoding eq 'crypt' ) {
-
     $pw_attrib = 'Crypt-Password';
-    $password = $self->_password;
-
   } elsif ( $self->_password_encoding eq 'plain' ) {
-
-    $pw_attrib = $radius_password; #Cleartext-Password?  man rlm_pap
-    $password = $self->_password;
-
+    $pw_attrib = $radius_password;
   } else {
-
-    $pw_attrib = length($password) <= 12 ? $radius_password : 'Crypt-Password';
-    $password = $self->_password;
-
+    $pw_attrib = length($self->_password) <= 12
+                   ? $radius_password
+                   : 'Crypt-Password';
   }
 
-  ($pw_attrib, $password);
+  ($pw_attrib, $self->_password);
 
 }
 
@@ -1709,22 +1797,6 @@ sub domain {
   $svc_domain->domain;
 }
 
-=item svc_domain
-
-Returns the FS::svc_domain record for this account's domain (see
-L<FS::svc_domain>).
-
-=cut
-
-# FS::h_svc_acct has a history-aware svc_domain override
-
-sub svc_domain {
-  my $self = shift;
-  $self->{'_domsvc'}
-    ? $self->{'_domsvc'}
-    : qsearchs( 'svc_domain', { 'svcnum' => $self->domsvc } );
-}
-
 =item cust_svc
 
 Returns the FS::cust_svc record for this account (see L<FS::cust_svc>).
@@ -3046,61 +3118,4 @@ schema.html from the base documentation.
 
 =cut
 
-=item domain_select_hash %OPTIONS
-
-Returns a hash SVCNUM => DOMAIN ...  representing the domains this customer
-may at present purchase.
-
-Currently available options are: I<pkgnum> I<svcpart>
-
-=cut
-
-sub domain_select_hash {
-  my ($self, %options) = @_;
-  my %domains = ();
-  my $part_svc;
-  my $cust_pkg;
-
-  if (ref($self)) {
-    $part_svc = $self->part_svc;
-    $cust_pkg = $self->cust_svc->cust_pkg
-      if $self->cust_svc;
-  }
-
-  $part_svc = qsearchs('part_svc', { 'svcpart' => $options{svcpart} })
-    if $options{'svcpart'};
-
-  $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $options{pkgnum} })
-    if $options{'pkgnum'};
-
-  if ($part_svc && ( $part_svc->part_svc_column('domsvc')->columnflag eq 'S'
-                  || $part_svc->part_svc_column('domsvc')->columnflag eq 'F')) {
-    %domains = map { $_->svcnum => $_->domain }
-               map { qsearchs('svc_domain', { 'svcnum' => $_ }) }
-               split(',', $part_svc->part_svc_column('domsvc')->columnvalue);
-  }elsif ($cust_pkg && !$conf->exists('svc_acct-alldomains') ) {
-    %domains = map { $_->svcnum => $_->domain }
-               map { qsearchs('svc_domain', { 'svcnum' => $_->svcnum }) }
-               map { qsearch('cust_svc', { 'pkgnum' => $_->pkgnum } ) }
-               qsearch('cust_pkg', { 'custnum' => $cust_pkg->custnum });
-  }else{
-    %domains = map { $_->svcnum => $_->domain } qsearch('svc_domain', {} );
-  }
-
-  if ($part_svc && $part_svc->part_svc_column('domsvc')->columnflag eq 'D') {
-    my $svc_domain = qsearchs('svc_domain',
-      { 'svcnum' => $part_svc->part_svc_column('domsvc')->columnvalue } );
-    if ( $svc_domain ) {
-      $domains{$svc_domain->svcnum}  = $svc_domain->domain;
-    }else{
-      warn "unknown svc_domain.svcnum for part_svc_column domsvc: ".
-           $part_svc->part_svc_column('domsvc')->columnvalue;
-
-    }
-  }
-
-  (%domains);
-}
-
 1;
-
index 8ca30c2..d6eaf25 100644 (file)
@@ -89,6 +89,8 @@ FS::svc_Common.  The following fields are currently supported:
 
 =item expiration_date - UNIX timestamp
 
+=item max_accounts
+
 =back
 
 =head1 METHODS
@@ -109,6 +111,86 @@ sub table_info {
     'cancel_weight'  => 60,
     'fields' => {
       'domain' => 'Domain',
+      'parent_svcnum' => { 
+                         label => 'Parent domain / Communigate administrator domain',
+                         type  => 'select',
+                         select_table => 'svc_domain',
+                         select_key => 'svcnum',
+                         select_label => 'domain',
+                         disable_inventory => 1,
+                         disable_select    => 1,
+                       },
+      'max_accounts' => { label => 'Maximum number of accounts',
+                          'disable_inventory' => 1,
+                        },
+      'cgp_aliases' => { 
+                         label => 'Communigate aliases',
+                         type  => 'text',
+                         disable_inventory => 1,
+                         disable_select    => 1,
+                       },
+      'cgp_accessmodes' => { 
+                             label => 'Communigate enabled services',
+                             type  => 'communigate_pro-accessmodes',
+                             disable_inventory => 1,
+                             disable_select    => 1,
+                           },
+
+      'acct_def_cgp_accessmodes' => { 
+                             label => 'Acct. default Communigate enabled services',
+                             type  => 'communigate_pro-accessmodes',
+                             disable_inventory => 1,
+                             disable_select    => 1,
+                           },
+      'acct_def_password_selfchange' => { label => 'Acct. default Password modification',
+                                 type  => 'checkbox',
+                            disable_inventory => 1,
+                            disable_select    => 1,
+                               },
+      'acct_def_password_recover'    => { label => 'Acct. default Password recovery',
+                                 type  => 'checkbox',
+                            disable_inventory => 1,
+                            disable_select    => 1,
+                               },
+      'acct_def_cgp_deletemode' => { 
+                            label => 'Acct. default Communigate message delete method',
+                            type  => 'select',
+                            select_list => [ 'Move To Trash', 'Immediately', 'Mark' ],
+                            disable_inventory => 1,
+                            disable_select    => 1,
+                          },
+      'acct_def_cgp_emptytrash' => { 
+                            label => 'Acct. default Communigate on logout remove trash',
+                            type  => 'text',
+                            disable_inventory => 1,
+                            disable_select    => 1,
+                          },
+      'acct_def_quota'     => { 
+                       label => 'Acct. default Quota', #Mail storage limit
+                       type => 'text',
+                       disable_inventory => 1,
+                       disable_select => 1,
+                     },
+      'acct_def_file_quota'=> { 
+                       label => 'Acct. default File storage limit',
+                       type => 'text',
+                       disable_inventory => 1,
+                       disable_select => 1,
+                     },
+      'acct_def_file_maxnum'=> { 
+                       label => 'Acct. default Number of files limit',
+                       type => 'text',
+                       disable_inventory => 1,
+                       disable_select => 1,
+                     },
+      'acct_def_file_maxsize'=> { 
+                       label => 'Acct. default File size limit',
+                       type => 'text',
+                       disable_inventory => 1,
+                       disable_select => 1,
+                     },
+
+
     },
   };
 }
@@ -290,7 +372,8 @@ sub replace {
               : $new->replace_old;
 
   return "Can't change domain - reorder."
-    if $old->getfield('domain') ne $new->getfield('domain'); 
+    if $old->getfield('domain') ne $new->getfield('domain')
+    && ! $conf->exists('svc_domain-edit_domain'); 
 
   # Better to do it here than to force the caller to remember that svc_domain is weird.
   $new->setfield(action => 'I');
@@ -335,6 +418,17 @@ sub check {
 
   my $error = $self->ut_numbern('svcnum')
               || $self->ut_numbern('catchall')
+              || $self->ut_numbern('max_accounts')
+              || $self->ut_textn('cgp_aliases') #well
+              || $self->ut_enum('acct_def_password_selfchange', [ '', 'Y' ])
+              || $self->ut_enum('acct_def_password_recover',    [ '', 'Y' ])
+              || $self->ut_textn('acct_def_cgp_accessmodes')
+              || $self->ut_alphan('acct_def_quota')
+              || $self->ut_alphan('acct_def_file_quota')
+              || $self->ut_alphan('acct_def_maxnum')
+              || $self->ut_alphan('acct_def_maxsize')
+              || $self->ut_alphasn('acct_def_cgp_deletemode')
+              || $self->ut_alphan('acct_def_cgp_emptytrash')
   ;
   return $error if $error;
 
@@ -429,6 +523,7 @@ sub domain_record {
     'PTR'   => sub { $_[0]->reczone <=> $_[1]->reczone },
   );
 
+  map { $_ } #return $self->num_domain_record( PARAMS ) unless wantarray;
   sort {    $order{$a->rectype} <=> $order{$b->rectype}
          or &{ $sort{$a->rectype} || sub { 0; } }($a, $b)
        }
index aca7c1b..338fdbc 100644 (file)
@@ -76,7 +76,7 @@ sub table_info {
                  },
       'title' => { label => 'Printed on invoice line items',
                    type  => 'text',
-                   disable_inventory => 1,
+                   #disable_inventory => 1,
                  },
     },
   };
diff --git a/FS/FS/svc_mailinglist.pm b/FS/FS/svc_mailinglist.pm
new file mode 100644 (file)
index 0000000..ba297ee
--- /dev/null
@@ -0,0 +1,330 @@
+package FS::svc_mailinglist;
+
+use strict;
+use base qw( FS::svc_Domain_Mixin FS::svc_Common );
+use Scalar::Util qw( blessed );
+use FS::Record qw( qsearchs dbh ); # qsearch );
+use FS::svc_domain;
+use FS::mailinglist;
+
+=head1 NAME
+
+FS::svc_mailinglist - Object methods for svc_mailinglist records
+
+=head1 SYNOPSIS
+
+  use FS::svc_mailinglist;
+
+  $record = new FS::svc_mailinglist \%hash;
+  $record = new FS::svc_mailinglist { 'column' => 'value' };
+
+  $error = $record->insert;
+
+  $error = $new_record->replace($old_record);
+
+  $error = $record->delete;
+
+  $error = $record->check;
+
+=head1 DESCRIPTION
+
+An FS::svc_mailinglist object represents a mailing list customer service.
+FS::svc_mailinglist inherits from FS::Record.  The following fields are
+currently supported:
+
+=over 4
+
+=item svcnum
+
+primary key
+
+=item username
+
+username
+
+=item domsvc
+
+domsvc
+
+=item listnum
+
+listnum
+
+=item reply_to_group
+
+reply_to_group
+
+=item remove_author
+
+remove_author
+
+=item reject_auto
+
+reject_auto
+
+=item remove_to_and_cc
+
+remove_to_and_cc
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item new HASHREF
+
+Creates a new record.  To add the record to the database, see L<"insert">.
+
+Note that this stores the hash reference, not a distinct copy of the hash it
+points to.  You can ask the object for a copy with the I<hash> method.
+
+=cut
+
+# the new method can be inherited from FS::Record, if a table method is defined
+
+sub table { 'svc_mailinglist'; }
+
+sub table_info {
+  {
+    'name' => 'Mailing list',
+    'display_weight' => 80,
+    'cancel_weight'  => 55,
+    'fields' => {
+      'username' => { 'label' => 'List address',
+                      'disable_default'   => 1,
+                      'disable_fixed'     => 1,
+                      'disable_inventory' => 1,
+                    },
+      'domsvc' => { 'label' => 'List address domain',
+                    'disable_inventory' => 1,
+                    },
+      'domain' => 'List address domain',
+      'listnum' => { 'label' => 'List name',
+                     'disable_inventory' => 1,
+                   },
+      'listname' => 'List name', #actually mailinglist.listname
+      'reply_to' => { 'label' => 'Reply-To list',
+                      'type'  => 'checkbox',
+                      'disable_inventory' => 1,
+                      'disable_select'    => 1,
+                    },
+      'remove_from' => { 'label' => 'Remove From: from messages',
+                          'type'  => 'checkbox',
+                          'disable_inventory' => 1,
+                          'disable_select'    => 1,
+                        },
+      'reject_auto' => { 'label' => 'Reject automatic messages',
+                         'type'  => 'checkbox',
+                         'disable_inventory' => 1,
+                         'disable_select'    => 1,
+                       },
+      'remove_to_and_cc' => { 'label' => 'Remove To: and Cc: from messages',
+                              'type'  => 'checkbox',
+                              'disable_inventory' => 1,
+                              'disable_select'    => 1,
+                            },
+    },
+  };
+}
+
+=item insert
+
+Adds this record to the database.  If there is an error, returns the error,
+otherwise returns false.
+
+=cut
+
+sub insert {
+  my $self = shift;
+
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  my $error;
+
+  #attach to existing lists?  sound scary 
+  #unless ( $self->listnum ) {
+    my $mailinglist = new FS::mailinglist {
+      'listname' => $self->get('listname'),
+    };
+    $error = $mailinglist->insert;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error;
+    }
+    $self->listnum($mailinglist->listnum);
+  #}
+
+  $error = $self->SUPER::insert(@_);
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+  '';
+}
+
+=item delete
+
+Delete this record from the database.
+
+=cut
+
+sub delete {
+  my $self = shift;
+
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  my $error = $self->mailinglist->delete || $self->SUPER::delete;
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+  '';
+
+}
+
+=item replace OLD_RECORD
+
+Replaces the OLD_RECORD with this one in the database.  If there is an error,
+returns the error, otherwise returns false.
+
+=cut
+
+sub replace {
+  my $new = shift;
+
+  my $old = ( blessed($_[0]) && $_[0]->isa('FS::Record') )
+              ? shift
+              : $new->replace_old;
+
+  return "can't change listnum" if $old->listnum != $new->listnum; #?
+
+  my %options = @_;
+
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  if ( $new->get('listname') && $new->get('listname') ne $old->listname ) {
+    my $mailinglist = $old->mailinglist;
+    $mailinglist->listname($new->get('listname'));
+    my $error = $mailinglist->replace;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error if $error;
+    }
+  }
+
+  my $error = $new->SUPER::replace($old, %options);
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error if $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+  ''; #no error
+  
+
+}
+
+=item check
+
+Checks all fields to make sure this is a valid record.  If there is
+an error, returns the error, otherwise returns false.  Called by the insert
+and replace methods.
+
+=cut
+
+# the check method should currently be supplied - FS::Record contains some
+# data checking routines
+
+sub check {
+  my $self = shift;
+
+  my $error = 
+    $self->ut_numbern('svcnum')
+    || $self->ut_text('username')
+    || $self->ut_foreign_key('domsvc', 'svc_domain', 'svcnum')
+    #|| $self->ut_foreign_key('listnum', 'mailinglist', 'listnum')
+    || $self->ut_foreign_keyn('listnum', 'mailinglist', 'listnum')
+    || $self->ut_enum('reply_to_group', [ '', 'Y' ] )
+    || $self->ut_enum('remove_author', [ '', 'Y' ] )
+    || $self->ut_enum('reject_auto', [ '', 'Y' ] )
+    || $self->ut_enum('remove_to_and_cc', [ '', 'Y' ] )
+  ;
+  return $error if $error;
+
+  return "Can't remove listnum" if $self->svcnum && ! $self->listnum;
+
+  $self->SUPER::check;
+}
+
+=item mailinglist
+
+=cut
+
+sub mailinglist {
+  my $self = shift;
+  qsearchs('mailinglist', { 'listnum' => $self->listnum } );
+}
+
+=item listname
+
+=cut
+
+sub listname {
+  my $self = shift;
+  my $mailinglist = $self->mailinglist;
+  $mailinglist ? $mailinglist->listname : '';
+}
+
+=item label
+
+=cut
+
+sub label {
+  my $self = shift;
+  $self->listname. ' <'. $self->username. '@'. $self->domain. '>';
+}
+
+=back
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+L<FS::Record>, schema.html from the base documentation.
+
+=cut
+
+1;
+
diff --git a/FS/FS/svc_pbx.pm b/FS/FS/svc_pbx.pm
new file mode 100644 (file)
index 0000000..6ae0418
--- /dev/null
@@ -0,0 +1,277 @@
+package FS::svc_pbx;
+
+use strict;
+use base qw( FS::svc_External_Common );
+use FS::Record qw( qsearch qsearchs dbh );
+use FS::cust_svc;
+use FS::svc_phone;
+use FS::svc_acct;
+
+=head1 NAME
+
+FS::svc_pbx - Object methods for svc_pbx records
+
+=head1 SYNOPSIS
+
+  use FS::svc_pbx;
+
+  $record = new FS::svc_pbx \%hash;
+  $record = new FS::svc_pbx { 'column' => 'value' };
+
+  $error = $record->insert;
+
+  $error = $new_record->replace($old_record);
+
+  $error = $record->delete;
+
+  $error = $record->check;
+
+  $error = $record->suspend;
+
+  $error = $record->unsuspend;
+
+  $error = $record->cancel;
+
+=head1 DESCRIPTION
+
+An FS::svc_pbx object represents a PBX tenant.  FS::svc_pbx inherits from
+FS::svc_Common.  The following fields are currently supported:
+
+=over 4
+
+=item svcnum
+
+Primary key (assigned automatcially for new accounts)
+
+=item id
+
+(Unique?) number of external record
+
+=item title
+
+PBX name
+
+=item max_extensions
+
+Maximum number of extensions
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item new HASHREF
+
+Creates a new PBX tenant.  To add the PBX tenant to the database, see
+L<"insert">.
+
+Note that this stores the hash reference, not a distinct copy of the hash it
+points to.  You can ask the object for a copy with the I<hash> method.
+
+=cut
+
+sub table { 'svc_pbx'; }
+
+sub table_info {
+  {
+    'name' => 'PBX',
+    'name_plural' => 'PBXs', #optional,
+    'longname_plural' => 'PBXs', #optional
+    'sorts' => 'svcnum', # optional sort field (or arrayref of sort fields, main first)
+    'display_weight' => 70,
+    'cancel_weight'  => 90,
+    'fields' => {
+      'id'    => 'ID',
+      'title' => 'Name',
+      'max_extensions' => 'Maximum number of User Extensions',
+#      'field'         => 'Description',
+#      'another_field' => { 
+#                           'label'     => 'Description',
+#                         'def_label' => 'Description for service definitions',
+#                         'type'      => 'text',
+#                         'disable_default'   => 1, #disable switches
+#                         'disable_fixed'     => 1, #
+#                         'disable_inventory' => 1, #
+#                       },
+#      'foreign_key'   => { 
+#                           'label'        => 'Description',
+#                         'def_label'    => 'Description for service defs',
+#                         'type'         => 'select',
+#                         'select_table' => 'foreign_table',
+#                         'select_key'   => 'key_field_in_table',
+#                         'select_label' => 'label_field_in_table',
+#                       },
+
+    },
+  };
+}
+
+=item search_sql STRING
+
+Class method which returns an SQL fragment to search for the given string.
+
+=cut
+
+#XXX
+#or something more complicated if necessary
+#sub search_sql {
+#  my($class, $string) = @_;
+#  $class->search_sql_field('title', $string);
+#}
+
+=item label
+
+Returns the title field for this PBX tenant.
+
+=cut
+
+sub label {
+  my $self = shift;
+  $self->title;
+}
+
+=item insert
+
+Adds this record to the database.  If there is an error, returns the error,
+otherwise returns false.
+
+The additional fields pkgnum and svcpart (see L<FS::cust_svc>) should be 
+defined.  An FS::cust_svc record will be created and inserted.
+
+=cut
+
+sub insert {
+  my $self = shift;
+  my $error;
+
+  $error = $self->SUPER::insert;
+  return $error if $error;
+
+  '';
+}
+
+=item delete
+
+Delete this record from the database.
+
+=cut
+
+sub delete {
+  my $self = shift;
+
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  foreach my $svc_phone (qsearch('svc_phone', { 'pbxsvc' => $self->svcnum } )) {
+    $svc_phone->pbxsvc('');
+    my $error = $svc_phone->replace;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error;
+    }
+  }
+
+  foreach my $svc_acct  (qsearch('svc_acct',  { 'pbxsvc' => $self->svcnum } )) {
+    my $error = $svc_acct->delete;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error;
+    }
+  }
+
+  my $error = $self->SUPER::delete;
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+  '';
+}
+
+
+=item replace OLD_RECORD
+
+Replaces the OLD_RECORD with this one in the database.  If there is an error,
+returns the error, otherwise returns false.
+
+=cut
+
+sub replace {
+  my ( $new, $old ) = ( shift, shift );
+  my $error;
+
+  $error = $new->SUPER::replace($old);
+  return $error if $error;
+
+  '';
+}
+
+=item suspend
+
+Called by the suspend method of FS::cust_pkg (see L<FS::cust_pkg>).
+
+=item unsuspend
+
+Called by the unsuspend method of FS::cust_pkg (see L<FS::cust_pkg>).
+
+=item cancel
+
+Called by the cancel method of FS::cust_pkg (see L<FS::cust_pkg>).
+
+=item check
+
+Checks all fields to make sure this is a valid PBX tenant.  If there is
+an error, returns the error, otherwise returns false.  Called by the insert
+and repalce methods.
+
+=cut
+
+sub check {
+  my $self = shift;
+
+  my $x = $self->setfixed;
+  return $x unless ref($x);
+  my $part_svc = $x;
+
+
+  $self->SUPER::check;
+}
+
+#XXX this is a way-too simplistic implementation
+# at the very least, title should be unique across exports that need that or
+# controlled by a conf setting or something
+sub _check_duplicate {
+  my $self = shift;
+
+  $self->lock_table;
+
+  if ( qsearchs( 'svc_pbx', { 'title' => $self->title } ) ) {
+    return "Name in use";
+  } else {
+    return '';
+  }
+}
+
+=back
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+L<FS::svc_Common>, L<FS::Record>, L<FS::cust_svc>, L<FS::part_svc>,
+L<FS::cust_pkg>, schema.html from the base documentation.
+
+=cut
+
+1;
+
index 88582d3..30572ec 100644 (file)
@@ -1,15 +1,21 @@
 package FS::svc_phone;
 
 use strict;
-use vars qw( @ISA @pw_set $conf );
+use base qw( FS::svc_Domain_Mixin FS::location_Mixin FS::svc_Common );
+use vars qw( $DEBUG $me @pw_set $conf $phone_name_max );
+use Data::Dumper;
+use Scalar::Util qw( blessed );
 use FS::Conf;
 use FS::Record qw( qsearch qsearchs dbh );
 use FS::Msgcat qw(gettext);
-use FS::svc_Common;
 use FS::part_svc;
 use FS::phone_device;
+use FS::svc_pbx;
+use FS::svc_domain;
+use FS::cust_location;
 
-@ISA = qw( FS::svc_Common );
+$me = '[' . __PACKAGE__ . ']';
+$DEBUG = 0;
 
 #avoid l 1 and o O 0
 @pw_set = ( 'a'..'k', 'm','n', 'p-z', 'A'..'N', 'P'..'Z' , '2'..'9' );
@@ -17,6 +23,7 @@ use FS::phone_device;
 #ask FS::UID to run this stuff for us later
 $FS::UID::callback{'FS::svc_acct'} = sub { 
   $conf = new FS::Conf;
+  $phone_name_max = $conf->config('svc_phone-phone_name-max_length');
 };
 
 =head1 NAME
@@ -67,6 +74,10 @@ Voicemail PIN
 
 =item phone_name
 
+=item pbxsvc
+
+Optional svcnum from svc_pbx
+
 =back
 
 =head1 METHODS
@@ -104,6 +115,24 @@ sub table_info {
                           },
         'sip_password' => 'SIP password',
         'phone_name'   => 'Name',
+        'pbxsvc'       => { label => 'PBX',
+                            type  => 'select-svc_pbx.html',
+                            disable_inventory => 1,
+                            disable_select => 1, #UI wonky, pry works otherwise
+                          },
+        'domsvc'    => {
+                         label     => 'Domain',
+                         type      => 'select',
+                         select_table => 'svc_domain',
+                         select_key   => 'svcnum',
+                         select_label => 'domain',
+                         disable_inventory => 1,
+                       },
+        'locationnum' => {
+                           label => 'E911 location',
+                           disable_inventory => 1,
+                           disable_select    => 1,
+                         },
     },
   };
 }
@@ -149,18 +178,61 @@ sub label {
   my $self = shift;
   my $phonenum = $self->phonenum; #XXX format it better
   my $label = $phonenum;
+  $label .= '@'.$self->domain if $self->domsvc;
   $label .= ' ('.$self->phone_name.')' if $self->phone_name;
   $label;
 }
 
 =item insert
 
-Adds this record to the database.  If there is an error, returns the error,
-otherwise returns false.
+Adds this phone number to the database.  If there is an error, returns the
+error, otherwise returns false.
 
 =cut
 
-# the insert method can be inherited from FS::Record
+sub insert {
+  my $self = shift;
+  my %options = @_;
+
+  if ( $DEBUG ) {
+    warn "[$me] insert called on $self: ". Dumper($self).
+         "\nwith options: ". Dumper(%options);
+  }
+
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  #false laziness w/cust_pkg.pm... move this to location_Mixin?  that would
+  #make it more of a base class than a mixin... :)
+  if ( $options{'cust_location'}
+         && ( ! $self->locationnum || $self->locationnum == -1 ) ) {
+    my $error = $options{'cust_location'}->insert;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return "inserting cust_location (transaction rolled back): $error";
+    }
+    $self->locationnum( $options{'cust_location'}->locationnum );
+  }
+  #what about on-the-fly edits?  if the ui supports it?
+
+  my $error = $self->SUPER::insert(%options);
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+  '';
+
+}
 
 =item delete
 
@@ -210,7 +282,53 @@ returns the error, otherwise returns false.
 
 =cut
 
-# the replace method can be inherited from FS::Record
+sub replace {
+  my $new = shift;
+
+  my $old = ( blessed($_[0]) && $_[0]->isa('FS::Record') )
+              ? shift
+              : $new->replace_old;
+
+  my %options = @_;
+
+  if ( $DEBUG ) {
+    warn "[$me] replacing $old with $new\n".
+         "\nwith options: ". Dumper(%options);
+  }
+
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  #false laziness w/cust_pkg.pm... move this to location_Mixin?  that would
+  #make it more of a base class than a mixin... :)
+  if ( $options{'cust_location'}
+         && ( ! $new->locationnum || $new->locationnum == -1 ) ) {
+    my $error = $options{'cust_location'}->insert;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return "inserting cust_location (transaction rolled back): $error";
+    }
+    $new->locationnum( $options{'cust_location'}->locationnum );
+  }
+  #what about on-the-fly edits?  if the ui supports it?
+
+  my $error = $new->SUPER::replace($old, %options);
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error if $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+  ''; #no error
+}
 
 =item suspend
 
@@ -251,6 +369,8 @@ sub check {
   }
   $self->phonenum($phonenum);
 
+  $self->locationnum('') if !$self->locationnum || $self->locationnum == -1;
+
   my $error = 
     $self->ut_numbern('svcnum')
     || $self->ut_numbern('countrycode')
@@ -258,9 +378,16 @@ sub check {
     || $self->ut_anything('sip_password')
     || $self->ut_numbern('pin')
     || $self->ut_textn('phone_name')
+    || $self->ut_foreign_keyn('pbxsvc', 'svc_pbx',    'svcnum' )
+    || $self->ut_foreign_keyn('domsvc', 'svc_domain', 'svcnum' )
+    || $self->ut_foreign_keyn('locationnum', 'cust_location', 'locationnum')
   ;
   return $error if $error;
 
+  return 'Name ('. $self->phone_name.
+         ") is longer than $phone_name_max characters"
+    if $phone_name_max && length($self->phone_name) > $phone_name_max;
+
   $self->countrycode(1) unless $self->countrycode;
 
   unless ( length($self->sip_password) ) {
@@ -387,6 +514,17 @@ sub phone_device {
   qsearch('phone_device', { 'svcnum' => $self->svcnum } );
 }
 
+#override location_Mixin version cause we want to try the cust_pkg location
+#in between us and cust_main
+# XXX what to do in the unlinked case???  return a pseudo-object that returns
+# empty fields?
+sub cust_location_or_main {
+  my $self = shift;
+  return $self->cust_location if $self->locationnum;
+  my $cust_pkg = $self->cust_svc->cust_pkg;
+  $cust_pkg ? $cust_pkg->cust_location_or_main : '';
+}
+
 =back
 
 =head1 BUGS
index 30d7f58..75e72c5 100644 (file)
@@ -3,11 +3,11 @@ package FS::tax_rate;
 use strict;
 use vars qw( @ISA $DEBUG $me
              %tax_unittypes %tax_maxtypes %tax_basetypes %tax_authorities
-             %tax_passtypes %GetInfoType );
+             %tax_passtypes %GetInfoType $keep_cch_files );
 use Date::Parse;
 use DateTime;
 use DateTime::Format::Strptime;
-use Storable qw( thaw );
+use Storable qw( thaw nfreeze );
 use IO::File;
 use File::Temp;
 use LWP::UserAgent;
@@ -31,6 +31,7 @@ use FS::Misc qw( csv_from_fixed );
 
 $DEBUG = 0;
 $me = '[FS::tax_rate]';
+$keep_cch_files = 0;
 
 =head1 NAME
 
@@ -501,7 +502,9 @@ given customer (see L<FS::cust_main>)
 
 =cut
 
+    #hot
 sub tax_on_tax {
+       #akshun
   my $self = shift;
   my $cust_main = shift;
 
@@ -575,6 +578,10 @@ sub tax_rate_location {
 
 =cut
 
+sub _progressbar_foo {
+  return (0, time, 5);
+}
+
 sub batch_import {
   my ($param, $job) = @_;
 
@@ -603,7 +610,7 @@ sub batch_import {
   }
   
   my $line;
-  my ( $count, $last, $min_sec ) = (0, time, 5); #progressbar
+  my ( $count, $last, $min_sec ) = _progressbar_foo();
   if ( $job || scalar(@column_callbacks) ) {
     my $error =
       csv_from_fixed(\$fh, \$count, \@column_lengths, \@column_callbacks);
@@ -629,6 +636,7 @@ sub batch_import {
       my $dt = $parser->parse_datetime( $hash->{'effective_date'} );
       $hash->{'effective_date'} = $dt ? $dt->epoch : '';
 
+      $hash->{$_} =~ s/\s//g foreach qw( inoutcity inoutlocal ) ; 
       $hash->{$_} = sprintf("%.2f", $hash->{$_}) foreach qw( taxbase taxmax );
 
       my $taxclassid =
@@ -874,57 +882,43 @@ Load a batch import as a queued JSRPC job
 sub process_batch_import {
   my $job = shift;
 
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
   my $param = thaw(decode_base64(shift));
-  my $format = $param->{'format'};        #well... this is all cch specific
+  my $args = '$job, encode_base64( nfreeze( $param ) )';
 
-  my $files = $param->{'uploaded_files'}
-    or die "No files provided.";
+  my $method = '_perform_batch_import';
+  if ( $param->{reload} ) {
+    $method = 'process_batch_reload';
+  }
 
-  my (%files) = map { /^(\w+):([\.\w]+)$/ ? ($1,$2):() } split /,/, $files;
+  eval "$method($args);";
+  if ($@) {
+    $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+    die $@;
+  }
 
-  if ($format eq 'cch' || $format eq 'cch-fixed') {
+  #success!
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+}
 
-    my $oldAutoCommit = $FS::UID::AutoCommit;
-    local $FS::UID::AutoCommit = 0;
-    my $dbh = dbh;
-    my $error = '';
-    my $have_location = 0;
-
-    my @list = ( 'GEOCODE',  'geofile',   \&FS::tax_rate_location::batch_import,
-                 'CODE',     'codefile',  \&FS::tax_class::batch_import,
-                 'PLUS4',    'plus4file', \&FS::cust_tax_location::batch_import,
-                 'ZIP',      'zipfile',   \&FS::cust_tax_location::batch_import,
-                 'TXMATRIX', 'txmatrix',  \&FS::part_pkg_taxrate::batch_import,
-                 'DETAIL',   'detail',    \&FS::tax_rate::batch_import,
-               );
-    while( scalar(@list) ) {
-      my ($name, $file, $import_sub) = (shift @list, shift @list, shift @list);
-      unless ($files{$file}) {
-        next if $name eq 'PLUS4';
-        $error = "No $name supplied";
-        $error = "Neither PLUS4 nor ZIP supplied"
-          if ($name eq 'ZIP' && !$have_location);
-        next;
-      }
-      $have_location = 1 if $name eq 'PLUS4';
-      my $fmt = $format. ( $name eq 'ZIP' ? '-zip' : '' );
-      my $dir = '%%%FREESIDE_CACHE%%%/cache.'. $FS::UID::datasrc;
-      my $filename = "$dir/".  $files{$file};
-      open my $fh, "< $filename" or $error ||= "Can't open $name file: $!";
+sub _perform_batch_import {
+  my $job = shift;
 
-      $error ||= &{$import_sub}({ 'filehandle' => $fh, 'format' => $fmt }, $job);
-      close $fh;
-      unlink $filename or warn "Can't delete $filename: $!";
-    }
-    
-    if ($error) {
-      $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-      die $error;
-    }else{
-      $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-    }
+  my $param = thaw(decode_base64(shift));
+  my $format = $param->{'format'};        #well... this is all cch specific
 
-  }elsif ($format eq 'cch-update' || $format eq 'cch-fixed-update') {
+  my $files = $param->{'uploaded_files'}
+    or die "No files provided.";
+
+  my (%files) = map { /^(\w+):((taxdata\/\w+\.\w+\/)?[\.\w]+)$/ ? ($1,$2):() }
+                split /,/, $files;
+
+  if ( $format eq 'cch' || $format eq 'cch-fixed'
+    || $format eq 'cch-update' || $format eq 'cch-fixed-update' )
+  {
 
     my $oldAutoCommit = $FS::UID::AutoCommit;
     local $FS::UID::AutoCommit = 0;
@@ -933,116 +927,70 @@ sub process_batch_import {
     my @insert_list = ();
     my @delete_list = ();
     my @predelete_list = ();
+    my $insertname = '';
+    my $deletename = '';
+    my $dir = '%%%FREESIDE_CACHE%%%/cache.'. $FS::UID::datasrc;
 
-    my @list = ( 'GEOCODE',  'geofile',   \&FS::tax_rate_location::batch_import,
-                 'CODE',     'codefile',  \&FS::tax_class::batch_import,
-                 'PLUS4',    'plus4file', \&FS::cust_tax_location::batch_import,
-                 'ZIP',      'zipfile',   \&FS::cust_tax_location::batch_import,
-                 'TXMATRIX', 'txmatrix',  \&FS::part_pkg_taxrate::batch_import,
+    my @list = ( 'GEOCODE',  \&FS::tax_rate_location::batch_import,
+                 'CODE',     \&FS::tax_class::batch_import,
+                 'PLUS4',    \&FS::cust_tax_location::batch_import,
+                 'ZIP',      \&FS::cust_tax_location::batch_import,
+                 'TXMATRIX', \&FS::part_pkg_taxrate::batch_import,
+                 'DETAIL',   \&FS::tax_rate::batch_import,
                );
-    my $dir = '%%%FREESIDE_CACHE%%%/cache.'. $FS::UID::datasrc;
     while( scalar(@list) ) {
-      my ($name, $file, $import_sub) = (shift @list, shift @list, shift @list);
-      unless ($files{$file}) {
-        my $vendor = $name eq 'ZIP' ? 'cch' : 'cch-zip';
-        next     # update expected only for previously installed location data
-          if (   ($name eq 'PLUS4' || $name eq 'ZIP')
-               && !scalar( qsearch( { table => 'cust_tax_location',
-                                      hashref => { data_vendor => $vendor },
-                                      select => 'DISTINCT data_vendor',
-                                  } )
-                         )
-             );
+      my ( $name, $import_sub ) = splice( @list, 0, 2 );
+      my $file = lc($name). 'file';
 
+      unless ($files{$file}) {
         $error = "No $name supplied";
         next;
       }
+      next if $name eq 'DETAIL' && $format =~ /update/;
+
       my $filename = "$dir/".  $files{$file};
-      open my $fh, "< $filename" or $error ||= "Can't open $name file $filename: $!";
-      unlink $filename or warn "Can't delete $filename: $!";
-
-      my $ifh = new File::Temp( TEMPLATE => "$name.insert.XXXXXXXX",
-                                DIR      => $dir,
-                                UNLINK   => 0,     #meh
-                              ) or die "can't open temp file: $!\n";
-
-      my $dfh = new File::Temp( TEMPLATE => "$name.delete.XXXXXXXX",
-                                DIR      => $dir,
-                                UNLINK   => 0,     #meh
-                              ) or die "can't open temp file: $!\n";
-
-      my $insert_pattern = ($format eq 'cch-update') ? qr/"I"\s*$/ : qr/I\s*$/;
-      my $delete_pattern = ($format eq 'cch-update') ? qr/"D"\s*$/ : qr/D\s*$/;
-      while(<$fh>) {
-        my $handle = '';
-        $handle = $ifh if $_ =~ /$insert_pattern/;
-        $handle = $dfh if $_ =~ /$delete_pattern/;
-        unless ($handle) {
-          $error = "bad input line: $_" unless $handle;
-          last;
+
+      if ( $format =~ /update/ ) {
+
+        ( $error, $insertname, $deletename ) =
+          _perform_cch_insert_delete_split( $name, $filename, $dir, $format )
+          unless $error;
+        last if $error;
+
+        unlink $filename or warn "Can't delete $filename: $!"
+          unless $keep_cch_files;
+        push @insert_list, $name, $insertname, $import_sub, $format;
+        if ( $name eq 'GEOCODE' ) { #handle this whole ordering issue better
+          unshift @predelete_list, $name, $deletename, $import_sub, $format;
+        } else {
+          unshift @delete_list, $name, $deletename, $import_sub, $format;
         }
-        print $handle $_;
-      }
-      close $fh;
-      close $ifh;
-      close $dfh;
 
-      push @insert_list, $name, $ifh->filename, $import_sub;
-      if ( $name eq 'GEOCODE' ) { #handle this whole ordering issue better
-        unshift @predelete_list, $name, $dfh->filename, $import_sub;
       } else {
-        unshift @delete_list, $name, $dfh->filename, $import_sub;
+
+        push @insert_list, $name, $filename, $import_sub, $format;
+
       }
 
     }
 
-    while( scalar(@predelete_list) ) {
-      my ($name, $file, $import_sub) =
-        (shift @predelete_list, shift @predelete_list, shift @predelete_list);
+    push @insert_list,
+      'DETAIL', "$dir/".$files{detail}, \&FS::tax_rate::batch_import, $format
+      if $format =~ /update/;
 
-      my $fmt = $format. ( $name eq 'ZIP' ? '-zip' : '' );
-      open my $fh, "< $file" or $error ||= "Can't open $name file $file: $!";
-      $error ||=
-        &{$import_sub}({ 'filehandle' => $fh, 'format' => $fmt }, $job);
-      close $fh;
-      unlink $file or warn "Can't delete $file: $!";
-    }
+    $error ||= _perform_cch_tax_import( $job,
+                                        [ @predelete_list ],
+                                        [ @insert_list ],
+                                        [ @delete_list ],
+    );
     
-    while( scalar(@insert_list) ) {
-      my ($name, $file, $import_sub) =
-        (shift @insert_list, shift @insert_list, shift @insert_list);
-
-      my $fmt = $format. ( $name eq 'ZIP' ? '-zip' : '' );
-      open my $fh, "< $file" or $error ||= "Can't open $name file $file: $!";
-      $error ||=
-        &{$import_sub}({ 'filehandle' => $fh, 'format' => $fmt }, $job);
-      close $fh;
-      unlink $file or warn "Can't delete $file: $!";
-    }
     
-    $error ||= "No DETAIL supplied"
-      unless ($files{detail});
-    open my $fh, "< $dir/". $files{detail}
-      or $error ||= "Can't open DETAIL file: $!";
-    $error ||=
-      &FS::tax_rate::batch_import({ 'filehandle' => $fh, 'format' => $format },
-                                  $job);
-    close $fh;
-    unlink "$dir/". $files{detail} or warn "Can't delete $files{detail}: $!"
-      if $files{detail};
-
-    while( scalar(@delete_list) ) {
-      my ($name, $file, $import_sub) =
-        (shift @delete_list, shift @delete_list, shift @delete_list);
-
-      my $fmt = $format. ( $name eq 'ZIP' ? '-zip' : '' );
-      open my $fh, "< $file" or $error ||= "Can't open $name file $file: $!";
-      $error ||=
-        &{$import_sub}({ 'filehandle' => $fh, 'format' => $fmt }, $job);
-      close $fh;
+    @list = ( @predelete_list, @insert_list, @delete_list );
+    while( !$keep_cch_files && scalar(@list) ) {
+      my ( undef, $file, undef, undef ) = splice( @list, 0, 4 );
       unlink $file or warn "Can't delete $file: $!";
     }
-    
+
     if ($error) {
       $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
       die $error;
@@ -1056,45 +1004,207 @@ sub process_batch_import {
 
 }
 
-=item process_download_and_reload
 
-Download and process a tax update as a queued JSRPC job after wiping the
-existing wipable tax data.
+sub _perform_cch_tax_import {
+  my ( $job, $predelete_list, $insert_list, $delete_list ) = @_;
 
-=cut
+  my $error = '';
+  foreach my $list ($predelete_list, $insert_list, $delete_list) {
+    while( scalar(@$list) ) {
+      my ( $name, $file, $method, $format ) = splice( @$list, 0, 4 );
+      my $fmt = "$format-update";
+      $fmt = $format. ( lc($name) eq 'zip' ? '-zip' : '' );
+      open my $fh, "< $file" or $error ||= "Can't open $name file $file: $!";
+      $error ||= &{$method}({ 'filehandle' => $fh, 'format' => $fmt }, $job);
+      close $fh;
+    }
+  }
 
-sub process_download_and_reload {
-  my $job = shift;
+  return $error;
+}
 
-  my $param = thaw(decode_base64($_[0]));
-  my $format = $param->{'format'};        #well... this is all cch specific
+sub _perform_cch_insert_delete_split {
+  my ($name, $filename, $dir, $format) = @_;
 
-  my ( $count, $last, $min_sec, $imported ) = (0, time, 5, 0); #progressbar
-  $count = 100;
+  my $error = '';
 
-  if ( $job ) {  # progress bar
-    my $error = $job->update_statustext( int( 100 * $imported / $count ) );
+  open my $fh, "< $filename"
+    or $error ||= "Can't open $name file $filename: $!";
+
+  my $ifh = new File::Temp( TEMPLATE => "$name.insert.XXXXXXXX",
+                            DIR      => $dir,
+                            UNLINK   => 0,     #meh
+                          ) or die "can't open temp file: $!\n";
+  my $insertname = $ifh->filename;
+
+  my $dfh = new File::Temp( TEMPLATE => "$name.delete.XXXXXXXX",
+                            DIR      => $dir,
+                            UNLINK   => 0,     #meh
+                          ) or die "can't open temp file: $!\n";
+  my $deletename = $dfh->filename;
+
+  my $insert_pattern = ($format eq 'cch-update') ? qr/"I"\s*$/ : qr/I\s*$/;
+  my $delete_pattern = ($format eq 'cch-update') ? qr/"D"\s*$/ : qr/D\s*$/;
+  while(<$fh>) {
+    my $handle = '';
+    $handle = $ifh if $_ =~ /$insert_pattern/;
+    $handle = $dfh if $_ =~ /$delete_pattern/;
+    unless ($handle) {
+      $error = "bad input line: $_" unless $handle;
+      last;
+    }
+    print $handle $_;
+  }
+  close $fh;
+  close $ifh;
+  close $dfh;
+
+  return ($error, $insertname, $deletename);
+}
+
+sub _perform_cch_diff {
+  my ($name, $newdir, $olddir) = @_;
+
+  my %oldlines = ();
+
+  if ($olddir) {
+    open my $oldcsvfh, "$olddir/$name.txt"
+      or die "failed to open $olddir/$name.txt: $!\n";
+
+    while(<$oldcsvfh>) {
+      chomp;
+      $oldlines{$_} = 1;
+    }
+    close $oldcsvfh;
+  }
+
+  open my $newcsvfh, "$newdir/$name.txt"
+    or die "failed to open $newdir/$name.txt: $!\n";
+    
+  my $dfh = new File::Temp( TEMPLATE => "$name.diff.XXXXXXXX",
+                            DIR      => "$newdir",
+                            UNLINK   => 0,     #meh
+                          ) or die "can't open temp file: $!\n";
+  my $diffname = $dfh->filename;
+
+  while(<$newcsvfh>) {
+    chomp;
+    if (exists($oldlines{$_})) {
+      $oldlines{$_} = 0;
+    } else {
+      print $dfh $_, ',"I"', "\n";
+    }
+  }
+  close $newcsvfh;
+
+  for (keys %oldlines) {
+    print $dfh $_, ',"D"', "\n" if $oldlines{$_};
+  }
+
+  close $dfh;
+
+  return $diffname;
+}
+
+sub _cch_fetch_and_unzip {
+  my ( $job, $urls, $secret, $dir ) = @_;
+
+  my $ua = new LWP::UserAgent;
+  foreach my $url (split ',', $urls) {
+    my @name = split '/', $url;  #somewhat restrictive
+    my $name = pop @name;
+    $name =~ /([\w.]+)/; # untaint that which we don't trust so much any more
+    $name = $1;
+      
+    open my $taxfh, ">$dir/$name" or die "Can't open $dir/$name: $!\n";
+     
+    my ( $imported, $last, $min_sec ) = _progressbar_foo();
+    my $res = $ua->request(
+      new HTTP::Request( GET => $url ),
+      sub {
+            print $taxfh $_[0] or die "Can't write to $dir/$name: $!\n";
+            my $content_length = $_[1]->content_length;
+            $imported += length($_[0]);
+            if ( time - $min_sec > $last ) {
+              my $error = $job->update_statustext(
+                ($content_length ? int(100 * $imported/$content_length) : 0 ).
+                ",Downloading data from CCH"
+              );
+              die $error if $error;
+              $last = time;
+            }
+      },
+    );
+    die "download of $url failed: ". $res->status_line
+      unless $res->is_success;
+      
+    close $taxfh;
+    my $error = $job->update_statustext( "0,Unpacking data" );
     die $error if $error;
+    $secret =~ /([\w.]+)/; # untaint that which we don't trust so much any more
+    $secret = $1;
+    system('unzip', "-P", $secret, "-d", "$dir",  "$dir/$name") == 0
+      or die "unzip -P $secret -d $dir $dir/$name failed";
+    #unlink "$dir/$name";
   }
+}
+sub _cch_extract_csv_from_dbf {
+  my ( $job, $dir, $name ) = @_;
 
-  my $oldAutoCommit = $FS::UID::AutoCommit;
-  local $FS::UID::AutoCommit = 0;
-  my $dbh = dbh;
-  my $error = '';
+  eval "use Text::CSV_XS;";
+  die $@ if $@;
 
-  my $sql =
-    "SELECT count(*) FROM part_pkg_taxoverride JOIN tax_class ".
-    "USING (taxclassnum) WHERE data_vendor = '$format'";
-  my $sth = $dbh->prepare($sql) or die $dbh->errstr;
-  $sth->execute
-    or die "Unexpected error executing statement $sql: ". $sth->errstr;
-  die "Don't (yet) know how to handle part_pkg_taxoverride records."
-    if $sth->fetchrow_arrayref->[0];
+  eval "use XBase;";
+  die $@ if $@;
 
-  # really should get a table EXCLUSIVE lock here
+  my ( $imported, $last, $min_sec ) = _progressbar_foo();
+  my $error = $job->update_statustext( "0,Unpacking $name" );
+  die $error if $error;
+  warn "opening $dir.new/$name.dbf\n" if $DEBUG;
+  my $table = new XBase 'name' => "$dir.new/$name.dbf";
+  die "failed to access $dir.new/$name.dbf: ". XBase->errstr
+    unless defined($table);
+  my $count = $table->last_record; # approximately;
+  open my $csvfh, ">$dir.new/$name.txt"
+    or die "failed to open $dir.new/$name.txt: $!\n";
+
+  my $csv = new Text::CSV_XS { 'always_quote' => 1 };
+  my @fields = $table->field_names;
+  my $cursor = $table->prepare_select;
+  my $format_date =
+    sub { my $date = shift;
+          $date =~ /^(\d{4})(\d{2})(\d{2})$/ && ($date = "$2/$3/$1");
+          $date;
+        };
+  while (my $row = $cursor->fetch_hashref) {
+    $csv->combine( map { ($table->field_type($_) eq 'D')
+                         ? &{$format_date}($row->{$_}) 
+                         : $row->{$_}
+                       }
+                   @fields
+    );
+    print $csvfh $csv->string, "\n";
+    $imported++;
+    if ( time - $min_sec > $last ) {
+      my $error = $job->update_statustext(
+        int(100 * $imported/$count).  ",Unpacking $name"
+      );
+      die $error if $error;
+      $last = time;
+    }
+  }
+  $table->close;
+  close $csvfh;
+}
+
+sub _remember_disabled_taxes {
+  my ( $job, $format, $disabled_tax_rate ) = @_;
+
+  # cch specific hash
+
+  my ( $imported, $last, $min_sec ) = _progressbar_foo();
 
-  #remember disabled taxes
-  my %disabled_tax_rate = ();
   my @items = qsearch( { table   => 'tax_rate',
                          hashref => { disabled => 'Y',
                                       data_vendor => $format,
@@ -1102,16 +1212,12 @@ sub process_download_and_reload {
                          select  => 'geocode, taxclassnum',
                        }
                      );
-  $count = scalar(@items);
+  my $count = scalar(@items);
   foreach my $tax_rate ( @items ) {
     if ( time - $min_sec > $last ) {
-      my $error = $job->update_statustext(
+      $job->update_statustext(
         int( 100 * $imported / $count ). ",Remembering disabled taxes"
       );
-      if ($error) {
-        $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-        die $error;
-      }
       $last = time;
     }
     $imported++;
@@ -1121,148 +1227,75 @@ sub process_download_and_reload {
       warn "failed to find tax_class ". $tax_rate->taxclassnum;
       next;
     }
-    $disabled_tax_rate{$tax_rate->geocode. ':'. $tax_class->taxclass} = 1;
+    $disabled_tax_rate->{$tax_rate->geocode. ':'. $tax_class->taxclass} = 1;
   }
+}
+
+sub _remember_tax_products {
+  my ( $job, $format, $taxproduct ) = @_;
 
-  #remember tax products
   # XXX FIXME  this loop only works when cch is the only data provider
-  my %taxproduct = ();
+
+  my ( $imported, $last, $min_sec ) = _progressbar_foo();
+
   my $extra_sql = "WHERE taxproductnum IS NOT NULL OR ".
                   "0 < ( SELECT count(*) from part_pkg_option WHERE ".
                   "       part_pkg_option.pkgpart = part_pkg.pkgpart AND ".
                   "       optionname LIKE 'usage_taxproductnum_%' AND ".
                   "       optionvalue != '' )";
-  @items = qsearch( { table => 'part_pkg',
-                      select  => 'DISTINCT pkgpart,taxproductnum',
-                      hashref => {},
-                      extra_sql => $extra_sql,
-                    }
-                  );
-  $count = scalar(@items);
-  $imported = 0;
+  my @items = qsearch( { table => 'part_pkg',
+                         select  => 'DISTINCT pkgpart,taxproductnum',
+                         hashref => {},
+                         extra_sql => $extra_sql,
+                       }
+                     );
+  my $count = scalar(@items);
   foreach my $part_pkg ( @items ) {
     if ( time - $min_sec > $last ) {
-      my $error = $job->update_statustext(
+      $job->update_statustext(
         int( 100 * $imported / $count ). ",Remembering tax products"
       );
-      if ($error) {
-        $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-        die $error;
-      }
       $last = time;
     }
     $imported++;
     warn "working with package part ". $part_pkg->pkgpart.
       "which has a taxproductnum of ". $part_pkg->taxproductnum. "\n" if $DEBUG;
     my $part_pkg_taxproduct = $part_pkg->taxproduct('');
-    $taxproduct{$part_pkg->pkgpart}{''} = $part_pkg_taxproduct->taxproduct
-      if $part_pkg_taxproduct;
+    $taxproduct->{$part_pkg->pkgpart}->{''} = $part_pkg_taxproduct->taxproduct
+      if $part_pkg_taxproduct && $part_pkg_taxproduct->data_vendor eq $format;
 
     foreach my $option ( $part_pkg->part_pkg_option ) {
-      next unless $option->optionname =~ /^usage_taxproductnum_(\w)$/;
+      next unless $option->optionname =~ /^usage_taxproductnum_(\w+)$/;
       my $class = $1;
 
       $part_pkg_taxproduct = $part_pkg->taxproduct($class);
-      $taxproduct{$part_pkg->pkgpart}{$class} = $part_pkg_taxproduct->taxproduct
-        if $part_pkg_taxproduct;
+      $taxproduct->{$part_pkg->pkgpart}->{$class} =
+          $part_pkg_taxproduct->taxproduct
+        if $part_pkg_taxproduct && $part_pkg_taxproduct->data_vendor eq $format;
     }
   }
+}
 
-  #wipe out the old data
-  $error = $job->update_statustext( "0,Removing old tax data" );
-  if ($error) {
-    $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-    die $error;
-  }
-  foreach my $tax_rate_location ( qsearch( 'tax_rate_location',
-                                           { data_vendor => $format,
-                                             disabled    => '',
-                                           }
-                                         )
-                                )
-  {
-    $tax_rate_location->disabled('Y');
-    my $error = $tax_rate_location->replace;
-    if ( $error ) {
-      $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-      die $error;
-    }
-  }
+sub _restore_remembered_tax_products {
+  my ( $job, $format, $taxproduct ) = @_;
 
-  local $FS::part_pkg_taxproduct::delete_kludge = 1;
-  my @table = qw(
-    tax_rate part_pkg_taxrate part_pkg_taxproduct tax_class cust_tax_location
-  );
-  foreach my $table ( @table ) {
-    my $dbh = dbh;
-#    my $primary_key = dbdef->table($table)->primary_key;
-#    my $sql = "SELECT $primary_key FROM $table WHERE data_vendor = ".
-    my $sql = "DELETE FROM $table WHERE data_vendor = ".
-      $dbh->quote($format);
-    my $sth = $dbh->prepare($sql);
-    unless ($sth) {
-      $error = $dbh->errstr;
-      $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-      die $error;
-    }
-    unless ($sth->execute) {
-      $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-      die "Failed to execute $sql: ". $sth->errstr;
-    }
-#    foreach my $row ( @{ $sth->fetchall_arrayref } ) {
-#      my $record = qsearchs( $table, { $primary_key => $row->[0] } )
-#        or die "Failed to find $table with $primary_key ". $row->[0];
-#      my $error = $record->delete;
-#      if ( $error ) {
-#        $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-#        die $error;
-#      }
-#    }
-  }
+  # cch specific
 
-  if ( $format eq 'cch' ) {
-    foreach my $cust_tax_location ( qsearch( 'cust_tax_location',
-                                             { data_vendor => "$format-zip" }
-                                           )
-                                  )
-    {
-      my $error = $cust_tax_location->delete;
-      if ( $error ) {
-        $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-        die $error;
-      }
-    }
-  }
-
-  #import new data
-  my $statement = ' &process_download_and_update($job, @_); ';
-  eval $statement;
-  if ($@) {
-    $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-    die $@;
-  }
-
-  #restore taxproducts
-  $count = scalar(keys %taxproduct);
-  $imported = 0;
-  foreach my $pkgpart ( keys %taxproduct ) {
+  my ( $imported, $last, $min_sec ) = _progressbar_foo();
+  my $count = scalar(keys %$taxproduct);
+  foreach my $pkgpart ( keys %$taxproduct ) {
     warn "restoring taxproductnums on pkgpart $pkgpart\n" if $DEBUG;
     if ( time - $min_sec > $last ) {
-      my $error = $job->update_statustext(
+      $job->update_statustext(
         int( 100 * $imported / $count ). ",Restoring tax products"
       );
-      if ( $error ) {
-        $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-        die $error;
-      }
       $last = time;
     }
     $imported++;
 
     my $part_pkg = qsearchs('part_pkg', { pkgpart => $pkgpart } );
     unless ( $part_pkg ) {
-      $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-      die "somehow failed to find part_pkg with pkgpart $pkgpart!\n";
+      return "somehow failed to find part_pkg with pkgpart $pkgpart!\n";
     }
 
     my %options = $part_pkg->options;
@@ -1270,19 +1303,18 @@ sub process_download_and_reload {
     my $primary_svc = $part_pkg->svcpart;
     my $new = new FS::part_pkg { $part_pkg->hash };
 
-    foreach my $class ( keys %{ $taxproduct{$pkgpart} } ) {
+    foreach my $class ( keys %{ $taxproduct->{$pkgpart} } ) {
       warn "working with class '$class'\n" if $DEBUG;
       my $part_pkg_taxproduct =
         qsearchs( 'part_pkg_taxproduct',
-                  { taxproduct  => $taxproduct{$pkgpart}{$class},
+                  { taxproduct  => $taxproduct->{$pkgpart}->{$class},
                     data_vendor => $format,
                   }
                 );
 
       unless ( $part_pkg_taxproduct ) {
-        $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-        die "failed to find part_pkg_taxproduct ($taxproduct{pkgpart}{$class})".
-            " for pkgpart $pkgpart\n";
+        return "failed to find part_pkg_taxproduct (".
+          $taxproduct->{pkgpart}->{$class}. ") for pkgpart $pkgpart\n";
       }
 
       if ( $class eq '' ) {
@@ -1301,24 +1333,23 @@ sub process_download_and_reload {
                                'options' => \%options,
     );
       
-    if ( $error ) {
-      $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-      die $error;
-    }
+    return $error if $error;
+
   }
 
-  #disable tax_rates
-  $count = scalar(keys %disabled_tax_rate);
-  $imported = 0;
-  foreach my $key (keys %disabled_tax_rate) {
+  '';
+}
+
+sub _restore_remembered_disabled_taxes {
+  my ( $job, $format, $disabled_tax_rate ) = @_;
+
+  my ( $imported, $last, $min_sec ) = _progressbar_foo();
+  my $count = scalar(keys %$disabled_tax_rate);
+  foreach my $key (keys %$disabled_tax_rate) {
     if ( time - $min_sec > $last ) {
-      my $error = $job->update_statustext(
+      $job->update_statustext(
         int( 100 * $imported / $count ). ",Disabling tax rates"
       );
-      if ( $error ) {
-        $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-        die $error;
-      }
       $last = time;
     }
     $imported++;
@@ -1326,10 +1357,8 @@ sub process_download_and_reload {
     my @tax_class = qsearch( 'tax_class', { data_vendor => $format,
                                             taxclass    => $taxclass,
                                           } );
-    if (scalar(@tax_class) > 1) {
-      $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-      die "found multiple tax_class records for format $format class $taxclass";
-    }
+    return "found multiple tax_class records for format $format class $taxclass"
+      if scalar(@tax_class) > 1;
       
     unless (scalar(@tax_class)) {
       warn "no tax_class for format $format class $taxclass\n";
@@ -1344,28 +1373,188 @@ sub process_download_and_reload {
     );
 
     if (scalar(@tax_rate) > 1) {
-      $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-      die "found multiple tax_rate records for format $format geocode $geocode".
-          " and taxclass $taxclass ( taxclassnum ". $tax_class[0]->taxclassnum.
-          " )";
+      return "found multiple tax_rate records for format $format geocode ".
+             "$geocode and taxclass $taxclass ( taxclassnum ".
+             $tax_class[0]->taxclassnum.  " )";
     }
       
     if (scalar(@tax_rate)) {
       $tax_rate[0]->disabled('Y');
       my $error = $tax_rate[0]->replace;
-      if ( $error ) {
-        $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-        die $error;
-      }
+      return $error if $error;
     }
   }
+}
 
-  #success!
+sub _remove_old_tax_data {
+  my ( $job, $format ) = @_;
+
+  my $dbh = dbh;
+  my $error = $job->update_statustext( "0,Removing old tax data" );
+  die $error if $error;
+
+  my $sql = "UPDATE public.tax_rate_location SET disabled='Y' ".
+    "WHERE data_vendor = ".  $dbh->quote($format);
+  $dbh->do($sql) or return "Failed to execute $sql: ". $dbh->errstr;
+
+  my @table = qw(
+    tax_rate part_pkg_taxrate part_pkg_taxproduct tax_class cust_tax_location
+  );
+  foreach my $table ( @table ) {
+    $sql = "DELETE FROM public.$table WHERE data_vendor = ".
+      $dbh->quote($format);
+    $dbh->do($sql) or return "Failed to execute $sql: ". $dbh->errstr;
+  }
+
+  if ( $format eq 'cch' ) {
+    $sql = "DELETE FROM public.cust_tax_location WHERE data_vendor = ".
+      $dbh->quote("$format-zip");
+    $dbh->do($sql) or return "Failed to execute $sql: ". $dbh->errstr;
+  }
+
+  '';
+}
+
+sub _create_temporary_tables {
+  my ( $job, $format ) = @_;
+
+  my $dbh = dbh;
+  my $error = $job->update_statustext( "0,Creating temporary tables" );
+  die $error if $error;
+
+  my @table = qw( tax_rate
+                  tax_rate_location
+                  part_pkg_taxrate
+                  part_pkg_taxproduct
+                  tax_class
+                  cust_tax_location
+  );
+  foreach my $table ( @table ) {
+    my $sql =
+      "CREATE TEMPORARY TABLE $table ( LIKE $table INCLUDING DEFAULTS )";
+    $dbh->do($sql) or return "Failed to execute $sql: ". $dbh->errstr;
+  }
+
+  '';
+}
+
+sub _copy_from_temp {
+  my ( $job, $format ) = @_;
+
+  my $dbh = dbh;
+  my $error = $job->update_statustext( "0,Making permanent" );
+  die $error if $error;
+
+  my @table = qw( tax_rate
+                  tax_rate_location
+                  part_pkg_taxrate
+                  part_pkg_taxproduct
+                  tax_class
+                  cust_tax_location
+  );
+  foreach my $table ( @table ) {
+    my $sql =
+      "INSERT INTO public.$table SELECT * from $table";
+    $dbh->do($sql) or return "Failed to execute $sql: ". $dbh->errstr;
+  }
+
+  '';
+}
+
+=item process_download_and_reload
+
+Download and process a tax update as a queued JSRPC job after wiping the
+existing wipable tax data.
+
+=cut
+
+sub process_download_and_reload {
+  _process_reload('process_download_and_update', @_);
+}
+
+  
+=item process_batch_reload
+
+Load and process a tax update from the provided files as a queued JSRPC job
+after wiping the existing wipable tax data.
+
+=cut
+
+sub process_batch_reload {
+  _process_reload('_perform_batch_import', @_);
+}
 
-  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
   
+sub _process_reload {
+  my ( $method, $job ) = ( shift, shift );
+
+  my $param = thaw(decode_base64($_[0]));
+  my $format = $param->{'format'};        #well... this is all cch specific
+
+  my ( $imported, $last, $min_sec ) = _progressbar_foo();
+
+  if ( $job ) {  # progress bar
+    my $error = $job->update_statustext( 0 );
+    die $error if $error;
+  }
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+  my $error = '';
+
+  my $sql =
+    "SELECT count(*) FROM part_pkg_taxoverride JOIN tax_class ".
+    "USING (taxclassnum) WHERE data_vendor = '$format'";
+  my $sth = $dbh->prepare($sql) or die $dbh->errstr;
+  $sth->execute
+    or die "Unexpected error executing statement $sql: ". $sth->errstr;
+  die "Don't (yet) know how to handle part_pkg_taxoverride records."
+    if $sth->fetchrow_arrayref->[0];
+
+  # really should get a table EXCLUSIVE lock here
+
+  #remember disabled taxes
+  my %disabled_tax_rate = ();
+  $error ||= _remember_disabled_taxes( $job, $format, \%disabled_tax_rate );
+
+  #remember tax products
+  my %taxproduct = ();
+  $error ||= _remember_tax_products( $job, $format, \%taxproduct );
+
+  #create temp tables
+  $error ||= _create_temporary_tables( $job, $format );
+
+  #import new data
+  unless ($error) {
+    my $args = '$job, @_';
+    eval "$method($args);";
+    $error = $@ if $@;
+  }
+
+  #restore taxproducts
+  $error ||= _restore_remembered_tax_products( $job, $format, \%taxproduct );
+
+  #disable tax_rates
+  $error ||=
+   _restore_remembered_disabled_taxes( $job, $format, \%disabled_tax_rate );
+
+  #wipe out the old data
+  $error ||= _remove_old_tax_data( $job, $format ); 
+
+  #untemporize
+  $error ||= _copy_from_temp( $job, $format );
+
+  if ($error) {
+    $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+    die $error;
+  }
+
+  #success!
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
 }
 
+
 =item process_download_and_update
 
 Download and process a tax update as a queued JSRPC job
@@ -1378,26 +1567,22 @@ sub process_download_and_update {
   my $param = thaw(decode_base64(shift));
   my $format = $param->{'format'};        #well... this is all cch specific
 
-  my ( $count, $last, $min_sec, $imported ) = (0, time, 5, 0); #progressbar
-  $count = 100;
+  my ( $imported, $last, $min_sec ) = _progressbar_foo();
 
   if ( $job ) {  # progress bar
-    my $error = $job->update_statustext( int( 100 * $imported / $count ) );
+    my $error = $job->update_statustext( 0);
     die $error if $error;
   }
 
-  my $dir = '%%%FREESIDE_CACHE%%%/cache.'. $FS::UID::datasrc. '/taxdata';
+  my $cache_dir = '%%%FREESIDE_CACHE%%%/cache.'. $FS::UID::datasrc. '/';
+  my $dir = $cache_dir. 'taxdata';
   unless (-d $dir) {
     mkdir $dir or die "can't create $dir: $!\n";
   }
 
   if ($format eq 'cch') {
 
-    eval "use Text::CSV_XS;";
-    die $@ if $@;
-
-    eval "use XBase;";
-    die $@ if $@;
+    my @namelist = qw( code detail geocode plus4 txmatrix zip );
 
     my $conf = new FS::Conf;
     die "direct download of tax data not enabled\n" 
@@ -1410,18 +1595,18 @@ sub process_download_and_update {
 
     $dir .= '/cch';
 
-    my $oldAutoCommit = $FS::UID::AutoCommit;
-    local $FS::UID::AutoCommit = 0;
     my $dbh = dbh;
     my $error = '';
 
     # really should get a table EXCLUSIVE lock here
     # check if initial import or update
+    #
+    # relying on mkdir "$dir.new" as a mutex
     
     my $sql = "SELECT count(*) from tax_rate WHERE data_vendor='$format'";
     my $sth = $dbh->prepare($sql) or die $dbh->errstr;
     $sth->execute() or die $sth->errstr;
-    my $upgrade = $sth->fetchrow_arrayref->[0];
+    my $update = $sth->fetchrow_arrayref->[0];
 
     # create cache and/or rotate old tax data
 
@@ -1445,7 +1630,7 @@ sub process_download_and_update {
 
     } else {
 
-      die "can't find previous tax data\n" if $upgrade;
+      die "can't find previous tax data\n" if $update;
 
     }
 
@@ -1453,215 +1638,37 @@ sub process_download_and_update {
     
     # fetch and unpack the zip files
 
-    my $ua = new LWP::UserAgent;
-    foreach my $url (split ',', $urls) {
-      my @name = split '/', $url;  #somewhat restrictive
-      my $name = pop @name;
-      $name =~ /(.*)/; # untaint that which we trust;
-      $name = $1;
-      
-      open my $taxfh, ">$dir.new/$name" or die "Can't open $dir.new/$name: $!\n";
-     
-      my $res = $ua->request(
-        new HTTP::Request( GET => $url),
-        sub { #my ($data, $response_object) = @_;
-              print $taxfh $_[0] or die "Can't write to $dir.new/$name: $!\n";
-              my $content_length = $_[1]->content_length;
-              $imported += length($_[0]);
-              if ( time - $min_sec > $last ) {
-                my $error = $job->update_statustext(
-                  ($content_length ? int(100 * $imported/$content_length) : 0 ).
-                  ",Downloading data from CCH"
-                );
-                die $error if $error;
-                $last = time;
-              }
-        },
-      );
-      die "download of $url failed: ". $res->status_line
-        unless $res->is_success;
-      
-      close $taxfh;
-      my $error = $job->update_statustext( "0,Unpacking data" );
-      die $error if $error;
-      $secret =~ /(.*)/; # untaint that which we trust;
-      $secret = $1;
-      system('unzip', "-P", $secret, "-d", "$dir.new",  "$dir.new/$name") == 0
-        or die "unzip -P $secret -d $dir.new $dir.new/$name failed";
-      #unlink "$dir.new/$name";
-    }
+    _cch_fetch_and_unzip( $job, $urls, $secret, "$dir.new" );
  
     # extract csv files from the dbf files
 
-    foreach my $name ( qw( code detail geocode plus4 txmatrix zip ) ) {
-      my $error = $job->update_statustext( "0,Unpacking $name" );
-      die $error if $error;
-      warn "opening $dir.new/$name.dbf\n" if $DEBUG;
-      my $table = new XBase 'name' => "$dir.new/$name.dbf";
-      die "failed to access $dir.new/$name.dbf: ". XBase->errstr
-        unless defined($table);
-      $count = $table->last_record; # approximately;
-      $imported = 0;
-      open my $csvfh, ">$dir.new/$name.txt"
-        or die "failed to open $dir.new/$name.txt: $!\n";
-
-      my $csv = new Text::CSV_XS { 'always_quote' => 1 };
-      my @fields = $table->field_names;
-      my $cursor = $table->prepare_select;
-      my $format_date =
-        sub { my $date = shift;
-              $date =~ /^(\d{4})(\d{2})(\d{2})$/ && ($date = "$2/$3/$1");
-              $date;
-            };
-      while (my $row = $cursor->fetch_hashref) {
-        $csv->combine( map { ($table->field_type($_) eq 'D')
-                             ? &{$format_date}($row->{$_}) 
-                             : $row->{$_}
-                           }
-                       @fields
-        );
-        print $csvfh $csv->string, "\n";
-        $imported++;
-        if ( time - $min_sec > $last ) {
-          my $error = $job->update_statustext(
-            int(100 * $imported/$count).  ",Unpacking $name"
-          );
-          die $error if $error;
-          $last = time;
-        }
-      }
-      $table->close;
-      close $csvfh;
+    foreach my $name ( @namelist ) {
+      _cch_extract_csv_from_dbf( $job, $dir, $name ); 
     }
 
     # generate the diff files
 
-    my @insert_list = ();
-    my @delete_list = ();
-    my @predelete_list = ();
-
-    my @list = (
-                 'geocode',  \&FS::tax_rate_location::batch_import, 
-                 'code',     \&FS::tax_class::batch_import,
-                 'plus4',    \&FS::cust_tax_location::batch_import,
-                 'zip',      \&FS::cust_tax_location::batch_import,
-                 'txmatrix', \&FS::part_pkg_taxrate::batch_import,
-                 'detail',   \&FS::tax_rate::batch_import,
-               );
-
-    while( scalar(@list) ) {
-      my ( $name, $method ) = ( shift @list, shift @list );
-      my %oldlines = ();
-
-      my $error = $job->update_statustext( "0,Comparing to previous $name" );
-      die $error if $error;
-
-      warn "processing $dir.new/$name.txt\n" if $DEBUG;
-
-      if ($upgrade) {
-        open my $oldcsvfh, "$dir.1/$name.txt"
-          or die "failed to open $dir.1/$name.txt: $!\n";
-
-        while(<$oldcsvfh>) {
-          chomp;
-          $oldlines{$_} = 1;
-        }
-        close $oldcsvfh;
+    my @list = ();
+    foreach my $name ( @namelist ) {
+      my $difffile = "$dir.new/$name.txt";
+      if ($update) {
+        my $error = $job->update_statustext( "0,Comparing to previous $name" );
+        die $error if $error;
+        warn "processing $dir.new/$name.txt\n" if $DEBUG;
+        my $olddir = $update ? "$dir.1" : "";
+        $difffile = _perform_cch_diff( $name, "$dir.new", $olddir );
       }
-
-      open my $newcsvfh, "$dir.new/$name.txt"
-        or die "failed to open $dir.new/$name.txt: $!\n";
-    
-      my $ifh = new File::Temp( TEMPLATE => "$name.insert.XXXXXXXX",
-                                DIR      => "$dir.new",
-                                UNLINK   => 0,     #meh
-                              ) or die "can't open temp file: $!\n";
-
-      my $dfh = new File::Temp( TEMPLATE => "$name.delete.XXXXXXXX",
-                                DIR      => "$dir.new",
-                                UNLINK   => 0,     #meh
-                              ) or die "can't open temp file: $!\n";
-
-      while(<$newcsvfh>) {
-        chomp;
-        if (exists($oldlines{$_})) {
-          $oldlines{$_} = 0;
-        } else {
-          print $ifh $_, ',"I"', "\n";
-        }
-      }
-      close $newcsvfh;
-
-      if ($name eq 'detail') {
-        for (keys %oldlines) {  # one file for rate details
-          print $ifh $_, ',"D"', "\n" if $oldlines{$_};
-        }
-      } else {
-        for (keys %oldlines) {
-          print $dfh $_, ',"D"', "\n" if $oldlines{$_};
-        }
-      }
-      %oldlines = ();
-
-      push @insert_list, $name, $ifh->filename, $method;
-      if ( $name eq 'geocode' ) {
-        unshift @predelete_list, $name, $dfh->filename, $method
-          unless $name eq 'detail';
-      } else {
-        unshift @delete_list, $name, $dfh->filename, $method
-          unless $name eq 'detail';
-      }
-
-      close $dfh;
-      close $ifh;
+      $difffile =~ s/^$cache_dir//;
+      push @list, "${name}file:$difffile";
     }
 
-    while( scalar(@predelete_list) ) {
-      my ($name, $file, $method) =
-        (shift @predelete_list, shift @predelete_list, shift @predelete_list);
-
-      my $fmt = "$format-update";
-      $fmt = $fmt. ( $name eq 'zip' ? '-zip' : '' );
-      open my $fh, "< $file" or $error ||= "Can't open $name file $file: $!";
-      $error ||=
-        &{$method}({ 'filehandle' => $fh, 'format' => $fmt }, $job);
-      close $fh;
-      #unlink $file or warn "Can't delete $file: $!";
-    }
-
-    while( scalar(@insert_list) ) {
-      my ($name, $file, $method) =
-        (shift @insert_list, shift @insert_list, shift @insert_list);
-
-      my $fmt = "$format-update";
-      $fmt = $fmt. ( $name eq 'zip' ? '-zip' : '' );
-      open my $fh, "< $file" or $error ||= "Can't open $name file $file: $!";
-      $error ||=
-        &{$method}({ 'filehandle' => $fh, 'format' => $fmt }, $job);
-      close $fh;
-      #unlink $file or warn "Can't delete $file: $!";
-    }
-    
-    while( scalar(@delete_list) ) {
-      my ($name, $file, $method) =
-        (shift @delete_list, shift @delete_list, shift @delete_list);
-
-      my $fmt = "$format-update";
-      $fmt = $fmt. ( $name eq 'zip' ? '-zip' : '' );
-      open my $fh, "< $file" or $error ||= "Can't open $name file $file: $!";
-      $error ||=
-        &{$method}({ 'filehandle' => $fh, 'format' => $fmt }, $job);
-      close $fh;
-      #unlink $file or warn "Can't delete $file: $!";
-    }
+    # perform the import
+    local $keep_cch_files = 1;
+    $param->{uploaded_files} = join( ',', @list );
+    $param->{format} .= '-update' if $update;
+    $error ||=
+      _perform_batch_import( $job, encode_base64( nfreeze( $param ) ) );
     
-    if ($error) {
-      $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
-      die $error;
-    }else{
-      $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-    }
-
     rename "$dir.new", "$dir"
       or die "cch tax update processed, but can't rename $dir.new: $!\n";
 
@@ -1750,111 +1757,6 @@ sub browse_queries {
   return ($query, "SELECT COUNT(*) FROM tax_rate $extra_sql");
 }
 
-# _upgrade_data
-#
-# Used by FS::Upgrade to migrate to a new database.
-#
-#
-
-sub _upgrade_data {  # class method
-  my ($self, %opts) = @_;
-  my $dbh = dbh;
-
-  warn "$me upgrading $self\n" if $DEBUG;
-
-  my @column = qw ( tax excessrate usetax useexcessrate fee excessfee
-                    feebase feemax );
-
-  if ( $dbh->{Driver}->{Name} eq 'Pg' ) {
-
-    eval "use DBI::Const::GetInfoType;";
-    die $@ if $@;
-
-    my $major_version = 0;
-    $dbh->get_info( $GetInfoType{SQL_DBMS_VER} ) =~ /^(\d{2})/
-      && ( $major_version = sprintf("%d", $1) );
-
-    if ( $major_version > 7 ) {
-
-      # ideally this would be supported in DBIx-DBSchema and friends
-
-      foreach my $column ( @column ) {
-        my $columndef = dbdef->table($self->table)->column($column);
-        unless ($columndef->type eq 'numeric') {
-
-          warn "updating tax_rate column $column to numeric\n" if $DEBUG;
-          my $sql = "ALTER TABLE tax_rate ALTER $column TYPE numeric(14,8)";
-          my $sth = $dbh->prepare($sql) or die $dbh->errstr;
-          $sth->execute or die $sth->errstr;
-
-          warn "updating h_tax_rate column $column to numeric\n" if $DEBUG;
-          $sql = "ALTER TABLE h_tax_rate ALTER $column TYPE numeric(14,8)";
-          $sth = $dbh->prepare($sql) or die $dbh->errstr;
-          $sth->execute or die $sth->errstr;
-
-        }
-      }
-
-    } elsif ( $dbh->{pg_server_version} =~ /^704/ ) {
-
-      # ideally this would be supported in DBIx-DBSchema and friends
-
-      foreach my $column ( @column ) {
-        my $columndef = dbdef->table($self->table)->column($column);
-        unless ($columndef->type eq 'numeric') {
-
-          warn "updating tax_rate column $column to numeric\n" if $DEBUG;
-
-          foreach my $table ( qw( tax_rate h_tax_rate ) ) {
-
-            my $sql = "ALTER TABLE $table RENAME $column TO old_$column";
-            my $sth = $dbh->prepare($sql) or die $dbh->errstr;
-            $sth->execute or die $sth->errstr;
-
-            my $def = dbdef->table($table)->column($column);
-            $def->type('numeric');
-            $def->length('14,8'); 
-            my $null = $def->null;
-            $def->null('NULL');
-
-            $sql = "ALTER TABLE $table ADD COLUMN ". $def->line($dbh);
-            $sth = $dbh->prepare($sql) or die $dbh->errstr;
-            $sth->execute or die $sth->errstr;
-
-            $sql = "UPDATE $table SET $column = CAST( old_$column AS numeric )";
-            $sth = $dbh->prepare($sql) or die $dbh->errstr;
-            $sth->execute or die $sth->errstr;
-
-            unless ( $null eq 'NULL' ) {
-              $sql = "ALTER TABLE $table ALTER $column SET NOT NULL";
-              $sth = $dbh->prepare($sql) or die $dbh->errstr;
-              $sth->execute or die $sth->errstr;
-            }
-
-            $sql = "ALTER TABLE $table DROP old_$column";
-            $sth = $dbh->prepare($sql) or die $dbh->errstr;
-            $sth->execute or die $sth->errstr;
-
-          }
-        }
-      }
-
-    } else {
-
-      warn "WARNING: tax_rate table upgrade unsupported for this Pg version\n";
-
-    }
-
-  } else {
-
-    warn "WARNING: tax_rate table upgrade only supported for Pg 8+\n";
-
-  }
-
-  '';
-
-}
-
 =back
 
 =head1 BUGS
index 5643679..4755f1f 100644 (file)
@@ -87,6 +87,7 @@ FS/h_svc_www.pm
 FS/part_bill_event.pm
 FS/payinfo_Mixin.pm
 FS/export_svc.pm
+FS/export_device.pm
 FS/part_export.pm
 FS/part_export_option.pm
 FS/part_export/acct_sql.pm
@@ -231,6 +232,7 @@ t/domain_record.t
 t/nas.t
 t/part_bill_event.t
 t/export_svc.t
+t/export_device.t
 t/part_export.t
 t/part_export_option.t
 t/part_export-acct_sql.t
@@ -364,6 +366,8 @@ FS/cust_credit_bill_pkg.pm
 t/cust_credit_bill_pkg.t
 FS/registrar.pm
 t/registrar.t
+FS/svc_Domain_Mixin.pm
+t/svc_Domain_Mixin.t
 FS/svc_External_Common.pm
 t/svc_External_Common.t
 FS/svc_Parent_Mixin.pm
@@ -455,3 +459,20 @@ FS/cust_statement.pm
 t/cust_statement.t
 FS/cdr_batch.pm
 t/cdr_batch.t
+FS/svc_pbx.pm
+t/svc_pbx.t
+FS/h_svc_www.pm
+t/h_svc_www.t
+FS/location_Mixin.pm
+t/location_Mixin.t
+FS/svc_mailinglist.pm
+t/svc_mailinglist.t
+FS/mailinglist.pm
+t/mailinglist.t
+FS/mailinglistmember.pm
+t/mailinglistmember.t
+FS/part_event/Action/Mixin/credit_pkg.pm
+FS/part_event/Action/pkg_agent_credit.pm
+FS/part_event/Action/pkg_agent_credit_pkg.pm
+FS/part_event/Action/pkg_employee_credit.pm
+FS/part_event/Action/pkg_employee_credit_pkg.pm
index 06bef68..3f8abc0 100755 (executable)
@@ -12,15 +12,15 @@ use FS::pay_batch;
 use FS::cust_pay_batch;
 use FS::Conf;
 
-use vars qw( $opt_a $opt_t $opt_v );
-getopts('avt');
+use vars qw( $opt_a $opt_t $opt_v $opt_p );
+getopts('avtp:');
 
 #$Net::SFTP::Foreign::debug = -1;
 
 sub usage { "
   Usage:
     freeside-paymentech-upload [ -v ] [ -t ] user batchnum
-    freeside-paymentech-upload -a [ -v ] [ -t ] user\n
+    freeside-paymentech-upload -a [ -p payby ] [ -v ] [ -t ] user\n
 " }
 
 my $user = shift or die &usage;
@@ -31,8 +31,11 @@ my $zip_check = `which zip` or die "can't find zip executable\n";
 my @batches; 
 
 if($opt_a) {
-  @batches = qsearch('pay_batch', { status => 'O' } );
-  die "No open batches found.\n" if !@batches;
+  my %criteria = (status => 'O');
+  $criteria{'payby'} = uc($opt_p) if $opt_p;
+  @batches = qsearch('pay_batch', \%criteria);
+  die "No open batches found".($opt_p ? " of type '$opt_p'" : '').".\n" 
+    if !@batches;
 }
 else {
   my $batchnum = shift;
@@ -95,7 +98,7 @@ freeside-paymentech-upload - Transmit a payment batch to Chase Paymentech via SF
 
 =head1 SYNOPSIS
 
-  freeside-paymentech-upload [ -a ] [ -v ] [ -t ] user batchnum
+  freeside-paymentech-upload [ -a [ -p PAYBY ] ] [ -v ] [ -t ] user batchnum
 
 =head1 DESCRIPTION
 
@@ -106,6 +109,8 @@ response file.
 
 -a: Send all open batches, instead of specifying a batchnum.
 
+-p PAYBY: With -a, limit to batches of that payment type, e.g. -p CARD.
+
 -v: Be verbose.
 
 -t: Send the transaction to the test server.
index 97c704c..f4ff1c2 100755 (executable)
@@ -4,7 +4,7 @@ use strict;
 use vars qw($opt_d $opt_s $opt_q $opt_v $opt_r);
 use vars qw($DEBUG $DRY_RUN);
 use Getopt::Std;
-use DBIx::DBSchema 0.31;
+use DBIx::DBSchema 0.31; #0.39
 use FS::UID qw(adminsuidsetup checkeuid datasrc driver_name);  #getsecrets);
 use FS::CurrentUser;
 use FS::Schema qw( dbdef dbdef_dist reload_dbdef );
@@ -30,6 +30,11 @@ $FS::UID::callback_hack = 1;
 my $dbh = adminsuidsetup($user);
 $FS::UID::callback_hack = 0;
 
+if ( driver_name =~ /^mysql/i ) { #until 0.39 is required above
+  eval "use DBIx::DBSchema 0.39;";
+  die $@ if $@;
+}
+
 #needs to match FS::Schema...
 my $dbdef_file = "%%%FREESIDE_CONF%%%/dbdef.". datasrc;
 
diff --git a/FS/t/h_svc_mailinglist.t b/FS/t/h_svc_mailinglist.t
new file mode 100644 (file)
index 0000000..d75575a
--- /dev/null
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::h_svc_mailinglist;
+$loaded=1;
+print "ok 1\n";
diff --git a/FS/t/h_svc_pbx.t b/FS/t/h_svc_pbx.t
new file mode 100644 (file)
index 0000000..8b30f52
--- /dev/null
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::h_svc_pbx;
+$loaded=1;
+print "ok 1\n";
diff --git a/FS/t/location_Mixin.t b/FS/t/location_Mixin.t
new file mode 100644 (file)
index 0000000..b6a9bf2
--- /dev/null
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::location_Mixin;
+$loaded=1;
+print "ok 1\n";
diff --git a/FS/t/mailinglist.t b/FS/t/mailinglist.t
new file mode 100644 (file)
index 0000000..45b7dd5
--- /dev/null
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::mailinglist;
+$loaded=1;
+print "ok 1\n";
diff --git a/FS/t/mailinglistmember.t b/FS/t/mailinglistmember.t
new file mode 100644 (file)
index 0000000..1ceb2f5
--- /dev/null
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::mailinglistmember;
+$loaded=1;
+print "ok 1\n";
diff --git a/FS/t/svc_Domain_Mixin.t b/FS/t/svc_Domain_Mixin.t
new file mode 100644 (file)
index 0000000..261af75
--- /dev/null
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::svc_Domain_Mixin;
+$loaded=1;
+print "ok 1\n";
diff --git a/FS/t/svc_mailinglist.t b/FS/t/svc_mailinglist.t
new file mode 100644 (file)
index 0000000..73896da
--- /dev/null
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::svc_mailinglist;
+$loaded=1;
+print "ok 1\n";
diff --git a/FS/t/svc_pbx.t b/FS/t/svc_pbx.t
new file mode 100644 (file)
index 0000000..2a41372
--- /dev/null
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::svc_pbx;
+$loaded=1;
+print "ok 1\n";
index 34e3fdd..b7b355c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -123,7 +123,7 @@ RT_PATH = /opt/rt3
 FREESIDE_PATH = `pwd`
 PERL_INC_DEV_KLUDGE = /usr/local/share/perl/5.10.0/
 
-VERSION=1.9.2cvs
+VERSION=1.9.2
 TAG=freeside_1_9_2
 
 DEBVERSION = `echo ${VERSION} | perl -pe 's/(\d)([a-z])/\1~\2/'`-1
@@ -203,6 +203,7 @@ perl-modules:
          s|%%%FREESIDE_EXPORT%%%|${FREESIDE_EXPORT}|g;\
        " blib/lib/FS/Cron/*.pm;\
        perl -p -i -e "\
+         s|%%%FREESIDE_CONF%%%|${FREESIDE_CONF}|g;\
          s|%%%FREESIDE_EXPORT%%%|${FREESIDE_EXPORT}|g;\
          s|%%%FREESIDE_LOG%%%|${FREESIDE_LOG}|g;\
        " blib/lib/FS/part_export/*.pm;\
@@ -361,12 +362,12 @@ create-rt: configure-rt
        || true
 
 install-rt:
-       [ ${RT_ENABLED} -eq 1 ] && ( cd rt; make install ) || true
-       [ ${RT_ENABLED} -eq 1 ] && perl -p -i -e "\
+       if [ ${RT_ENABLED} -eq 1 ]; then ( cd rt; make install ); fi
+       if [ ${RT_ENABLED} -eq 1 ]; then perl -p -i -e "\
          s'%%%RT_DOMAIN%%%'${RT_DOMAIN}'g;\
          s'%%%RT_TIMEZONE%%%'${RT_TIMEZONE}'g;\
          s'%%%FREESIDE_URL%%%'${FREESIDE_URL}'g;\
-       " ${RT_PATH}/etc/RT_SiteConfig.pm
+       " ${RT_PATH}/etc/RT_SiteConfig.pm; fi
 
 clean:
        rm -rf masondocs
index 110ec8f..e20d96b 100644 (file)
@@ -1 +1 @@
-ivan-unconfigured-freeside-installation@420.am
+ivan-unconfigured-freeside-installation@freeside.biz
index 20a0b4f..7f9977c 100644 (file)
@@ -1,3 +1,15 @@
+freeside (1.9.2-1) unstable; urgency=low
+
+  * New upstream release
+
+ -- Ivan Kohler <ivan-debian@420.am>  Mon, 05 Apr 2010 00:08:55 -0700
+
+freeside (1.9.2~cvs-1) unstable; urgency=low
+
+  * New upstream release
+
+ -- Ivan Kohler <ivan-debian@420.am>  Mon, 05 Apr 2010 00:05:25 -0700
+
 freeside (1.9.1-1) unstable; urgency=low
 
   * New upstream release
index 75869a0..4ea4815 100644 (file)
@@ -22,7 +22,7 @@ Description: Billing and trouble ticketing for service providers
 
 Package: freeside-lib
 Architecture: all
-Depends: ghostscript | gs-gpl, gsfonts, tetex-base, tetex-bin, libauthen-passphrase-perl, libbusiness-creditcard-perl, libcache-cache-perl, libcache-simple-timedexpiry-perl, libclass-returnvalue-perl, libcrypt-passwdmd5-perl, libdate-manip-perl, libdbd-pg-perl | libdbd-mysql-perl, libdbi-perl, libdbix-dbschema-perl (>= 0.35), libdbix-searchbuilder-perl, libdigest-sha1-perl, libfile-counterfile-perl, libfile-rsync-perl, libfrontier-rpc-perl, libhtml-format-perl, libhtml-tree-perl, libipc-run3-perl, libipc-sharelite-perl,  liblingua-en-nameparse-perl, liblocale-maketext-fuzzy-perl, liblocale-maketext-lexicon-perl, liblocale-subcountry-perl, liblog-dispatch-perl, libmailtools-perl (>= 2), libmime-perl (>= 5.424) | libmime-perl (< 5.421), libnet-domain-tld-perl, libnet-scp-perl, libnet-ssh-perl, libnet-whois-raw-perl, libnetaddr-ip-perl, libnumber-format-perl, libregexp-common-perl, libstring-approx-perl, libstring-shellquote-perl, libterm-readkey-perl, libtest-inline-perl, libtext-autoformat-perl, libtext-csv-perl, libtext-template-perl, libtext-wrapper-perl, libtie-ixhash-perl, libtime-duration-perl, libtime-modules-perl, libtimedate-perl, libuniversal-require-perl, liburi-perl, libwant-perl, libwww-perl
+Depends: ghostscript | gs-gpl, gsfonts, tetex-base, tetex-bin, libauthen-passphrase-perl, libbusiness-creditcard-perl, libcache-cache-perl, libcache-simple-timedexpiry-perl, libclass-returnvalue-perl, libcrypt-passwdmd5-perl, libdate-manip-perl, libdbd-pg-perl | libdbd-mysql-perl, libdbi-perl, libdbix-dbschema-perl (>= 0.35), libdbix-searchbuilder-perl, libdigest-sha1-perl, libfile-counterfile-perl, libfile-rsync-perl, libfrontier-rpc-perl, libhtml-format-perl, libhtml-tree-perl, libipc-run3-perl, libipc-sharelite-perl,  liblingua-en-nameparse-perl, liblocale-maketext-fuzzy-perl, liblocale-maketext-lexicon-perl, liblocale-subcountry-perl, liblog-dispatch-perl, libmailtools-perl (>= 2), libmime-perl (>= 5.424) | libmime-perl (< 5.421), libnet-domain-tld-perl, libnet-scp-perl, libnet-ssh-perl, libnet-whois-raw-perl, libnetaddr-ip-perl, libnumber-format-perl, libregexp-common-perl, libstring-approx-perl, libstring-shellquote-perl, libterm-readkey-perl, libtest-inline-perl, libtext-autoformat-perl, libtext-csv-perl, libtext-template-perl, libtext-wrapper-perl, libtie-ixhash-perl, libtime-duration-perl, libtime-modules-perl, libtimedate-perl, libuniversal-require-perl, liburi-perl, libwant-perl, libwww-perl, libemail-sender-perl, libemail-sender-transport-smtp-tls-perl
 Recommends: libdbd-pg-perl, libdbd-mysql-perl, rsync
 Suggests: libbusiness-onlinepayment-perl
 Description: Libraries for Freeside billing and trouble ticketing
index 49629d4..7e6821b 100644 (file)
@@ -59,6 +59,7 @@ $socket .= '.'.$tag if defined $tag && length($tag);
   'provision_external'        => 'MyAccount/provision_external',
   'unprovision_svc'           => 'MyAccount/unprovision_svc',
   'myaccount_passwd'          => 'MyAccount/myaccount_passwd',
+  'create_ticket'             => 'MyAccount/create_ticket',
   'signup_info'               => 'Signup/signup_info',
   'skin_info'                 => 'MyAccount/skin_info',
   'access_info'               => 'MyAccount/access_info',
index 987b97e..9cdb65e 100644 (file)
@@ -1,7 +1,6 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Payment results') %>
 
-<FONT SIZE=4>Payment results</FONT><BR><BR>
 <%= if ( $error ) {
   $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error processing your payment: $error</FONT>!;
 } else {
index c0977d9..7941971 100755 (executable)
@@ -1,7 +1,6 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Edit billing address') %>
 
-<FONT SIZE=4>Edit billing address</FONT><BR><BR>
 <%= if ( $error ) { 
   $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error: $error</FONT><BR><BR>!;
 }  ''; %>
index 9b91d2c..68b6fd8 100644 (file)
@@ -1,7 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
-
-<FONT SIZE=4>Change password</FONT><BR><BR>
+<%= include('header', 'Change password') %>
 
 <%= if ( $error ) {
   $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!;
index bbe4527..9633e89 100644 (file)
@@ -1,7 +1,6 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Change payment information') %>
 
-<FONT SIZE=4>Change payment information</FONT><BR><BR>
 <%= if ( $error ) { 
   $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error: $error</FONT><BR><BR>!;
   }  ''; %>
index f03aeb5..59f9176 100755 (executable)
@@ -1,7 +1,6 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Edit service address') %>
 
-<FONT SIZE=4>Edit service address</FONT><BR><BR>
 <%= if ( $error ) { 
   $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error: $error</FONT><BR><BR>!;
 }  ''; %>
index 95bdab7..37dccaa 100644 (file)
@@ -1,5 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Change package') %>
 
 <%= include('change_pkg') %>
 
index a20e8ac..192c29f 100755 (executable)
@@ -1,5 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Purchase additional package') %>
 
 <%= include('order_pkg') %>
 
index e16b01e..80a14f8 100644 (file)
@@ -1,5 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Remove service') %>
 
 <%= if ( $error ) {
   $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error: $error</FONT>!;
index 630959e..692348f 100644 (file)
@@ -3,6 +3,28 @@
     <TITLE><%= $title || 'MyAccount' %></TITLE>
     <%= $head %>
   </HEAD>
+  <STYLE TYPE="text/css">
+    body {
+      color: <%= $text_color || '#000000' %>;
+      <%= $font ? "font: $font;" : '' %>
+    }
+    a { 
+      color: <%= $link_color || 'blue' %>;
+      <%= $menu_nounderline ? 'text-decoration: none' : '' %>
+    }
+    a:visited { 
+      color: <%= $vlink_color || 'purple' %>;
+      <%= $menu_nounderline ? 'text-decoration: none' : '' %>
+    }
+    a:active { 
+      color: <%= $alink_color || 'blue' %>;
+      <%= $menu_nounderline ? 'text-decoration: none' : '' %>
+    }
+    a:hover { 
+      color: <%= $hlink_color || '' %>;
+      <%= $menu_nounderline ? 'text-decoration: none' : '' %>
+    }
+  </STYLE>
   <BODY BGCOLOR="<%= $body_bgcolor || '#eeeeee' %>">
     <script language="JavaScript"><!--
       var mywindow = -1;
       }
     //--></script>
     <%= $body_header %>
-    <FONT SIZE=5><%= $title || 'MyAccount' %></FONT>
-    <BR><BR>
+
+    <TABLE BORDER=0 WIDTH="100%" CELLPADDING=0 CELLSPACING=0>
+      <TR STYLE="padding:0px">
+        <TD><IMG SRC="image.cgi?logo"></TD>
+        <TD WIDTH = "29%"
+            STYLE = "background: url(image.cgi?title_left_image) no-repeat left center; padding:0px">
+        </TD>
+        <TD WIDTH = "49%"
+            ALIGN="<%= $title_align || 'left' %>"
+            STYLE = "background: url(image.cgi?title_right_image) no-repeat right center; padding:0px">
+              <FONT SIZE  = "<%= $title_size || 5 %>"
+                    COLOR = "<%= $title_color %>"
+              ><%= $INCLUDE_ARGS[0] %>&nbsp;&nbsp;&nbsp;</FONT>
+          </DIV>
+        </TD>
+      </TR>
+    </TABLE>
+
     <%= include('myaccount_menu') %>
     <TD VALIGN="top">
+
diff --git a/fs_selfservice/FS-SelfService/cgi/image.cgi b/fs_selfservice/FS-SelfService/cgi/image.cgi
new file mode 100755 (executable)
index 0000000..e951dcd
--- /dev/null
@@ -0,0 +1,20 @@
+#!/usr/bin/perl -T
+#!/usr/bin/perl -Tw
+
+use strict;
+use CGI;
+use FS::SelfService qw( skin_info );
+
+my $cgi = new CGI;
+
+my($query) = $cgi->keywords;
+$query =~ /^(\w+)$/ or '' =~ /^()$/;
+my $name = $1;
+
+my $info = skin_info();
+
+print $cgi->header( '-type'    => 'image/png', #for now
+                    #'-expires' => 'now',
+                  ).
+      $info->{$name};
+
index 8802a5d..09391e7 100644 (file)
@@ -1,7 +1,6 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Make a payment') %>
 
-<FONT SIZE=4>Make a payment</FONT><BR><BR>
 <FORM NAME="OneTrueForm" METHOD="POST" ACTION="<%=$selfurl%>" onSubmit="document.OneTrueForm.process.disabled=true">
 <INPUT TYPE="hidden" NAME="session" VALUE="<%=$session_id%>">
 <INPUT TYPE="hidden" NAME="action" VALUE="ach_payment_results">
@@ -25,7 +24,7 @@
 <%= include('check') %>
 <TR>
   <TD COLSPAN=2>
-    <INPUT TYPE="checkbox" CHECKED NAME="save" VALUE="1">
+    <INPUT TYPE="checkbox" <%= $save_unchecked ? '' : 'CHECKED' %> NAME="save" VALUE="1">
     Remember this information
   </TD>
 </TR><TR>
index 96a17ba..e454647 100644 (file)
@@ -1,7 +1,6 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Make a payment') %>
 
-<FONT SIZE=4>Make a payment</FONT><BR><BR>
 <FORM NAME="OneTrueForm" METHOD="POST" ACTION="<%=$selfurl%>" onSubmit="document.OneTrueForm.process.disabled=true">
 <INPUT TYPE="hidden" NAME="session" VALUE="<%=$session_id%>">
 <INPUT TYPE="hidden" NAME="action" VALUE="payment_results">
@@ -35,8 +34,8 @@
 <%= include('card') %>
 <TR>
   <TD COLSPAN=8>
-    <INPUT TYPE="checkbox" CHECKED NAME="save" VALUE="1">
-    Remember this information
+    <INPUT TYPE="checkbox" <%= $save_unchecked ? '' : 'CHECKED' %> NAME="save" VALUE="1">
+    Remember this card and billing address
   </TD>
 </TR><TR>
   <TD COLSPAN=8>
index b2900b1..4055ed0 100755 (executable)
@@ -1,5 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Pay now') %>
 
 <SCRIPT TYPE="text/javascript">
   function popcollect() {
@@ -13,8 +13,6 @@
 <SCRIPT TYPE="text/javascript" SRC="overlibmws_crossframe.js"></SCRIPT>
 <SCRIPT TYPE="text/javascript" SRC="iframecontentmws.js"></SCRIPT>
 
-<FONT SIZE=4>Pay now</FONT><BR><BR>
-
 <%= if ( $error ) {
   $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!;
 }else{
index 9b54794..0de7385 100644 (file)
@@ -1,5 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'My Account') %>
 
 Hello <%= $name %>!<BR><BR>
 <%= $small_custview %>
index 8765323..9d33036 100644 (file)
@@ -1,11 +1,15 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
 <TABLE BORDER=0><TR>
-<TD VALIGN="top" HEIGHT="100%" BGCOLOR="<%= $box_bgcolor || '#c0c0c0' %>">
+<TD VALIGN="top" BGCOLOR="<%= $menu_bgcolor || $box_bgcolor || '#c0c0c0' %>">
 
 <TABLE CELLSPACING=0 BORDER=0 HEIGHT="100%">
 
 <%= 
 
+if ( $menu_top_image ) {
+  $OUT .= '<TR><TD STYLE="padding:0px"><IMG SRC="image.cgi?menu_top_image"></TD></TR>';
+}
+
 my @menu = (
   { title=>' ' },
   { title=>'Overview', url=>'myaccount', size=>'+1', },
@@ -85,25 +89,43 @@ push @menu,
 
 foreach my $item ( @menu ) {
 
+  next if $menu_skipblanks && $item->{'title'} =~ /^\s*$/;
+  next if $menu_skipheadings && ! $item->{'url'};
+
   $OUT .= '<TR><TD'; 
-  if ( exists $item->{'url'} && $action eq $item->{'url'} ) {
-    $OUT .= ' BGCOLOR="'. ( $body_bgcolor || '#eeeeee' ). '" '.
-            ' STYLE="border-top: 1px solid black;'.
-                   ' border-left: 1px solid black;'.
-                   ' border-bottom: 1px solid black"';
+  if ( $menu_body_image ) {
+    if ( exists $item->{'url'} && $action eq $item->{'url'} ) {
+      $OUT .= #' BGCOLOR="'. ( $body_bgcolor || '#eeeeee' ). '" '.
+              ' STYLE="background: url(image.cgi?menu_body_image) 0 bottom; '.
+              '        color:#3366CC"; '. #XXX config
+              ' " ';
+    } else {
+      $OUT .= ' STYLE="background: url(image.cgi?menu_body_image) 0 bottom" ';
+    }
   } else {
-    $OUT .= ' STYLE="border-right: 1px solid black"';
+    if ( exists $item->{'url'} && $action eq $item->{'url'} ) {
+      $OUT .= ' BGCOLOR="'. ( $body_bgcolor || '#eeeeee' ). '" '.
+              ' STYLE="border-top: 1px solid black;'.
+                     ' border-left: 1px solid black;'.
+                     ' border-bottom: 1px solid black"';
+    } else {
+      $OUT .= ' STYLE="border-right: 1px solid black"';
+    }
   }
   $OUT.='>';
 
-  $OUT .= '&nbsp;' x $item->{'indent'}
-    if exists $item->{'indent'};
+  if ( $menu_skipheadings ) {
+    $OUT .= '&nbsp;&nbsp;';
+  } else {
+    $OUT .= '&nbsp;' x $item->{'indent'}
+      if exists $item->{'indent'};
+  }
 
   $OUT .= '<A HREF="'. $url. $item->{'url'}. '">'
     if exists $item->{'url'} && $action ne $item->{'url'};
 
-  $OUT .= '<FONT SIZE="'. $item->{'size'}. '">'
-    if exists $item->{'size'};
+  $OUT .= '<FONT SIZE="'. ( $menu_fontsize || $item->{'size'} ). '">'
+    if $menu_fontsize || exists($item->{'size'});
 
   $item->{'title'} =~ s/ /&nbsp;/g;
   $OUT .= $item->{'title'};
@@ -118,9 +140,13 @@ foreach my $item ( @menu ) {
 
 }
 
-%>
+if ( $menu_bottom_image ) {
+  $OUT .= '<TR><TD STYLE="padding:0px"><IMG SRC="image.cgi?menu_bottom_image"></TD></TR>';
+} else {
+  $OUT .= '<TR><TD STYLE="border-right: 1px solid black" HEIGHT="100%"><BR><BR><BR><BR></TD></TR>';
+}
 
-<TR><TD STYLE="border-right: 1px solid black" HEIGHT="100%"><BR><BR><BR><BR></TD></TR>
+%>
 
 </TABLE>
 
index 4abfd84..79335a0 100644 (file)
@@ -7,7 +7,7 @@ function enable_order_pkg () {
   }
 }
 </SCRIPT>
-<FONT SIZE=4>Purchase additional package</FONT><BR><BR>
+
 <%= if ( $error ) {
   $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!;
 } ''; %>
index 987b97e..9cdb65e 100644 (file)
@@ -1,7 +1,6 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Payment results') %>
 
-<FONT SIZE=4>Payment results</FONT><BR><BR>
 <%= if ( $error ) {
   $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error processing your payment: $error</FONT>!;
 } else {
index a440284..bf7ad77 100644 (file)
@@ -1,6 +1,4 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
-
+<%= include('header', 'Information updated successfully') %>
 <FONT SIZE=4>Information updated successfully.</FONT>
-
 <%= include('footer') %>
index ffe0cab..4eca91f 100644 (file)
@@ -1,5 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', "Password changed" ) %>
 
 <FONT SIZE=4>Password changed for <%= $value %> <%= $label %>.</FONT>
 
index a440284..e399aea 100644 (file)
@@ -1,6 +1,4 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
-
+<%= include('header', 'Information updated successfully' ) %>
 <FONT SIZE=4>Information updated successfully.</FONT>
-
 <%= include('footer') %>
index c7c69f0..bf15b6e 100644 (file)
@@ -1,6 +1,4 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
-
-<FONT SIZE=4>Package change successful.</FONT>
+<%= include('header', 'Package change successful') %>
 
 <%= include('footer') %>
index a440284..bf7ad77 100644 (file)
@@ -1,6 +1,4 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
-
+<%= include('header', 'Information updated successfully') %>
 <FONT SIZE=4>Information updated successfully.</FONT>
-
 <%= include('footer') %>
index b868937..649d920 100755 (executable)
@@ -1,5 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Package order successful') %>
 
 <FONT SIZE=4>Package order successful.</FONT>
 
index 9dfc328..4a16ec5 100644 (file)
@@ -1,5 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', "$svc recharged successfully") %>
 
 <FONT SIZE=4><%= $svc %> recharged successfully.</FONT>
 
index 39920cb..d6515e7 100644 (file)
@@ -1,5 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', "$svc setup successfully") %>
 
 <FONT SIZE=4><%= $svc %> setup successfully.</FONT>
 
index 103eb9e..c20aae0 100644 (file)
@@ -1,5 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', "$svc setup successfully") %>
 
 <FONT SIZE=4><%= $svc %> setup successfully.</FONT>
 
index f5b2c2b..7c0f861 100644 (file)
@@ -1,5 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Setup my services') %>
 
 <%= include('provision_list') %>
 
index bffd22f..bae5730 100644 (file)
@@ -1,5 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Setup account') %>
 
 <%= include('svc_acct') %>
 
index 6f0aa1f..c716e82 100644 (file)
@@ -1,7 +1,6 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Recharge with prepaid card') %>
 
-<FONT SIZE=4>Recharge with prepaid card</FONT><BR><BR>
 <FORM NAME="OneTrueForm" METHOD="POST" ACTION="<%=$selfurl%>" onSubmit="document.OneTrueForm.process.disabled=true">
 <INPUT TYPE="hidden" NAME="session" VALUE="<%=$session_id%>">
 <INPUT TYPE="hidden" NAME="action" VALUE="recharge_results">
index af15365..147b66b 100644 (file)
@@ -1,7 +1,6 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Recharge results') %>
 
-<FONT SIZE=4>Recharge results</FONT><BR><BR>
 <%= if ( $error ) {
   $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error processing your prepaid card: $error</FONT>!;
 } else {
index 734563b..2252852 100644 (file)
@@ -721,8 +721,12 @@ use HTML::Entities;
 use FS::SelfService qw(regionselector popselector domainselector location_form);
 
 #false laziness w/agent.cgi
+use vars qw(@INCLUDE_ARGS);
 sub include {
   my $name = shift;
+
+  @INCLUDE_ARGS = @_;
+
   my $template = new Text::Template( TYPE   => 'FILE',
                                      SOURCE => "$main::template_dir/$name.html",
                                      DELIMITERS => [ '<%=', '%>' ],
@@ -736,3 +740,4 @@ sub include {
 
 }
 
+1;
index 32bd632..6d4d847 100644 (file)
@@ -1,10 +1,10 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
-
-<FONT SIZE=4>Call usage for
-<%= Date::Format::time2str('%b&nbsp;%o&nbsp;%Y', $beginning) %> -
-<%= Date::Format::time2str('%b&nbsp;%o&nbsp;%Y', $ending) %>
-</FONT><BR><BR>
+<%= include('header', 'Call usage for '.
+                       Date::Format::time2str('%b&nbsp;%o&nbsp;%Y', $beginning).
+                       ' - '.
+                       Date::Format::time2str('%b&nbsp;%o&nbsp;%Y', $ending)
+           )
+%>
 
 <%= if ( $error ) {
   $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!;
index 8a1c1c7..072a414 100644 (file)
@@ -1,5 +1,5 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
+<%= include('header', 'Invoice') %>
 
 <%= $invoice_html %>
 
index b492102..6943763 100644 (file)
@@ -3,15 +3,14 @@
     @svc_phone = grep { $_->{svcdb} eq 'svc_phone' } @svcs;
     '';
 %>
-<%= include('header') %>
+<%= include('header', 'Account usage') %>
 
 <%= if ( $error ) {
   $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!;
 } ''; %>
 
 <%= if ( @svc_acct ) {
-      $OUT.= '<FONT SIZE="4">Account usage</FONT><BR><BR>
-              <TABLE BGCOLOR="#cccccc">
+      $OUT.= '<TABLE BGCOLOR="#cccccc">
                 <TR>
                   <TH ALIGN="left">Account</TH>
                   <TH ALIGN="right">Time remaining</TH>
index 9f02eba..c4cc177 100644 (file)
@@ -1,10 +1,10 @@
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header') %>
-
-<FONT SIZE=4>Service usage details for
-<%= Date::Format::time2str('%b&nbsp;%o&nbsp;%Y', $beginning) %> -
-<%= Date::Format::time2str('%b&nbsp;%o&nbsp;%Y', $ending) %>
-</FONT><BR><BR>
+<%= include('header', 'Service usage details for '.
+                      Date::Format::time2str('%b&nbsp;%o&nbsp;%Y', $beginning).
+                      ' - '.
+                      Date::Format::time2str('%b&nbsp;%o&nbsp;%Y', $ending)
+           )
+%>
 
 <%= if ( $error ) {
   $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!;
diff --git a/fs_selfservice/java/freeside_create_ticket_example.java b/fs_selfservice/java/freeside_create_ticket_example.java
new file mode 100755 (executable)
index 0000000..759a4a6
--- /dev/null
@@ -0,0 +1,85 @@
+
+import biz.freeside.SelfService;
+import org.apache.commons.logging.impl.SimpleLog; //included in apache xmlrpc
+import java.util.HashMap;
+import java.util.Vector;
+
+public class freeside_create_ticket_example {
+  private static SimpleLog logger = new SimpleLog("SelfService");
+
+  public static void main( String args[] ) throws Exception {
+    SelfService client =
+      new SelfService( "http://192.168.1.221:8081/xmlrpc.cgi" );
+
+    Vector params = new Vector();
+    params.addElement( "username" );
+    params.addElement( "4155551212" ); // svc_phone.phonenum
+    params.addElement( "password" );
+    params.addElement( "5454" );       // svc_phone.pin
+    params.addElement( "domain" );
+    params.addElement( "svc_phone" );
+    HashMap result = client.execute( "login", params );
+
+    String error = (String) result.get("error");
+
+    if (error.length() < 1) {
+
+      // successful login
+
+      String sessionId = (String) result.get("session_id");
+
+      logger.trace("[login] logged into freeside with session_id="+sessionId);
+
+      // store session id in your session store to be used for other calls
+
+      // like, say, this one to create a ticket
+
+      Vector ticket_params = new Vector();
+      ticket_params.addElement( "session_id" );
+      ticket_params.addElement( sessionId );
+      ticket_params.addElement( "queue" );
+      ticket_params.addElement( 3 ); // otherwise defaults to
+                                      // ticket_system-selfservice_queueid
+                                      // or ticket_system-default_queueid
+      ticket_params.addElement( "requestor" );         // these
+      ticket_params.addElement( "email@example.com" ); // are
+      ticket_params.addElement( "cc" );                // optional
+      ticket_params.addElement( "joe@example.com" );   // 
+      ticket_params.addElement( "subject" );
+      ticket_params.addElement( "Houston, we have a problem." );
+      ticket_params.addElement( "message" );
+      ticket_params.addElement( "The Oscillation Overthurster has gone out of alignment!<br><br>It needs to be fixed immediately!  <A HREF=\"http://linktest.freeside.biz/hi\">link test</A>" );
+      ticket_params.addElement( "mime_type" );
+      ticket_params.addElement( "text/html" );
+
+      HashMap ticket_result = client.execute( "create_ticket", ticket_params);
+
+      String error = (String) ticket_result.get("error");
+
+      if (error.length() < 1) {
+
+        // successful ticket creation
+
+        String ticketId = (String) ticket_result.get("ticket_id");
+
+        logger.trace("[login] ticket created with id="+ticketId);
+
+      } else {
+
+        // unsuccesful creating ticket
+
+        logger.warn("[login] error creating ticket: "+error);
+
+      }
+
+    }else{
+
+      // unsuccessful login
+
+      logger.warn("[login] error logging into freeside: "+error);
+
+      // display/say error message to user
+
+    }
+  }
+}
diff --git a/fs_selfservice/perl/xmlrpc-create_ticket.pl b/fs_selfservice/perl/xmlrpc-create_ticket.pl
new file mode 100755 (executable)
index 0000000..0ccada2
--- /dev/null
@@ -0,0 +1,41 @@
+#!/usr/bin/perl
+
+use strict;
+use Frontier::Client;
+use Data::Dumper;;
+
+my $server = new Frontier::Client (
+        url => 'http://localhost/selfservice/xmlrpc.cgi',
+);
+
+my $result = $server->call('FS.SelfService.XMLRPC.login',
+  'username' => '4155551212',
+  'password' => '5454',
+  'domain'   => 'svc_phone',
+);
+
+#print Dumper($result);
+die $result->{'error'} if $result->{'error'};
+
+my $session_id = $result->{'session_id'};
+warn "logged in with session_id $session_id\n";
+
+my $t_result = $server->call('FS.SelfService.XMLRPC.create_ticket',
+  'session_id' => $session_id,
+  'queue'      => 3, #otherwise defaults to ticket_system-selfservice_queueid
+                     #or ticket_system-default_queueid
+  'requestor'  => 'harveylala@example.com',
+  'cc'         => 'chiquitabanana@example.com',
+  'subject'    => 'Chiquita keeps sitting on me',
+  'message'    => 'Is there something you can do about this?<BR><BR>She keeps waking me up!  <A HREF="http://linktest.freeside.biz/hi">link test</A>',
+  'mime_type'  => 'text/html',
+);
+
+die $t_result->{'error'} if $t_result->{'error'};
+
+warn Dumper($t_result);
+
+my $ticket_id = $t_result->{'ticket_id'};
+warn "ticket $ticket_id created\n";
+
+1;
index 321025b..3162e3a 100644 (file)
@@ -49,13 +49,29 @@ my $groups_sub = sub {
 
 };
 
+my $cust_sub = sub {
+  my $access_user = shift;
+  $access_user->user_custnum ? $access_user->user_cust_main->name : '';
+};
+my $cust_link = [ $p.'view/cust_main.cgi?custnum=', 'user_custnum' ];
+
 my $count_query = 'SELECT COUNT(*) FROM access_user';
 
 my $link = [ $p.'edit/access_user.html?', 'usernum' ];
 
-my @header = ( '#',       'Username', 'Full name', 'Groups'    );
-my @fields = ( 'usernum', 'username', 'name',      $groups_sub );
-my $align = 'rlll';
-my @links = ( $link, $link, $link, '' );
+my @header = ( '#',       'Username', 'Full name', 'Groups',    'Customer' );
+my @fields = ( 'usernum', 'username', 'name',      $groups_sub, $cust_sub, );
+my $align = 'rllll';
+my @links = ( $link, $link, $link, '', $cust_link );
+
+#if ( FS::Conf->new->config('ticket_system') ) {
+#  push @header, 'Ticketing';
+#  push @fields, sub {
+#    my $access_user = shift;
+#
+#  };
+#  $align .= 'l';
+#  push @links, '';
+#}
 
 </%init>
index 04e0e23..fb70ee4 100644 (file)
@@ -6,7 +6,7 @@
                                     ],
                  'query'         => { 'table' => 'part_pkg_taxclass', },
                  'count_query'   => 'SELECT COUNT(*) FROM part_pkg_taxclass',
-                 'header'        => [ '#', 'Device type' ],
+                 'header'        => [ '#', 'Tax class' ],
                  'fields'        => [ 'taxclassnum',
                                       'taxclass',
                                     ],
index 23bc23f..3371926 100644 (file)
@@ -15,6 +15,7 @@
                            'Region',
                            'Prefix(es)',
                            'Included<BR>minutes',
+                           'Connection<BR>charge',
                            'Charge per<BR>minute',
                            'Granularity',
                            'Usage class',
      'fields'         => [
                            'regionname',
                            sub { shift->dest_region->prefixes_short },
-                           sub { shift->min_included.
-                                 '&nbsp;<FONT SIZE="-1">(edit)</FONT>';
-                               },
-                           sub { $money_char. shift->min_charge.
-                                 '&nbsp;<FONT SIZE="-1">(edit)</FONT>';
-                               },
+                           sub { shift->min_included. $edit_hint },
+                           $conn_charge_sub,
+                           sub { $money_char. shift->min_charge. $edit_hint },
                            sub { $granularity{ shift->sec_granularity } },
                            'classname',
                          ],
@@ -39,6 +37,7 @@
 <%once>
 
 tie my %granularity, 'Tie::IxHash', FS::rate_detail::granularities();
+tie my %conn_secs,   'Tie::IxHash', FS::rate_detail::conn_secs();
 
 my $conf = new FS::Conf;
 my $money_char = $conf->config('money_char') || '$';
@@ -59,6 +58,15 @@ my $edit_onclick = sub {
              #default# 'color'       => '#333399',
          );
 };
+my $edit_hint = '&nbsp;<FONT SIZE="-1">(edit)</FONT>';
+
+my $conn_charge_sub = sub {
+   my $rate_detail = shift;
+   #return '' unless $rate_detail->conn_charge > 0 || $rate_detail->conn_sec;
+   $money_char. $rate_detail->conn_charge.
+     ($rate_detail->conn_sec ? ' for '.$conn_secs{$rate_detail->conn_sec} : '').
+     $edit_hint;
+};
 
 </%once>
 <%init>
index 13286cf..08f6c10 100644 (file)
@@ -43,7 +43,10 @@ Click on a configuration value to change it.
   <TABLE BGCOLOR="#cccccc" BORDER=1 CELLSPACING=0 CELLPADDING=0 BORDERCOLOR="#999999">
   <tr>
     <th colspan="2" bgcolor="#dcdcdc">
-      <% ucfirst($section || 'unclassified') %> configuration options
+      <% ucfirst($section || 'unclassified') %>
+%     if ( $curuser->option('show_confitem_counts') ) {
+        (<% scalar( @{ $section_items{$section} } ) %> items)
+%     }
     </th>
   </tr>
 % foreach my $i (@{ $section_items{$section} }) { 
@@ -319,8 +322,9 @@ my %namecol = (
 </%once>
 <%init>
 
-die "access denied"
-  unless $FS::CurrentUser::CurrentUser->access_right('Configuration');
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+die "access denied" unless $curuser->access_right('Configuration');
 
 my $page_agent = '';
 my $title;
@@ -345,7 +349,7 @@ my @config_items = grep { $page_agent ? $_->per_agent : 1 }
 my @deleteable = qw( invoice_latexreturnaddress invoice_htmlreturnaddress );
 my %deleteable = map { $_ => 1 } @deleteable;
 
-my @sections = qw(required billing username password UI session shell BIND );
+my @sections = qw(required billing invoicing UI self-service username password session shell BIND );
 push @sections, '', 'deprecated';
 
 my %section_items = ();
index 04af73d..056c17c 100644 (file)
@@ -8,7 +8,7 @@
 </CENTER>
 
 <CENTER>
-<FONT SIZE="-1">&copy; 2009 Freeside Internet Services, Inc.<BR>
+<FONT SIZE="-1">&copy; 2010 Freeside Internet Services, Inc.<BR>
 All rights reserved.<BR>
 Licensed under the terms of the<BR>
 GNU <b>Affero</b> General Public License.<BR>
@@ -29,7 +29,7 @@ GNU <b>Affero</b> General Public License.<BR>
 <BR>
 
 <CENTER>
-<FONT SIZE="-3">"I need a miracle every day." -J.P. Barlow</FONT>
+<FONT SIZE="-3">"Put your gold money where your love is, baby" -R. Hunter</FONT>
 </CENTER>
 
 <SCRIPT TYPE="text/javascript">
index d927722..10b9e70 100644 (file)
@@ -36,12 +36,13 @@ Peter Bowen<BR>
 Jeremy Davis<BR>
 Jeff Finucane<BR>
 Jason Hall<BR>
-Kristian Hoffman<BR>
 Ivan Kohler<BR>
 Richard Siddall<BR>
+Mark Wells<BR>
 <BR>
 
 <H3>Core Emeritus</H3>
+Kristian Hoffman<BR>
 Brian McCane<BR>
 Matt Simerson<BR>
 <BR>
@@ -90,7 +91,6 @@ Audrey Tang<BR>
 Jason Thomas<BR>
 Jesse Vincent<BR>
 Johan Vromans<BR>
-Mark Wells<BR>
 Peter Wemm<BR>
 Mark Williamson<BR>
 Tim Yardley<BR>
diff --git a/httemplate/docs/man/FS/part_export/.cvs_is_on_crack b/httemplate/docs/man/FS/part_export/.cvs_is_on_crack
deleted file mode 100644 (file)
index e69de29..0000000
index c312138..29c8ca6 100755 (executable)
@@ -94,7 +94,7 @@
   <SCRIPT TYPE="text/javascript">
     Calendar.setup({
       inputField: "<% $column %>_text",
-      ifFormat:   "%m/%d/%Y",
+      ifFormat:   "<% $date_format %>",
       button:     "<% $column %>_button",
       align:      "BR"
     });
 </FORM>
 
 <% include('/elements/footer.html') %>
+<%shared>
 
-<%once>
+my $conf = new FS::Conf;
+my $date_format = $conf->config('date_format') || '%m/%d/%Y';
 
-#my $format = "%c %z (%Z)";
-my $format = "%m/%d/%Y %T %z (%Z)";
+my $format = $date_format. ' %T %z (%Z)';
 
-#false laziness w/view/cust_main/packages.html
-#my( $billed_or_prepaid,
-
-</%once>
+</%shared>
 <%init>
 
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Edit customer package dates');
 
+
 my $error = '';
 my( $pkgnum, $cust_pkg );
 
index 73488ef..1f52b47 100644 (file)
@@ -7,16 +7,18 @@
                                { field=>'_password2', type=>'password' },
                                'last',
                                'first',
+                               { field=>'user_custnum', type=>'search-cust_main', },
                                { field=>'disabled', type=>'checkbox', value=>'Y' },
                              ],
                  'labels' => { 
-                               'usernum'   => 'User number',
-                               'username'  => 'Username',
-                               '_password' => 'Password',
-                               '_password2'=> 'Re-enter Password',
-                               'last'      => 'Last name',
-                               'first'     => 'First name',
-                               'disabled'  => 'Disable employee',
+                               'usernum'      => 'User number',
+                               'username'     => 'Username',
+                               '_password'    => 'Password',
+                               '_password2   '=> 'Re-enter Password',
+                               'last'         => 'Last name',
+                               'first'        => 'First name',
+                               'user_custnum' => 'Customer (optional)',
+                               'disabled'     => 'Disable employee',
                              },
                  'edit_callback' => sub { my( $c, $o ) = @_; 
                                           $o->set('_password', '');
index febf281..dc80847 100755 (executable)
@@ -14,7 +14,7 @@
 
   <TR>
     <TD ALIGN="right">Date</TD>
-    <TD BGCOLOR="#ffffff"><% time2str("%D",$_date) %></TD>
+    <TD BGCOLOR="#ffffff"><% time2str($date_format, $_date) %></TD>
   </TR>
 
   <TR>
 </FORM>
 </BODY>
 </HTML>
-<%once>
+<%init>
 
 my $conf = new FS::Conf;
-
-</%once>
-<%init>
+my $date_format = $conf->config('date_format') || '%m/%d/%Y';
 
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Post credit');
index 0410506..d1d4368 100644 (file)
@@ -43,6 +43,7 @@
 %if ( $cust_main->referral_custnum
 %     and $referring_cust_main =
 %           qsearchs('cust_main', { custnum => $cust_main->referral_custnum } )
+%     and ! $curuser->access_right('Edit referring customer')
 %) {
 
   <TR>
@@ -52,8 +53,8 @@
     </TD>
   </TR>
   <INPUT TYPE="hidden" NAME="referral_custnum" VALUE="<% $cust_main->referral_custnum %>">
-% } elsif ( ! $conf->exists('disable_customer_referrals') ) { 
 
+% } elsif ( ! $conf->exists('disable_customer_referrals') ) { 
 
   <TR>
     <TD ALIGN="right">Referring customer</TD>
       <!-- <INPUT TYPE="text" NAME="referral_custnum" VALUE=""> -->
       <% include('/elements/search-cust_main.html',
                     'field_name' => 'referral_custnum',
+                    'curr_value' => $cust_main->referral_custnum,
                  )
       %>
     </TD>
   </TR>
-% } else { 
-
 
+% } else { 
   <INPUT TYPE="hidden" NAME="referral_custnum" VALUE="">
 % } 
 
@@ -77,7 +78,7 @@
                   'name'        => 'signupdate',
                   'value'       => $cust_main->signupdate,
                   'label'       => 'Signup date',
-                  'format'      => $conf->config('date_format') || "%m/%d/%Y",
+                  'format'      => ( $conf->config('date_format') || "%m/%d/%Y" ),
               })
     %>
 % }
@@ -92,6 +93,8 @@ my $custnum = $opt{'custnum'};
 
 my $conf = new FS::Conf;
 
+my $curuser = $FS::CurrentUser::CurrentUser;
+
 my $r = qq!<font color="#ff0000">*</font>&nbsp;!;
 
 </%init>
index 6c6a1a9..e2501cb 100755 (executable)
@@ -6,11 +6,11 @@
 <INPUT TYPE="hidden" NAME="custnum" VALUE="<% $custnum %>">
 <INPUT TYPE="hidden" NAME="notenum" VALUE="<% $notenum %>">
 
-
-<BR><BR>
-<TEXTAREA NAME="comment" ROWS="12" COLS="60">
-<% $comment %>
-</TEXTAREA>
+<% include('/elements/htmlarea.html', 'field' => 'comment',
+                                      'curr_value' => $comment) %>
+% #<TEXTAREA NAME="comment" ROWS="12" COLS="60">
+% # <% $comment %>
+% #</TEXTAREA>
 
 <BR><BR>
 <INPUT TYPE="submit" VALUE="<% $notenum ? "Apply Changes" : "Add Note" %>">
@@ -33,6 +33,8 @@ if ( $cgi->param('error') ) {
   $comment = $note->comments;
 }
 
+$comment =~ s/\r//g; # remove weird line breaks to protect FCKeditor
+
 $cgi->param('custnum') =~ /^(\d+)$/ or die "illeagl custnum";
 my $custnum = $1;
 
index 07e5198..a6b73b1 100755 (executable)
@@ -26,7 +26,7 @@ Payment
 <TR>
   <TD ALIGN="right">Date</TD>
   <TD COLSPAN=2>
-    <INPUT TYPE="text" NAME="_date" ID="_date_text" VALUE="<% time2str("%m/%d/%Y %r",$_date) %>">
+    <INPUT TYPE="text" NAME="_date" ID="_date_text" VALUE="<% time2str($date_format.' %r',$_date) %>">
     <IMG SRC="../images/calendar.png" ID="_date_button" STYLE="cursor: pointer" TITLE="Select date">
   </TD>
 </TR>
@@ -34,7 +34,7 @@ Payment
 <SCRIPT TYPE="text/javascript">
   Calendar.setup({
     inputField: "_date_text",
-    ifFormat:   "%m/%d/%Y",
+    ifFormat:   "<% $date_format %>",
     button:     "_date_button",
     align:      "BR"
   });
@@ -100,7 +100,8 @@ Payment
 
 my $conf = new FS::Conf;
 
-my $money_char = $conf->config('money_char') || '$';
+my $money_char  = $conf->config('money_char')  || '$';
+my $date_format = $conf->config('date_format') || '%m/%d/%Y';
 
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Post payment');
index 94c0993..59417b4 100755 (executable)
     </TR>
 
   <TR>
-    <TD ALIGN="right">Date</TD><TD BGCOLOR="#ffffff"><% time2str("%D",$cust_pay->_date) %></TD>
+    <TD ALIGN="right">Date</TD><TD BGCOLOR="#ffffff"><% time2str($date_format, $cust_pay->_date) %></TD>
   </TR>
 
   <TR>
     <TD ALIGN="right">Method</TD><TD BGCOLOR="#ffffff"><% $payby %> # <% $paymask %></TD>
   </TR>
 
-% unless ( $paydate ) {  # possibly other reasons: i.e. card has since expired
+% unless ( $paydate || $cust_pay->payby ne 'CARD' ) {  # possibly other reasons: i.e. card has since expired
   <TR>
     <TD ALIGN="right">Expiration</TD><TD BGCOLOR="#ffffff">
       <% include( '/elements/select-month_year.html',
@@ -93,7 +93,7 @@
 
   <TR>
     <TD ALIGN="right">Date</TD>
-    <TD BGCOLOR="#ffffff"><% time2str("%D",$_date) %></TD>
+    <TD BGCOLOR="#ffffff"><% time2str($date_format, $_date) %></TD>
   </TR>
 
   <TR>
@@ -134,6 +134,8 @@ die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Refund payment');
 
 my $conf = new FS::Conf;
+my $date_format = $conf->config('date_format') || '%m/%d/%Y';
+
 my $custnum = $cgi->param('custnum');
 my $refund  = $cgi->param('refund');
 my $payby   = $cgi->param('payby');
index a485d37..1fc8a09 100644 (file)
@@ -52,7 +52,7 @@ Examples:
 
 <TR>
   <TD ALIGN="right">Date: </TD>
-  <TD><B><% time2str("%D", $src->_date) %></B></TD>
+  <TD><B><% time2str($date_format, $src->_date) %></B></TD>
 </TR>
 
 <TR>
@@ -107,7 +107,7 @@ Apply to:
 <OPTION VALUE="">Select <% $dst_thing %>
 
 % foreach my $dst ( @dst ) { 
-  <OPTION<% $dst->$dst_pkey eq $dst_pkeyvalue ? ' SELECTED' : '' %> VALUE="<% $dst->$dst_pkey %>">#<% $dst->$dst_pkey %> - <% time2str("%D", $dst->_date) %> - $<% $dst->$dst_unapplied %>
+  <OPTION<% $dst->$dst_pkey eq $dst_pkeyvalue ? ' SELECTED' : '' %> VALUE="<% $dst->$dst_pkey %>">#<% $dst->$dst_pkey %> - <% time2str($date_format, $dst->_date) %> - $<% $dst->$dst_unapplied %>
 % } 
 
 </SELECT>
@@ -133,7 +133,8 @@ Apply to:
 my %opt = @_;
 
 my $conf = new FS::Conf;
-my $money_char = $conf->config('money_char') || '$';
+my $money_char  = $conf->config('money_char')  || '$';
+my $date_format = $conf->config('date_format') || '%m/%d/%Y';
 
 my $src_thing = ucfirst($opt{'src_thing'});
 my $src_table = $opt{'src_table'};
index fd73e03..1a1023c 100644 (file)
@@ -40,8 +40,10 @@ Example:
                     'disabled' => 0,
                     'onchange' => 'javascript_function',
 
-                    #m2 stuff only tested w/selectlayers so far
-                    #might work w/select too, dunno others
+                    'include_opt_callback' => sub { my $object = @_;
+                                                    ( 'option' => 'value', );
+                                                  },
+
                     'm2name_table'   => 'table_name',
                     'm2name_namecol' => 'name_column',
                     #OR#
@@ -276,9 +278,13 @@ Example:
 %   $include_common{$_} = $f->{$_}
 %     foreach grep exists($f->{$_}), qw( empty_label );
 %
+%   #select-table
+%   $include_common{$_} = $f->{$_}
+%     foreach grep exists($f->{$_}), qw( value_col extra_sql );
+%
 %   #select-table, checkboxes-table
 %   $include_common{$_} = $f->{$_}
-%     foreach grep exists($f->{$_}), qw( table name_col );
+%     foreach grep exists($f->{$_}), qw( table name_col  );
 %
 %   #checkboxes-table
 %   $include_common{$_} = $f->{$_}
@@ -290,9 +296,17 @@ Example:
 %
 %   if ( $type eq 'tablebreak-tr-title' ) {
 %     $include_common{'table_id'} = 'TableNumber'. $tablenum++;
+%   }
+%   if ( $type eq 'tablebreak-tr-title' || $type eq 'title' ) {
 %     $include_common{'colspan'} = $f->{colspan} if $f->{colspan};
 %   }
 %
+%   if ( $f->{include_opt_callback} ) {
+%     %include_common = ( %include_common,
+%                         &{ $f->{include_opt_callback} }( $object )
+%                       );
+%   }
+%
 %   my $layer_prefix_on = '';
 %
 %   my $include_sub = sub {
index ef04bd0..36950b2 100644 (file)
                  'new_hashref_callback' => sub {
                    #my( $cgi, $svc_x ) = @_;
 
-                   { svcpart => $svcpart };
+                   { pkgnum  => $pkgnum,
+                     svcpart => $svcpart,
+                   };
 
                  },
 
                  'new_callback' => sub {
-                    my( $cgi, $svc_x, $fields, $opt ) = @_;;
+                    my( $cgi, $svc_x, $fields, $opt ) = @_;
 
                     $part_svc = qsearchs( 'part_svc', { svcpart=>$svcpart });
                     die "No part_svc entry!" unless $part_svc;
 
                     #$svcnum='';
 
+                    if ( my $cb = $opt{'svc_new_callback'} ) {
+                     my $cust_pkg = $pkgnum
+                                      ? qsearchs('cust_pkg', {pkgnum=>$pkgnum})
+                                      : ''; #?
+                      &{ $cb }( $cgi,$svc_x, $part_svc,$cust_pkg, $fields,$opt);
+                    }
+
                     $svc_x->set_default_and_fixed;
 
                  },
 
                  'field_callback' => sub {
                    my ($cgi, $object, $f) = @_;
+
                    my $columndef = $part_svc->part_svc_column($f->{'field'});
                    my $flag = $columndef->columnflag;
                    if ( $flag eq 'F' ) {
                                       ? 'fixed'
                                       : 'hidden';
                      $f->{'value'} = $columndef->columnvalue;
+                   } elsif ( $flag eq 'A' ) {
+                     $f->{'type'} = 'hidden';
+                   } elsif ( $flag eq 'M' ) {
+                     $f->{'empty_label'} = 'Select inventory item';
+                     $f->{'type'}        = 'select-table';
+                     $f->{'table'}       = 'inventory_item';
+                     $f->{'name_col'}    = 'item'; 
+                     $f->{'value_col'}   = 'item'; 
+                     $f->{'hashref'}     = {
+                                            'classnum'=>$columndef->columnvalue,
+                                            #'svcnum'  => '',
+                                           };
+                     $f->{'extra_sql'}   = 'AND ( svcnum IS NULL ';
+                     $f->{'extra_sql'}  .= ' OR svcnum = '. $object->svcnum
+                       if $object->svcnum;
+                     $f->{'extra_sql'}  .= ' ) ';
+                     $f->{'disable_empty'} = $object->svcnum ? 1 : 0,
+                   }
+
+                   if (    $f->{'type'} eq 'select-svc_pbx'
+                        || $f->{'type'} eq 'select-svc-domain' 
+                      )
+                   {
+                     $f->{'include_opt_callback'} =
+                       sub { ( 'pkgnum'  => $pkgnum,
+                               'svcpart' => $svcpart,
+                             );
+                           };
+                   }
+
+                   if ( $f->{'field'} eq 'custnum' && $pkgnum ) {
+                     my $cust_pkg = qsearchs('cust_pkg', {'pkgnum' => $pkgnum});
+                     $object->set('custnum', $cust_pkg->custnum);
                    }
+
                  },
 
                  'html_init' => sub {
 sub label_fixup {
   my( $part_svc, $opt ) = @_;
 
+  $opt->{'name'} ||= $part_svc->svc;
+
+  my $svcdb = $part_svc->svcdb;
+  require "FS/$svcdb.pm";
+
+  if ( UNIVERSAL::can("FS::$svcdb", 'table_info') ) {
+    #$opt->{'name'} ||= "FS::$svcdb"->table_info->{'name'};
+
+    my $fields = "FS::$svcdb"->table_info->{'fields'};
+    $opt->{'fields'} ||= [ grep { $_ ne 'svcnum' } keys %$fields ];
+
+    $opt->{labels} ||= {
+                         map { $_ => ( ref($fields->{$_})
+                                         ? $fields->{$_}{'label'}
+                                         : $fields->{$_}
+                                     );
+                             }
+                         keys %$fields
+                       };
+  }
+
   #false laziness w/view/svc_Common.html
   #override default labels with service-definition labels if applicable
   my $labels = $opt->{labels}; # with -> here
-  foreach my $field ( keys %$labels ) {
+  foreach my $field ( keys %{ $opt->{labels} } ) {
     my $col = $part_svc->part_svc_column($field);
-    $labels->{$field} = $col->columnlabel if $col->columnlabel !~ /^\S*$/;
+    $labels->{$field} = $col->columnlabel if $col->columnlabel !~ /^\s*$/;
   }
 
 }
diff --git a/httemplate/edit/mailinglistmember.html b/httemplate/edit/mailinglistmember.html
new file mode 100644 (file)
index 0000000..2391cb6
--- /dev/null
@@ -0,0 +1,25 @@
+<% include( 'elements/edit.html',
+              'name_singular' => 'member',
+              'table'         => 'mailinglistmember',
+              'popup'         => 1,
+              'fields'        => [
+                { field=>'listnum', type=>'hidden', },
+                { field=>'svcnum', type=>'hidden', }, #not yet
+                { field=>'contactemailnum', type=>'hidden', }, #not yet
+                { field=>'email', type=>'text', },
+              ],
+              'labels' => { 'membernum' => 'Member',
+                            'email'     => 'Email address',
+                          },
+              'new_callback' => $new_callback,
+          )
+%>
+<%init>
+
+my $new_callback = sub {
+  #my( $cgi, $object, $fields_listref, $opt_hashref ) = @_;
+  my( $cgi, $object ) = @_;
+  $object->listnum( $cgi->param('listnum') );
+};
+
+</%init>
index 4f2fe93..146070f 100644 (file)
@@ -6,6 +6,7 @@
                                'devicename' => 'Device name',
                              },
                  'viewall_dir' => 'browse',
+                 'html_bottom' => $html_bottom_sub,
            )
 %>
 <%init>
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Configuration');
 
+my $extra_sql =
+  join( ' OR ', map { "exporttype = '$_'" }
+                keys %{FS::part_export::export_info('part_device')}
+      );
+$extra_sql = $extra_sql ? " WHERE ( $extra_sql ) " : " WHERE 0 = 1 ";
+
+my $html_bottom_sub = sub {
+  my $part_device = shift;
+
+  '<BR>'.
+  '<FONT SIZE="+1">Exports</FONT><BR>'.
+
+  '<TABLE BGCOLOR="#cccccc" WIDTH=100%>'.
+  '<TR><TD>'.
+  include( '/elements/checkboxes-table.html',
+             'source_obj'    => $part_device,
+             'link_table'    => 'export_device',
+             'target_table'  => 'part_export',
+             'extra_sql'     => $extra_sql,
+             'name_callback' => sub { my $o = shift;
+                                      $o->exporttype. ' to '. $o->machine;
+                                    },
+         ).
+  '</TD></TR></TABLE>';
+
+};
+
 </%init>
+
index a02545f..f9818c4 100755 (executable)
 
                             { type => 'columnend' },
 
-                            { 'type'  => $census ? 'tablebreak-tr-title'
-                                                 : 'hidden',
+                            { 'type'  => $report_option ? 'tablebreak-tr-title'
+                                                        : 'hidden',
                               'value' => 'Optional report classes',
                               'field' => 'census_title',
                             },
                             { 'field'    => 'report_option',
-                              'type'     => $census ? 'select-table' : 'hidden',
+                              'type'     => $report_option ? 'select-table'
+                                                           : 'hidden',
                               'table'    => 'part_pkg_report_option',
                               'name_col' => 'name',
+                              'hashref'  => { 'disabled' => '' },
                               'multiple' => 1,
                             },
 
@@ -256,7 +258,7 @@ my $sth = dbh->prepare("SELECT COUNT(*) FROM part_pkg_report_option".
                        "  WHERE disabled IS NULL OR disabled = ''  ")
   or die dbh->errstr;
 $sth->execute or die $sth->errstr;
-my $census = $sth->fetchrow_arrayref->[0];
+my $report_option = $sth->fetchrow_arrayref->[0];
 
 #XXX
 # - tr-part_pkg_freq: month_increments_only (from price plans)
@@ -409,7 +411,6 @@ my $m2_error_callback_maker = sub {
   my $link_type = shift; #yay closures
   return sub {
     my( $cgi, $object ) = @_;
-    my $num;
     map {
 
           if ( /^${link_type}_dst_pkgpart(\d+)$/ &&
index 7970343..98ed9fe 100755 (executable)
@@ -15,10 +15,12 @@ Disable new orders <INPUT TYPE="checkbox" NAME="disabled" VALUE="Y"<% $hashref->
 Service definitions are the templates for items you offer to your customers.
 <UL><LI>svc_acct - Accounts - anything with a username (Mailboxes, PPP accounts, shell accounts, RADIUS entries for broadband, etc.)
     <LI>svc_domain - Domains
-    <LI>svc_forward - mail forwarding
+    <LI>svc_forward - Mail forwarding
+    <LI>svc_mailinglist - Mailing list
     <LI>svc_www - Virtual domain website
     <LI>svc_broadband - Broadband/High-speed Internet service (always-on)
     <LI>svc_phone - Customer phone numbers
+    <LI>svc_pbx - Customer PBXs
     <LI>svc_external - Externally-tracked service
 <!--   <LI>svc_charge - One-time charges (Partially unimplemented)
        <LI>svc_wo - Work orders (Partially unimplemented)
@@ -64,10 +66,9 @@ that field.
 %             'condition' =>
 %               sub { !ref($_[0]) || $_[0]->{disable_select} }, 
 %           },
-%# need to template-ize httemplate/edit/svc_* first
-%#    'M' => { 'desc' => 'Manual selection from inventory',
-%#             'condition' => $inv_sub,
-%#           },
+%    'M' => { 'desc' => 'Manual selection from inventory',
+%             'condition' => $inv_sub,
+%           },
 %    'A' => { 'desc' => 'Automatically fill in from inventory',
 %             'condition' => $inv_sub,
 %           },
@@ -184,6 +185,9 @@ that field.
 %
 %          foreach my $f ( keys %flag ) {
 %
+%            # need to template-ize more httemplate/edit/svc_* first
+%            next if $f eq 'M' and $layer !~ /^svc_(broadband|external|phone)$/;
+%
 %            #here is where the SUB from above is called, to skip some choices
 %            next if $flag{$f}->{condition}
 %                 && &{ $flag{$f}->{condition} }( $def, $layer, $field );
@@ -265,6 +269,14 @@ that field.
 %                             'empty_label'  => 'Select inventory class',
 %                          );
 %
+%        } elsif ( $def->{type} eq 'checkbox' ) {
+%
+%          $html .= include('/elements/checkbox.html',
+%                             'field'      => $layer.'__'.$field,
+%                             'curr_value' => $value,
+%                             'value'      => 'Y',
+%                          );
+%
 %        } elsif ( $def->{type} eq 'select' ) {
 %
 %          $html .= qq!<SELECT NAME="${layer}__${field}" $disabled!;
@@ -288,6 +300,15 @@ that field.
 %          } #endif
 %          $html .= '</SELECT>';
 %
+%        } elsif ( $def->{type} eq 'select-svc_pbx.html' ) {
+%
+%          $html .= include('/elements/select-svc_pbx.html',
+%                             'curr_value'   => $value,
+%                             'element_name' => "${layer}__${field}",
+%                             'element_etc'  => $disabled,
+%                             'multiple'     => ($flag eq 'S'),
+%                          );
+%
 %        } elsif ( $def->{type} eq 'radius_usergroup_selector' ) {
 %
 %          #XXX disable the RADIUS usergroup selector?  ugh it sure does need
@@ -296,6 +317,14 @@ that field.
 %          $html .= FS::svc_acct::radius_usergroup_selector(
 %            [ split(',', $value) ], "${layer}__${field}" );
 %
+%        } elsif ( $def->{type} eq 'communigate_pro-accessmodes' ) {
+%
+%          $html .= include('/elements/communigate_pro-accessmodes.html',
+%                             'element_name_prefix' => "${layer}__${field}_",
+%                             'curr_value'          => $value,
+%                             #doesn't work#'element_etc'  => $disabled,
+%                          );
+%
 %        } elsif ( $def->{type} eq 'disabled' ) {
 %
 %          $html .=
@@ -303,7 +332,7 @@ that field.
 %
 %        } else {
 %
-%          $html .= '<font color="#ff0000">unknown type'. $def->{type};
+%          $html .= '<font color="#ff0000">unknown type '. $def->{type};
 %
 %        }
 %
index 22aab44..b5796eb 100755 (executable)
@@ -39,14 +39,15 @@ push @errors, '_setup_areyousure'
   && ! $cgi->param('setup_areyousure');      # and it wasn't confirmed 
 
 push @errors, '_start'
-  if $hash{'start_date'} && $old->start_date # if a start date was added
-  && $hash{'setup'};                         # but there's a setup date
+  if $hash{'start_date'} && !$old->start_date # if a start date was added
+  && $hash{'setup'};                          # but there's a setup date
 
 my $new;
 my $error;
 if ( @errors ) {
   $error = join(',', @errors);
 } else {
+  warn join(',',%hash);
   $new = new FS::cust_pkg \%hash;
   $error = $new->replace($old);
 }
diff --git a/httemplate/edit/process/mailinglistmember.html b/httemplate/edit/process/mailinglistmember.html
new file mode 100644 (file)
index 0000000..f1842b8
--- /dev/null
@@ -0,0 +1,6 @@
+<% include( 'elements/process.html',
+              'table'        => 'mailinglistmember',
+              'popup_reload' => 'Member added',
+          )
+%>
+%#XXX ACL
index 882991e..8036f73 100755 (executable)
@@ -39,7 +39,7 @@ my @dest_detail = map {
   new FS::rate_detail {
     'ratenum'  => $ratenum,
     map { $_ => $cgi->param("$_$ratenum") }
-        qw( min_included min_charge sec_granularity classnum )
+        qw( min_included conn_charge conn_sec min_charge sec_granularity classnum )
   };
 } qsearch('rate', {} );
 
index 515d89e..0d2c007 100755 (executable)
@@ -11,7 +11,6 @@ die "access denied"
 
 $cgi->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!";
 my $svcnum = $1;
-my $error;
 
 my $old;
 if ( $svcnum ) {
@@ -32,6 +31,18 @@ foreach (map { $_,$_."_threshold" } qw( upbytes downbytes totalbytes )) {
   $cgi->param($_, FS::UI::bytecount::parse_bytecount($cgi->param($_)) );
 }
 
+#unmunge cgp_accessmodes (falze laziness-ish w/part_svc.pm::process &svc_domain)
+unless ( $cgi->param('cgp_accessmodes') ) {
+  $cgi->param('cgp_accessmodes', 
+    join(' ',
+      sort map { /^cgp_accessmodes_([\w\/]+)$/ or die "no way"; $1; }
+               grep $cgi->param($_),
+                    grep /^cgp_accessmodes_([\w\/]+)$/,
+                         $cgi->param()
+        )
+  );
+}
+
 my %hash = $svcnum ? $old->hash : ();
 map {
     $hash{$_} = scalar($cgi->param($_));
@@ -40,27 +51,31 @@ map {
   } (fields('svc_acct'), qw ( pkgnum svcpart usergroup ));
 my $new = new FS::svc_acct ( \%hash );
 
+my $error = '';
+
 $new->_password($old->_password) if $old;
-if(  $cgi->param('clear_password') eq '*HIDDEN*'
-  or $cgi->param('clear_password') =~ /^\(.* encrypted\)$/ ) {
+if (     $cgi->param('clear_password') eq '*HIDDEN*'
+      || $cgi->param('clear_password') =~ /^\(.* encrypted\)$/ ) {
   die "fatal: no previous account to recall hidden password from!" unless $old;
-} 
-else {
+} else {
   $error = $new->set_password($cgi->param('clear_password'));
 }
 
 if ( $svcnum ) {
-  foreach (grep { $old->$_ != $new->$_ } qw( seconds upbytes downbytes totalbytes )) {
+  foreach ( grep { $old->$_ != $new->$_ }
+                 qw( seconds upbytes downbytes totalbytes )
+          )
+  {
     my %hash = map { $_ => $new->$_ } 
                grep { $new->$_ }
                qw( seconds upbytes downbytes totalbytes );
 
-    $error = $new->set_usage(\%hash);  #unoverlimit and trigger radius changes
-    last;                              #once is enough
+    $error ||= $new->set_usage(\%hash);  #unoverlimit and trigger radius changes
+    last;                                #once is enough
   }
   $error ||= $new->replace($old);
 } else {
-  $error = $new->insert;
+  $error ||= $new->insert;
   $svcnum = $new->svcnum;
 }
 
index 59b5180..381339b 100755 (executable)
@@ -15,6 +15,30 @@ $FS::svc_domain::whois_hack = 1;
 $cgi->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!";
 my $svcnum = $1;
 
+#unmunge cgp_accessmodes (falze laziness-ish w/part_svc.pm::process & svc_acct)
+unless ( $cgi->param('cgp_accessmodes') ) {
+  $cgi->param('cgp_accessmodes', 
+    join(' ',
+      sort map { /^cgp_accessmodes_([\w\/]+)$/ or die "no way"; $1; }
+               grep $cgi->param($_),
+                    grep /^cgp_accessmodes_([\w\/]+)$/,
+                         $cgi->param()
+        )
+  );
+}
+
+#unmunge acct_def_cgp_accessmodes (falze laziness-ahoy)
+unless ( $cgi->param('acct_def_cgp_accessmodes') ) {
+  $cgi->param('acct_def_cgp_accessmodes', 
+    join(' ',
+      sort map { /^acct_def_cgp_accessmodes_([\w\/]+)$/ or die "no way"; $1; }
+               grep $cgi->param($_),
+                    grep /^acct_def_cgp_accessmodes_([\w\/]+)$/,
+                         $cgi->param()
+        )
+  );
+}
+
 my $new = new FS::svc_domain ( {
   map {
     $_, scalar($cgi->param($_));
@@ -24,10 +48,10 @@ my $new = new FS::svc_domain ( {
 
 my $error = '';
 if ($cgi->param('svcnum')) {
-  $error="Can't modify a domain!";
+  $error  = $new->replace();
 } else {
-  $error=$new->insert;
-  $svcnum=$new->svcnum;
+  $error  = $new->insert;
+  $svcnum = $new->svcnum;
 }
 
 </%init>
diff --git a/httemplate/edit/process/svc_external.html b/httemplate/edit/process/svc_external.html
new file mode 100644 (file)
index 0000000..3515afc
--- /dev/null
@@ -0,0 +1,10 @@
+<% include( 'elements/svc_Common.html',
+               'table'    => 'svc_external',
+           )
+%>
+<%init>
+
+die "access denied"
+  unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific?
+
+</%init>
diff --git a/httemplate/edit/process/svc_mailinglist.html b/httemplate/edit/process/svc_mailinglist.html
new file mode 100644 (file)
index 0000000..580f6cc
--- /dev/null
@@ -0,0 +1,11 @@
+<% include( 'elements/svc_Common.html',
+               'table'  => 'svc_mailinglist',
+               'fields' => [ fields('svc_mailinglist'), 'listname' ],
+           )
+%>
+<%init>
+
+die "access denied"
+  unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific?
+
+</%init>
index 27a703c..e02ec5c 100644 (file)
@@ -1,5 +1,6 @@
 <% include( 'elements/svc_Common.html',
                'table'    => 'svc_phone',
+               'args_callback' => $args_callback,
            )
 %>
 <%init>
@@ -7,4 +8,22 @@
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific?
 
+my $args_callback = sub {
+  my( $cgi, $object ) = @_;
+
+  my %opt = ();
+  if ( $cgi->param('locationnum') == -1 ) {
+    my $cust_location = new FS::cust_location {
+      map { $_ => scalar($cgi->param($_)) }
+          qw( custnum address1 address2 city county state zip country )
+    };
+    $opt{'cust_location'} = $cust_location;
+  }
+
+  %opt;
+
+};
+
+
+
 </%init>
index c96fa6c..64ad3a2 100644 (file)
@@ -147,7 +147,7 @@ function bill_now_changed (what) {
 <SCRIPT TYPE="text/javascript">
   Calendar.setup({
     inputField: "start_date_text",
-    ifFormat:   "%m/%d/%Y",
+    ifFormat:   "<% $date_format %>",
     button:     "start_date_button",
     align:      "BR"
   });
@@ -250,6 +250,7 @@ die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('One-time charge');
 
 my $conf = new FS::Conf;
+my $date_format = $conf->config('date_format') || '%m/%d/%Y';
 
 $cgi->param('custnum') =~ /^(\d+)$/ or die 'illegal custnum';
 my $custnum = $1;
index dd8c3f6..869ace8 100644 (file)
@@ -6,6 +6,8 @@
                    'dest_regionname'     => 'Region',
                    'dest_prefixes_short' => 'Prefix(es)',
                    'min_included'        => 'Included minutes/calls',
+                   'conn_charge'         => 'Connection charge',
+                   'conn_sec'            => 'For',
                    'min_charge'          => 'Charge per minute/call',
                    'sec_granularity'     => 'Granularity',
                    'classnum'            => 'Usage class',
                    { field=>'dest_regionname',     type=>'fixed',  },
                    { field=>'dest_prefixes_short', type=>'fixed',  },
                    { field=>'min_included',        type=>'text',  size=>5 },
+                   { field=>'conn_charge',         type=>'money', size=>4 },
+                   { field          =>'conn_sec',
+                      type          =>'select',
+                      options       => [ keys %conn_secs ],
+                      labels        => \%conn_secs,
+                      disable_empty => 1,
+                   },
                    { field=>'min_charge',          type=>'money', size=>4 },
                    { field         =>'sec_granularity',
                      type          =>'select',
@@ -38,9 +47,9 @@
 <%once>
 
 tie my %granularity, 'Tie::IxHash', FS::rate_detail::granularities();
+tie my %conn_secs,   'Tie::IxHash', FS::rate_detail::conn_secs();
 
 </%once>
-
 <%init>
 
 my $conf = new FS::Conf;
index 9ca3a35..f77c0db 100644 (file)
       <FONT SIZE=-1>Included<BR>minutes/calls</FONT>
     </TH>
     <TH CLASS="grid" BGCOLOR="#cccccc">
+      <FONT SIZE=-1>Connection<BR>charge</FONT>
+    </TH>
+    <TH CLASS="grid" BGCOLOR="#cccccc">
+      <FONT SIZE=-1>Connection<BR>charge for</FONT>
+    </TH>
+    <TH CLASS="grid" BGCOLOR="#cccccc">
       <FONT SIZE=-1>Charge per<BR>minute/call</FONT>
     </TH>
     <TH CLASS="grid" BGCOLOR="#cccccc">
     </TD>
 
     <TD CLASS="grid" BGCOLOR="<% $bgcolor %>">
-      $<INPUT TYPE="text" SIZE=6 NAME="min_charge<%$n%>" VALUE="<% $cgi->param("min_charge$n") || $rate_detail->min_charge |h %>">
+      <%$money_char%><INPUT TYPE="text" SIZE=9 NAME="conn_charge<%$n%>" VALUE="<% $cgi->param("conn_charge$n") || $rate_detail->conn_charge |h %>">
+    </TD>
+
+    <TD CLASS="grid" BGCOLOR="<% $bgcolor %>">
+      <SELECT NAME="conn_sec<%$n%>">
+%       foreach my $conn_sec ( keys %conn_secs ) {
+%         my $curr_value = $cgi->param("conn_sec$n") || $rate_detail->conn_sec;
+%         my $selected = ($conn_sec==$curr_value) ? ' SELECTED' : '';
+          <OPTION VALUE="<% $conn_sec %>" <%$selected%>><% $conn_secs{$conn_sec} %></OPTION>
+%       }
+    </TD>
+
+    <TD CLASS="grid" BGCOLOR="<% $bgcolor %>">
+      <%$money_char%><INPUT TYPE="text" SIZE=6 NAME="min_charge<%$n%>" VALUE="<% $cgi->param("min_charge$n") || $rate_detail->min_charge |h %>">
     </TD>
 
     <TD CLASS="grid" BGCOLOR="<% $bgcolor %>">
 </FORM>
 
 <% include('/elements/footer.html') %>
+<%once>
+
+tie my %conn_secs,   'Tie::IxHash', FS::rate_detail::conn_secs();
 
+</%once>
 <%init>
 
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Configuration');
 
+my $conf = new FS::Conf;
+my $money_char = $conf->config('money_char') || '$';
+
 my $rate_region;
 if ( $cgi->param('error') ) {
   $rate_region = new FS::rate_region ( {
index 6666d97..3da72d2 100644 (file)
@@ -1,7 +1,7 @@
 <% include('elements/svc_Common.html',
              'table'        => $table,
             'post_url'     => popurl(1). "process/svc_Common.html",
-            %opt,
+             %opt,
          )
 %>
 <%init>
index afbd002..99e4b74 100755 (executable)
@@ -54,7 +54,7 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 %}else{
     <INPUT TYPE="hidden" NAME="clear_password" VALUE="<% $password %>">
 %}
-<INPUT TYPE="hidden" NAME="_password_encoding" VALUE="<% $password_encoding %>">
+<INPUT TYPE="hidden" NAME="_password_encoding" VALUE="<% $svc_acct->_password_encoding %>">
 %
 %my $sec_phrase = $svc_acct->sec_phrase;
 %if ( $conf->exists('security_phrase') 
@@ -122,7 +122,27 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
     </TD>
   </TR>
 % } 
-%
+
+
+% if ( $communigate ) {
+
+    <TR>
+      <TD ALIGN="right">Aliases</TD>
+      <TD><INPUT TYPE="text" NAME="cgp_aliases" VALUE="<% $svc_acct->cgp_aliases %>"></TD>
+    </TR>
+
+% } else {
+    <INPUT TYPE="text" NAME="cgp_aliases" VALUE="<% $svc_acct->cgp_aliases %>">
+% }
+
+
+<% include('/elements/tr-select-svc_pbx.html',
+             'curr_value' => $svc_acct->pbxsvc,
+             'part_svc'   => $part_svc,
+             'cust_pkg'   => $cust_pkg,
+          )
+%>
+
 %#pop
 %my $popnum = $svc_acct->popnum || 0;
 %if ( $part_svc->part_svc_column('popnum')->columnflag eq 'F' ) {
@@ -234,31 +254,119 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
     </TD>
   </TR>
 % } 
-% if ( $part_svc->part_svc_column('quota')->columnflag eq 'F' ) { 
 
 
+% if ( $communigate
+%      && $part_svc->part_svc_column('cgp_type')->columnflag ne 'F' )
+% {
+
+  <TR>
+    <TD ALIGN="right">Mailbox type</TD>
+    <TD>
+      <SELECT NAME="cgp_type">
+%       foreach my $option (qw( MultiMailbox TextMailbox MailDirMailbox
+%                               AGrade BGrade CGrade                    )) {
+          <OPTION VALUE="<% $option %>"
+                  <% $option eq $svc_acct->cgp_type() ? 'SELECTED' : '' %>
+          ><% $option %>
+%       }
+      </SELECT>
+    </TD>
+  </TR>
+
+% } else {
+    <INPUT TYPE="hidden" NAME="cgp_type" VALUE="<% $svc_acct->cgp_type() %>">
+% }
+
+
+% #false laziness w/svc_domain
+% if ( $communigate
+%      && $part_svc->part_svc_column('cgp_accessmodes')->columnflag ne 'F' )
+% {
+
+  <TR>
+    <TD ALIGN="right">Enabled services</TD>
+    <TD>
+      <% include( '/elements/communigate_pro-accessmodes.html',
+                    'curr_value' => $svc_acct->cgp_accessmodes,
+                )
+      %>
+    </TD>
+  </TR>
+
+% } else {
+    <INPUT TYPE="hidden" NAME="cgp_accessmodes" VALUE="<% $svc_acct->cgp_accessmodes() |h %>">
+% }
+
+
+% if ( $part_svc->part_svc_column('quota')->columnflag eq 'F' ) { 
   <INPUT TYPE="hidden" NAME="quota" VALUE="<% $svc_acct->quota %>">
-% } else { 
+% } else {
+%   my $quota_label = $communigate ? 'Mail storage limit' : 'Quota';
+    <TR>
+      <TD ALIGN="right"><% $quota_label %></TD>
+      <TD><INPUT TYPE="text" NAME="quota" VALUE="<% $svc_acct->quota %>"></TD>
+    </TR>
+% }
+
+% tie my %cgp_label, 'Tie::IxHash',
+%   'file_quota'   => 'File storage limit',
+%   'file_maxnum'  => 'Number of files limit',
+%   'file_maxsize' => 'File size limit',
+% ;
+%
+% foreach my $key (keys %cgp_label) {
+%
+%   if ( !$communigate || $part_svc->part_svc_column($key)->columnflag eq 'F' ){
+      <INPUT TYPE="hidden" NAME="<%$key%>" VALUE="<% $svc_acct->$key() |h %>">
+%   } else {
+
+      <TR>
+        <TD ALIGN="right"><% $cgp_label{$key} %></TD>
+        <TD><INPUT TYPE="text" NAME="<% $key %>" VALUE="<% $svc_acct->$key() |h %>"></TD>
+      </TR>
+
+%   }
+% }
 
+% if ( $communigate ) {
 
+%# false laziness w/svc_domain acct_def
   <TR>
-    <TD ALIGN="right">Quota:</TD>
-    <TD><INPUT TYPE="text" NAME="quota" VALUE="<% $svc_acct->quota %>"></TD>
+    <TD ALIGN="right">Message delete method</TD>
+    <TD>
+      <SELECT NAME="cgp_deletemode">
+%       for ( 'Move To Trash', 'Immediately', 'Mark' ) {
+          <OPTION VALUE="<% $_ %>"
+                  <% $_ eq $svc_acct->cgp_deletemode ? 'SELECTED' : '' %>
+          ><% $_ %>
+%       }
+      </SELECT>
+    </TD>
+  </TR>
+
+  <TR>
+    <TD ALIGN="right">On logout remove trash</TD>
+    <TD><INPUT TYPE="text" NAME="cgp_emptytrash" VALUE="<% $svc_acct->cgp_emptytrash %>"></TD>
   </TR>
-% } 
-% if ( $part_svc->part_svc_column('slipip')->columnflag =~ /^[FA]$/ ) { 
 
+% } else {
 
-  <INPUT TYPE="hidden" NAME="slipip" VALUE="<% $svc_acct->slipip %>">
-% } else { 
+  <INPUT TYPE="hidden" NAME="cgp_deletemode" VALUE="<% $svc_acct->cgp_deletemode %>">
+  <INPUT TYPE="hidden" NAME="cgp_emptytrash" VALUE="<% $svc_acct->cgp_emptytrash %>">
+
+% }
 
 
+% if ( $part_svc->part_svc_column('slipip')->columnflag =~ /^[FA]$/ ) { 
+  <INPUT TYPE="hidden" NAME="slipip" VALUE="<% $svc_acct->slipip %>">
+% } else { 
   <TR>
     <TD ALIGN="right">IP</TD>
     <TD><INPUT TYPE="text" NAME="slipip" VALUE="<% $svc_acct->slipip %>"></TD>
   </TR>
 % } 
-%
+
 % my %label = ( seconds => 'Time',
 %               upbytes => 'Upload bytes',
 %               downbytes => 'Download bytes',
@@ -392,6 +500,9 @@ if ( $cgi->param('error') ) {
 
 }
 
+my $communigate = scalar($part_svc->part_export('communigate_pro'));
+                # || scalar($part_svc->part_export('communigate_pro_singledomain'));
+
 my( $cust_pkg, $cust_main ) = ( '', '' );
 if ( $pkgnum ) {
   $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $pkgnum } );
@@ -440,22 +551,17 @@ my $svc = $part_svc->getfield('svc');
 my $otaker = getotaker;
 
 my $username = $svc_acct->username;
-my $password;
-my $password_encryption = $svc_acct->_password_encryption;
-my $password_encoding = $svc_acct->_password_encoding;
-
-if($svcnum) {
-  if($password = $svc_acct->get_cleartext_password) {
-    if (! $conf->exists('showpasswords')) {
-        $password = '*HIDDEN*';
-    }
-  }
-  elsif($svc_acct->_password and $password_encryption ne 'plain') {
+
+my $password = '';
+if ( $cgi->param('error') ) {
+  $password = $cgi->param('clear_password');
+} elsif ( $svcnum ) {
+  my $password_encryption = $svc_acct->_password_encryption;
+  if ( $password = $svc_acct->get_cleartext_password ) {
+    $password = '*HIDDEN*' unless $conf->exists('showpasswords');
+  } elsif( $svc_acct->_password and $password_encryption ne 'plain' ) {
     $password = "(".uc($password_encryption)." encrypted)";
   }
-  else {
-    $password = '';
-  }
 }
 
 my $ulen = 
index 8a108f8..b11fec7 100644 (file)
@@ -63,12 +63,12 @@ my $callback = sub {
       if $fieldref->{field} eq 'blocknum';
       
     $fieldref->{value} = $object->addr_block->label
-      if $fieldref->{field} eq 'block_label';
+      if $fieldref->{field} eq 'block_label' && $object->addr_block;
 
   } else { 
 
     if ($fieldref->{field} eq 'block_label') {
-      if ($fixedblock) {
+      if ($fixedblock && $object->addr_block) {
         $object->blocknum($fixedblock);
         $fieldref->{value} = $object->addr_block->label;
       }else{
@@ -93,7 +93,8 @@ my $callback = sub {
                && $FS::CurrentUser::CurrentUser->agentnum($_->agentnum)
              }
         map { $_->addr_block } $object->allowed_routers;
-      my @options = map { $_->blocknum } @addr_block;
+      my @options = map { $_->blocknum } 
+                    sort { $a->label cmp $b->label } @addr_block;
       my %option_labels = map { ( $_->blocknum => $_->label ) } @addr_block;
       $fieldref->{type}    = 'select';
       $fieldref->{options} = \@options;
index 10079ce..78faf12 100755 (executable)
@@ -8,10 +8,18 @@
 <INPUT TYPE="hidden" NAME="svcpart" VALUE="<% $svcpart %>">
 
 <% ntable("#cccccc",2) %>
+
 <TR>
-<P>Domain <INPUT TYPE="text" NAME="domain" VALUE="<% $domain %>" SIZE=28 MAXLENGTH=63>
-<BR>
+  <TD ALIGN="right">Domain</TD>
+  <TD>
+%   if ( !$svcnum || $conf->exists('svc_domain-edit_domain') ) {
+      <INPUT TYPE="text" NAME="domain" VALUE="<% $domain %>" SIZE=28 MAXLENGTH=63>
+%   } else {
+      <B><% $domain %></B>
+%   }
+
 % if ($export) {
+<BR>
 Available top-level domains: <% $export->option('tlds') %>
 </TR>
 
@@ -27,11 +35,161 @@ Available top-level domains: <% $export->option('tlds') %>
 </TR>
 
 % }
-
-<TR>
-<P><INPUT TYPE="submit" VALUE="Submit">
+  </TD>
 </TR>
+
+% if ( $communigate ) {
+  <TR>
+    <TD ALIGN="right">Administrator domain</TD>
+    <TD>
+      <% include('/elements/select-domain.html',
+                   'element_name' => 'parent_svcnum',
+                   'curr_value'   => $svc_domain->parent_svcnum,
+                   'empty_label'  => '(none)',
+                )
+      %>
+    </TD>
+  </TR>
+% } else {
+  <INPUT TYPE="hidden" NAME="parent_svcnum" VALUE="<% $svc_domain->parent_svcnum %>">
+% }
+
+% if ( $communigate
+%      && $part_svc->part_svc_column('max_accounts')->columnflag !~ /^[FA]$/ ) {
+
+    <TR>
+      <TD ALIGN="right">Aliases</TD>
+      <TD><INPUT TYPE="text" NAME="cgp_aliases" VALUE="<% $svc_domain->cgp_aliases %>"></TD>
+    </TR>
+
+% } else {
+    <INPUT TYPE="text" NAME="cgp_aliases" VALUE="<% $svc_domain->cgp_aliases %>">
+% }
+
+% if ( $part_svc->part_svc_column('max_accounts')->columnflag =~ /^[FA]$/ ) {
+    <INPUT TYPE="hidden" NAME="max_accounts" VALUE="<% $svc_domain->max_accounts %>">
+% } else {
+    <TR>
+      <TD ALIGN="right">Maximum number of accounts</TD>
+      <TD>
+        <INPUT TYPE="text" NAME="max_accounts" SIZE=5 MAXLENGTH=6 VALUE="<% $svc_domain->max_accounts %>">
+      </TD>
+    </TR>
+% }
+
+% if ( $communigate
+%      && $part_svc->part_svc_column('cgp_accessmodes')->columnflag ne 'F' )
+% {
+
+  <TR>
+    <TD ALIGN="right">Enabled services</TD>
+    <TD>
+      <% include( '/elements/communigate_pro-accessmodes.html',
+                    'curr_value' => $svc_domain->cgp_accessmodes,
+                )
+      %>
+    </TD>
+  </TR>
+
+% } else {
+    <INPUT TYPE="hidden" NAME="cgp_accessmodes" VALUE="<% $svc_domain->cgp_accessmodes() |h %>">
+% }
+
 </TABLE>
+<BR>
+
+% if ( $communigate ) {
+
+Account defaults
+<% ntable("#cccccc",2) %>
+
+  <% include('/elements/tr-checkbox.html',
+               'label'      =>'Password modification',
+               'field'      => 'acct_def_password_selfchange',
+               'curr_value' => $svc_domain->acct_def_password_selfchange,
+               'value'      => 'Y',
+            )
+  %>
+  <% include('/elements/tr-checkbox.html',
+               'label'      =>'Password recovery',
+               'field'      => 'acct_def_password_recover',
+               'curr_value' => $svc_domain->acct_def_password_recover,
+               'value'      => 'Y',
+            )
+  %>
+
+  <TR>
+    <TD ALIGN="right">Enabled services
+    </TD>
+    <TD><% include('/elements/communigate_pro-accessmodes.html',
+                     'element_name_prefix' => 'acct_def_cgp_accessmodes_',
+                     'curr_value' => $svc_domain->acct_def_cgp_accessmodes,
+                  )
+        %>
+    </TD>
+  </TR>
+
+  <% include('/elements/tr-input-text.html',
+               'label'      => 'Mail storage limit',
+               'field'      => 'acct_def_quota',
+               'curr_value' => $svc_domain->acct_def_quota,
+            )
+  %>
+  <% include('/elements/tr-input-text.html',
+               'label'      => 'File storage limit',
+               'field'      => 'acct_def_file_quota',
+               'curr_value' => $svc_domain->acct_def_file_quota,
+            )
+  %>
+  <% include('/elements/tr-input-text.html',
+               'label'      => 'Files limit',
+               'field'      => 'acct_def_file_maxnum',
+               'curr_value' => $svc_domain->acct_def_file_maxnum,
+            )
+  %>
+  <% include('/elements/tr-input-text.html',
+               'label'      => 'File size limit',
+               'field'      => 'acct_def_file_maxsize',
+               'curr_value' => $svc_domain->acct_def_file_maxsize,
+            )
+  %>
+
+%# false laziness w/svc_acct acct_def
+  <TR>
+    <TD ALIGN="right">Message delete method</TD>
+    <TD>
+      <SELECT NAME="acct_def_cgp_deletemode">
+%       for ( 'Move To Trash', 'Immediately', 'Mark' ) {
+          <OPTION VALUE="<% $_ %>"
+                  <% $_ eq $svc_domain->acct_def_cgp_deletemode ? 'SELECTED' : '' %>
+          ><% $_ %>
+%       }
+      </SELECT>
+    </TD>
+  </TR>
+
+  <% include('/elements/tr-input-text.html',
+               'label'      => 'On logout remove trash',
+               'curr_value' => $svc_domain->acct_def_cgp_emptytrash,
+            )
+  %>
+
+</TABLE>
+<BR>
+
+% } else {
+
+%   foreach my $f (qw( password_selfchange password_recover cgp_accessmodes
+%                      quota file_quota file_maxnum file_maxsize
+%                      cgp_deletemode cgp_emptytrash
+%                 )) {
+      <INPUT TYPE="hidden" NAME="acct_def_<%$f%>" VALUE="<% $svc_domain->get("acct_def_$f") %>">
+%   }
+
+% }
+
+<INPUT TYPE="submit" VALUE="Submit">
+
 </FORM>
 
 <% include('/elements/footer.html') %>
@@ -41,6 +199,8 @@ Available top-level domains: <% $export->option('tlds') %>
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific?
 
+my $conf = new FS::Conf;
+
 my($svcnum, $pkgnum, $svcpart, $kludge_action, $part_svc,
    $svc_domain);
 if ( $cgi->param('error') ) {
@@ -94,19 +254,14 @@ my $action = $svcnum ? 'Edit' : 'Add';
 
 my $svc = $part_svc->getfield('svc');
 
-my @exports = $part_svc->part_export();
-
-my $registrar;
-my $export;
+my $communigate = scalar($part_svc->part_export('communigate_pro'));
+                # || scalar($part_svc->part_export('communigate_pro_singledomain'));
 
 # Find the first export that does domain registration
-foreach (@exports) {
-       $export = $_ if $_->can('registrar');
-}
+my @exports = grep $_->can('registrar'), $part_svc->part_export;
+my $export = $exports[0];
 # If we have a domain registration export, get the registrar object
-if ($export) {
-       $registrar = $export->registrar;
-}
+my $registrar = $export ? $export->registrar : '';
 
 my $otaker = getotaker;
 
index 0df842b..54aa11f 100644 (file)
@@ -1,102 +1 @@
-<% include('/elements/header.html', "External service $action") %>
-
-<% include('/elements/error.html') %>
-
-<FORM ACTION="<%$p1%>process/svc_external.cgi" METHOD=POST>
-
-<INPUT TYPE="hidden" NAME="svcnum" VALUE="<% $svcnum %>">
-Service #<B><% $svcnum ? $svcnum : "(NEW)" %></B>
-<BR><BR>
-
-<INPUT TYPE="hidden" NAME="pkgnum" VALUE="<% $pkgnum %>">
-
-<INPUT TYPE="hidden" NAME="svcpart" VALUE="<% $svcpart %>">
-
-% my $id    = $svc_external->id;
-% my $title = $svc_external->title;
-%
-<% &ntable("#cccccc",2) %>
-  <TR>
-    <TD ALIGN="right">External ID</TD>
-    <TD><INPUT TYPE="text" NAME="id" VALUE="<% $id %>"></TD>
-  </TR>
-  <TR>
-    <TD ALIGN="right">Title</TD>
-    <TD><INPUT TYPE="text" NAME="title" VALUE="<% $title %>"></TD>
-  </TR>
-
-% foreach my $field ($svc_external->virtual_fields) {
-%   if ( $part_svc->part_svc_column($field)->columnflag ne 'F' ) {
-%     # If the flag is X, it won't even show up in $svc_acct->virtual_fields.
-      <% $svc_external->pvf($field)->widget( 'HTML',
-                                             'edit', 
-                                             $svc_external->getfield($field)
-                                           )
-      %>
-%   }
-% }
-
-</TABLE>
-<BR>
-
-<INPUT TYPE="submit" VALUE="Submit">
-</FORM>
-
-<% include('/elements/footer.html') %>
-
-<%init>
-
-die "access denied"
-  unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific?
-
-my( $svcnum,  $pkgnum, $svcpart, $part_svc, $svc_external );
-if ( $cgi->param('error') ) {
-
-  $svc_external = new FS::svc_external ( {
-    map { $_, scalar($cgi->param($_)) } fields('svc_external')
-  } );
-  $svcnum = $svc_external->svcnum;
-  $pkgnum = $cgi->param('pkgnum');
-  $svcpart = $cgi->param('svcpart');
-  $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart});
-  die "No part_svc entry!" unless $part_svc;
-
-} elsif ( $cgi->param('pkgnum') && $cgi->param('svcpart') ) { #adding
-
-  $cgi->param('pkgnum') =~ /^(\d+)$/ or die 'unparsable pkgnum';
-  $pkgnum = $1;
-  $cgi->param('svcpart') =~ /^(\d+)$/ or die 'unparsable svcpart';
-  $svcpart = $1;
-
-  $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart});
-  die "No part_svc entry!" unless $part_svc;
-
-  $svc_external = new FS::svc_external { svcpart => $svcpart };
-
-  $svcnum='';
-
-  $svc_external->set_default_and_fixed;
-
-} else { #adding
-
-  my($query) = $cgi->keywords;
-  $query =~ /^(\d+)$/ or die "unparsable svcnum";
-  $svcnum=$1;
-  $svc_external=qsearchs('svc_external',{'svcnum'=>$svcnum})
-    or die "Unknown (svc_external) svcnum!";
-
-  my($cust_svc)=qsearchs('cust_svc',{'svcnum'=>$svcnum})
-    or die "Unknown (cust_svc) svcnum!";
-
-  $pkgnum=$cust_svc->pkgnum;
-  $svcpart=$cust_svc->svcpart;
-  
-  $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart});
-  die "No part_svc entry!" unless $part_svc;
-
-}
-my $action = $svc_external->svcnum ? 'Edit' : 'Add';
-
-my $p1 = popurl(1);
-
-</%init>
+<% include( 'elements/svc_Common.html', 'table'=>'svc_external' ) %>
index 96a00a5..73f6465 100755 (executable)
@@ -32,24 +32,35 @@ function dstchanged(what) {
 </SCRIPT>
 
 <% ntable("#cccccc",2) %>
-<TR><TD ALIGN="right">Email to</TD>
-<TD><SELECT NAME="srcsvc" SIZE=1 onChange="srcchanged(this)">
-% foreach $_ (keys %email) { 
-
-  <OPTION<% $_ eq $srcsvc ? " SELECTED" : "" %> VALUE="<% $_ %>"><% $email{$_} %></OPTION>
-% } 
-% if ( $svc_forward->dbdef_table->column('src') ) { 
-
-  <OPTION <% $src ? 'SELECTED' : '' %> VALUE="0">(other email address)</OPTION>
-% } 
 
-</SELECT>
-% if ( $svc_forward->dbdef_table->column('src') ) { 
-
-<INPUT TYPE="text" NAME="src" VALUE="<% $src %>" <% ( $src || !scalar(%email) ) ? '' : 'DISABLED STYLE="background-color: lightgrey"' %>>
-% } 
-
-</TD></TR>
+<TR>
+  <TD ALIGN="right">Email to</TD>
+  <TD>
+%   if ( $conf->exists('svc_forward-no_srcsvc') ) {
+      <INPUT NAME="srcsrc" TYPE="hidden" VALUE="0">
+%   } else {
+      <SELECT NAME="srcsvc" SIZE=1 onChange="srcchanged(this)">
+%       foreach $_ (keys %email) { 
+          <OPTION VALUE="<% $_ %>"
+                  <% $_ eq $srcsvc ? 'SELECTED' : '' %>
+          ><% $email{$_} %></OPTION>
+%       } 
+        <OPTION VALUE="0" <% $src ? 'SELECTED' : '' %>
+        >(other email address)</OPTION>
+      </SELECT>
+%   }
+
+%   my $src_disabled =    $src
+%                      || $conf->exists('svc_forward-no_srcsvc')
+%                      || !scalar(%email);
+    <INPUT NAME  = "src"
+           TYPE  = "text"
+           VALUE = "<% $src %>"
+           <% $src_disabled ? '' : 'DISABLED STYLE="background-color: lightgrey"' %>
+    >
+
+  </TD>
+</TR>
 
 <TR><TD ALIGN="right">Forwards to</TD>
 <TD><SELECT NAME="dstsvc" SIZE=1 onChange="dstchanged(this)">
diff --git a/httemplate/edit/svc_mailinglist.cgi b/httemplate/edit/svc_mailinglist.cgi
new file mode 100644 (file)
index 0000000..c7c739d
--- /dev/null
@@ -0,0 +1,25 @@
+<% include( 'elements/svc_Common.html',
+              'table'  => 'svc_mailinglist',
+              'fields' => \@fields,
+          )
+%>
+<%init>
+
+die "access denied"
+  unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific?
+
+my @fields = (
+  'username',
+  { field=>'domsvc',           type=>'select-svc-domain',
+    #label => 'List address domain',
+  },
+  { field=>'listnum',          type=>'hidden', },
+  { field=>'listname',         type=>'text', },
+  { field=>'reply_to',         type=>'checkbox', value=>'Y' },
+  { field=>'remove_from',      type=>'checkbox', value=>'Y' },
+  { field=>'reject_auto',      type=>'checkbox', value=>'Y' },
+  { field=>'remove_to_and_cc', type=>'checkbox', value=>'Y' },
+
+);
+
+</%init>
index d7629ab..b77d962 100644 (file)
@@ -1,22 +1,21 @@
 <% include( 'elements/svc_Common.html',
-               'name'     => 'Phone number',
                'table'    => 'svc_phone',
-               'fields'   => [ 'countrycode',
-                               { field => 'phonenum',
-                                 type  => 'select-did',
-                                 label => 'Phone number',
-                               },
-                               'sip_password',
-                               'pin',
-                               'phone_name',
-                             ],
+               'fields'   => \@fields,
                'labels'   => {
+                               'svcnum'       => 'Service',
                                'countrycode'  => 'Country code',
                                'phonenum'     => 'Phone number',
+                               'domsvc'       => 'Domain',
                                'sip_password' => 'SIP password',
                                'pin'          => 'Voicemail PIN',
                                'phone_name'   => 'Name',
+                               'pbxsvc'       => 'PBX',
+                               'locationnum'  => 'E911 location',
                              },
+               'svc_new_callback' => sub {
+                 my( $cgi, $svc_x, $part_svc, $cust_pkg, $fields, $opt ) = @_;
+                 $svc_x->locationnum($cust_pkg->locationnum) if $cust_pkg;
+               },
            )
 %>
 <%init>
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific?
 
+my $conf = new FS::Conf;
+
+my @fields = ( 'countrycode',
+               { field => 'phonenum',
+                 type  => 'select-did',
+                 label => 'Phone number',
+               },
+             );
+
+push @fields, { field => 'domsvc',
+                type  => 'select-svc-domain',
+                label => 'Domain',
+              }
+  if $conf->exists('svc_phone-domain');
+
+push @fields, { field => 'pbxsvc',
+                type  => 'select-svc_pbx',
+                label => 'PBX',
+              },
+              'sip_password',
+              'pin',
+              { field => 'phone_name',
+                type  => 'text',
+                maxlength => $conf->config('svc_phone-phone_name-max_length'),
+              },
+
+              { value   => 'E911 Information',
+                type    => 'tablebreak-tr-title',
+                colspan => 7,
+              },
+              { field => 'locationnum',
+                type  => 'select-cust_location',
+                label => 'E911 location',
+                include_opt_callback => sub {
+                  my $svc_phone = shift;
+                  my $pkgnum =  $svc_phone->get('pkgnum')
+                             || $cgi->param('pkgnum')
+                             || $svc_phone->cust_svc->pkgnum; #hua?
+                               #cross agent location exposure?  sheesh
+                  my $cust_pkg = qsearchs('cust_pkg', {'pkgnum' => $pkgnum});
+                  my $cust_main = $cust_pkg ? $cust_pkg->cust_main : '';
+                  ( 'no_bold'   => 1,
+                    'cust_pkg'  => $cust_pkg,
+                    'cust_main' => $cust_main,
+                  );
+                },
+              },
+              { field => 'custnum', type=> 'hidden' }, #for new cust_locations
+;
+
+
 </%init>
diff --git a/httemplate/elements/communigate_pro-accessmodes.html b/httemplate/elements/communigate_pro-accessmodes.html
new file mode 100644 (file)
index 0000000..6ce9ca5
--- /dev/null
@@ -0,0 +1,30 @@
+<% include( 'checkboxes.html',
+              'element_name_prefix' => 'cgp_accessmodes_',
+              'names_list'          => \@names,
+              'checked_callback'    => $callback,
+              %opt,
+          )
+%>
+<%once>
+
+my @names = (qw(
+  Mail Relay Signal Mobile TLS POP IMAP MAPI
+  AirSync SIP XMPP WebMail XIMSS FTP ACAP PWD
+  LDAP RADIUS S/MIME WebCAL WebSite PBX HTTP
+));
+
+</%once>
+<%init>
+
+my %opt = @_;
+my $curr_value = $opt{'curr_value'};
+
+$curr_value = { map { $_=>1 } split(/\s+/, $curr_value) }
+  unless ref($curr_value);
+
+my $callback = sub {
+  my( $cgi, $name ) = @_;
+  $curr_value->{$name};
+};
+
+</%init>
index 22e872e..8da91ef 100644 (file)
@@ -24,7 +24,7 @@ Example:
 <HTML>
   <HEAD>
     <TITLE>
-      <% $title %>
+      <% $title |h %>
     </TITLE>
     <META HTTP-Equiv="Cache-Control" Content="no-cache">
     <META HTTP-Equiv="Pragma" Content="no-cache">
@@ -293,7 +293,7 @@ input.fstext {
         <TD BGCOLOR="#e8e8e8" HEIGHT="100%" VALIGN="top"> <!-- WIDTH="100%"> -->
 
           <FONT SIZE=6>
-            <% $title %>
+            <% $title |h %>
           </FONT>
 
 % unless ( $nobr ) {
index 07aaa69..0ec6c04 100644 (file)
@@ -18,7 +18,7 @@ Example:
 </%doc>
 
 <TR>
-  <TH ALIGN="right"><%$r%><% $opt{'address1_label'} || 'Address' %></TH>
+  <<%$th%> ALIGN="right"><%$r%><% $opt{'address1_label'} || 'Address' %></<%$th%>>
   <TD COLSPAN=7>
     <INPUT TYPE     = "text"
            NAME     = "<%$pre%>address1"
@@ -48,7 +48,7 @@ Example:
 </TR>
 
 <TR>
-  <TH ALIGN="right"><%$r%>City</TH>
+  <<%$th%> ALIGN="right"><%$r%>City</<%$th%>>
   <TD WIDTH="1">
     <INPUT TYPE     = "text"
            NAME     = "<%$pre%>city"
@@ -59,13 +59,13 @@ Example:
            <% $style %>
     >
   </TD>
-  <TH ALIGN="right" ID="<%$pre%>countylabel" <%$county_style%>><%$r%>County</TH>
+  <<%$th%> ALIGN="right" ID="<%$pre%>countylabel" <%$county_style%>><%$r%>County</<%$th%>>
   <TD><% include('/elements/select-county.html', %select_hash ) %></TD>
-  <TH ALIGN="right" WIDTH="1"><%$r%>State</TH>
+  <<%$th%> ALIGN="right" WIDTH="1"><%$r%>State</<%$th%>>
   <TD WIDTH="1">
     <% include('/elements/select-state.html', %select_hash ) %>
   </TD>
-  <TH><%$r%>Zip</TH>
+  <<%$th%>><%$r%>Zip</<%$th%>>
   <TD>
     <INPUT TYPE     = "text"
            NAME     = "<%$pre%>zip"
@@ -80,7 +80,7 @@ Example:
 </TR>
 
 <TR>
-  <TH ALIGN="right"><%$r%>Country</TH>
+  <<%$th%> ALIGN="right"><%$r%>Country</<%$th%>>
   <TD COLSPAN=6><% include('/elements/select-country.html', %select_hash ) %></TD>
 </TR>
 
@@ -88,7 +88,7 @@ Example:
   <INPUT TYPE="hidden" NAME="geocode" VALUE="<% $opt{geocode} %>">
 % } else {
 %   if ( $pre eq 'ship_' && $conf->exists('cust_main-require_censustract') ) {
-      <TR><TH ALIGN="right">Census tract<BR>(automatic)</TH>
+      <TR><<%$th%> ALIGN="right">Census tract<BR>(automatic)</<%$th%>>
         <TD>
           <INPUT TYPE="text" NAME="censustract" VALUE="<% $opt{censustract} %>">
         </TD>
@@ -123,7 +123,7 @@ $object->set($pre.'state', $statedefault )
          || $object->get($pre.'country') ne $countrydefault;
 
 my @style = ();
-push @style, 'background-color: #dddddd"' if $disabled;
+push @style, 'background-color: #dddddd' if $disabled;
 
 my @address2_label_style = ();
 push @address2_label_style, 'visibility:hidden'
@@ -161,4 +161,6 @@ my %select_hash = (
   'style'    => \@style,
 );
 
+my $th = $opt{'no_bold'} ? 'TD' : 'TH';
+
 </%init>
index d4a915e..a68a575 100644 (file)
@@ -235,6 +235,7 @@ if($curuser->access_right('Financial reports')) {
     'Sales, Credits and Receipts' => [ $fsurl.'graph/report_money_time.html', 'Sales, credits and receipts summary graph' ],
     'Sales Report' => [ $fsurl.'graph/report_cust_bill_pkg.html', 'Sales report and graph (by agent, package class and/or date range)' ],
     'Rated Call Sales Report' => [ $fsurl.'graph/report_cust_bill_pkg_detail.html', 'Sales report and graph (by agent, package class, usage class and/or date range)' ],
+    'Employee Commission Report' => [ $fsurl.'search/report_employee_commission.html', '' ],
     'Credit Report' => [ $fsurl.'search/report_cust_credit.html', 'Credit report (by employee and/or date range)' ],
     'Refund Report' => [ $fsurl.'search/report_cust_refund.html', 'Refund report (by type and/or date range)' ],
   );
@@ -320,7 +321,7 @@ $tools_menu{'Job Queue'} =  [ $fsurl.'search/queue.html', 'View pending job queu
   if $curuser->access_right('Job queue');
 $tools_menu{'Ticketing'} = [ \%tools_ticketing, 'Ticketing tools' ]
   if $conf->config('ticket_system');
-$tools_menu{'Time Queue'} =  [ $fsurl.'search/timeworked.html', 'View pending support time' ]
+$tools_menu{'Time Queue'} =  [ $fsurl.'search/report_timeworked.html', 'View pending support time' ]
   if $curuser->access_right('Time queue');
 $tools_menu{'Attachments'} = [ $fsurl.'browse/cust_attachment.html', 'View customer attachments' ]
   if !$conf->config('disable_cust_attachment') and $curuser->access_right('View attachments') and $curuser->access_right('Browse attachments');
index df2bd1d..6a446ab 100644 (file)
@@ -1,7 +1,7 @@
 /*\r
  Do not remove or change this notice.\r
- overlibmws.js core module - Copyright Foteos Macrides 2002-2008. All rights reserved.\r
-   Initial: August 18, 2002 - Last Revised: March 22, 2008\r
+ overlibmws.js core module - Copyright Foteos Macrides 2002-2010. All rights reserved.\r
+   Initial: August 18, 2002 - Last Revised: January 5, 2010\r
  This module is subject to the same terms of usage as for Erik Bosrup's overLIB,\r
  though only a minority of the code and API now correspond with Erik's version.\r
  See the overlibmws Change History and Command Reference via:\r
@@ -132,11 +132,12 @@ OLkon=(OLua.indexOf('konqueror')>=0)?1:0,
 OLkht=(OLsaf||OLkon)?1:0,\r
 OLopr=(OLua.indexOf('opera')>=0)?1:0,\r
 OLop7=(OLopr&&document.createTextNode)?1:0;\r
+OLop95=(OLop7&&document.getElementsByClassName)?1:0;\r
 if(OLopr){OLns4=OLns6=OLgek=0;OLie4=(OLop7)?1:0;}\r
 var OLieM=((OLie4&&OLmac)&&!(OLkht||OLopr))?1:0,\r
-OLie5=0,OLie55=0;OLie7=0;if(OLie4&&!OLop7){\r
+OLie5=0,OLie55=0,OLie7=0;OLie8=0;if(OLie4&&!OLop7){\r
 if((OLv=OLua.match(/msie (\d\.\d+)\.*/i))&&(OLv=parseFloat(OLv[1]))>=5.0){\r
-OLie5=1;OLns6=0;if(OLv>=5.5)OLie55=1;if(OLv>=7.0)OLie7=1;}if(OLns6)OLie4=0;}\r
+OLie5=1;OLns6=0;if(OLv>=5.5)OLie55=1;if(OLv>=7.0)OLie7=1;if(OLv>=8.0)OLie8=1;}if(OLns6)OLie4=0;}\r
 if(OLns4)window.onresize=function(){location.reload();};var OLchkMh=1,OLdw;\r
 if(OLns4||OLie4||OLns6){OLmh();if(window.addEventListener)window.addEventListener("unload",\r
 OLulCl,false);}else{overlib=nd=cClick=OLpageDefaults=no_overlib;}\r
@@ -147,25 +148,25 @@ function OLulCl(){if(over)cClick();window.removeEventListener("unload",OLulCl,fa
 */\r
 // Loads defaults then args into runtime variables.\r
 function overlib(){\r
-if(!(OLloaded&&OLgateOK))return;if((OLexclusivePI)&&OLisExclusive(arguments))return true;if(OLchkMh)OLmh();\r
-if(OLndt&&!OLtimerid)OLndt=0;if(over)cClick();if(parent!=self){if(parent.OLo2Ref){parent.OLeval(parent.OLo2Ref);\r
-parent.OLo2Ref="";}if(parent.OLifRef){parent.OLeval(parent.OLifRef);parent.OLifRef="";}}if(OLo2Ref){eval(OLo2Ref);\r
-OLo2Ref="";}if(OLifRef){eval(OLifRef);OLifRef="";}OLload(OLp1or2);OLload(OLp1);OLfnRef="";OLifX=0;OLifY=0;OLhover=0;\r
-OLsetRunTimeVar();OLparseTokens('o3_',arguments);if(!(over=OLmkLyr()))return false;if(o3_decode)OLdecode();if(OLprintPI)\r
-OLchkPrint();if(OLbubblePI)OLchkForBubbleEffect();if(OLdebugPI)OLsetDebugCanShow();if(OLshadowPI)OLinitShadow();\r
-if(OLiframePI)OLinitIfs();if(OLfilterPI)OLinitFilterLyr();if(OLexclusivePI&&o3_exclusive&&o3_exclusivestatus!="")\r
-o3_status=o3_exclusivestatus;else if(o3_autostatus==2&&o3_cap!="")o3_status=o3_cap;else if(o3_autostatus==1&&o3_text!="")\r
-o3_status=o3_text;if(!o3_delay){return OLmain();}else{OLdelayid=setTimeout("OLmain()",o3_delay);if(o3_status!=""){\r
-self.status=o3_status;return true;}else if(!(OLop7&&event&&event.type=='mouseover'))return false;}\r
+if(!(OLloaded&&OLgateOK))return;if((OLexclusivePI)&&OLisExclusive(arguments))return true;if(OLchkMh)OLmh();if(OLndt&&\r
+!OLtimerid)OLndt=0;if(over){if(OLfilterPI)o3_filter=0;cClick();}if(parent!=self){if(parent.OLo2Ref){parent.OLeval(\r
+parent.OLo2Ref);parent.OLo2Ref="";}if(parent.OLifRef){parent.OLeval(parent.OLifRef);parent.OLifRef="";}}if(OLo2Ref){\r
+eval(OLo2Ref);OLo2Ref="";}if(OLifRef){eval(OLifRef);OLifRef="";}OLload(OLp1or2);OLload(OLp1);OLfnRef="";OLifX=0;OLifY=0;\r
+OLhover=0;if(OLcrossframePI&&parent!=self)OLchkFRAME(arguments);OLsetRunTimeVar();OLparseTokens('o3_',arguments);if(!(\r
+over=OLmkLyr()))return false;over.onmouseover=over.onmouseout=null;if(o3_decode)OLdecode();if(OLprintPI)OLchkPrint();\r
+if(OLbubblePI)OLchkForBubbleEffect();if(OLdebugPI)OLsetDebugCanShow();if(OLshadowPI)OLinitShadow();if(OLiframePI)OLinitIfs();\r
+if(OLfilterPI)OLinitFilterLyr();if(OLexclusivePI&&o3_exclusive&&o3_exclusivestatus!="")o3_status=o3_exclusivestatus;else\r
+if(o3_autostatus==2&&o3_cap!="")o3_status=o3_cap;else if(o3_autostatus==1&&o3_text!="")o3_status=o3_text;if(!o3_delay){\r
+return OLmain();}else{OLdelayid=setTimeout("OLmain()",o3_delay);if(o3_status!=""){self.status=o3_status;return true;}else\r
+if(!(OLop7&&event&&event.type=='mouseover'))return false;}\r
 }\r
 function OLeval(s){eval(s);}\r
 \r
 // Clears popups if appropriate\r
 function nd(time){\r
-if(OLloaded&&OLgateOK){if(!((OLexclusivePI)&&OLisExclusive())){if(time&&over&&!o3_delay){\r
-if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=(OLhover&&o3_frame==self&&!OLcursorOff())?0:\r
-setTimeout("cClick()",(o3_timeout=OLndt=time));}else{if(!OLshowingsticky){OLallowmove=0;\r
-if(over)OLhideObject(over);}}}}return false;\r
+if(OLloaded&&OLgateOK){if(!((OLexclusivePI)&&OLisExclusive())){if(time&&over&&!o3_delay){if(OLtimerid>0)\r
+clearTimeout(OLtimerid);OLtimerid=(OLhover&&!OLcursorOff())?0:setTimeout("cClick()",(o3_timeout=OLndt=time));\r
+}else{if(!OLshowingsticky){OLallowmove=0;if(over)OLhideObject(over);}}}}return false;\r
 }\r
 \r
 // Close function for stickies\r
@@ -189,11 +190,12 @@ function no_overlib(){return false;}
  OVERLIB MAIN FUNCTION SET\r
 */\r
 function OLmain(){\r
-o3_delay=0;if(parent!=self&&o3_frame==parent&&parent.OLscrollPI&&parent.over)parent.OLclearScroll();if(o3_frame==self){\r
-if(o3_noclose)OLoptMOUSEOFF(0);else if(o3_mouseoff)OLoptMOUSEOFF(1);}if(o3_sticky){OLshowingsticky=1;if(OLfnRef&&\r
-parent!=self&&o3_frame==parent&&parent.overlib){parent.OLifRef=OLfnRef+'cClick()';}}OLdoLyr();OLallowmove=0;if(o3_timeout>0){\r
-if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=setTimeout("cClick()",o3_timeout);}OLchkRef();OLdisp(o3_status);\r
-if(OLdraggablePI)OLcheckDrag();if(o3_status!="")return true;else if(!(OLop7&&event&&event.type=='mouseover'))return false;\r
+o3_delay=0;if(parent!=self&&o3_frame==parent&&parent.OLscrollPI&&parent.over)parent.OLclearScroll();if(o3_noclose)\r
+OLoptMOUSEOFF(0);else if(o3_mouseoff)OLoptMOUSEOFF(1);if(o3_sticky){OLshowingsticky=1;if(OLfnRef&&parent!=self&&\r
+o3_frame==parent&&parent.overlib)parent.OLifRef=(OLfilterPI?OLfnRef+'o3_filter=0;':'')+OLfnRef+'cClick();';}OLdoLyr();\r
+OLallowmove=0;if(o3_timeout>0){if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=setTimeout("cClick()",o3_timeout);}\r
+OLchkRef();OLdisp(o3_status);if(OLdraggablePI)OLcheckDrag();if(o3_status!="")return true;else if(!(OLop7&&event&&\r
+event.type=='mouseover'))return false;\r
 }\r
 function OLchkRef(){\r
 if(o3_ref){OLrefXY=OLgetRefXY(o3_ref);if(OLrefXY[0]==null&&OLcrossframePI)OLchkIfRef();\r
@@ -211,11 +213,10 @@ OLcontentSimple(o3_text):(o3_sticky)?OLcontentCaption(o3_text,o3_cap,o3_close):O
 \r
 // Makes Layer\r
 function OLmkLyr(id,f,z){\r
-id=(id||'overDiv');f=(f||o3_frame);z=(z||1000);var fd=f.document,d=OLgetRefById(id,fd);\r
-if(!d){if(OLns4)d=fd.layers[id]=new Layer(1024,f);else if(OLie4&&!OLop7){\r
-fd.body.insertAdjacentHTML('AfterBegin','<div id="'+id+'"></div>');d=fd.all[id];}else{d=fd.createElement('div');\r
-if(d){d.id=id;fd.body.appendChild(d);}}if(!d)return null;if(OLns4)d.zIndex=z;else{var o=d.style;o.position='absolute';\r
-o.visibility='hidden';o.zIndex=z;}}return d;\r
+id=(id||'overDiv');f=(f||o3_frame);z=(z||1000);var fd=f.document,d=OLgetRefById(id,fd);if(!d){if(OLns4)d=fd.layers[id]=\r
+new Layer(1024,f);else if(OLie4&&!OLop7){fd.body.insertAdjacentHTML('AfterBegin','<div id="'+id+'"></div>');d=fd.all[id];}\r
+else{d=fd.createElement('div');if(d){d.id=id;fd.body.appendChild(d);}}if(!d)return null;if(OLns4)d.zIndex=z;else{var o=\r
+d.style;o.position='absolute';o.visibility='hidden';o.zIndex=z;}}return d;\r
 }\r
 \r
 // Creates and writes layer content\r
@@ -225,9 +226,9 @@ if(o3_fgbackground!='')o3_fgbackground=' background="'+o3_fgbackground+'"';
 if(o3_bgbackground!='')o3_bgbackground=' background="'+o3_bgbackground+'"';\r
 if(o3_cgbackground!='')o3_cgbackground=' background="'+o3_cgbackground+'"';\r
 if(o3_fgcolor!='')o3_fgcolor=' bgcolor="'+o3_fgcolor+'"';if(o3_bgcolor!='')o3_bgcolor=' bgcolor="'+o3_bgcolor+'"';\r
-if(o3_cgcolor!='')o3_cgcolor=' bgcolor="'+o3_cgcolor+'"';if(o3_height>0)o3_height=' height="'+o3_height+'"';\r
-else o3_height='';}if(!OLns4)OLrepositionTo(over,(OLns6?20:0),0);var lyrHtml=OLdoLGF();\r
-if(o3_wrap&&!o3_fullhtml){OLlayerWrite(lyrHtml);o3_width=(OLns4?over.clip.width:over.offsetWidth);if(OLie4){\r
+if(o3_cgcolor!='')o3_cgcolor=' bgcolor="'+o3_cgcolor+'"';if(o3_height>0)o3_height=(OLns4)?' height="'+o3_height+'"':\r
+' style="height:'+o3_height+'px;"';else o3_height='';}if(!OLns4)OLrepositionTo(over,(OLns6?20:0),0);var lyrHtml=OLdoLGF();\r
+if(o3_wrap&&!o3_fullhtml){OLlayerWrite(lyrHtml);o3_width=(OLns4?over.clip.width:over.offsetWidth);if(OLie4&&!OLop95){\r
 var w=OLfd().clientWidth;if(o3_width>=w){if(OLop7){if(OLovertwoPI&&over==over2){var z=over2.style.zIndex;\r
 o3_frame.document.body.removeChild(over);over2=OLmkLyr('overDiv2',o3_frame,z);over=over2;}else{\r
 o3_frame.document.body.removeChild(over);over=OLmkLyr();}}o3_width=w-20;}}\r
@@ -294,7 +295,7 @@ return ((o3_base>0&&!o3_wrap)?('<table width="100%" border="0" cellpadding="0" c
 +o3_bgclass+'"':'')+'><tr><td height="'+o3_base+'"></td></tr></table>'):'')+'</td></tr></table>';\r
 }\r
 function OLwd(a){return(o3_wrap?'':' width="'+(!a?'100%':(a==1?o3_width:(o3_width-o3_padxl-o3_padxr)))+'"');}\r
-function OLhL(s){return(s?' style="width:100%;"':'width:100%;');}\r
+function OLhL(s){if(!OLie5)return '';return(s?' style="overflow:auto;"':'overflow:auto;');}\r
 \r
 // Loads image into the div.\r
 function OLsetBackground(i){\r
@@ -308,18 +309,18 @@ else{if(OLns4)over.background.src=i;else{if(OLns6)over.style.width=o3_width+'px'
 // Displays layer\r
 function OLdisp(s){\r
 if(OLmodalPI&&!o3_modalscroll)OLchkModal();if(!OLallowmove){if(OLshadowPI)OLdispShadow();if(OLiframePI)OLdispIfs();\r
-OLplaceLayer();if(OLmodalPI&&o3_modalscroll)OLchkModal();if(OLndt)OLshowObject(over);\r
-else OLshowid=setTimeout("OLshowObject(over)",1);OLallowmove=(o3_sticky||o3_nofollow)?0:1;}OLndt=0;if(s!="")self.status=s;\r
+OLplaceLayer();if(OLmodalPI&&o3_modalscroll)OLchkModal();if(OLndt)OLshowObject(over);else OLshowid=\r
+setTimeout("OLshowObject(over)",1);OLallowmove=(o3_sticky||o3_nofollow)?0:1;}OLndt=0;if(s!="")self.status=s;\r
 }\r
 \r
 // Decides placement of layer.\r
 function OLplaceLayer(){\r
 var snp,X,Y,pgLeft,pgTop,pWd=o3_width,pHt,iWd=100,iHt=100,SB=0,LM=0,CX=0,TM=0,BM=0,CY=0,o=OLfd(),\r
 nsb=(OLgek>=20010505&&!o3_frame.scrollbars.visible)?1:0;\r
-if(!OLkht&&o&&o.clientWidth)iWd=o.clientWidth;\r
+if(!OLkht&&!OLop95&&o&&o.clientWidth)iWd=o.clientWidth;\r
 else if(o3_frame.innerWidth){SB=Math.ceil(1.4*(o3_frame.outerWidth-o3_frame.innerWidth));\r
 if(SB>20)SB=20;iWd=o3_frame.innerWidth;}\r
-pgLeft=(OLie4)?o.scrollLeft:o3_frame.pageXOffset;\r
+pgLeft=(OLie4&&!OLop95)?o.scrollLeft:o3_frame.pageXOffset;\r
 if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow)SB=CX=5;else\r
 if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowx){SB+=((o3_shadowx>0)?o3_shadowx:0);\r
 LM=((o3_shadowx<0)?Math.abs(o3_shadowx):0);CX=Math.abs(o3_shadowx);}\r
@@ -345,8 +346,8 @@ snp=X % o3_snapx;
 if(o3_hpos==LEFT){X=X-(o3_snapx+snp);}else{X=X+(o3_snapx-snp);}}X+=OLifX;}\r
 if(!o3_nojustx&&X+pWd>pgLeft+iWd-SB)\r
 X=iWd+pgLeft-pWd-SB;if(!o3_nojustx&&X-LM<pgLeft)X=pgLeft+LM;\r
-pgTop=OLie4?o.scrollTop:o3_frame.pageYOffset;\r
-if(!OLkht&&!nsb&&o&&o.clientHeight)iHt=o.clientHeight;\r
+pgTop=OLie4&&!OLop95?o.scrollTop:o3_frame.pageYOffset;\r
+if(!OLkht&&!OLop95&&!nsb&&o&&o.clientHeight)iHt=o.clientHeight;\r
 else if(o3_frame.innerHeight)iHt=o3_frame.innerHeight;\r
 if(OLbubblePI&&o3_bubble)pHt=OLbubbleHt;else pHt=OLns4?over.clip.height:over.offsetHeight;\r
 if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowy){TM=(o3_shadowy<0)?Math.abs(o3_shadowy):0;\r
@@ -424,16 +425,15 @@ of=(p=='UR')?[W-pW,0]:(p=='LL')?[W,-pH]:(p=='LR')?[W-pW,-pH]:[W,0];}else if(c=='
 // Gets x or y location of object\r
 function OLpageLoc(o,t){\r
 var l=0,s=o;while(o.offsetParent&&o.offsetParent.tagName.toLowerCase()!='html'){l+=o['offset'+t];o=o.offsetParent;}\r
-l+=o['offset'+t];while(s=s.parentNode){if((s['scroll'+t]>0)&&s.tagName.toLowerCase()=='div')l-=s['scroll'+t];}return l;\r
+l+=o['offset'+t];if(!OLop7)while(s=s.parentNode){if((s['scroll'+t]>0)&&s.tagName.toLowerCase()=='div')l-=s['scroll'+t];}\r
+return l;\r
 }\r
 \r
 // Moves layer\r
 function OLmouseMove(e){\r
-var e=(e||event);OLcC=(OLovertwoPI&&over2&&over==over2?cClick2:cClick);OLx=(e.pageX||e.clientX+OLfd().scrollLeft);\r
-OLy=(e.pageY||e.clientY+OLfd().scrollTop);if((OLallowmove&&over)&&(o3_frame==self||over==OLgetRefById()||(OLovertwoPI&&\r
-over2==over&&over==OLgetRefById('overDiv2')))){OLplaceLayer();if(OLhidePI)OLhideUtil(0,1,1,0,0,0);}if(OLhover&&over&&\r
-o3_frame==self&&OLcursorOff())if(o3_offdelay<1)OLcC();else{if(OLtimerid>0)clearTimeout(OLtimerid);\r
-OLtimerid=setTimeout("OLcC()",o3_offdelay);}\r
+var e=(e||event);OLx=(e.pageX||e.clientX+OLfd().scrollLeft);OLy=(e.pageY||e.clientY+OLfd().scrollTop);if((OLallowmove&&\r
+over)&&(o3_frame==self||over==OLgetRefById()||(OLovertwoPI&&over2==over&&over==OLgetRefById('overDiv2')))){OLplaceLayer();\r
+if(OLhidePI)OLhideUtil(0,1,1,0,0,0);}\r
 }\r
 \r
 // Capture mouse and chain other scripts.\r
@@ -451,8 +451,8 @@ function OLparseTokens(pf,ar){
 var i,v,md= -1,par=(pf!='ol_'),p=OLpar,q=OLparQuo,t=OLtoggle;OLudf=(par&&!ar.length?1:0);\r
 for(i=0;i<ar.length;i++){if(md<0){if(typeof ar[i]=='number'){OLudf=(par?1:0);i--;}\r
 else{switch(pf){case 'ol_':ol_text=ar[i];break;default:o3_text=ar[i];}}md=0;}else{\r
-if(ar[i]==INARRAY){OLudf=0;eval(pf+'text=ol_texts['+ar[++i]+']');continue;}\r
-if(ar[i]==CAPARRAY){eval(pf+'cap=ol_caps['+ar[++i]+']');continue;}\r
+if(ar[i]==INARRAY){OLudf=0;eval(pf+'text=ol_texts['+ar[(++i)]+']');continue;}\r
+if(ar[i]==CAPARRAY){eval(pf+'cap=ol_caps['+ar[(++i)]+']');continue;}\r
 if(ar[i]==CAPTION){q(ar[++i],pf+'cap');continue;}\r
 if(Math.abs(ar[i])==STICKY){t(ar[i],pf+'sticky');continue;}\r
 if(Math.abs(ar[i])==NOFOLLOW){t(ar[i],pf+'nofollow');continue;}\r
@@ -577,8 +577,8 @@ if(OLshowid>0){clearTimeout(OLshowid);OLshowid=0;}if(OLtimerid>0)clearTimeout(OL
 if(OLdelayid>0)clearTimeout(OLdelayid);OLtimerid=0;OLdelayid=0;self.status="";o3_label=ol_label;\r
 if(o3_frame!=self)o=OLgetRefById();if(o){if(o.onmouseover)o.onmouseover=null;if(OLscrollPI&&o==over)OLclearScroll();\r
 if(OLdraggablePI)OLclearDrag();if(OLfilterPI)OLcleanupFilter(o);if(OLshadowPI)OLhideShadow();var os=(OLns4)?o:o.style;\r
-if(((OLfilterPI)&&!OLchkFadeOut(os))||!OLfilterPI){os.visibility="hidden";if(!OLie55||!OLfilterPI||!o3_filter||\r
-o3_fadeout<0)o.innerHTML='';}if(OLhidePI&&o==over)OLhideUtil(0,0,1);if(OLiframePI)OLhideIfs(o);}\r
+if(((OLfilterPI)&&!OLchkFadeOut(os))||!OLfilterPI){os.visibility="hidden";if(!OLie55||(typeof ggOnChange=='undefined'&&\r
+(!OLfilterPI||!o3_filter||o3_fadeout<0)))o.innerHTML='';}if(OLhidePI&&o==over)OLhideUtil(0,0,1);if(OLiframePI)OLhideIfs(o);}\r
 }\r
 \r
 // Moves layer\r
@@ -588,8 +588,9 @@ o=(OLns4)?o:o.style;o.left=(OLns4?xL:xL+'px');o.top=(OLns4?yL:yL+'px');
 \r
 // Handle NOCLOSE-MOUSEOFF\r
 function OLoptMOUSEOFF(c){\r
-if(!c)o3_close="";\r
-over.onmouseover=function(){OLhover=1;if(OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}}\r
+if(!c)o3_close="";over.onmouseover=function(){OLhover=1;if(OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}}\r
+over.onmouseout=function(){if(OLhover){OLcC=(OLovertwoPI&&over2&&over==over2?cClick2:cClick);if(OLtimerid>0)\r
+clearTimeout(OLtimerid);OLtimerid=setTimeout("OLcC()",(o3_offdelay<1)?1:o3_offdelay);}}\r
 }\r
 function OLcursorOff(){\r
 var o=(OLns4?over:over.style),pHt=OLns4?over.clip.height:over.offsetHeight,left=parseInt(o.left),top=parseInt(o.top),\r
@@ -608,7 +609,7 @@ if(OLcmdLine.length){for(var k=0;k<OLcmdLine.length;k++){var j=OLcmdLine[k](pf,i
 }\r
 function OLregCmds(c){\r
 if(typeof c!='string')return;var pM=c.split(',');pMtr=pMtr.concat(pM);\r
-for(var i=0;i<pM.length;i++)eval(pM[i].toUpperCase()+'='+pmCnt++);\r
+for(var i=0;i<pM.length;i++)eval(pM[i].toUpperCase()+'='+(pmCnt++));\r
 }\r
 function OLregRunTimeFunc(f){\r
 if(typeof f=='object')OLrunTime=OLrunTime.concat(f);else OLrunTime[OLrunTime.length++]=f;\r
index dd64223..e1bbf41 100644 (file)
@@ -1,7 +1,7 @@
 /*\r
- overlibmws_crossframe.js plug-in module - Copyright Foteos Macrides 2003-2008. All rights reserved.\r
+ overlibmws_crossframe.js plug-in module - Copyright Foteos Macrides 2003-2010. All rights reserved.\r
    For support of FRAME.\r
-   Initial: August 3, 2003 - Last Revised: January 16, 2008\r
+   Initial: August 3, 2003 - Last Revised: October 25, 2008\r
  See the Change History and Command Reference for overlibmws via:\r
 \r
        http://www.macridesweb.com/oltest/\r
@@ -32,8 +32,8 @@ function OLoptFRAME(frm){
 o3_frame=OLmkLyr('overDiv',frm)?frm:self;if(o3_frame!=self){var l,tFrm=OLgetFrameRef(top.frames,o3_frame),\r
 sFrm=OLgetFrameRef(top.frames,ol_frame);if(sFrm.length==tFrm.length) {l=tFrm.lastIndexOf('[');if(l){\r
 while(sFrm.substring(0,l)!=tFrm.substring(0,l))l=tFrm.lastIndexOf('[',l-1);tFrm=tFrm.substr(l);sFrm=sFrm.substr(l);}}\r
-var i,k,cnt=0,p='',str=tFrm;while((k=str.lastIndexOf('['))!= -1){cnt++;str=str.substring(0,k);}\r
-for(i=0;i<cnt;i++)p=p+'parent.';OLfnRef=p+'frames'+sFrm+'.';var n=window.name,o;\r
+var i,k,cnt=0,p='',str=tFrm;while((k=str.lastIndexOf('['))!= -1){cnt++;str=str.substring(0,k);}if(!sFrm&&o3_frame==parent)\r
+sFrm=OLgetFrameRef(parent,self);else for(i=0;i<cnt;i++)p=p+'parent.';OLfnRef=p+'frames'+sFrm+'.';var n=window.name,o;\r
 if((n&&parent!=self&&o3_frame==parent)&&(o=OLgetRef(n,parent.document))){if(OLie4&&!OLop7){\r
 OLx=event.clientX+OLfd().scrollLeft;OLy=event.clientY+OLfd().scrollTop;}\r
 OLifX=OLpageLoc(o,'Left')-(OLie4&&!OLop7?OLfd().scrollLeft:self.pageXOffset);\r
@@ -47,6 +47,11 @@ OLrefXY[0]+=(OLpageLoc(o,'Left')-(OLie4&&!OLop7?OLfd(self).scrollLeft:self.pageX
 OLrefXY[1]+=(OLpageLoc(o,'Top')-(OLie4&&!OLop7?OLfd(self).scrollTop:self.pageYOffset));}}\r
 }\r
 \r
+function OLchkFRAME(args){\r
+var OLfrmVal=self;for(var i=0;i<args.length;i++){if(typeof args[i]=='number'&&args[i]==FRAME){OLfrmVal=args[i+1];break;}}\r
+if(OLfrmVal!=self&&OLfrmVal.over&&OLfrmVal.cClick)OLfrmVal.cClick();\r
+}\r
+\r
 OLregCmdLineFunc(OLparseCrossframe);\r
 \r
 OLcrossframePI=1;\r
index 1bf0ecf..d2b5eb1 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
- overlibmws_draggable.js plug-in module - Copyright Foteos Macrides 2002-2008. All rights reserved.\r
+ overlibmws_draggable.js plug-in module - Copyright Foteos Macrides 2002-2010. All rights reserved.\r
    For support of the DRAGGABLE feature.\r
    Initial: August 24, 2002 - Last Revised: January 26, 2008\r
  See the Change History and Command Reference for overlibmws via:\r
index 4c937d3..a06bdc5 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
- overlibmws_iframe.js plug-in module - Copyright Foteos Macrides 2003-2008. All rights reserved.\r
+ overlibmws_iframe.js plug-in module - Copyright Foteos Macrides 2003-2010. All rights reserved.\r
    Masks system controls to prevent obscuring of popops for IE v5.5 or higher.\r
    Initial: October 19, 2003 - Last Revised: January 26, 2008\r
  See the Change History and Command Reference for overlibmws via:\r
index 60414a6..854f584 100644 (file)
@@ -4,22 +4,64 @@
 
     <% $number %>
 
-%   if ( $opt{'callable'} && $curuser->option('vonage-username') ) { 
-
-      <% include('/elements/popup_link.html',
-           'action'      =>
-             'https://secure.click2callu.com/tpcc/makecall'.
-             '?username='. uri_escape($curuser->option('vonage-username')).
-             '&password='. uri_escape($curuser->option('vonage-password')).
-             "&fromnumber=$vonage_number".
-             "&tonumber=$snumber",
-           'width'       => 240,
-           'height'      => 64,
-           'actionlabel' => 'Initiating call',
-           'label'       => qq!<IMG SRC="${fsurl}images/red_telephone_mimooh_01.png" BORDER=0 ALT="Call this number">!,
-         )
-      %>
+%   if ( $opt{'callable'} ) {
+%
+%     if ( $curuser->option('vonage-username') ) { 
+%
+%       (my $vonage_number = $curuser->option('vonage-fromnumber')) =~ s/\D//g;
+%       $vonage_number =~ /^1/ or $vonage_number = "1$vonage_number";
+
+        <% include('/elements/popup_link.html',
+             'action'      =>
+               'https://secure.click2callu.com/tpcc/makecall'.
+               '?username='. uri_escape($curuser->option('vonage-username')).
+               '&password='. uri_escape($curuser->option('vonage-password')).
+               "&fromnumber=$vonage_number".
+               "&tonumber=$snumber",
+             'width'       => 240,
+             'height'      => 64,
+             'actionlabel' => 'Initiating call',
+             'label'       => "<$img>",
+           )
+        %>
+
+%     } elsif ( $curuser->option('snom-ip') ) {
+%
+%       my $host = $curuser->option('snom-ip');
+%       if ( $curuser->option('snom-username') ) {
+%         my $userpass = uri_escape($curuser->option('snom-username'));
+%         $userpass .= ':'. uri_escape($curuser->option('snom-password'))
+%           if $curuser->option('snom-password');
+%         $host = $userpass.'@'.$host;
+%       }
+%
+%       $snumber = "1$snumber" unless $snumber =~ /~1/; #NANPA-centric
+
+%#        <% include('/elements/popup_link.html',
+%#             'action'      => "http://$host/command.htm?number=$snumber",
+%#             %link_common,
+%#           )
+%#        %>
+
+        <A HREF="javascript:snom_call(<%$snumber%>)"><<% $img %>></A>
 
+        <SCRIPT TYPE="text/javascript">
+          function snom_call(number) {
+
+            var url = '<% "http://$host/command.htm?number=" %>';
+            url = url + number;
+
+            var xmlhttp = new XMLHttpRequest();
+            xmlhttp.open('GET', url, true);
+            xmlhttp.send(null);
+
+          }
+
+        </SCRIPT>
+
+
+%     }
+%
 %   } 
 %
 % } else { 
@@ -34,7 +76,6 @@ my( $number, %opt ) = @_;
 
 my $curuser = $FS::CurrentUser::CurrentUser;
 
-( my $vonage_number = $curuser->option('vonage-fromnumber') ) =~ s/\D//g;
-$vonage_number =~ /^1/ or $vonage_number = "1$vonage_number";
+my $img = qq(IMG SRC="${fsurl}images/red_telephone_mimooh_01.png" BORDER=0 ALT="Call this number");
 
 </%init>
index dbcc2ed..23c4369 100644 (file)
@@ -1,26 +1,39 @@
-<INPUT TYPE="hidden" NAME="<% $opt{'field_name'} %>" VALUE="<% $value %>">
+<%doc>
+
+Example:
+
+  include( '/elements/search-cust_main.html,
+             'field'       => 'custnum',
+             #slightly deprecated old synonym for field#'field_name'=>'custnum',
+             'find_button' => 1, #add a "find" button to the field
+             'curr_value'  => 54, #current value
+             'value        => 32, #deprecated synonym for curr_value
+  );
+
+</%doc>
+<INPUT TYPE="hidden" NAME="<% $field %>" VALUE="<% $value %>">
 
 <!-- some false laziness w/ misc/batch-cust_pay.html, though not as bad as i'd thought at first... -->
 
 <INPUT TYPE = "text"
-       NAME = "<% $opt{'field_name'} %>_search"
-       ID   = "<% $opt{'field_name'} %>_search"
+       NAME = "<% $field %>_search"
+       ID   = "<% $field %>_search"
        SIZE = "32"
        VALUE="<% $cust_main ? $cust_main->name : '(cust #, name or company)' %>"
-       onFocus="clearhint_<% $opt{'field_name'} %>_search(this);"
-       onClick="clearhint_<% $opt{'field_name'} %>_search(this);"
-       onChange="smart_<% $opt{'field_name'} %>_search(this);"
+       onFocus="clearhint_<% $field %>_search(this);"
+       onClick="clearhint_<% $field %>_search(this);"
+       onChange="smart_<% $field %>_search(this);"
 >
 
 % if ( $opt{'find_button'} ) {
     <INPUT TYPE    = "button"
            VALUE   = 'Find',
-           NAME    = "<% $opt{'field_name'} %>_findbutton"
-           onClick = "smart_<% $opt{'field_name'} %>_search(this.form.<% $opt{'field_name'} %>_search);"
+           NAME    = "<% $field %>_findbutton"
+           onClick = "smart_<% $field %>_search(this.form.<% $field %>_search);"
     >
 % }
 
-<SELECT NAME="<% $opt{'field_name'} %>_select" ID="<% $opt{'field_name'} %>_select" STYLE="color:#ff0000; display:none" onChange="select_<% $opt{'field_name'} %>(this);">
+<SELECT NAME="<% $field %>_select" ID="<% $field %>_select" STYLE="color:#ff0000; display:none" onChange="select_<% $field %>(this);">
 </SELECT>
 
 <% include('/elements/xmlhttp.html',
@@ -31,7 +44,7 @@
 
 <SCRIPT TYPE="text/javascript">
 
-  function clearhint_<% $opt{'field_name'} %>_search (what) {
+  function clearhint_<% $field %>_search (what) {
 
     what.style.color = '#000000';
 
@@ -43,7 +56,7 @@
 
   }
 
-  function smart_<% $opt{'field_name'} %>_search(what) {
+  function smart_<% $field %>_search(what) {
 
     var customer = what.value;
 
     what.style.color= '#000000';
     what.style.backgroundColor = '#dddddd';
 
-    var customer_select = document.getElementById('<% $opt{'field_name'} %>_select');
+    var customer_select = document.getElementById('<% $field %>_select');
 
     //alert("search for customer " + customer);
 
-    function <% $opt{'field_name'} %>_search_update(customers) {
+    function <% $field %>_search_update(customers) {
 
       //alert('customers returned: ' + customers);
 
@@ -76,7 +89,7 @@
 
       if ( customerArray.length == 0 ) {
 
-        what.form.<% $opt{'field_name'} %>.value = '';
+        what.form.<% $field %>.value = '';
 
         what.value = 'Customer not found: ' + what.value;
         what.style.color = '#ff0000';
 
         //alert('one customer found: ' + customerArray[0]);
 
-        what.form.<% $opt{'field_name'} %>.value = customerArray[0][0];
+        what.form.<% $field %>.value = customerArray[0][0];
         what.value = customerArray[0][1];
 
         what.style.display = '';
 
     }
 
-    smart_search( customer, <% $opt{'field_name'} %>_search_update );
+    smart_search( customer, <% $field %>_search_update );
 
 
   }
 
-  function select_<% $opt{'field_name'} %> (what) {
+  function select_<% $field %> (what) {
 
     var custnum = what.options[what.selectedIndex].value;
     var customer = what.options[what.selectedIndex].text;
 
-    var customer_obj = document.getElementById('<% $opt{'field_name'} %>_search');
+    var customer_obj = document.getElementById('<% $field %>_search');
 
     if ( custnum == '' ) {
       //what.style.color = '#ff0000';
 
     } else {
     
-      what.form.<% $opt{'field_name'} %>.value = custnum;
+      what.form.<% $field %>.value = custnum;
 
       customer_obj.value = customer;
       customer_obj.style.color = '#000000';
 <%init>
 
 my( %opt ) = @_;
-$opt{'field_name'} ||= 'custnum';
+
+my $field = $opt{'field'} || $opt{'field_name'} || 'custnum';
 
 my $value = $opt{'curr_value'} || $opt{'value'};
 
index aa2d73b..453205c 100644 (file)
@@ -12,7 +12,7 @@
     what.options[length] = optionName;
   }
 
-  function <% $opt{'prefix'} %>state_changed(what, callback) {
+  function <% $opt{'state_prefix'} %>state_changed(what, callback) {
 
     what.form.<% $opt{'prefix'} %>areacode.disabled = 'disabled';
     what.form.<% $opt{'prefix'} %>areacode.style.display = 'none';
@@ -24,7 +24,7 @@
     what.form.<% $opt{'prefix'} %>exchange.disabled = 'disabled';
     what.form.<% $opt{'prefix'} %>phonenum.disabled = 'disabled';
 
-    state = what.options[what.selectedIndex].value;
+    var state = what.options[what.selectedIndex].value;
 
     function <% $opt{'prefix'} %>update_areacodes(areacodes) {
 
@@ -86,6 +86,7 @@
 
 my %opt = @_;
 
-$opt{disabled} = 'disabled' unless exists $opt{disabled};
+$opt{disabled}     = 'disabled'   unless exists $opt{disabled};
+$opt{state_prefix} = $opt{prefix} unless exists $opt{state_prefix};
 
 </%init>
index af8d595..b62d6a0 100644 (file)
@@ -3,7 +3,7 @@
 Example:
 
   include('/elements/select-did.html',
-            'field'   => 'phonenum',
+            #can't actuall change from phonenum yet# 'field'   => 'phonenum',
 
             'svcpart' => 5,
             #OR
@@ -18,6 +18,7 @@ Example:
       <TR>
         <TD>
           <% include('/elements/select-state.html',
+                       'prefix'        => 'phonenum_', #$field.'_',
                        'country'       => $country,
                        'disable_empty' => 0,
                        'empty_label'   => 'Select state',
@@ -26,8 +27,9 @@ Example:
         </TD>
         <TD>
           <% include('/elements/select-areacode.html',
-                       'svcpart' => $svcpart,
-                       'empty'   => 'Select area code',
+                       'state_prefix' => 'phonenum_', #$field.'_',
+                       'svcpart'      => $svcpart,
+                       'empty'        => 'Select area code',
                     )
           %>
         </TD>
@@ -84,4 +86,6 @@ if ( scalar(@exports) > 1 ) {
 
 my $use_selector = scalar(@exports) ? 1 : 0;
 
+#my $field = $opt{'field'} || 'phonenum';
+
 </%init>
diff --git a/httemplate/elements/select-svc-domain.html b/httemplate/elements/select-svc-domain.html
new file mode 100644 (file)
index 0000000..4c04466
--- /dev/null
@@ -0,0 +1,50 @@
+<SELECT NAME="domsvc" SIZE=1>
+% foreach my $svcnum (
+%                      sort { $svc_domain{$a} cmp $svc_domain{$b} }
+%                      keys %svc_domain
+%                    ) {
+
+    <OPTION VALUE="<% $svcnum %>"
+            <% ($svcnum == $domsvc) ? ' SELECTED' : '' %>
+    ><% $svc_domain{$svcnum} %>
+
+% } 
+
+</SELECT>
+<%init>
+
+my %opt = @_;
+
+my %svc_domain = ();
+my $domsvc;
+
+my $domsvc = $opt{'curr_value'};
+my $part_svc = $opt{'part_svc'}
+               || qsearchs('part_svc', { 'svcpart' => $opt{'svcpart'} });
+
+#optional
+my $cust_pkg = $opt{'cust_pkg'};
+$cust_pkg ||= qsearchs('cust_pkg', { 'pkgnum' => $opt{'pkgnum'} })
+  if $opt{'pkgnum'};
+
+my $pkgnum = $cust_pkg ? $cust_pkg->pkgnum : '';
+
+my %svc_domain = ();
+
+if ( $domsvc ) {
+  my $svc_domain = qsearchs('svc_domain', { 'svcnum' => $domsvc } );
+  if ( $svc_domain ) {
+    $svc_domain{$svc_domain->svcnum} = $svc_domain;
+  } else {
+    warn "unknown svc_domain.svcnum for svc_acct.domsvc: $domsvc";
+  }
+}
+
+%svc_domain = (
+  %svc_domain,
+  FS::svc_Domain_Mixin->domain_select_hash( 'svcpart' => $part_svc->svcpart,
+                                            'pkgnum'  => $pkgnum,
+                                          )
+);
+
+</%init>
diff --git a/httemplate/elements/select-svc_pbx.html b/httemplate/elements/select-svc_pbx.html
new file mode 100644 (file)
index 0000000..19bce96
--- /dev/null
@@ -0,0 +1,57 @@
+<SELECT <% $opt{'multiple'} ? 'MULTIPLE' : 'SIZE=1' %>
+        NAME = "<% $opt{'element_name'} || $opt{'field'} || 'pbxsvc' %>"
+        <% $opt{'element_etc'} %>
+>
+
+% unless ( $opt{'multiple'} || $opt{'disable_empty'} ) {
+    <OPTION VALUE=""><% $opt{'empty_label'} || '' %>
+% }
+
+% foreach my $svcnum (
+%                      sort { $svc_pbx{$a} cmp $svc_pbx{$b} }
+%                      keys %svc_pbx
+%                    ) {
+%   my $svc_pbx = $svc_pbx{$svcnum};
+%   my $selected = ($svcnum == $pbxsvc) ? ' SELECTED' : '';
+
+    <OPTION VALUE="<% $svcnum %>" <% $selected %>><% $svc_pbx{$svcnum} %>
+
+% } 
+
+</SELECT>
+<%init>
+
+# false laziness w/select-svc_acct-domain.html
+
+my %opt = @_;
+
+my $pbxsvc = $opt{'curr_value'};
+my $part_svc = $opt{'part_svc'}
+               || qsearchs('part_svc', { 'svcpart' => $opt{'svcpart'} });
+my $svcpart = $part_svc ? $part_svc->svcpart : '';
+
+#optional
+my $cust_pkg = $opt{'cust_pkg'};
+$cust_pkg ||= qsearchs('cust_pkg', { 'pkgnum' => $opt{'pkgnum'} })
+  if $opt{'pkgnum'};
+
+my $pkgnum = $cust_pkg ? $cust_pkg->pkgnum : '';
+
+my %svc_pbx = ();
+
+if ( $pbxsvc ) {
+  my $svc_pbx = qsearchs('svc_pbx', { 'svcnum' => $pbxsvc } );
+  if ( $svc_pbx ) {
+    $svc_pbx{$svc_pbx->svcnum} = $svc_pbx;
+  } else {
+    warn "unknown svc_pbx.svcnum for svc_acct.pbxsvc: $pbxsvc";
+  }
+}
+
+%svc_pbx = (
+  %svc_pbx,
+  FS::svc_Common->pbx_select_hash( 'svcpart' => $svcpart,
+                                   'pkgnum'  => $pkgnum,
+                                 )
+);
+</%init>
index 10a8b27..c280c36 100644 (file)
@@ -29,6 +29,9 @@ Example:
     #or
     'records'        => \@records, #instead of search params
 
+    #instead of the primary key... only for special cases
+    'value_col'      => 'columnname',
+
     #basic params controlling the resulting <SELECT>
     'pre_options'    => [ 'value' => 'option' ], #before normal options
     'empty_label'    => '', #better specify it though, the default might change
@@ -86,7 +89,7 @@ Example:
 % {
 %   my $recvalue = $record->$key();
     <OPTION VALUE="<% $recvalue %>"
-            <% ref($value) && $value->{$recvalue} || $value == $recvalue
+            <% ref($value) && $value->{$recvalue} || $value && $value eq $recvalue # not == because of value_col
                ? ' SELECTED' : ''
             %>
     ><% $opt{'label_showkey'} ? "$recvalue: " : '' %>
@@ -118,7 +121,7 @@ if ( $opt{'onchange'} ) {
 my $dbdef_table = dbdef->table($opt{'table'})
   or die "can't find dbdef for ". $opt{'table'}. " table\n";
 
-my $key = $dbdef_table->primary_key; #? $opt{'primary_key'} ||
+my $key = $opt{'value_col'} || $dbdef_table->primary_key;
 
 my $name_col = $opt{'name_col'};
 
index 8a1dd62..2aa5974 100644 (file)
@@ -11,7 +11,7 @@
 <SCRIPT TYPE="text/javascript">
   Calendar.setup({
     inputField: "<% $opt{prefix} %>beginning_text",
-    ifFormat:   "%m/%d/%Y<% $time_format %>",
+    ifFormat:   "<% $date_format. $time_format %>",
     button:     "<% $opt{prefix} %>beginning_button",
     align:      "BR"
     <% $input_time %>
@@ -30,7 +30,7 @@
 <SCRIPT TYPE="text/javascript">
   Calendar.setup({
     inputField: "<% $opt{prefix} %>ending_text",
-    ifFormat:   "%m/%d/%Y<% $time_format %>",
+    ifFormat:   "<% $date_format. $time_format %>",
     button:     "<% $opt{prefix} %>ending_button",
     align:      "BR"
     <% $input_time %>
@@ -54,6 +54,10 @@ my $previous_request_count = '';
 
 my %opt = @_;
 
+my $conf = new FS::Conf;
+
+my $date_format = $conf->config('date_format') || '%m/%d/%Y';
+
 $opt{prefix} = '' unless defined $opt{prefix};
 $opt{prefix} .= '_' if $opt{prefix};
 
index 2a731e1..ff4996f 100644 (file)
@@ -21,8 +21,8 @@
   });
 </SCRIPT>
 
-
 <%init>
+
 my($name, $value, $label, $format, $usedatetime);
 if ( ref($_[0]) ) {
   my $opt = shift;
@@ -35,7 +35,10 @@ if ( ref($_[0]) ) {
   ($name, $value, $label, $format, $usedatetime) = @_;
 }
 
-$format = "%m/%d/%Y" unless $format;
+my $conf = new FS::Conf;
+
+$format ||= $conf->config('date_format') || '%m/%d/%Y';
+
 $label = $name unless $label;
 
 if ( $value =~ /\S/ ) {
diff --git a/httemplate/elements/tr-search-cust_main.html b/httemplate/elements/tr-search-cust_main.html
new file mode 100644 (file)
index 0000000..9df91a1
--- /dev/null
@@ -0,0 +1,15 @@
+<% include('tr-td-label.html', @_ ) %>
+
+  <TD <% $colspan %> <% $cell_style %> ID="<% $opt{input_id} || $opt{id}.'_input0' %>"><% include('search-cust_main.html', @_ ) %></TD>
+
+</TR>
+
+<%init>
+
+my %opt = @_;
+
+my $cell_style = $opt{'cell_style'} ? 'STYLE="'. $opt{'cell_style'}. '"' : '';
+
+my $colspan = $opt{'colspan'} ? 'COLSPAN="'.$opt{'colspan'}.'"' : '';
+
+</%init>
index da16dfe..bc39154 100644 (file)
@@ -118,7 +118,7 @@ Example:
 </SCRIPT>
 
 <TR>
-  <TH ALIGN="right">Service&nbsp;location</TH>
+  <<%$th%> ALIGN="right"><% $opt{'label'} || 'Service&nbsp;location' %></<%$th%>>
   <TD COLSPAN=7>
     <SELECT NAME="locationnum" onChange="locationnum_changed(this);">
       <OPTION VALUE="">(default service address)
@@ -139,6 +139,7 @@ Example:
              #'onchange' ?  probably not
              'disabled'     => ( $locationnum == -1 ? '' : 'DISABLED' ),
              'no_asterisks' => 1,
+             'no_bold'      => $opt{'no_bold'},
           )
 %>
 
@@ -156,6 +157,7 @@ my $statedefault = $conf->config('statedefault')
 
 my %opt = @_;
 my $cgi       = $opt{'cgi'};
+my $cust_pkg  = $opt{'cust_pkg'};
 my $cust_main = $opt{'cust_main'};
 
 my $prefix = length($cust_main->ship_last) ? 'ship_' : '';
@@ -170,9 +172,15 @@ if ( $locationnum && $locationnum != -1 ) {
   $cust_location = new FS::cust_location;
   if ( $locationnum == -1 ) {
     $cust_location->$_( $cgi->param($_) ) foreach @location_fields;
+  } elsif ( $cust_pkg && $cust_pkg->locationnum ) {
+    my $pkg_location = $cust_pkg->cust_location;
+    $cust_location->$_( $pkg_location->$_ ) foreach @location_fields;
+    $opt{'empty_label'} ||= 'package address: '.$pkg_location->line;
   } else {
     $cust_location->$_( $cust_main->get($prefix.$_) ) foreach @location_fields;
   }
 }
 
+my $th = $opt{'no_bold'} ? 'TD' : 'TH';
+
 </%init>
diff --git a/httemplate/elements/tr-select-svc-domain.html b/httemplate/elements/tr-select-svc-domain.html
new file mode 100644 (file)
index 0000000..437bc58
--- /dev/null
@@ -0,0 +1,34 @@
+%if ( $columnflag eq 'F' ) {
+  <INPUT TYPE="hidden" NAME="domsvc" VALUE="<% $domsvc %>">
+% } else { 
+
+  <TR>
+    <TD ALIGN="right"><% $opt{'label'} || 'Domain' %></TD>
+    <TD>
+      <% include('/elements/select-svc-domain.html',
+                   'curr_value' => $domsvc,
+                   'part_svc'   => $part_svc,
+                   'cust_pkg'   => $cust_pkg,
+                )
+      %>
+    </TD>
+  </TR>
+% } 
+<%init>
+
+my %opt = @_;
+
+my $domsvc = $opt{'curr_value'};
+
+#required
+my $part_svc = $opt{'part_svc'}
+               || qsearchs('part_svc', { 'svcpart' => $opt{'svcpart'} });
+
+my $columnflag = $part_svc->part_svc_column('domsvc')->columnflag;
+
+#optional
+my $cust_pkg = $opt{'cust_pkg'};
+$cust_pkg ||= qsearchs('cust_pkg', { 'pkgnum' => $opt{'pkgnum'} })
+  if $opt{'pkgnum'};
+
+</%init>
diff --git a/httemplate/elements/tr-select-svc_pbx.html b/httemplate/elements/tr-select-svc_pbx.html
new file mode 100644 (file)
index 0000000..b02bd65
--- /dev/null
@@ -0,0 +1,60 @@
+%if ( $columnflag eq 'F' || !keys(%svc_pbx) ) {
+  <INPUT TYPE="hidden" NAME="<% $opt{'element_name'} || $opt{'field'} || 'pbxsvc' %>" VALUE="<% $pbxsvc %>">
+% } else { 
+
+  <TR>
+    <TD ALIGN="right"><% $opt{'label'} || 'PBX' %></TD>
+    <TD>
+      <% include('/elements/select-svc_pbx.html',
+                   'curr_value' => $pbxsvc,
+                   'part_svc'   => $part_svc,
+                   'cust_pkg'   => $cust_pkg,
+                )
+      %>
+    </TD>
+  </TR>
+% } 
+<%init>
+
+# false laziness w/tr-select-svc_acct-domain.html
+
+my %opt = @_;
+
+my $pbxsvc = $opt{'curr_value'};
+
+#required
+my $part_svc = $opt{'part_svc'}
+               || qsearchs('part_svc', { 'svcpart' => $opt{'svcpart'} });
+my $svcpart =
+  $part_svc ? $part_svc->svcpart : '';
+my $columnflag =
+  $part_svc ? $part_svc->part_svc_column('pbxsvc')->columnflag : '';
+
+#optional
+my $cust_pkg = $opt{'cust_pkg'};
+$cust_pkg ||= qsearchs('cust_pkg', { 'pkgnum' => $opt{'pkgnum'} })
+  if $opt{'pkgnum'};
+
+# false laziness w/select-svc_pbx.html
+
+my $pkgnum = $cust_pkg ? $cust_pkg->pkgnum : '';
+
+my %svc_pbx = ();
+
+if ( $pbxsvc ) {
+  my $svc_pbx = qsearchs('svc_pbx', { 'svcnum' => $pbxsvc } );
+  if ( $svc_pbx ) {
+    $svc_pbx{$svc_pbx->svcnum} = $svc_pbx;
+  } else {
+    warn "unknown svc_pbx.svcnum for svc_acct.pbxsvc: $pbxsvc";
+  }
+}
+
+%svc_pbx = (
+  %svc_pbx,
+  FS::svc_Common->pbx_select_hash( 'svcpart' => $svcpart,
+                                   'pkgnum'  => $pkgnum,
+                                 )
+);
+
+</%init>
diff --git a/httemplate/misc/bulk_pkg_increment_bill.cgi b/httemplate/misc/bulk_pkg_increment_bill.cgi
new file mode 100755 (executable)
index 0000000..d594b55
--- /dev/null
@@ -0,0 +1,50 @@
+<% include('/elements/header-popup.html', "Increment Next Bill Date") %>
+
+% if ( $cgi->param('error') ) {
+  <FONT SIZE="+1" COLOR="#ff0000">Error: <% $cgi->param('error') %></FONT>
+  <BR><BR>
+% }
+
+<FORM ACTION="<% $p %>misc/process/bulk_pkg_increment_bill.cgi" METHOD=POST>
+
+%# some false laziness w/search/cust_pkg.cgi
+
+<INPUT TYPE="hidden" NAME="query" VALUE="<% $cgi->keywords |h %>">
+%  for my $param (qw(agentnum custnum magic status classnum custom censustract)) {
+<INPUT TYPE="hidden" NAME="<% $param %>" VALUE="<% $cgi->param($param) |h %>">
+%  }
+%
+% foreach my $pkgpart ($cgi->param('pkgpart')) {
+<INPUT TYPE="hidden" NAME="pkgpart" VALUE="<% $pkgpart |h %>">
+% }
+%
+% foreach my $field (qw( setup last_bill bill adjourn susp expire cancel )) {
+% 
+  <INPUT TYPE="hidden" NAME="<% $field %>begin" VALUE="<% $cgi->param("${field}.begin") |h %>">
+  <INPUT TYPE="hidden" NAME="<% $field %>beginning" VALUE="<% $cgi->param("${field}beginning") |h %>">
+  <INPUT TYPE="hidden" NAME="<% $field %>end" VALUE="<% $cgi->param("${field}.end") |h %>">
+  <INPUT TYPE="hidden" NAME="<% $field %>ending" VALUE="<% $cgi->param("${field}.ending") |h %>">
+% }
+
+<% ntable('#cccccc') %>
+
+  <TR>
+    <TD>Days to increment: </TD>
+    <TD><INPUT type="text" name="days"></TD>
+  </TR>
+
+</TABLE>
+
+<BR>
+<INPUT TYPE="submit" VALUE="Increment next bill date">
+
+</FORM>
+</BODY>
+</HTML>
+
+<%init>
+
+die "access denied"
+  unless $FS::CurrentUser::CurrentUser->access_right('Bulk change customer packages');
+
+</%init>
index 607ce13..67d2847 100755 (executable)
@@ -31,7 +31,7 @@
 <SCRIPT TYPE="text/javascript">
   Calendar.setup({
     inputField: "expire_date",
-    ifFormat:   "%m/%d/%Y",
+    ifFormat:   "<% $date_format %>",
     button:     "expire_button",
     align:      "BR"
   });
 
 <%init>
 
-my $date = time2str("%m/%d/%Y", time);
+my %conf = new FS::Conf;
+my $date_format = $conf->config('date_format') || '%m/%d/%Y';
+
+my $date = time2str($date_format, time);
 
 my($pkgnum, $reasonnum);
 if ( $cgi->param('error') ) {
index d4a6da1..8adc40d 100755 (executable)
@@ -25,7 +25,7 @@
 <SCRIPT TYPE="text/javascript">
   Calendar.setup({
     inputField: "dun_date",
-    ifFormat:   "%m/%d/%Y",
+    ifFormat:   "<% $date_format %>",
     button:     "dun_button",
     align:      "BR"
   });
 
 <%init>
 
-my $date = time2str("%m/%d/%Y", time);
+my $conf = new FS::Conf;
+my $date_format = $conf->config('date_format') || '%m/%d/%Y';
+
+my $date = time2str($date_format, time);
 
 my($pkgnum);
 if ( $cgi->param('error') ) {
diff --git a/httemplate/misc/delete-mailinglistmember.html b/httemplate/misc/delete-mailinglistmember.html
new file mode 100644 (file)
index 0000000..6b91de8
--- /dev/null
@@ -0,0 +1,20 @@
+% if ( $error ) {
+%   errorpage($error);
+% } else {
+<% $cgi->redirect($p."search/mailinglistmember.html?listnum=$listnum") %>
+% }
+<%init>
+
+my($query) = $cgi->keywords;
+$query =~ /^(\d+)$/ || die "Illegal devicenum";
+my $membernum = $1;
+
+my $mailinglistmember =
+  qsearchs('mailinglistmember', { 'membernum' => $membernum } )
+    or die "unknown membernum $membernum";
+
+my $listnum = $mailinglistmember->listnum;
+
+my $error = $mailinglistmember->delete;
+
+</%init>
index a7571ca..85573e6 100644 (file)
@@ -54,7 +54,7 @@
 <SCRIPT TYPE="text/javascript">
   Calendar.setup({
     inputField: "start_date_text",
-    ifFormat:   "%m/%d/%Y",
+    ifFormat:   "<% $date_format %>",
     button:     "start_date_button",
     align:      "BR"
   });
@@ -90,6 +90,7 @@ die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Order customer package');
 
 my $conf = new FS::Conf;
+my $date_format = $conf->config('date_format') || '%m/%d/%Y';
 
 $cgi->param('custnum') =~ /^(\d+)$/ or die "no custnum";
 my $custnum = $1;
index 87a6745..60b2aeb 100644 (file)
@@ -47,7 +47,7 @@ foreach my $countrycode ( @countrycodes ) {
                           || new FS::rate_detail   \%hash;
 
     $dst_rate_detail->$_( $src_rate_detail->get($_) )
-      foreach qw( min_included min_charge sec_granularity classnum );
+      foreach qw( min_included conn_charge conn_sec min_charge sec_granularity classnum );
 
     my $method = $dst_rate_detail->ratedetailnum ? 'replace' : 'insert';
 
index e73133c..442d83a 100644 (file)
@@ -1,5 +1,9 @@
 <% include('/elements/header.html', 'Edit rates with Excel' ) %>
 
+% if ( $have_conn ) { 
+  <FONT COLOR="#FF0000">WARNING: This functionality does not yet preserve connection charges.</FONT><BR><BR>
+% }
+
 <% include( '/elements/form-file_upload.html',
               'name'      => 'RateImportForm',
               'action'    => 'process/rate_edit_excel.html',
@@ -58,4 +62,9 @@
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Configuration');
 
+my $sth = dbh->prepare('SELECT COUNT(*) FROM rate_detail WHERE conn_charge > 0 OR conn_sec > 0 LIMIT 1')
+  or die dbh->errstr;
+$sth->execute or die $sth->errstr;
+my $have_conn = $sth->fetchrow_arrayref->[0];
+
 </%init>
index 378164e..708583d 100644 (file)
@@ -45,8 +45,10 @@ unless ( $error ) { # if ($access_user) {
   #XXX autogen
   my @paramlist = qw( menu_position default_customer_view
                       email_address
+                      snom-ip snom-username snom-password
                       vonage-fromnumber vonage-username vonage-password
-                      show_pkgnum show_db_profile save_db_profile
+                      show_pkgnum show_confitem_counts export_getsettings
+                      show_db_profile save_db_profile
                       height width availHeight availWidth colorDepth
                     );
 
index 562ef29..7ded183 100644 (file)
@@ -80,6 +80,14 @@ Development
     <TD><INPUT TYPE="checkbox" NAME="show_pkgnum" VALUE="1" <% $curuser->option('show_pkgnum') ? 'CHECKED' : '' %>></TD>
   </TR>
   <TR>
+    <TH>Show config item counts: </TH>
+    <TD><INPUT TYPE="checkbox" NAME="show_confitem_counts" VALUE="1" <% $curuser->option('show_confitem_counts') ? 'CHECKED' : '' %>></TD>
+  </TR>
+  <TR>
+    <TH>Show export data on service view (when available): </TH>
+    <TD><INPUT TYPE="checkbox" NAME="export_getsettings" VALUE="1" <% $curuser->option('export_getsettings') ? 'CHECKED' : '' %>></TD>
+  </TR>
+  <TR>
     <TH>Show database profiling (when available): </TH>
     <TD><INPUT TYPE="checkbox" NAME="show_db_profile" VALUE="1" <% $curuser->option('show_db_profile') ? 'CHECKED' : '' %>></TD>
   </TR>
@@ -91,6 +99,28 @@ Development
 </TABLE>
 <BR>
 
+SNOM integration
+<% ntable("#cccccc",2) %>
+
+  <TR>
+    <TH ALIGN="right">SNOM IP address</TH>
+    <TD><INPUT TYPE="text" NAME="snom-ip" VALUE="<% $curuser->option('snom-ip') %>"></TD>
+  </TR>
+
+  <TR>
+    <TH ALIGN="right">SNOM HTTP username (if necessary)</TH>
+    <TD><INPUT TYPE="text" NAME="snom-username" VALUE="<% $curuser->option('snom-username') %>"></TD>
+  </TR>
+
+  <TR>
+    <TH ALIGN="right">SNOM HTTP password (if necessary)</TH>
+    <TD><INPUT TYPE="password" NAME="snom-password" VALUE="<% $curuser->option('snom-password') %>"></TD>
+  </TR>
+
+</TABLE>
+<BR>
+
+OR<BR><BR>
 
 Vonage integration (see <a href="https://secure.click2callu.com/">Click2Call</a>)
 <% ntable("#cccccc",2) %>
index c1f5517..8d72357 100755 (executable)
@@ -22,7 +22,7 @@
                    sub { time2str('%b %d %Y', shift->_date ) },
                    \&FS::UI::Web::cust_fields,
                  ],
-                 'align' => 'rrrr'.FS::UI::Web::cust_aligns(),
+                 'align' => 'rrrrl'.FS::UI::Web::cust_aligns(),
                  'links' => [
                    $link,
                    $link,
index 3c390e7..4272d86 100644 (file)
@@ -5,34 +5,34 @@
                 'count_query' => $count_query,
                 'count_addl'  => [ '$%.2f total paid (net)', ],
                 'header'      => [ 'Net applied',
-                                   'to Invoice',
+                                   'Invoice',
+                                   'Invoice amount',
+                                   'Invoice date',
                                    'Payment',
+                                   'Payment amount',
+                                   'Payment date',
                                    'By',
                                    FS::UI::Web::cust_header(),
                                  ],
                 'fields'      => [
-                   sub { $money_char. sprintf('%.2f', shift->amount ) },
-                   sub { my $cbp = shift;
-                         '#'.$cbp->invnum. ' '.
-                         time2str('%b %d %Y', $cbp->cust_bill_date ).
-                         " ($money_char".
-                           sprintf('%.2f', $cbp->cust_bill_amount).
-                         ")" 
-                       },
-                   sub { my $cbp = shift;
-                         $cbp->cust_pay->payby_payinfo_pretty. ' '.
-                         time2str('%b %d %Y', $cbp->_date ).
-                         " ($money_char".
-                         sprintf('%.2f', $cbp->cust_pay_paid ).
-                         ")"
-                       },
-                   sub { shift->cust_pay->otaker },
+                   sub { $money_char.sprintf('%.2f', shift->amount ) },
+                   'invnum',
+                   sub { $money_char.sprintf('%.2f', shift->cust_bill_charged)},
+                   sub { time2str('%b %d %Y', shift->cust_bill_date ) },
+                   sub { shift->cust_pay->payby_payinfo_pretty },
+                   sub { $money_char.sprintf('%.2f', shift->cust_pay_paid)},
+                   sub { time2str('%b %d %Y', shift->cust_pay_date ) },
+                   sub { shift->cust_pay_otaker },
                    \&FS::UI::Web::cust_fields,
                 ],
-                'align' => 'rrrl'.FS::UI::Web::cust_aligns(),
+                'align' => 'rrrrlrrl'.FS::UI::Web::cust_aligns(),
                 'links' => [
                              '',
                              $cust_bill_link,
+                             $cust_bill_link,
+                             $cust_bill_link,
+                             $cust_pay_link,
+                             $cust_pay_link,
                              $cust_pay_link,
                              '',
                              ( map { $_ ne 'Cust. Status' ? $cust_link : '' }
                              '',
                              '',
                              '',
+                             '',
+                             '',
+                             '',
+                             '',
                              FS::UI::Web::cust_colors(),
                            ],
                 'style' => [ 
                              '',
                              '',
                              '',
+                             '',
+                             '',
+                             '',
+                             '',
                              FS::UI::Web::cust_styles(),
                            ],
           )
@@ -93,9 +101,11 @@ my $sql_query   = {
   'table'     => 'cust_bill_pay',
   'select'    => join(', ',
                    'cust_bill_pay.*',
-                   'cust_pay.paid       AS cust_pay_paid',
                    'cust_bill._date     AS cust_bill_date',
-                   #'cust_bill.charged   AS cust_bill_charged',
+                   'cust_bill.charged   AS cust_bill_charged',
+                   'cust_pay.paid       AS cust_pay_paid',
+                   'cust_pay._date      AS cust_pay_date',
+                   'cust_pay.otaker     AS cust_pay_otaker',
                    'cust_pay.custnum    AS custnum',
                    'cust_main.custnum   AS cust_main_custnum',
                    FS::UI::Web::cust_sql_fields(),
index 9b0201c..2e79cd7 100644 (file)
@@ -3,15 +3,24 @@
                  'name'        => 'line items',
                  'query'       => $query,
                  'count_query' => $count_query,
-                 'count_addl'  => [ $money_char. '%.2f total', ],
+                 'count_addl'  => [ $money_char. '%.2f total',
+                                    $unearned ? ( $money_char. '%.2f unearned revenue' ) : (),
+                                  ],
                  'header'      => [
                    '#',
                    'Description',
-                   'Setup charge',
+                   ( $unearned
+                     ? 'Unearned'
+                     : 'Setup charge'
+                   ),
                    ( $use_usage eq 'usage'
                      ? 'Usage charge'
                      : 'Recurring charge'
                    ),
+                   ( $unearned
+                     ? ( 'Charge start', 'Charge end' )
+                     : ()
+                   ),
                    'Invoice',
                    'Date',
                    FS::UI::Web::cust_header(),
                        },
                    #strikethrough or "N/A ($amount)" or something these when
                    # they're not applicable to pkg_tax search
-                   sub { sprintf($money_char.'%.2f', shift->setup ) },
+                   sub { my $cust_bill_pkg = shift;
+                         if ( $unearned ) {
+                           my $period =
+                             $cust_bill_pkg->edate - $cust_bill_pkg->sdate;
+                           my $elapsed = $unearned - $cust_bill_pkg->sdate;
+                           $elapsed = 0 if $elapsed < 0;
+
+                           my $remaining = 1 - $elapsed/$period;
+
+                           sprintf($money_char. '%.2f',
+                             $remaining * $cust_bill_pkg->recur );
+
+                         } else {
+                           sprintf($money_char.'%.2f', $cust_bill_pkg->setup );
+                         }
+                       },
                    sub { my $row = shift;
                          my $value = 0;
                          if ( $use_usage eq 'recurring' ) {
                          }
                          sprintf($money_char.'%.2f', $value );
                        },
+                   ( $unearned
+                     ? ( sub { time2str('%b %d %Y', shift->sdate ) },
+                         sub { time2str('%b %d %Y', shift->edate ) },
+                       )
+                     : ()
+                   ),
                    'invnum',
                    sub { time2str('%b %d %Y', shift->_date ) },
                    \&FS::UI::Web::cust_fields,
@@ -45,6 +75,7 @@
                    '',
                    '',
                    '',
+                   ( $unearned ? ( '', '' ) : () ),
                    $ilink,
                    $ilink,
                    ( map { $_ ne 'Cust. Status' ? $clink : '' }
                    ),
                  ],
                  #'align' => 'rlrrrc'.FS::UI::Web::cust_aligns(),
-                 'align' => 'lrrrc'.FS::UI::Web::cust_aligns(),
+                 'align' => 'lrr'.
+                            ( $unearned ? 'cc' : '' ).
+                            'rc'.
+                            FS::UI::Web::cust_aligns(),
                  'color' => [ 
                               #'',
                               '',
                               '',
                               '',
+                              ( $unearned ? ( '', '' ) : () ),
                               '',
                               '',
                               FS::UI::Web::cust_colors(),
                               '',
                               '',
                               '',
+                              ( $unearned ? ( '', '' ) : () ),
                               '',
                               '',
                               FS::UI::Web::cust_styles(),
@@ -80,6 +116,8 @@ die "access denied"
 
 my $conf = new FS::Conf;
 
+my $unearned = '';
+
 #here is the agent virtualization
 my $agentnums_sql =
   $FS::CurrentUser::CurrentUser->agentnums_sql( 'table' => 'cust_main' );
@@ -282,6 +320,19 @@ if ( $cgi->param('out') ) {
                    keys %ph
     );
 
+} elsif ( $cgi->param('unearned_now') =~ /^(\d+)$/ ) {
+
+  $unearned = $1;
+
+  push @where, "cust_bill_pkg.sdate < $unearned",
+               "cust_bill_pkg.edate > $unearned",
+               "cust_bill_pkg.recur != 0",
+               "part_pkg.freq != '0'",
+               "part_pkg.freq != '1'",
+               "part_pkg.freq NOT LIKE '%h'",
+               "part_pkg.freq NOT LIKE '%d'",
+               "part_pkg.freq NOT LIKE '%w'";
+
 }
 
 if ( $cgi->param('itemdesc') ) {
@@ -399,10 +450,31 @@ if ( $cgi->param('pkg_tax') ) {
     $count_query .= "SUM(setup + recur - usage)";
   } elsif ( $use_usage eq 'usage' ) {
     $count_query .= "SUM(usage)";
+  } elsif ( $unearned ) {
+    $count_query .= "SUM(cust_bill_pkg.recur)";
   } else {
     $count_query .= "SUM(cust_bill_pkg.setup + cust_bill_pkg.recur)";
   }
 
+  if ( $unearned ) {
+
+    #false laziness w/report_prepaid_income.cgi
+
+    my $float = 'REAL'; #'DOUBLE PRECISION';
+
+    my $period = "CAST(cust_bill_pkg.edate - cust_bill_pkg.sdate AS $float)";
+    my $elapsed = "(CASE WHEN cust_bill_pkg.sdate > $unearned
+                     THEN 0
+                     ELSE ($unearned - cust_bill_pkg.sdate)
+                   END)";
+    #my $elapsed = "CAST($unearned - cust_bill_pkg.sdate AS $float)";
+
+    my $remaining = "(1 - $elapsed/$period)";
+
+    $count_query .= ", SUM($remaining * cust_bill_pkg.recur)";
+
+  }
+
 }
 
 my $where = ' WHERE '. join(' AND ', @where);
@@ -458,11 +530,13 @@ if ($use_usage) {
 }
 warn "count_query is $count_query\n";
 
-my @select = (
-               'cust_bill_pkg.*',
-               'cust_bill._date',
-             );
-push @select, 'part_pkg.pkg' unless $cgi->param('istax');
+my @select = ( 'cust_bill_pkg.*',
+               'cust_bill._date', );
+
+push @select, 'part_pkg.pkg',
+              'part_pkg.freq',
+  unless $cgi->param('istax');
+
 push @select, 'cust_main.custnum',
               FS::UI::Web::cust_sql_fields();
 
index 56df924..e87b214 100644 (file)
@@ -32,6 +32,17 @@ if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {
   $agentnum = $1;
   push @where, "cust_main.agentnum = $agentnum";
 }
+
+# select svcdb
+
+if ( $cgi->param('svcdb') =~ /^(\w+)$/ ) {
+  my $svcdb = $1;
+  push @where, "EXISTS( SELECT 1 FROM $svcdb LEFT JOIN cust_svc USING ( svcnum )
+                                             LEFT JOIN cust_pkg USING ( pkgnum )
+                          WHERE cust_pkg.custnum = cust_main.custnum
+                      )";
+}
+
 my $where = scalar(@where) ? 'WHERE '. join(' AND ', @where) : '';
 
 # bill zip vs ship zip
index ee4c82d..83cd206 100755 (executable)
                     ),
                     '',
                   ],
-                  'extra_choices_callback'=> $extra_choices, 
               )
 %>
 <%init>
@@ -253,22 +252,32 @@ sub time_or_blank {
    };
 }
 
-my $html_init = include('/elements/init_overlib.html');
-
-my $extra_choices = sub {
+my $html_init = sub {
   my $query = shift;
-
-  return '' unless
-   $FS::CurrentUser::CurrentUser->access_right('Bulk change customer packages');
-    
-  '<BR><BR>'.
-  include( '/elements/popup_link.html',
-             'label'       => 'Change these packages',
-             'action'      => "${p}misc/bulk_change_pkg.cgi?$query",
-             'actionlabel' => 'Change Packages',
-             'width'       => 763,
-             'height'      => 336,
-         );
+  my $text = '';
+  my $curuser = $FS::CurrentUser::CurrentUser;
+
+  if ( $curuser->access_right('Bulk change customer packages') ) {
+    $text .= include('/elements/init_overlib.html').
+             include( '/elements/popup_link.html',
+               'label'       => 'Change these packages',
+               'action'      => "${p}misc/bulk_change_pkg.cgi?$query",
+               'actionlabel' => 'Change Packages',
+               'width'       => 569,
+               'height'      => 210,
+             ). '<BR>';
+
+    if ( $curuser->access_right('Edit customer package dates') ) {
+      $text .= include( '/elements/popup_link.html',
+                 'label'       => 'Increment next bill date',
+                 'action'      => "${p}misc/bulk_pkg_increment_bill.cgi?$query",
+                 'actionlabel' => 'Increment Bill Date',
+                 'width'       => 569,
+                 'height'      => 210,
+              ). '<BR>';
+    }
+  }
+  return $text;
 };
 
 </%init>
index b1296d1..4f83d0a 100755 (executable)
@@ -29,6 +29,15 @@ Examples:
                'redirect_empty' => $redirect_empty,
           )
 
+  include( 'elements/cust_pay_or_refund.html',
+               'table'          => 'h_cust_pay',
+               'amount_field'   => 'paid',
+               'name_singular'  => 'payment',
+               'name_verb'      => 'paid',
+               'pre_header'     => [ 'Transaction',    'By' ],
+               'pre_fields'     => [ 'history_action', 'history_user' ],
+         )
+
 </%doc>
 <% include( 'search.html',
                 'title'          => $title,
@@ -37,46 +46,12 @@ Examples:
                 'count_query'    => $count_query,
                 'count_addl'     => [ '$%.2f total '.$opt{name_verb}, ],
                 'redirect_empty' => $opt{'redirect_empty'},
-                'header'         => [ "\u$name_singular",
-                                      'Amount',
-                                      'Date',
-                                      @header,
-                                      FS::UI::Web::cust_header(),
-                                    ],
-                'fields'       => [
-                  'payby_payinfo_pretty',
-                  sub { sprintf('$%.2f', shift->$amount_field() ) },
-                  sub { time2str('%b %d %Y', shift->_date ) },
-                  @fields,
-                  \&FS::UI::Web::cust_fields,
-                ],
-                #'align' => 'lrrrll',
-                'align' => 'rrr'.
-                           join('', map 'c', @fields ).
-                           FS::UI::Web::cust_aligns(),
-                'links' => [
-                  $link,
-                  $link,
-                  $link,
-                  ( map '', @fields ),
-                  ( map { $_ ne 'Cust. Status' ? $cust_link : '' }
-                        FS::UI::Web::cust_header()
-                  ),
-                ],
-                'color' => [ 
-                             '',
-                             '',
-                             '',
-                             ( map '', @fields ),
-                             FS::UI::Web::cust_colors(),
-                           ],
-                'style' => [ 
-                             '',
-                             '',
-                             '',
-                             ( map '', @fields ),
-                             FS::UI::Web::cust_styles(),
-                           ],
+                'header'         => \@header,
+                'fields'         => \@fields,
+                'align'          => $align,
+                'links'          => \@links,
+                'color'          => \@color,
+                'style'          => \@style,
           )
 %>
 <%init>
@@ -88,16 +63,69 @@ my $curuser = $FS::CurrentUser::CurrentUser;
 die "access denied"
   unless $curuser->access_right('Financial reports');
 
-my $thing = $opt{'thing'};
+my $table = $opt{'table'} || 'cust_'.$opt{'thing'};
+
 my $amount_field = $opt{'amount_field'};
 my $name_singular = $opt{'name_singular'};
 
 my $title = "\u$name_singular Search Results";
 
+my $link = '';
+if (    ( $curuser->access_right('View invoices') #XXX for now
+          || $curuser->access_right('View customer payments')
+        )
+     && ! $opt{'disable_link'}
+   )
+{
+
+  my $key;
+  my $q = '';
+  if ( $table eq 'cust_pay_void' ) {
+    $key = 'paynum';
+    $q .= 'void=1;';
+  } elsif ( $table eq /^cust_(\w+)$/ ) {
+    $key = $1.'num';
+  }
+  
+  if ( $key ) {
+    $q .= "$key=";
+    $link = [ "${p}view/$table.html?$q", $key ]
+  }
+}
+
+my $cust_link = sub {
+  my $cust_thing = shift;
+  $cust_thing->cust_main_custnum
+    ? [ "${p}view/cust_main.cgi?", 'custnum' ] 
+    : '';
+};
+
 my @header = ();
 my @fields = ();
+my $align = '';
+my @links = ();
+if ( $opt{'pre_header'} ) {
+  push @header, @{ $opt{'pre_header'} };
+  $align .= 'c' x scalar(@{ $opt{'pre_header'} });
+  push @links, map '', @{ $opt{'pre_header'} };
+  push @fields, @{ $opt{'pre_fields'} };
+}
+
+push @header, "\u$name_singular",
+              'Amount',
+              'Date',
+;
+$align .= 'rrr';
+push @links, '', '', '';
+push @fields, 'payby_payinfo_pretty',
+              sub { sprintf('$%.2f', shift->$amount_field() ) },
+              sub { time2str('%b %d %Y', shift->_date ) },
+;
+
 unless ( $opt{'disable_by'} ) {
   push @header, 'By';
+  $align .= 'c';
+  push @links, '';
   push @fields, sub { my $o = shift->otaker;
                       $o = 'auto billing'          if $o eq 'fs_daily';
                       $o = 'customer self-service' if $o eq 'fs_selfservice';
@@ -105,6 +133,14 @@ unless ( $opt{'disable_by'} ) {
                     };
 }
 
+push @header, FS::UI::Web::cust_header();
+$align .=  FS::UI::Web::cust_aligns();
+push @links, map { $_ ne 'Cust. Status' ? $cust_link : '' }
+                 FS::UI::Web::cust_header();
+my @color = ( ( map '', @fields ), FS::UI::Web::cust_colors() );
+my @style = ( ( map '', @fields ), FS::UI::Web::cust_styles() );
+push @fields, \&FS::UI::Web::cust_fields;
+
 push @header, @{ $opt{'addl_header'} }
   if $opt{'addl_header'};
 push @fields, @{ $opt{'addl_fields'} }
@@ -132,7 +168,7 @@ if ( $cgi->param('magic') ) {
       $cgi->param('payby') =~
         /^(CARD|CHEK|BILL|PREP|CASH|WEST|MCRD)(-(VisaMC|Amex|Discover|Maestro))?$/
           or die "illegal payby ". $cgi->param('payby');
-      push @search, "cust_$thing.payby = '$1'";
+      push @search, "$table.payby = '$1'";
       if ( $3 ) {
 
         my $cardtype = $3;
@@ -141,53 +177,53 @@ if ( $cgi->param('magic') ) {
         if ( $cardtype eq 'VisaMC' ) {
           #avoid posix regexes for portability
           $search =
-            " ( (     substring(cust_$thing.payinfo from 1 for 1) = '4'     ".
-            "     AND substring(cust_$thing.payinfo from 1 for 4) != '4936' ".
-            "     AND substring(cust_$thing.payinfo from 1 for 6)           ".
+            " ( (     substring($table.payinfo from 1 for 1) = '4'     ".
+            "     AND substring($table.payinfo from 1 for 4) != '4936' ".
+            "     AND substring($table.payinfo from 1 for 6)           ".
             "         NOT SIMILAR TO '49030[2-9]'                        ".
-            "     AND substring(cust_$thing.payinfo from 1 for 6)           ".
+            "     AND substring($table.payinfo from 1 for 6)           ".
             "         NOT SIMILAR TO '49033[5-9]'                        ".
-            "     AND substring(cust_$thing.payinfo from 1 for 6)           ".
+            "     AND substring($table.payinfo from 1 for 6)           ".
             "         NOT SIMILAR TO '49110[1-2]'                        ".
-            "     AND substring(cust_$thing.payinfo from 1 for 6)           ".
+            "     AND substring($table.payinfo from 1 for 6)           ".
             "         NOT SIMILAR TO '49117[4-9]'                        ".
-            "     AND substring(cust_$thing.payinfo from 1 for 6)           ".
+            "     AND substring($table.payinfo from 1 for 6)           ".
             "         NOT SIMILAR TO '49118[1-2]'                        ".
             "   )".
-            "   OR substring(cust_$thing.payinfo from 1 for 2) = '51' ".
-            "   OR substring(cust_$thing.payinfo from 1 for 2) = '52' ".
-            "   OR substring(cust_$thing.payinfo from 1 for 2) = '53' ".
-            "   OR substring(cust_$thing.payinfo from 1 for 2) = '54' ".
-            "   OR substring(cust_$thing.payinfo from 1 for 2) = '54' ".
-            "   OR substring(cust_$thing.payinfo from 1 for 2) = '55' ".
-            "   OR substring(cust_$thing.payinfo from 1 for 2) = '36' ". #Diner's int'l processed as Visa/MC inside US
+            "   OR substring($table.payinfo from 1 for 2) = '51' ".
+            "   OR substring($table.payinfo from 1 for 2) = '52' ".
+            "   OR substring($table.payinfo from 1 for 2) = '53' ".
+            "   OR substring($table.payinfo from 1 for 2) = '54' ".
+            "   OR substring($table.payinfo from 1 for 2) = '54' ".
+            "   OR substring($table.payinfo from 1 for 2) = '55' ".
+            "   OR substring($table.payinfo from 1 for 2) = '36' ". #Diner's int'l processed as Visa/MC inside US
             " ) ";
         } elsif ( $cardtype eq 'Amex' ) {
           $search =
-            " (    substring(cust_$thing.payinfo from 1 for 2 ) = '34' ".
-            "   OR substring(cust_$thing.payinfo from 1 for 2 ) = '37' ".
+            " (    substring($table.payinfo from 1 for 2 ) = '34' ".
+            "   OR substring($table.payinfo from 1 for 2 ) = '37' ".
             " ) ";
         } elsif ( $cardtype eq 'Discover' ) {
           $search =
-            " (    substring(cust_$thing.payinfo from 1 for 4 ) = '6011'  ".
-            "   OR substring(cust_$thing.payinfo from 1 for 2 ) = '65'    ".
-            "   OR substring(cust_$thing.payinfo from 1 for 3 ) = '622'   ". #China Union Pay processed as Discover outside CN
+            " (    substring($table.payinfo from 1 for 4 ) = '6011'  ".
+            "   OR substring($table.payinfo from 1 for 2 ) = '65'    ".
+            "   OR substring($table.payinfo from 1 for 3 ) = '622'   ". #China Union Pay processed as Discover outside CN
             " ) ";
         } elsif ( $cardtype eq 'Maestro' ) { 
           $search =
-            " (    substring(cust_$thing.payinfo from 1 for 2 ) = '63'     ".
-            "   OR substring(cust_$thing.payinfo from 1 for 2 ) = '67'     ".
-            "   OR substring(cust_$thing.payinfo from 1 for 6 ) = '564182' ".
-            "   OR substring(cust_$thing.payinfo from 1 for 4 ) = '4936'   ".
-            "   OR substring(cust_$thing.payinfo from 1 for 6 )            ".
+            " (    substring($table.payinfo from 1 for 2 ) = '63'     ".
+            "   OR substring($table.payinfo from 1 for 2 ) = '67'     ".
+            "   OR substring($table.payinfo from 1 for 6 ) = '564182' ".
+            "   OR substring($table.payinfo from 1 for 4 ) = '4936'   ".
+            "   OR substring($table.payinfo from 1 for 6 )            ".
             "      SIMILAR TO '49030[2-9]'                             ".
-            "   OR substring(cust_$thing.payinfo from 1 for 6 )            ".
+            "   OR substring($table.payinfo from 1 for 6 )            ".
             "      SIMILAR TO '49033[5-9]'                             ".
-            "   OR substring(cust_$thing.payinfo from 1 for 6 )            ".
+            "   OR substring($table.payinfo from 1 for 6 )            ".
             "      SIMILAR TO '49110[1-2]'                             ".
-            "   OR substring(cust_$thing.payinfo from 1 for 6 )            ".
+            "   OR substring($table.payinfo from 1 for 6 )            ".
             "      SIMILAR TO '49117[4-9]'                             ".
-            "   OR substring(cust_$thing.payinfo from 1 for 6 )            ".
+            "   OR substring($table.payinfo from 1 for 6 )            ".
             "      SIMILAR TO '49118[1-2]'                             ".
             " ) ";
         } else {
@@ -195,10 +231,10 @@ if ( $cgi->param('magic') ) {
         }
 
         my $masksearch = $search;
-        $masksearch =~ s/cust_$thing\.payinfo/cust_$thing.paymask/gi;
+        $masksearch =~ s/$table\.payinfo/$table.paymask/gi;
 
         push @search,
-          "( $search OR ( cust_$thing.paymask IS NOT NULL AND $masksearch ) )";
+          "( $search OR ( $table.paymask IS NOT NULL AND $masksearch ) )";
 
       }
     }
@@ -206,11 +242,11 @@ if ( $cgi->param('magic') ) {
     if ( $cgi->param('payinfo') ) {
       $cgi->param('payinfo') =~ /^\s*(\d+)\s*$/
         or die "illegal payinfo ". $cgi->param('payinfo');
-      push @search, "cust_$thing.payinfo = '$1'";
+      push @search, "$table.payinfo = '$1'";
     }
 
     if ( $cgi->param('otaker') =~ /^(\w+)$/ ) {
-      push @search, "cust_$thing.otaker = '$1'";
+      push @search, "$table.otaker = '$1'";
     }
 
     #for cust_pay_pending...  statusNOT=done
@@ -222,7 +258,7 @@ if ( $cgi->param('magic') ) {
     push @search, "_date >= $beginning ",
                   "_date <= $ending";
 
-    if ( $thing eq 'pay_void' ) {
+    if ( $table eq 'cust_pay_void' ) {
       my($v_beginning, $v_ending) =
         FS::UI::Web::parse_beginning_ending($cgi, 'void');
       push @search, "void_date >= $v_beginning ",
@@ -246,19 +282,34 @@ if ( $cgi->param('magic') ) {
     die "unknown search magic: ". $cgi->param('magic');
   }
 
+  #for the history search
+  if ( $cgi->param('history_action') =~ /^([\w,]+)$/ ) {
+    my @history_action = split(/,/, $1);
+    push @search, 'history_action IN ('.
+                    join(',', map "'$_'", @history_action ). ')';
+  }
+
+  if (    $cgi->param('history_date_beginning')
+       || $cgi->param('history_date_ending')    ) {
+      my($h_beginning, $h_ending) =
+        FS::UI::Web::parse_beginning_ending($cgi, 'history_date');
+      push @search, "history_date >= $h_beginning ",
+                    "history_date <= $h_ending";
+  }
+
   #here is the agent virtualization
   push @search, $curuser->agentnums_sql;
 
   my $search = ' WHERE '. join(' AND ', @search);
 
   $count_query = "SELECT COUNT(*), SUM($amount_field) ".
-                 "FROM cust_$thing LEFT JOIN cust_main USING ( custnum )".
+                 "FROM $table LEFT JOIN cust_main USING ( custnum )".
                  $search;
 
   $sql_query = {
-    'table'     => "cust_$thing",
+    'table'     => $table,
     'select'    => join(', ',
-                     "cust_$thing.*",
+                     "$table.*",
                      'cust_main.custnum as cust_main_custnum',
                      FS::UI::Web::cust_sql_fields(),
                    ),
@@ -277,12 +328,12 @@ if ( $cgi->param('magic') ) {
   $cgi->param('payby') =~ /^(\w+)$/ or die "illegal payby";
   my $payby = $1;
 
-  $count_query = "SELECT COUNT(*), SUM($amount_field) FROM cust_$thing".
+  $count_query = "SELECT COUNT(*), SUM($amount_field) FROM $table".
                  "  WHERE payinfo = '$payinfo' AND payby = '$payby'".
                  "  AND ". $curuser->agentnums_sql;
 
   $sql_query = {
-    'table'     => "cust_$thing",
+    'table'     => $table,
     'hashref'   => { 'payinfo' => $payinfo,
                      'payby'   => $payby    },
     'extra_sql' => $curuser->agentnums_sql.
@@ -291,23 +342,4 @@ if ( $cgi->param('magic') ) {
 
 }
 
-my $link = '';
-if (    ( $curuser->access_right('View invoices') #XXX for now
-          || $curuser->access_right('View customer payments')
-        )
-     && ! $opt{'disable_link'}
-   )
-{
-  my $key = $thing eq 'pay_void' ? 'paynum' : $thing.'num';
-  my $q = ( $thing eq 'pay_void' ? 'void=1;' : '' ). "$key=";
-  $link = [ "${p}view/cust_$thing.html?$q", $key ]
-}
-
-my $cust_link = sub {
-  my $cust_thing = shift;
-  $cust_thing->cust_main_custnum
-    ? [ "${p}view/cust_main.cgi?", 'custnum' ] 
-    : '';
-};
-
 </%init>
index c0bb721..6b915a6 100644 (file)
 %               $cgi->param('_type', 'html-print'); 
                 as <A HREF="<% $cgi->self_url %>">printable copy</A>
 
-              <% $opt{'extra_choices_callback'}
-                 ? &{$opt{'extra_choices_callback'}}($cgi->query_string)
-                 : ''
-              %>
-
               </TD>
 %             $cgi->param('_type', "html" ); 
 %           } 
diff --git a/httemplate/search/h_cust_pay.html b/httemplate/search/h_cust_pay.html
new file mode 100755 (executable)
index 0000000..99330fa
--- /dev/null
@@ -0,0 +1,9 @@
+<% include( 'elements/cust_pay_or_refund.html',
+                'table'         => 'h_cust_pay',
+                'amount_field'  => 'paid',
+                'name_singular' => 'payment',
+                'name_verb'     => 'paid',
+                'pre_header'    => [ 'Transaction',    'By' ],
+                'pre_fields'    => [ 'history_action', 'history_user' ],
+          )
+%>
index cd37e26..ba449ec 100644 (file)
@@ -9,6 +9,7 @@
                                     'hashref' => { 'classnum' => $classnum },
                                     'select'  => join(', ',
                                         'inventory_item.*',
+                                        'part_svc.svcdb',
                                         'cust_main.custnum',
                                         FS::UI::Web::cust_sql_fields(),
                                       ),
@@ -103,7 +104,16 @@ my $count_query =
 my $link = sub {
   my $inventory_item = shift;
   if ( $inventory_item->svcnum ) {
-    [ "${p}view/svc_acct.cgi?", 'svcnum' ];
+
+    #[ "${p}view/svc_acct.cgi?", 'svcnum' ];
+    my $url = svc_url(
+      'm'      => $m,
+      'action' => 'view',
+      #'svcdb'  => $inventory_item->cust_svc->part_svc->svcdb,
+      'svcdb'  => $inventory_item->svcdb, #we have it from the joined search
+      'query'  => '',
+    );
+    [ $url, 'svcnum' ];
   } else {
     '';
   }
diff --git a/httemplate/search/mailinglistmember.html b/httemplate/search/mailinglistmember.html
new file mode 100644 (file)
index 0000000..ee395f4
--- /dev/null
@@ -0,0 +1,57 @@
+<% include('elements/search.html',
+             'title'         => $title,
+             'name_singular' => 'member',
+             'query'         => $query,
+             'count_query'   => $count_query,
+             'header'        => [ 'Email address' ],
+             'fields'        => [ $email_sub, ], #just this one for now
+             'html_init'     => $html_init,
+          )
+%>
+<%init>
+
+#XXX ACL:
+#make sure the mailing list is attached to a customer service i can see/view
+
+$cgi->param('listnum') =~ /^(\d+)$/ or die 'illegal listnum';
+my $listnum = $1;
+
+my $mailinglist = qsearchs('mailinglist', { 'listnum' => $listnum })
+  or die "unknown listnum $listnum";
+my $title = $mailinglist->listname. ' mailing list';
+
+my $svc_mailinglist = $mailinglist->svc_mailinglist;
+
+my $query = {
+  'table' => 'mailinglistmember',
+  'hashref' => { 'listnum' => $listnum },
+};
+
+my $count_query = "SELECT COUNT(*) FROM mailinglistmember WHERE listnum = $listnum";
+
+my $email_sub = sub {
+  my $member = shift;
+  my $r = $member->email; #just this one for now
+  my $a = qq[<A HREF="javascript:areyousure('$r', ]. $member->membernum. ')">';
+  $r .= " (${a}remove</A>)";
+  $r;
+};
+
+my $html_init = '';
+if ( $svc_mailinglist ) {
+  my $svcnum = $svc_mailinglist->svcnum;
+  my $label = encode_entities($svc_mailinglist->label);
+  $html_init .= qq[<A HREF="${p}/view/svc_mailinglist.cgi?$svcnum">View customer mailing list: $label</A><BR><BR>];
+}
+
+$html_init .= <<"END";
+<SCRIPT TYPE="text/javascript">
+  function areyousure(email,membernum) {
+    if ( confirm('Are you sure you want to remove ' + email + ' from this mailing list?') )
+      window.location.href="${p}misc/delete-mailinglistmember.html?" + membernum;
+    
+  }
+</SCRIPT>
+END
+
+</%init>
diff --git a/httemplate/search/part_pkg.html b/httemplate/search/part_pkg.html
new file mode 100644 (file)
index 0000000..87237c7
--- /dev/null
@@ -0,0 +1,213 @@
+<% include( 'elements/search.html',
+              'title'       => $title,
+              'name'        => $name,
+              'header'      => \@header,
+              'query'       => { 'select'    => $select,
+                                 'table'     => 'part_pkg',
+                                 'addl_from' => $addl_from,
+                                 'hashref'   => {},
+                                 'extra_sql' => $extra_sql,
+                                 'order_by'  => "ORDER BY $order_by",
+                               },
+              'count_query' => $count_query,
+              'fields'      => \@fields,
+              'links'       => \@links,
+              'align'       => $align,
+          )
+%>
+<%init>
+
+#this is about reports about packages definitions (starting w/commission ones)
+# while browse/part_pkg.cgi is config->package definitions
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+die "access denied"
+  unless $curuser->access_right('Financial reports');
+
+my $conf = new FS::Conf;
+my $money_char = $conf->config('money_char') || '$';
+
+my $title = 'Package definition report';
+my $name = 'package definition';
+
+my $select = '';
+my $addl_from = '';
+my @where = ();
+my @order_by = ();
+my @header = ();
+my @fields = ();
+my @links  = ();
+my $align  = '';
+
+if (1) { #commission reports
+
+  if (1) { #employee commission reports 
+
+    $select = 'DISTINCT usernum, username, part_pkg.*';
+
+    $addl_from .= ' CROSS JOIN access_user ';
+
+    if ( $cgi->param('otaker') =~ /^(\w+)$/ ) {
+
+      #XXX in this context, agent virt for employees, not package defs
+      my $access_user = qsearchs('access_user', { 'username' => $1 })
+        or die "unknown usernum";
+
+      $title = $access_user->name;
+
+    } else {
+
+      push @header, 'Employee';
+      push @fields, sub { shift->get('username'); }; #access_user->name
+      push @links, ''; #link to employee edit w/ACL?
+      $align .= 'c';
+
+      push @order_by, 'otaker';
+
+      $title = 'Employee';
+
+    }
+
+  } elsif (0) { #agent commission reports
+
+    if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {
+
+      #agent virt
+      my $agent = qsearchs('agent', { 'agentnum' => $1 })
+        or die "unknown agentnum";
+
+      $title = $agent->agent;
+
+      push @header, 'Agent';
+      push @fields, sub { 'XXXagent' };
+      push @links, ''; #link to agent edit w/ACL?
+      $align .= 'c';
+
+      push @order_by, 'agentnum'; #join to agent?  we're mostly interested in grouping rather than order
+
+    } else {
+      $title = 'Agent';
+    }
+
+  }
+
+  $title .= ' commission report';
+  $name = "commissionable $name";
+
+
+}
+
+push @header, 'Package definition';
+push @fields, 'pkg_comment';
+push @links, ''; #link to pkg definition edit w/ACL?
+$align .= 'l';
+
+if (1) { #commission reports
+
+  my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi);
+
+  my $match = '';
+  if (1) { #employee commission reports 
+    $match = 'cust_pkg.otaker = access_user.username';
+  } elsif (0) { #agent commission reports
+    $match = 'cust_main.agentnum = agent.agentnum';
+  }
+
+  my $from_cust_bill_pkg_where = "FROM cust_bill_pkg
+                                      LEFT JOIN ( cust_bill ) USING ( invnum )
+                                      LEFT JOIN ( cust_pkg  ) USING ( pkgnum )
+                                    WHERE cust_bill_pkg.pkgnum > 0
+                                      AND cust_bill._date >= $beginning
+                                      AND cust_bill._date <= $ending         ";
+  my $and = "                         AND $match
+                                      AND cust_pkg.pkgpart = part_pkg.pkgpart";
+
+  push @where, "EXISTS( SELECT 1 $from_cust_bill_pkg_where $and )";
+
+  push @header, '#'; # of sales';
+  push @links, ''; #link to detail report
+  $align .= 'r';
+  push @fields, 'num_cust_pkg';
+  $select .= ", ( SELECT COUNT(DISTINCT pkgnum)
+                    $from_cust_bill_pkg_where $and )
+                AS num_cust_pkg";
+#  push @fields, sub {
+#    my $part_pkg = shift;
+#    my $sql =
+#      #"SELECT COUNT( SELECT DISTINCT pkgnum $from_cust_bill_pkg_where )";
+#      "SELECT COUNT(DISTINCT pkgnum) $from_cust_bill_pkg_where";
+#    my $sth = dbh->prepare($sql) or die dbh->errstr;
+#    $sth->execute or die $sth->errstr;
+#    $sth->fetchrow_arrayref->[0];
+#  };
+
+  push @header, 'Sales';
+  push @links, ''; #link to detail report
+  $align .= 'r';
+#  push @fields, sub { $money_char. sprintf('%.2f', shift->get('pkg_sales')); };
+#  $select .=
+#    ", SUM( SELECT setup+recur $from_cust_bill_pkg_where ) AS pkg_sales";
+  push @fields, sub {
+    my $part_pkg = shift;
+    my $sql = "SELECT SUM(cust_bill_pkg.setup+cust_bill_pkg.recur) $from_cust_bill_pkg_where AND pkgpart = ? AND ";
+    my @arg = ($part_pkg->pkgpart);
+    if (1) { #employee commission reports 
+      $sql .= 'otaker = ?';
+      push @arg, $part_pkg->get('username');
+    } elsif (0) { #agent commission reports
+      $match = 'cust_main.agentnum = agent.agentnum';
+    }
+    my $sth = dbh->prepare($sql) or die dbh->errstr;
+    $sth->execute(@arg) or die $sth->errstr;
+    $money_char. sprintf('%.2f', $sth->fetchrow_arrayref->[0] );
+  };
+
+  push @header, 'Commission';
+  push @links, ''; #link to detail report
+  $align .= 'r';
+  #push @fields, sub { $money_char. sprintf('%.2f', shift->get('pkg_commission')); };
+  push @fields, sub {
+    my $part_pkg = shift;
+    my $sql = "SELECT SUM(amount) FROM cust_credit
+                   LEFT JOIN cust_event USING ( eventnum )
+                   LEFT JOIN part_event USING ( eventpart )
+                   LEFT JOIN cust_pkg ON ( cust_event.tablenum = cust_pkg.pkgnum )
+                 WHERE eventnum IS NOT NULL
+                   AND action IN ( 'pkg_employee_credit',
+                                   'pkg_employee_credit_pkg'
+                                 )
+                   AND cust_credit._date >= $beginning
+                   AND cust_credit._date <= $ending         
+                   AND pkgpart = ?
+                   AND cust_credit.custnum = ?
+              ";
+    my @arg = ($part_pkg->pkgpart);
+    if (1) { #employee commission reports 
+
+      #XXX in this context, agent virt for employees, not package defs
+      my $access_user = qsearchs('access_user', { 'username' => $part_pkg->get('username') })
+        or die "unknown usernum";
+
+      return 0 unless $access_user->user_custnum;
+      push @arg, $access_user->user_custnum;
+
+    } elsif (0) { #agent commission reports
+      push @arg, 'XXXagent_custnum'; #$agent->agent_custnum
+    }
+    my $sth = dbh->prepare($sql) or die dbh->errstr;
+    $sth->execute(@arg) or die $sth->errstr;
+    $money_char. sprintf('%.2f', $sth->fetchrow_arrayref->[0] );
+     
+  };
+
+}
+
+push @order_by, 'pkgpart'; #pkg?
+
+$select ||= 'part_pkg.*';
+my $extra_sql = scalar(@where) ? 'WHERE ' . join(' AND ', @where) : ''; 
+my $order_by = join(', ', @order_by);
+
+my $count_query = "SELECT COUNT(*) FROM part_pkg $addl_from $extra_sql";
+
+</%init>
index aa802f3..00cb9ed 100644 (file)
@@ -20,7 +20,7 @@
       </TR>
 
       <TR>
-        <TD ALIGN="right">Show customers with status:</TD>
+        <TD ALIGN="right">Show customers with status</TD>
         <TD>
           <SELECT NAME="status">
             <OPTION VALUE="">all
         </TD>
       </TR>
 
+      <TR>
+        <TD ALIGN="right">Limit to customers with provisioned service</TD>
+        <TD>
+          <SELECT NAME="svcdb">
+            <OPTION VALUE="">(no)
+            <OPTION VALUE="svc_acct">Account (svc_acct)
+            <OPTION VALUE="svc_broadband">Broadband service (svc_broadband)
+            <OPTION VALUE="svc_domain">Domain (svc_domain)
+            <OPTION VALUE="svc_external">External service (svc_external)
+            <OPTION VALUE="svc_forward">Mail forward (svc_foward)
+            <OPTION VALUE="svc_pbx">PBX (svc_pbx)
+            <OPTION VALUE="svc_phone">Phone number (svc_phone)
+            <OPTION VALUE="svc_www">Hosting (svc_www)
+          </SELECT>
+        </TD>
+      </TR>
+
       <% include( '/elements/tr-select-agent.html',
                      'curr_value'    => scalar( $cgi->param('agentnum') ),
                      'label'         => 'For agent: ',
diff --git a/httemplate/search/report_employee_commission.html b/httemplate/search/report_employee_commission.html
new file mode 100644 (file)
index 0000000..a79630a
--- /dev/null
@@ -0,0 +1,34 @@
+<% include('/elements/header.html', 'Employee commission report' ) %>
+
+<FORM ACTION="part_pkg.html">
+
+<TABLE BGCOLOR="#cccccc" CELLSPACING=0>
+
+%# 
+%# <% include( '/elements/tr-select-agent.html',
+%#                'curr_value'    => scalar( $cgi->param('agentnum') ),
+%#                'disable_empty' => 0,
+%#            )
+%# %>
+%# 
+
+%#2.1
+<% include( '/elements/tr-select-user.html' ) %>
+
+%#1.9
+%# <%include( '/elements/tr-select-otaker.html' ) %>
+
+<% include( '/elements/tr-input-beginning_ending.html', ) %>
+
+</TABLE>
+
+<BR>
+<INPUT TYPE="submit" VALUE="Get Report">
+
+<% include('/elements/footer.html') %>
+<%init>
+
+die "access denied"
+  unless $FS::CurrentUser::CurrentUser->access_right('Financial reports');
+
+</%init>
diff --git a/httemplate/search/report_h_cust_pay.html b/httemplate/search/report_h_cust_pay.html
new file mode 100644 (file)
index 0000000..4e47b38
--- /dev/null
@@ -0,0 +1,124 @@
+<% include('/elements/header.html', 'Payment transaction history' ) %>
+
+<FORM ACTION="h_cust_pay.html" METHOD="GET">
+<INPUT TYPE="hidden" NAME="magic" VALUE="_date">
+
+<TABLE BGCOLOR="#cccccc" CELLSPACING=0>
+
+  <TR>
+    <TH BGCOLOR="#e8e8e8" COLSPAN=2 ALIGN="left">
+      <FONT SIZE="+1">Search options</FONT>
+    </TH>
+  </TR>
+
+%#history stuff
+  <TR>
+    <TD ALIGN="right">Search transactions for: </TD>
+    <TD>
+      <SELECT NAME="history_action">
+        <OPTION VALUE="insert,replace_old,replace_new,delete">(all changes)
+        <OPTION VALUE="delete">Insertions
+        <OPTION VALUE="replace_old,replace_new">Replacements
+        <OPTION VALUE="delete">Deletions
+      </SELECT>
+    </TD>
+  </TR>
+
+  <TR>
+    <TD ALIGN="right" VALIGN="center">Transaction date: </TD>
+    <TD>
+      <TABLE>
+        <% include( '/elements/tr-input-beginning_ending.html',
+                      prefix => 'history_date',
+                      layout => 'horiz',
+                  )
+        %>
+      </TABLE>
+    </TD>
+  </TR>
+%#eo history stuff
+
+  <TR>
+    <TD ALIGN="right">Payments of type: </TD>
+    <TD>
+      <SELECT NAME="payby" onChange="payby_changed(this)">
+        <OPTION VALUE="">all</OPTION>
+        <OPTION VALUE="CARD">credit card (all)</OPTION>
+        <OPTION VALUE="CARD-VisaMC">credit card (Visa/MasterCard)</OPTION>
+        <OPTION VALUE="CARD-Amex">credit card (American Express)</OPTION>
+        <OPTION VALUE="CARD-Discover">credit card (Discover)</OPTION>
+        <OPTION VALUE="CARD-Maestro">credit card (Maestro/Switch/Solo)</OPTION>
+        <OPTION VALUE="CHEK">electronic check / ACH</OPTION>
+        <OPTION VALUE="BILL">check</OPTION>
+        <OPTION VALUE="PREP">prepaid card</OPTION>
+        <OPTION VALUE="CASH">cash</OPTION>
+        <OPTION VALUE="WEST">Western Union</OPTION>
+        <OPTION VALUE="MCRD">manual credit card</OPTION>
+      </SELECT>
+    </TD>
+  </TR>
+
+  <SCRIPT TYPE="text/javascript">
+  
+    function payby_changed(what) {
+      if ( what.options[what.selectedIndex].value == 'BILL' ) {
+       document.getElementById('checkno_caption').style.color = '#000000';
+        what.form.payinfo.disabled = false;
+       what.form.payinfo.style.backgroundColor = '#ffffff';
+      } else {
+       document.getElementById('checkno_caption').style.color = '#bbbbbb';
+        what.form.payinfo.disabled = true;
+       what.form.payinfo.style.backgroundColor = '#dddddd';
+      }
+    }
+
+  </SCRIPT>
+
+  <TR>
+    <TD ALIGN="right"><FONT ID="checkno_caption" COLOR="#bbbbbb">Check #: </FONT></TD>
+    <TD>
+      <INPUT TYPE="text" NAME="payinfo" DISABLED STYLE="background-color: #dddddd">
+    </TD>
+  </TR>
+
+  <% include( '/elements/tr-select-agent.html',
+                 'curr_value'    => scalar($cgi->param('agentnum')),
+                 'label'         => 'for agent: ',
+                 'disable_empty' => 0,
+             )
+  %>
+
+  <% include( '/elements/tr-select-otaker.html' ) %>
+
+  <TR>
+    <TD ALIGN="right" VALIGN="center">Payment</TD>
+    <TD>
+      <TABLE>
+        <% include( '/elements/tr-input-beginning_ending.html',
+                      layout   => 'horiz',
+                  )
+        %>
+      </TABLE>
+    </TD>
+  </TR>
+
+  <% include( '/elements/tr-input-lessthan_greaterthan.html',
+                'label' => 'Amount',
+               'field' => 'paid',
+            )
+  %>
+
+</TABLE>
+
+<BR>
+<INPUT TYPE="submit" VALUE="Get Report">
+
+</FORM>
+
+<% include('/elements/footer.html') %>
+<%init>
+
+die "access denied"
+  unless $FS::CurrentUser::CurrentUser->access_right('Financial reports');
+
+</%init>
index ce928b8..c0e2b80 100644 (file)
@@ -1,36 +1,86 @@
 <% include("/elements/header.html", 'Prepaid Income (Unearned Revenue) Report') %>
 
-<% table() %>
-  <TR>
-    <TH>Actual Unearned Revenue</TH>
-    <TH>Legacy Unearned Revenue</TH>
-  </TR>
+<% include( '/elements/table-grid.html' ) %>
+
   <TR>
-    <TD ALIGN="right">$<% $total %>
-    <TD ALIGN="right">
-      <% $now == $time ? "\$$total_legacy" : '<i>N/A</i>'%>
-    </TD>
+%   if ( scalar(@agentnums) > 1 ) {
+      <TH CLASS="grid" BGCOLOR="#cccccc">Agent</TH>
+%   }
+    <TH CLASS="grid" BGCOLOR="#cccccc"><% $actual_label %>Unearned Revenue</TH>
+%   if ( $legacy ) {
+      <TH CLASS="grid" BGCOLOR="#cccccc">Legacy Unearned Revenue</TH>
+%   }
   </TR>
 
+% my $bgcolor1 = '#eeeeee';
+% my $bgcolor2 = '#ffffff';
+% my $bgcolor;
+%
+% push @agentnums, 0 unless scalar(@agentnums) < 2;
+% foreach my $agentnum (@agentnums) {  
+%
+%   if ( $bgcolor eq $bgcolor1 ) {
+%     $bgcolor = $bgcolor2;
+%   } else {
+%     $bgcolor = $bgcolor1;
+%   }
+%
+%   my $alink = $agentnum ? "$link;agentnum=$agentnum" : $link;
+%
+%   my $agent_name = 'Total';
+%   if ( $agentnum ) {
+%     my $agent = qsearchs('agent', { 'agentnum' => $agentnum })
+%       or die "unknown agentnum $agentnum";
+%     $agent_name = $agent->agent;
+%   }
+
+    <TR>
+
+%     if ( scalar(@agentnums) > 1 ) {
+        <TD CLASS="grid" BGCOLOR="<% $bgcolor %>"><% $agent_name |h %></TD>
+%     }
+
+      <TD ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>"><A HREF="<% $alink %>"><% $money_char %><% $total{$agentnum} %></A></TD>
+
+%     if ( $legacy ) {
+        <TD ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>">
+          <% $now == $time ? $money_char.$total_legacy{$agentnum} : '<i>N/A</i>'%>
+        </TD>
+%     }
+
+    </TR>
+
+%  }
+
 </TABLE>
+
 <BR>
-Actual unearned revenue is the amount of unearned revenue Freeside has  
-actually invoiced for packages with longer-than monthly terms.
-<BR><BR>
-Legacy unearned revenue is the amount of unearned revenue represented by 
-customer packages.  This number may be larger than actual unearned 
-revenue if you have imported longer-than monthly customer packages from
-a previous billing system.
-</BODY>
-</HTML>
+<% $actual_label %><% $actual_label ? 'u' : 'U' %>nearned revenue
+is the amount of unearned revenue
+<% $actual_label ? 'Freeside has actually' : '' %>
+invoiced for packages with longer-than monthly terms.
+
+% if ( $legacy ) {
+  <BR><BR>
+  Legacy unearned revenue is the amount of unearned revenue represented by 
+  customer packages.  This number may be larger than actual unearned 
+  revenue if you have imported longer-than monthly customer packages from
+  a previous billing system.
+% }
+
+<% include('/elements/footer.html') %>
 <%init>
 
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Financial reports');
 
-#doesn't yet deal with daily/weekly packages
+my $conf = new FS::Conf;
+my $money_char = $conf->config('money_char') || '$';
+
+my $legacy = $conf->exists('enable_legacy_prepaid_income');
+my $actual_label = $legacy ? 'Actual ' : '';
 
-#needs to be re-written in sql for efficiency
+#doesn't yet deal with daily/weekly packages
 
 my $time = time;
 
@@ -38,74 +88,148 @@ my $now = $cgi->param('date') && str2time($cgi->param('date')) || $time;
 $now =~ /^(\d+)$/ or die "unparsable date?";
 $now = $1;
 
-my @where = ();
+my $link = "cust_bill_pkg.cgi?nottax=1;unearned_now=$now";
 
-if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {
-  my $agentnum = $1;
-  push @where, "agentnum = $agentnum";
-}
-
-#here is the agent virtualization
-push @where, $FS::CurrentUser::CurrentUser->agentnums_sql;
-
-my $where = join(' AND ', @where);
-$where = "AND $where" if $where;
-
-my( $total, $total_legacy ) = ( 0, 0 );
-
-my @cust_bill_pkg =
-  grep { $_->cust_pkg && $_->cust_pkg->part_pkg->freq !~ /^([01]|\d+[dw])$/ }
-    qsearch({
-      'select'    => 'cust_bill_pkg.*',
-      'table'     => 'cust_bill_pkg',
-      'addl_from' => ' LEFT JOIN cust_bill USING ( invnum  ) '.
-                     ' LEFT JOIN cust_main USING ( custnum ) ',
-      'hashref'   => {
-                       'recur' => { op=>'!=', value=>0    },
-                       'edate' => { op=>'>',  value=>$now },
-                     },
-      'extra_sql' => $where,
-    });
-
-my @cust_pkg = 
-  grep { $_->part_pkg->recur != 0
-         && $_->part_pkg->freq !~ /^([01]|\d+[dw])$/
-       }
-    qsearch({
-      'select'    => 'cust_pkg.*',
-      'table'     => 'cust_pkg',
-      'addl_from' => ' LEFT JOIN cust_main USING ( custnum ) ',
-      'hashref'   => { 'bill' => { op=>'>', value=>$now } },
-      'extra_sql' => $where,
-    });
-
-foreach my $cust_bill_pkg ( @cust_bill_pkg) { 
-  my $period = $cust_bill_pkg->edate - $cust_bill_pkg->sdate;
-
-  my $elapsed = $now - $cust_bill_pkg->sdate;
-  $elapsed = 0 if $elapsed < 0;
-
-  my $remaining = 1 - $elapsed/$period;
-
-  my $unearned = $remaining * $cust_bill_pkg->recur;
-  $total += $unearned;
+my $curuser = $FS::CurrentUser::CurrentUser;
 
+my $agentnum = '';
+my @agentnums = ();
+$agentnum ? ($agentnum) : $curuser->agentnums;
+if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {
+  @agentnums = ($1);
+  #XXX#push @where, "agentnum = $agentnum";
+  #XXX#$link .= ";agentnum=$agentnum";
+} else {
+  @agentnums = $curuser->agentnums;
 }
 
-foreach my $cust_pkg ( @cust_pkg ) {
-  my $period = $cust_pkg->bill - $cust_pkg->last_bill;
-
-  my $elapsed = $now - $cust_pkg->last_bill;
-  $elapsed = 0 if $elapsed < 0;
-
-  my $remaining = 1 - $elapsed/$period;
+my @where = ();
 
-  my $unearned = $remaining * $cust_pkg->part_pkg->recur; #!! only works for flat/legacy
-  $total_legacy += $unearned;
+#here is the agent virtualization
+push @where, $curuser->agentnums_sql( 'table'=>'cust_main' );
+
+#well, because cust_bill_pkg.cgi has it and without it the numbers don't match..
+push @where , " payby != 'COMP' "
+  unless $cgi->param('include_comp_cust');
+
+my %total = ();
+my %total_legacy = ();
+foreach my $agentnum (@agentnums) {
+  
+  my $where = join(' AND ', @where, "cust_main.agentnum = $agentnum");
+  $where = "AND $where" if $where;
+
+  my( $total, $total_legacy ) = ( 0, 0 );
+
+  # my @cust_bill_pkg =
+  #   grep { $_->cust_pkg && $_->cust_pkg->part_pkg->freq !~ /^([01]|\d+[hdw])$/ }
+  #     qsearch({
+  #       'select'    => 'cust_bill_pkg.*',
+  #       'table'     => 'cust_bill_pkg',
+  #       'addl_from' => ' LEFT JOIN cust_bill USING ( invnum  ) '.
+  #                      ' LEFT JOIN cust_main USING ( custnum ) ',
+  #       'hashref'   => {
+  #                        'recur' => { op=>'!=', value=>0    },
+  #                        'sdate' => { op=>'<',  value=>$now },
+  #                        'edate' => { op=>'>',  value=>$now },
+  #                      },
+  #       'extra_sql' => $where,
+  #     });
+  #
+  #    foreach my $cust_bill_pkg ( @cust_bill_pkg) { 
+  #      my $period = $cust_bill_pkg->edate - $cust_bill_pkg->sdate;
+  #   
+  #      my $elapsed = $now - $cust_bill_pkg->sdate;
+  #      $elapsed = 0 if $elapsed < 0;
+  #   
+  #      my $remaining = 1 - $elapsed/$period;
+  #   
+  #      my $unearned = $remaining * $cust_bill_pkg->recur;
+  #      $total += $unearned;
+  #   
+  #    }
+
+  #re-written in sql:
+
+  #false laziness w/cust_bill_pkg.cgi
+
+  my $float = 'REAL'; #'DOUBLE PRECISION';
+
+  my $period = "CAST(cust_bill_pkg.edate - cust_bill_pkg.sdate AS $float)";
+  my $elapsed = "(CASE WHEN cust_bill_pkg.sdate > $now
+                   THEN 0
+                   ELSE ($now - cust_bill_pkg.sdate)
+                 END)";
+  #my $elapsed = "CAST($unearned - cust_bill_pkg.sdate AS $float)";
+
+  my $remaining = "(1 - $elapsed/$period)";
+
+  my $select = "SUM($remaining * cust_bill_pkg.recur)";
+
+  #[...]
+
+  my $sql = "SELECT $select FROM cust_bill_pkg
+                            LEFT JOIN cust_pkg  USING ( pkgnum )
+                            LEFT JOIN part_pkg  USING ( pkgpart )
+                            LEFT JOIN cust_main USING ( custnum )
+               WHERE pkgpart > 0
+                 AND sdate < $now
+                 AND edate > $now
+                 AND cust_bill_pkg.recur != 0
+                 AND part_pkg.freq != '0'
+                 AND part_pkg.freq != '1'
+                 AND part_pkg.freq NOT LIKE '%h'
+                 AND part_pkg.freq NOT LIKE '%d'
+                 AND part_pkg.freq NOT LIKE '%w'
+                 $where
+             ";
+
+  my $sth = dbh->prepare($sql) or die dbh->errstr;
+  $sth->execute or die $sth->errstr;
+  my $total = $sth->fetchrow_arrayref->[0];
+
+  $total = sprintf('%.2f', $total);
+  $total{$agentnum} = $total;
+  $total{0} += $total;
+
+  if ( $legacy ) {
+
+    #not yet rewritten in sql, but now not enabled by default
+
+    my @cust_pkg = 
+      grep { $_->part_pkg->recur != 0
+             && $_->part_pkg->freq !~ /^([01]|\d+[dw])$/
+           }
+        qsearch({
+          'select'    => 'cust_pkg.*',
+          'table'     => 'cust_pkg',
+          'addl_from' => ' LEFT JOIN cust_main USING ( custnum ) ',
+          'hashref'   => { 'bill' => { op=>'>', value=>$now } },
+          'extra_sql' => $where,
+        });
+
+    foreach my $cust_pkg ( @cust_pkg ) {
+      my $period = $cust_pkg->bill - $cust_pkg->last_bill;
+   
+      my $elapsed = $now - $cust_pkg->last_bill;
+      $elapsed = 0 if $elapsed < 0;
+   
+      my $remaining = 1 - $elapsed/$period;
+   
+      my $unearned = $remaining * $cust_pkg->part_pkg->recur; #!! only works for flat/legacy
+      $total_legacy += $unearned;
+   
+    }
+
+    $total_legacy = sprintf('%.2f', $total_legacy);
+    $total_legacy{$agentnum} = $total_legacy;
+    $total_legacy{0} += $total_legacy;
+
+  }
 
 }
 
-$total = sprintf('%.2f', $total);
-$total_legacy = sprintf('%.2f', $total_legacy);
-
+$total{0} = sprintf('%.2f', $total{0});
+$total_legacy{0} = sprintf('%.2f', $total_legacy{0});
+  
 </%init>
index d707bd8..04801be 100644 (file)
@@ -44,7 +44,7 @@
 <SCRIPT TYPE="text/javascript">
   Calendar.setup({
     inputField: "date_text",
-    ifFormat:   "%m/%d/%Y",
+    ifFormat:   "<% $date_format %>",
     button:     "date_button",
     align:      "BR"
   });
@@ -58,4 +58,7 @@
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Financial reports');
 
+my $conf = new FS::Conf;
+my $date_format = $conf->config('date_format') || '%m/%d/%Y';
+
 </%init>
index 6e02413..6eea2b0 100755 (executable)
@@ -1,5 +1,5 @@
 <% include('/elements/header.html', {
-             'title' => "Customer View: ". $cust_main->name,
+             'title' => "Customer: ". $cust_main->name,
              'nobr'  => 1,
           })
 %>
@@ -128,7 +128,7 @@ Comments
                 'actionlabel' => 'Enter customer note',
                 'cust_main'   => $cust_main,
                 'width'       => 616,
-                'height'      => 408,
+                'height'      => 538, #575
             )
   %>
 
index 833c92e..71511dc 100755 (executable)
@@ -11,6 +11,9 @@
 %   }
     <TH CLASS="grid" BGCOLOR="#cccccc">Person</TH>
     <TH CLASS="grid" BGCOLOR="#cccccc">Note</TH>
+%   if ($curuser->access_right('Edit customer note') ) {
+    <TH CLASS="grid" BGCOLOR="#cccccc">&nbsp;</TH>
+%   }
   </TR>
 
 % my $bgcolor1 = '#eeeeee';
@@ -34,7 +37,7 @@
 %                                             ";notenum=$notenum",
 %                            'actionlabel' => 'Edit customer note',
 %                            'width'       => 616,
-%                            'height'      => 408,
+%                            'height'      => 538, #575
 %                            'frame'       => 'top',
 %                        );
 %   my $clickjs = qq!onclick="$onclick"!;
         &nbsp;<% $note->otaker%>
       </TD>
       <TD CLASS="grid" BGCOLOR="<% $bgcolor %>">
-        &nbsp;<%$note->comments%><% $edit %>
+        &nbsp;<%$note->comments%>
       </TD>
+% if($edit) {
+      <TD CLASS="grid" BGCOLOR="<% $bgcolor %>"><% $edit %></TD>
+% }
     </TR>
 
 % } #end display notes
index 56a2c4d..0dc4c41 100644 (file)
 
    <TR ID="balance_forward_row">
      <TD CLASS="grid" BGCOLOR="#dddddd">
-       <% time2str("%D",$date) %>
+       <% time2str($date_format, $date) %>
      </TD>
 
      <TD CLASS="grid" BGCOLOR="#dddddd">
-       <I>Starting balance on <% time2str("%D",$date) %></I>
+       <I>Starting balance on <% time2str($date_format, $date) %></I>
        (<A HREF="javascript:void(0);" onClick="show_history();">show prior history</A>)
      </TD>
 
         <A NAME="<% $target %>">
 % } 
 
-      <% time2str("%D",$item->{'date'}) %>
+      <% time2str($date_format, $item->{'date'}) %>
 % if ( $target && $target{$target} == 1 ) { 
 
         </A>
@@ -355,6 +355,7 @@ my( $cust_main ) = @_;
 my $custnum = $cust_main->custnum;
 
 my $conf = new FS::Conf;
+my $date_format = $conf->config('date_format') || '%m/%d/%Y';
 
 my $curuser = $FS::CurrentUser::CurrentUser;
 
@@ -376,7 +377,7 @@ my @history = ();
 
 my %opt = (
   ( map { $_ => scalar($conf->config($_)) }
-        qw( card_refund-days )
+        qw( card_refund-days date_format )
   ),
   ( map { $_ => $conf->exists($_) } 
         qw( deleteinvoices deletepayments deleterefunds pkg-balances )
index 058c6f5..fa5838e 100644 (file)
@@ -4,6 +4,8 @@ by <% $cust_credit->otaker %><% "$reason$desc$apply$delete$unapply" %>
 
 my( $cust_credit, %opt ) = @_;
 
+my $date_format = $opt{'date_format'} || '%m/%d/%Y';
+
 my $curuser = $FS::CurrentUser::CurrentUser;
 
 my @cust_credit_bill = $cust_credit->cust_credit_bill;
@@ -56,7 +58,7 @@ if (    scalar(@cust_credit_bill)   == 0
           && scalar(@cust_credit_refund) == 1
           && $cust_credit->credited == 0      ) {
   #applied to one refund
-  $desc .= ' refunded on '.  time2str("%D", $cust_credit_refund[0]->_date);
+  $desc .= ' refunded on '.  time2str($date_format, $cust_credit_refund[0]->_date);
 } else {
   #complicated
   $desc .= '<BR>';
@@ -67,11 +69,11 @@ if (    scalar(@cust_credit_bill)   == 0
                '$'. $app->amount.
                ' '. $app->applied_to_invoice.
                '<BR>';
-               #' on '. time2str("%D", $app->_date).
+               #' on '. time2str($date_format, $app->_date).
     } elsif ( $app->isa('FS::cust_credit_refund') ) {
       $desc .= '&nbsp;&nbsp;'.
                '$'. $app->amount.
-               ' refunded on '. time2str("%D", $app->_date).
+               ' refunded on '. time2str($date_format, $app->_date).
                '<BR>';
     } else {
       die "$app is not a FS::cust_credit_bill or a FS::cust_credit_refund";
index a4a349b..53fc0da 100644 (file)
@@ -4,6 +4,8 @@
 
 my( $cust_pay, %opt ) = @_;
 
+my $date_format = $opt{'date_format'} || '%m/%d/%Y';
+
 my $curuser = $FS::CurrentUser::CurrentUser;
 
 my $payby = $cust_pay->payby;
@@ -79,7 +81,7 @@ if (    scalar(@cust_bill_pay)   == 0
           && scalar(@cust_pay_refund) == 1
           && $cust_pay->unapplied == 0     ) {
   #applied to one refund
-  $desc .= ' refunded on '. time2str("%D", $cust_pay_refund[0]->_date);
+  $desc .= ' refunded on '. time2str($date_format, $cust_pay_refund[0]->_date);
 } else {
   #complicated
   $desc .= '<BR>';
@@ -90,11 +92,11 @@ if (    scalar(@cust_bill_pay)   == 0
                '$'. $app->amount.
                ' '. $app->applied_to_invoice.
                '<BR>';
-               #' on '. time2str("%D", $cust_bill_pay->_date).
+               #' on '. time2str($date_format, $cust_bill_pay->_date).
     } elsif ( $app->isa('FS::cust_pay_refund') ) {
       $desc .= '&nbsp;&nbsp;'.
                '$'. $app->amount.
-               ' refunded on '. time2str("%D", $app->_date).
+               ' refunded on '. time2str($date_format, $app->_date).
                '<BR>';
     } else {
       die "$app is not a FS::cust_bill_pay or FS::cust_pay_refund";
index 6103727..be68ff0 100644 (file)
@@ -1,10 +1,12 @@
 <DEL>Payment <% $info %></DEL>
-<I>voided <% time2str("%D", $cust_pay_void->void_date) %>
+<I>voided <% time2str($date_format, $cust_pay_void->void_date) %>
 by <% $cust_pay_void->otaker %></I><% $unvoid %>
 <%init>
 
 my( $cust_pay_void, %opt ) = @_;
 
+my $date_format = $opt{'date_format'} || '%m/%d/%Y';
+
 my $curuser = $FS::CurrentUser::CurrentUser;
 
 my $payby = $cust_pay_void->payby;
index 167849c..e1f9a13 100644 (file)
@@ -1,7 +1,24 @@
+<FORM METHOD="GET" ACTION="<% $new_base %>" NAME="CreateTicketForm">
+<INPUT TYPE="submit" VALUE="Create new ticket">
+in queue
+<SELECT NAME="Queue">
+% my %queues = FS::TicketSystem->queues();
+% foreach my $queueid ( keys %queues ) {
+%   #should consider whether the user has ACL to create ticket in each queue
+    <OPTION VALUE="<% $queueid %>"
+            <% $queueid == $new_param{'Queue'} ? 'SELECTED' : '' %>
+    ><% $queues{$queueid} |h %>
+% }
+</SELECT>
+% foreach my $param ( grep { $_ ne 'Queue' } keys %new_param ) {
+    <INPUT TYPE="hidden" NAME="<% $param %>" VALUE="<% $new_param{$param} |h %>">
+% }
+</FORM>
+<BR>
+
 (<A HREF="<% $open_link %>">View <% $openlabel %> tickets for this customer</A>)
 (<A HREF="<% $res_link  %>">View resolved tickets for this customer</A>)
-<BR>
-(<A HREF="<% $new_link  %>">Create new ticket for this customer</A>)
+<BR><BR>
 
 <% include("/elements/table-grid.html") %>
 % my $bgcolor1 = '#eeeeee';
@@ -73,6 +90,10 @@ my $res_link  = FS::TicketSystem->href_customer_tickets(
                   { 'statuses' => [ 'resolved' ] }
                 );
 
+my( $new_base, %new_param ) = FS::TicketSystem->href_params_new_ticket(
+                 $cust_main,
+                 join(', ', $cust_main->invoicing_list_emailonly )               );
+
 my $new_link = FS::TicketSystem->href_new_ticket(
                  $cust_main,
                  join(', ', $cust_main->invoicing_list_emailonly )
diff --git a/httemplate/view/cust_svc.cgi b/httemplate/view/cust_svc.cgi
new file mode 100644 (file)
index 0000000..8ccfce3
--- /dev/null
@@ -0,0 +1,23 @@
+<% $cgi->redirect(popurl(1)."$svcdb.cgi?". $svcnum ) %>
+<%init>
+
+#needed here?  we're just redirecting.  i guess it could reveal the svcdb of a
+#svcnum... oooooo scary.  not.
+die "access denied"
+  unless $FS::CurrentUser::CurrentUser->access_right('View customer services');
+
+#some false laziness w/svc_*.cgi
+
+my($query) = $cgi->keywords;
+$query =~ /^(\d+)$/;
+my $svcnum = $1;
+my $cust_svc = qsearchs( 'cust_svc', { 'svcnum' => $svcnum } );
+die "Unknown svcnum" unless $cust_svc;
+
+my $part_svc = qsearchs('part_svc',{'svcpart'=> $cust_svc->svcpart } );
+die "Unknown svcpart" unless $part_svc;
+
+my $svcdb = $part_svc->svcdb;
+
+</%init>
+
diff --git a/httemplate/view/elements/svc_export_settings.html b/httemplate/view/elements/svc_export_settings.html
new file mode 100644 (file)
index 0000000..c5f2555
--- /dev/null
@@ -0,0 +1,34 @@
+% if ( $FS::CurrentUser::CurrentUser->option('export_getsettings') ) {
+
+%   my ( $settings, $defaults ) = $svc_x->export_getsettings;
+%   if ( keys %$settings ) {
+
+%# a way to label this "Communigate pro settings".. just a config maybe... eh,
+%# its just for devel
+    External settings
+    <% ntable('#cccccc',2) %>
+
+%     foreach my $key ( sort {$defaults->{$a} <=> $defaults->{$b} or $a cmp $b}
+%                            keys %$settings
+%                     )
+%    {
+        <TR>
+          <TD ALIGN="right"><% $key |h %></TD>
+          <TD BGCOLOR="<% $defaults->{$key} ? '#eeeeee' : '#ffffff' %>">
+            <% $defaults->{$key} ? '<I>' : '<B>' %>
+            <% $settings->{$key} |h %>
+            <% $defaults->{$key} ? '</I>' : '</B>' %>
+          </TD>
+        </TR>
+%     }
+
+    </TABLE>
+    <BR>
+
+%   }
+% }
+<%init>
+
+my $svc_x = shift;
+
+</%init>
diff --git a/httemplate/view/elements/tr.html b/httemplate/view/elements/tr.html
new file mode 100644 (file)
index 0000000..e2ec7d4
--- /dev/null
@@ -0,0 +1,9 @@
+<TR>
+  <TD ALIGN="right"><% $opt{'label'} %></TD>
+  <TD BGCOLOR="#ffffff"><% $opt{'value'} %></TD>
+</TR>
+<%init>
+
+my %opt = @_;
+
+</%init>
index 44a2aa6..9135e67 100755 (executable)
   }
   </SCRIPT>
   
-  <% include("/elements/header.html",'Account View', menubar(
+  <% include("/elements/header.html",'View account', menubar(
     "Cancel this (unaudited) account" =>
             "javascript:areyousure(\'${p}misc/cancel-unaudited.cgi?$svcnum\')",
   )) %>
 
 % } 
 
-% if ( $part_svc->part_export_usage ) {
-%
-%  my $last_bill;
-%  my %plandata;
-%  if ( $cust_pkg ) {
-%    #false laziness w/httemplate/edit/part_pkg... this stuff doesn't really
-%    #belong in plan data
-%    %plandata = map { /^(\w+)=(.*)$/; ( $1 => $2 ); }
-%                    split("\n", $cust_pkg->part_pkg->plandata );
-%
-%    $last_bill = $cust_pkg->last_bill;
-%  } else {
-%    $last_bill = 0;
-%    %plandata = ();
-%  }
-%
-%  my $seconds = $svc_acct->seconds_since_sqlradacct( $last_bill, time );
-%  my $hour = int($seconds/3600);
-%  my $min = int( ($seconds%3600) / 60 );
-%  my $sec = $seconds%60;
-%
-%  my $input = $svc_acct->attribute_since_sqlradacct(
-%    $last_bill, time, 'AcctInputOctets'
-%  ) / 1048576;
-%  my $output = $svc_acct->attribute_since_sqlradacct(
-%    $last_bill, time, 'AcctOutputOctets'
-%  ) / 1048576;
-%
-%
+<% include( 'svc_acct/radius_usage.html',
+              'svc_acct' => $svc_acct,
+              'part_svc' => $part_svc,
+              'cust_pkg' => $cust_pkg,
+              %gopt,
+          )
+%>
 
-
-  RADIUS session information<BR>
-  <% ntable('#cccccc',2) %>
-  <TR><TD BGCOLOR="#ffffff">
-% if ( $seconds ) { 
-
-    Online <B><% $hour %></B>h <B><% $min %></B>m <B><% $sec %></B>s
-% } else { 
-
-    Has not logged on
-% } 
-% if ( $cust_pkg ) { 
-
-    since last bill (<% time2str('%a %b %o %Y', $last_bill) %>)
-% if ( length($plandata{recur_included_hours}) ) { 
-
-    - <% $plandata{recur_included_hours} %> total hours in plan
-% } 
-
-    <BR>
-% } else { 
-
-    (no billing cycle available for unaudited account)<BR>
-% } 
-
-
-  Upload: <B><% sprintf("%.3f", $input) %></B> megabytes<BR>
-  Download: <B><% sprintf("%.3f", $output) %></B> megabytes<BR>
-  Last Login: <B><% $svc_acct->last_login_text %></B><BR>
-% my $href = qq!<A HREF="${p}search/sqlradius.cgi?svcnum=$svcnum!; 
-
-  View session detail:
-      <% $href %>;begin=<% $last_bill %>">this billing cycle</A>
-    | <% $href %>;begin=<% time-15552000 %>">past six months</A>
-    | <% $href %>">all sessions</A>
-
-  </TD></TR></TABLE><BR>
-% } 
-
-% my @part_svc = ();
-% if ($FS::CurrentUser::CurrentUser->access_right('Change customer service')) {
-
-    <SCRIPT TYPE="text/javascript">
-      function enable_change () {
-        if ( document.OneTrueForm.svcpart.selectedIndex > 1 ) {
-          document.OneTrueForm.submit.disabled = false;
-        } else {
-          document.OneTrueForm.submit.disabled = true;
-        }
-      }
-    </SCRIPT>
-
-    <FORM NAME="OneTrueForm" ACTION="<%$p%>edit/process/cust_svc.cgi">
-    <INPUT TYPE="hidden" NAME="svcnum" VALUE="<% $svcnum %>">
-    <INPUT TYPE="hidden" NAME="pkgnum" VALUE="<% $pkgnum %>">
-
-%   #print qq!<BR><A HREF="../misc/sendconfig.cgi?$svcnum">Send account information</A>!; 
-% 
-%   if ( $pkgnum ) { 
-%     @part_svc = grep {    $_->svcdb   eq 'svc_acct'
-%                        && $_->svcpart != $part_svc->svcpart }
-%                 $cust_pkg->available_part_svc;
-%   } else {
-%     @part_svc = qsearch('part_svc', {
-%       svcdb    => 'svc_acct',
-%       disabled => '',
-%       svcpart  => { op=>'!=', value=>$part_svc->svcpart },
-%     } );
-%   }
-%
-% }
+<% include( 'svc_acct/change_svc_form.html',
+              'part_svc' => \@part_svc,
+              'svcnum'   => $svcnum,
+              'pkgnum'   => $pkgnum,
+              %gopt,
+          )
+%>
 
 Service #<B><% $svcnum %></B>
 | <A HREF="<%$p%>edit/svc_acct.cgi?<%$svcnum%>">Edit this service</A>
 
-% if ( @part_svc ) { 
-
-| <SELECT NAME="svcpart" onChange="enable_change()">
-    <OPTION VALUE="">Change service</OPTION>
-    <OPTION VALUE="">--------------</OPTION>
-% foreach my $opt_part_svc ( @part_svc ) { 
-
-      <OPTION VALUE="<% $opt_part_svc->svcpart %>"><% $opt_part_svc->svc %></OPTION>
-% } 
-
-  </SELECT>
-  <INPUT NAME="submit" TYPE="submit" VALUE="Change" disabled>
-
-% } 
-
-
-<% &ntable("#cccccc") %><TR><TD><% &ntable("#cccccc",2) %>
-
-<TR>
-  <TD ALIGN="right">Service</TD>
-  <TD BGCOLOR="#ffffff"><% $part_svc->svc %></TD>
-</TR>
-<TR>
-  <TD ALIGN="right">Username</TD>
-  <TD BGCOLOR="#ffffff"><% $svc_acct->username %></TD>
-</TR>
-<TR>
-  <TD ALIGN="right">Domain</TD>
-  <TD BGCOLOR="#ffffff"><% $domain %></TD>
-</TR>
-
-<TR>
-  <TD ALIGN="right">Password</TD>
-  <TD BGCOLOR="#ffffff">
-% my $password = $svc_acct->get_cleartext_password; 
-% if ( $password =~ /^\*\w+\* (.*)$/ ) {
-%         $password = $1;
-%    
+<% include( 'svc_acct/change_svc.html',
+              'part_svc' => \@part_svc,
+              %gopt,
+          )
+%>
 
-      <I>(login disabled)</I>
-% } 
-% if ( !$password and 
-%        $svc_acct->_password_encryption ne 'plain' and
-%        $svc_acct->_password ) {
-      <I>(<% uc($svc_acct->_password_encryption) %> encrypted)</I>
-% }
-% elsif ( $conf->exists('showpasswords') ) { 
-
-      <PRE><% encode_entities($password) %></PRE>
-% } else { 
-
-      <I>(hidden)</I>
-% } 
-
-
-  </TD>
-</TR>
-% $password = ''; 
-% if ( $conf->exists('security_phrase') ) {
-%     my $sec_phrase = $svc_acct->sec_phrase;
-%
-
-  <TR>
-    <TD ALIGN="right">Security phrase</TD>
-    <TD BGCOLOR="#ffffff"><% $svc_acct->sec_phrase %></TD>
-  </TR>
-% } 
-% if ( $svc_acct->popnum ) {
-%    my $svc_acct_pop = qsearchs('svc_acct_pop',{'popnum'=>$svc_acct->popnum});
-%
+<% include( 'svc_acct/basics.html',
+              'svc_acct' => $svc_acct,
+              'part_svc' => $part_svc,
+              %gopt,
+          )
+%>
 
-  <TR>
-    <TD ALIGN="right">Access number</TD>
-    <TD BGCOLOR="#ffffff"><% $svc_acct_pop->text %></TD>
-  </TR>
-% } 
-% if ($svc_acct->uid ne '') { 
-
-  <TR>
-    <TD ALIGN="right">UID</TD>
-    <TD BGCOLOR="#ffffff"><% $svc_acct->uid %></TD>
-  </TR>
-% } 
-% if ($svc_acct->gid ne '') { 
-
-  <TR>
-    <TD ALIGN="right">GID</TD>
-    <TD BGCOLOR="#ffffff"><% $svc_acct->gid %></TD>
-  </TR>
-% } 
-% if ($svc_acct->finger ne '') { 
-
-  <TR>
-    <TD ALIGN="right">Real Name</TD>
-    <TD BGCOLOR="#ffffff"><% $svc_acct->finger %></TD>
-  </TR>
-% } 
-% if ($svc_acct->dir ne '') { 
-
-  <TR>
-    <TD ALIGN="right">Home directory</TD>
-    <TD BGCOLOR="#ffffff"><% $svc_acct->dir %></TD>
-  </TR>
-% } 
-% if ($svc_acct->shell ne '') { 
-
-  <TR>
-    <TD ALIGN="right">Shell</TD>
-    <TD BGCOLOR="#ffffff"><% $svc_acct->shell %></TD>
-  </TR>
-% } 
-% if ($svc_acct->quota ne '') { 
-
-  <TR>
-    <TD ALIGN="right">Quota</TD>
-    <TD BGCOLOR="#ffffff"><% $svc_acct->quota %></TD>
-  </TR>
-% } 
-% if ($svc_acct->slipip) { 
-
-  <TR>
-    <TD ALIGN="right">IP address</TD>
-    <TD BGCOLOR="#ffffff">
-      <% ( $svc_acct->slipip eq "0.0.0.0" || $svc_acct->slipip eq '0e0' )
-            ? "<I>(Dynamic)</I>"
-            : $svc_acct->slipip
-      %>
-    </TD>
-  </TR>
-% } 
-% my %ulabel = ( seconds    => 'Time',
-%                upbytes    => 'Upload bytes',
-%                downbytes  => 'Download bytes',
-%                totalbytes => 'Total bytes',
-%              );
-% foreach my $uf ( keys %ulabel ) {
-%   my $tf = $uf . "_threshold";
-%   if ( $svc_acct->$uf ne '' ) {
-%     my $v = $uf eq 'seconds'
-%       #? (($svc_acct->$uf < 0 ? '-' : ''). duration_exact($svc_acct->$uf) )
-%       ? ($svc_acct->$uf < 0 ? '-' : '').
-%         int(abs($svc_acct->$uf)/3600). "hr ".
-%         sprintf("%02d",(abs($svc_acct->$uf)%3600)/60). "min"
-%       : FS::UI::bytecount::display_bytecount($svc_acct->$uf);
-    <TR>
-      <TD ALIGN="right"><% $ulabel{$uf} %> remaining</TD>
-      <TD BGCOLOR="#ffffff"><% $v %></TD>
-    </TR>
-
-%   }
-% }
-% foreach my $attribute ( grep /^radius_/, $svc_acct->fields ) {
-%  $attribute =~ /^radius_(.*)$/;
-%  my $pattribute = $FS::raddb::attrib{$1};
-%
-
-  <TR>
-    <TD ALIGN="right">Radius (reply) <% $pattribute %></TD>
-    <TD BGCOLOR="#ffffff"><% $svc_acct->getfield($attribute) %></TD>
-  </TR>
-% } 
-% foreach my $attribute ( grep /^rc_/, $svc_acct->fields ) {
-%  $attribute =~ /^rc_(.*)$/;
-%  my $pattribute = $FS::raddb::attrib{$1};
-%
-
-  <TR>
-    <TD ALIGN="right">Radius (check) <% $pattribute %></TD>
-    <TD BGCOLOR="#ffffff"><% $svc_acct->getfield($attribute) %></TD>
-  </TR>
-% } 
-
-
-<TR>
-  <TD ALIGN="right">RADIUS groups</TD>
-  <TD BGCOLOR="#ffffff"><% join('<BR>', $svc_acct->radius_groups) %></TD>
-</TR>
-%
-%# Can this be abstracted further?  Maybe a library function like
-%# widget('HTML', 'view', $svc_acct) ?  It would definitely make UI 
-%# style management easier.
-%
-% foreach (sort { $a cmp $b } $svc_acct->virtual_fields) { 
-
-  <% $svc_acct->pvf($_)->widget('HTML', 'view', $svc_acct->getfield($_)) %>
-% } 
-
-
-</TABLE></TD></TR></TABLE>
 </FORM>
+<BR>
+
+<% include( 'svc_acct/hosting.html',
+              %gopt,
+          )
+%>
+
+%#remove this?  does anybody even use it?  it was a misunderstood customer
+%#request IIRC?
+% my $conf = new FS::Conf;
+% if ( $conf->exists('svc_acct-notes') ) {
+%   warn 'WARNING: svc_acct-notes deprecated\n';
+<% join("<BR>", $conf->config('svc_acct-notes') ) %>
 <BR><BR>
-
-% if ( @svc_www ) {
-  Hosting
-  <% &ntable("#cccccc") %><TR><TD><% &ntable("#cccccc",2) %>
-%   foreach my $svc_www (@svc_www) {
-%     my($label, $value) = $svc_www->cust_svc->label;
-%     my $link = $p. 'view/svc_www.cgi?'. $svc_www->svcnum;
-      <TR>
-        <TD BGCOLOR="#ffffff">
-          <A HREF="<% $link %>"><% "$label: $value" %></A>
-        </TD>
-      </TR>
-%   }
-  </TABLE></TD></TR></TABLE>
-  <BR><BR>
 % }
 
-<% join("<BR>", $conf->config('svc_acct-notes') ) %>
-<BR><BR>
+<% include('elements/svc_export_settings.html', $svc_acct) %>
 
 <% joblisting({'svcnum'=>$svcnum}, 1) %>
 
@@ -345,8 +80,6 @@ Service #<B><% $svcnum %></B>
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('View customer services');
 
-my $conf = new FS::Conf;
-
 my $addl_from = ' LEFT JOIN cust_svc  USING ( svcnum  ) '.
                 ' LEFT JOIN cust_pkg  USING ( pkgnum  ) '.
                 ' LEFT JOIN cust_main USING ( custnum ) ';
@@ -382,25 +115,27 @@ my $part_svc = qsearchs('part_svc',{'svcpart'=> $cust_svc->svcpart } );
 die "Unknown svcpart" unless $part_svc;
 my $svc = $part_svc->svc;
 
-die 'Empty domsvc for svc_acct.svcnum '. $svc_acct->svcnum
-  unless $svc_acct->domsvc;
-my $svc_domain = qsearchs('svc_domain', { 'svcnum' => $svc_acct->domsvc } );
-die 'Unknown domain (domsvc '. $svc_acct->domsvc.
-    ' for svc_acct.svcnum '. $svc_acct->svcnum. ')'
-  unless $svc_domain;
-my $domain = $svc_domain->domain;
+my @part_svc = ();
+if ($FS::CurrentUser::CurrentUser->access_right('Change customer service')) {
+
+  if ( $pkgnum ) { 
+    @part_svc = grep {    $_->svcdb   eq 'svc_acct'
+                       && $_->svcpart != $part_svc->svcpart }
+                $cust_pkg->available_part_svc;
+  } else {
+    @part_svc = qsearch('part_svc', {
+      svcdb    => 'svc_acct',
+      disabled => '',
+      svcpart  => { op=>'!=', value=>$part_svc->svcpart },
+    } );
+  }
 
-my @svc_www = qsearch({
-  'select'    => 'svc_www.*',
-  'table'     => 'svc_www',
-  'addl_from' => $addl_from,
-  'hashref'   => { 'usersvc' => $svcnum },
-  #XXX shit outta luck if you somehow got them linked across agents
-  # maybe we should show but not link to them?  kinda makes sense...
-  # (maybe a specific ACL for this situation???)
-  'extra_sql' => ' AND '. $FS::CurrentUser::CurrentUser->agentnums_sql(
-                            'null_right' => 'View/link unlinked services'
-                          ),
-});
+}
+
+my $communigate = scalar($part_svc->part_export('communigate_pro'));
+                # || scalar($part_svc->part_export('communigate_pro_singledomain'));
+
+my %gopt = ( 'communigate' => $communigate,
+           );
 
 </%init>
diff --git a/httemplate/view/svc_acct/basics.html b/httemplate/view/svc_acct/basics.html
new file mode 100644 (file)
index 0000000..92b9ad7
--- /dev/null
@@ -0,0 +1,158 @@
+<% &ntable("#cccccc") %><TR><TD><% &ntable("#cccccc",2) %>
+
+<% include('/view/elements/tr.html', label=>'Service',  value=>$part_svc->svc) %>
+<% include('/view/elements/tr.html', label=>'Username', value=>$svc_acct->username) %>
+<% include('/view/elements/tr.html', label=>'Domain',   value=>$domain) %>
+
+% if ( $opt{'communigate'} ) {
+  <% include('/view/elements/tr.html', label=>'Aliases', value=>$svc_acct->cgp_aliases) %>
+%}
+
+% if ( $svc_acct->pbxsvc ) {
+  <% include('/view/elements/tr.html', label=>'PBX', value=>$svc_acct->pbx_title) %>
+%}
+
+% my $show_pw = '';
+% my $password = $svc_acct->get_cleartext_password; 
+% if ( $password =~ /^\*\w+\* (.*)$/ ) {
+%   $password = $1;
+%   $show_pw .= '<I>(login disabled)</I> ';
+% } 
+% if ( ! $password
+%      && $svc_acct->_password_encryption ne 'plain'
+%      && $svc_acct->_password
+%    )
+% {
+%   $show_pw .= '<I>('. uc($svc_acct->_password_encryption). ' encrypted)</I>';
+% } elsif ( $conf->exists('showpasswords') ) { 
+%   $show_pw .= '<PRE>'. encode_entities($password). '</PRE>';
+% } else { 
+%   $show_pw .= '<I>(hidden)</I>';
+% } 
+% $password = ''; 
+<% include('/view/elements/tr.html', label=>'Password', value=>$show_pw) %>
+
+
+% if ( $conf->exists('security_phrase') ) {
+  <%include('/view/elements/tr.html', label=>'Security phrase', value=>$svc_acct->sec_phrase)%>
+% } 
+
+% if ( $svc_acct->popnum ) {
+%   my $svc_acct_pop = qsearchs('svc_acct_pop',{'popnum'=>$svc_acct->popnum});
+    <% include('/view/elements/tr.html', label=>'Access number', value=>$svc_acct_pop->text) %>
+% } 
+
+% if ($svc_acct->uid ne '') { 
+  <% include('/view/elements/tr.html', label=>'UID', value=>$svc_acct->uid) %>
+% } 
+
+% if ($svc_acct->gid ne '') { 
+  <% include('/view/elements/tr.html', label=>'GID', value=>$svc_acct->gid) %>
+% } 
+
+% if ($svc_acct->finger ne '') { 
+  <% include('/view/elements/tr.html', label=>'Real Name', value=>$svc_acct->finger) %>
+% } 
+
+% if ($svc_acct->dir ne '') { 
+  <% include('/view/elements/tr.html', label=>'Home directory', value=>$svc_acct->dir) %>
+% } 
+
+% if ($svc_acct->shell ne '') { 
+  <% include('/view/elements/tr.html', label=>'Shell', value=>$svc_acct->shell) %>
+% } 
+
+% if ($svc_acct->quota ne '' && ! $opt{'communigate'} ) { 
+
+  <% include('/view/elements/tr.html', label=>'Quota', value=>$svc_acct->quota) %>
+
+% } elsif ( $opt{'communigate'} ) {
+
+  <% include('/view/elements/tr.html', label=>'Mailbox type', value=>$svc_acct->cgp_type) %>
+
+  <% include('/view/elements/tr.html', label=>'Enabled services',
+                        value=>$svc_acct->cgp_accessmodes ) %>
+
+  <% include('/view/elements/tr.html', label=>'Mail storage limit',
+                        value=>$svc_acct->quota ) %>
+
+  <% include('/view/elements/tr.html', label=>'File storage limit',
+                        value=>$svc_acct->file_quota ) %>
+
+  <% include('/view/elements/tr.html', label=>'Number of files limit',
+                        value=>$svc_acct->file_maxnum ) %>
+
+  <% include('/view/elements/tr.html', label=>'File size limit',
+                        value=>$svc_acct->file_maxsize ) %>
+
+  <% include('/view/elements/tr.html', label=>'Message delete method',
+                        value=>$svc_acct->cgp_deletemode ) %>
+
+  <% include('/view/elements/tr.html', label=>'On logout remove trash',
+                        value=>$svc_acct->cgp_emptytrash ) %>
+
+
+% }
+
+% if ($svc_acct->slipip) { 
+  <% include('/view/elements/tr.html',
+       label=>'IP address',
+       value=> ( $svc_acct->slipip eq "0.0.0.0" || $svc_acct->slipip eq '0e0' )
+                 ? "<I>(Dynamic)</I>"
+                 : $svc_acct->slipip
+     )
+  %>
+% } 
+
+<% include('usage.html',
+             'svc_acct' => $svc_acct,
+          )
+%>
+
+% foreach my $attribute ( grep /^radius_/, $svc_acct->fields ) {
+%   $attribute =~ /^radius_(.*)$/;
+%   my $pattribute = $FS::raddb::attrib{$1};
+    <% include('/view/elements/tr.html', label=>"Radius (reply) $pattribute",
+                          value=>$svc_acct->getfield($attribute)
+              )
+    %>
+% } 
+
+% foreach my $attribute ( grep /^rc_/, $svc_acct->fields ) {
+%   $attribute =~ /^rc_(.*)$/;
+%   my $pattribute = $FS::raddb::attrib{$1};
+    <% include('/view/elements/tr.html', label=>"Radius (check) $pattribute",
+                          value=>$svc_acct->getfield($attribute)
+              )
+    %>
+% } 
+
+<% include('/view/elements/tr.html', label=>'RADIUS groups',
+                      value=>join('<BR>', $svc_acct->radius_groups) ) %>
+
+%# Can this be abstracted further?  Maybe a library function like
+%# widget('HTML', 'view', $svc_acct) ?  It would definitely make UI 
+%# style management easier.
+% foreach (sort { $a cmp $b } $svc_acct->virtual_fields) { 
+  <% $svc_acct->pvf($_)->widget('HTML', 'view', $svc_acct->getfield($_)) %>
+% } 
+
+</TABLE></TD></TR></TABLE>
+<%init>
+
+my %opt = @_;
+
+my $conf = new FS::Conf;
+
+my $svc_acct = $opt{'svc_acct'};
+my $part_svc = $opt{'part_svc'};
+
+die 'Empty domsvc for svc_acct.svcnum '. $svc_acct->svcnum
+  unless $svc_acct->domsvc;
+my $svc_domain = qsearchs('svc_domain', { 'svcnum' => $svc_acct->domsvc } );
+die 'Unknown domain (domsvc '. $svc_acct->domsvc.
+    ' for svc_acct.svcnum '. $svc_acct->svcnum. ')'
+  unless $svc_domain;
+my $domain = $svc_domain->domain;
+
+</%init>
diff --git a/httemplate/view/svc_acct/change_svc.html b/httemplate/view/svc_acct/change_svc.html
new file mode 100644 (file)
index 0000000..33d44a7
--- /dev/null
@@ -0,0 +1,21 @@
+% if ( @part_svc || $opt{'showall'} ) {
+
+| <SELECT NAME="svcpart" onChange="enable_change()">
+    <OPTION VALUE="">Change service</OPTION>
+    <OPTION VALUE="">--------------</OPTION>
+% foreach my $opt_part_svc ( @part_svc ) { 
+
+      <OPTION VALUE="<% $opt_part_svc->svcpart %>"><% $opt_part_svc->svc %></OPTION>
+% } 
+
+  </SELECT>
+  <INPUT NAME="submit" TYPE="submit" VALUE="Change" disabled>
+
+% } 
+
+<%init>
+
+my %opt = @_;
+my @part_svc = @{ $opt{'part_svc'} };
+
+</%init>
diff --git a/httemplate/view/svc_acct/change_svc_form.html b/httemplate/view/svc_acct/change_svc_form.html
new file mode 100644 (file)
index 0000000..4f10922
--- /dev/null
@@ -0,0 +1,23 @@
+% if ( @part_svc || $opt{'showall'} ) {
+    <SCRIPT TYPE="text/javascript">
+      function enable_change () {
+        if ( document.OneTrueForm.svcpart.selectedIndex > 1 ) {
+          document.OneTrueForm.submit.disabled = false;
+        } else {
+          document.OneTrueForm.submit.disabled = true;
+        }
+      }
+    </SCRIPT>
+
+    <FORM NAME="OneTrueForm" ACTION="<%$p%>edit/process/cust_svc.cgi">
+    <INPUT TYPE="hidden" NAME="svcnum" VALUE="<% $svcnum %>">
+    <INPUT TYPE="hidden" NAME="pkgnum" VALUE="<% $pkgnum %>">
+% }
+<%init>
+
+my %opt = @_;
+my @part_svc = @{ $opt{'part_svc'} };
+my $svcnum = $opt{'svcnum'};
+my $pkgnum = $opt{'pkgnum'};
+
+</%init>
diff --git a/httemplate/view/svc_acct/hosting.html b/httemplate/view/svc_acct/hosting.html
new file mode 100644 (file)
index 0000000..1d83603
--- /dev/null
@@ -0,0 +1,38 @@
+% if ( @svc_www || $opt{'showall'} ) {
+  Hosting
+  <% &ntable("#cccccc") %><TR><TD><% &ntable("#cccccc",2) %>
+%   foreach my $svc_www (@svc_www) {
+%     my($label, $value) = $svc_www->cust_svc->label;
+%     my $link = $p. 'view/svc_www.cgi?'. $svc_www->svcnum;
+      <TR>
+        <TD BGCOLOR="#ffffff">
+          <A HREF="<% $link %>"><% "$label: $value" %></A>
+        </TD>
+      </TR>
+%   }
+  </TABLE></TD></TR></TABLE>
+  <BR><BR>
+% }
+<%init>
+
+my %opt = @_;
+
+#false laziness w/view_svc_acct.cgi and a zillion other places
+my $addl_from = ' LEFT JOIN cust_svc  USING ( svcnum  ) '.
+                ' LEFT JOIN cust_pkg  USING ( pkgnum  ) '.
+                ' LEFT JOIN cust_main USING ( custnum ) ';
+
+my @svc_www = qsearch({
+  'select'    => 'svc_www.*',
+  'table'     => 'svc_www',
+  'addl_from' => $addl_from,
+  'hashref'   => { 'usersvc' => $opt{'svcnum'} },
+  #XXX shit outta luck if you somehow got them linked across agents
+  # maybe we should show but not link to them?  kinda makes sense...
+  # (maybe a specific ACL for this situation???)
+  'extra_sql' => ' AND '. $FS::CurrentUser::CurrentUser->agentnums_sql(
+                            'null_right' => 'View/link unlinked services'
+                          ),
+});
+
+</%init>
diff --git a/httemplate/view/svc_acct/radius_usage.html b/httemplate/view/svc_acct/radius_usage.html
new file mode 100644 (file)
index 0000000..e2253a3
--- /dev/null
@@ -0,0 +1,77 @@
+% if ( $part_svc->part_export_usage ) {
+%
+%  my $last_bill;
+%  my %plandata;
+%  if ( $cust_pkg ) {
+%    #false laziness w/httemplate/edit/part_pkg... this stuff doesn't really
+%    #belong in plan data
+%    %plandata = map { /^(\w+)=(.*)$/; ( $1 => $2 ); }
+%                    split("\n", $cust_pkg->part_pkg->plandata );
+%
+%    $last_bill = $cust_pkg->last_bill;
+%  } else {
+%    $last_bill = 0;
+%    %plandata = ();
+%  }
+%
+%  my $seconds = $svc_acct->seconds_since_sqlradacct( $last_bill, time );
+%  my $hour = int($seconds/3600);
+%  my $min = int( ($seconds%3600) / 60 );
+%  my $sec = $seconds%60;
+%
+%  my $input = $svc_acct->attribute_since_sqlradacct(
+%    $last_bill, time, 'AcctInputOctets'
+%  ) / 1048576;
+%  my $output = $svc_acct->attribute_since_sqlradacct(
+%    $last_bill, time, 'AcctOutputOctets'
+%  ) / 1048576;
+%
+%
+
+
+  RADIUS session information<BR>
+  <% ntable('#cccccc',2) %>
+  <TR><TD BGCOLOR="#ffffff">
+% if ( $seconds ) { 
+
+    Online <B><% $hour %></B>h <B><% $min %></B>m <B><% $sec %></B>s
+% } else { 
+
+    Has not logged on
+% } 
+% if ( $cust_pkg ) { 
+
+    since last bill (<% time2str('%a %b %o %Y', $last_bill) %>)
+% if ( length($plandata{recur_included_hours}) ) { 
+
+    - <% $plandata{recur_included_hours} %> total hours in plan
+% } 
+
+    <BR>
+% } else { 
+
+    (no billing cycle available for unaudited account)<BR>
+% } 
+
+
+  Upload: <B><% sprintf("%.3f", $input) %></B> megabytes<BR>
+  Download: <B><% sprintf("%.3f", $output) %></B> megabytes<BR>
+  Last Login: <B><% $svc_acct->last_login_text %></B><BR>
+% my $href = qq!<A HREF="${p}search/sqlradius.cgi?svcnum=!. $svc_acct->svcnum; 
+
+  View session detail:
+      <% $href %>;begin=<% $last_bill %>">this billing cycle</A>
+    | <% $href %>;begin=<% time-15552000 %>">past six months</A>
+    | <% $href %>">all sessions</A>
+
+  </TD></TR></TABLE><BR>
+% } 
+<%init>
+
+my %opt = @_;
+
+my $svc_acct = $opt{'svc_acct'};
+my $part_svc = $opt{'part_svc'};
+my $cust_pkg = $opt{'cust_pkg'};
+
+</%init>
diff --git a/httemplate/view/svc_acct/usage.html b/httemplate/view/svc_acct/usage.html
new file mode 100644 (file)
index 0000000..9758d83
--- /dev/null
@@ -0,0 +1,27 @@
+% my %ulabel = ( seconds    => 'Time',
+%                upbytes    => 'Upload bytes',
+%                downbytes  => 'Download bytes',
+%                totalbytes => 'Total bytes',
+%              );
+% foreach my $uf ( keys %ulabel ) {
+%   my $tf = $uf . "_threshold";
+%   if ( $svc_acct->$uf ne '' ) {
+%     my $v = $uf eq 'seconds'
+%       #? (($svc_acct->$uf < 0 ? '-' : ''). duration_exact($svc_acct->$uf) )
+%       ? ($svc_acct->$uf < 0 ? '-' : '').
+%         int(abs($svc_acct->$uf)/3600). "hr ".
+%         sprintf("%02d",(abs($svc_acct->$uf)%3600)/60). "min"
+%       : FS::UI::bytecount::display_bytecount($svc_acct->$uf);
+    <TR>
+      <TD ALIGN="right"><% $ulabel{$uf} %> remaining</TD>
+      <TD BGCOLOR="#ffffff"><% $v %></TD>
+    </TR>
+
+%   }
+% }
+<%init>
+
+my %opt = @_;
+my $svc_acct = $opt{'svc_acct'};
+
+</%init>
index a9fc775..3938a34 100755 (executable)
-<% include("/elements/header.html",'Domain View', menubar(
-  ( ( $pkgnum || $custnum )
-    ? ( "View this customer (#$display_custnum)" => "${p}view/cust_main.cgi?$custnum",
-      )
-    : ( "Delete this (unaudited) domain" =>
-          "javascript:areyousure('${p}misc/cancel-unaudited.cgi?$svcnum', 'Delete $domain and all records?' )" )
-  )
-)) %>
+% if ( $custnum ) {
 
-<% include('/elements/error.html') %>
-
-Service #<% $svcnum %>
-<BR>Service: <B><% $part_svc->svc %></B>
-<BR>Domain name: <B><% $domain %></B>
-% if ($export) {
-<BR>Status: <B><% $status %></B>
-%   if ( $FS::CurrentUser::CurrentUser->access_right('Manage domain registration') ) {
-%     if ( defined($ops{'register'}) ) {
-    <A HREF="<% ${p} %>edit/process/domreg.cgi?op=register&svcnum=<% $svcnum %>">Register at <% $registrar->{'name'} %></A>&nbsp;
-%     }
-%     if ( defined($ops{'transfer'}) ) {
-    <A HREF="<% ${p} %>edit/process/domreg.cgi?op=transfer&svcnum=<% $svcnum %>">Transfer to <% $registrar->{'name'} %></A>&nbsp;
-%     }
-%     if ( defined($ops{'renew'}) ) {
-    <A HREF="<% ${p} %>edit/process/domreg.cgi?op=renew&svcnum=<% $svcnum %>&period=1">Renew at <% $registrar->{'name'} %></A>&nbsp;
-%     }
-%     if ( defined($ops{'revoke'}) ) {
-    <A HREF="<% ${p} %>edit/process/domreg.cgi?op=revoke&svcnum=<% $svcnum %>">Revoke</A>
-%     }
-%   }
-% }
+%#  <% include("/elements/header.html","View $svcdomain") %>
+  <% include("/elements/header.html","View domain") %>
+  <% include( '/elements/small_custview.html', $custnum, '', 1,
+     "${p}view/cust_main.cgi") %>
+  <BR>
 
-% if ( $FS::CurrentUser::CurrentUser->access_right('Edit domain catchall') ) {
-    <BR>Catch all email <A HREF="<% ${p} %>misc/catchall.cgi?<% $svcnum %>">(change)</A>:
 % } else {
-    <BR>Catch all email:
-% }
 
-<% $email ? "<B>$email</B>" : "<I>(none)<I>" %>
-<BR><BR><A HREF="<% ${p} %>misc/whois.cgi?custnum=<%$custnum%>;svcnum=<%$svcnum%>;domain=<%$domain%>">View whois information.</A>
-<BR><BR>
-<SCRIPT>
-  function areyousure(href, message) {
-    if ( confirm(message) == true )
-      window.location.href = href;
-  }
-  function slave_areyousure() {
-    return confirm("Remove all records and slave from " + document.SlaveForm.recdata.value + "?");
-  }
-</SCRIPT>
-
-% my @records; if ( @records = $svc_domain->domain_record ) { 
-
-  <% include('/elements/table-grid.html') %>
-
-% my $bgcolor1 = '#eeeeee';
-%     my $bgcolor2 = '#ffffff';
-%     my $bgcolor = $bgcolor2;
-
-  <tr>
-    <th CLASS="grid" BGCOLOR="#cccccc">Zone</th>
-    <th CLASS="grid" BGCOLOR="#cccccc">Type</th>
-    <th CLASS="grid" BGCOLOR="#cccccc">Data</th>
-  </tr>
-
-% foreach my $domain_record ( @records ) {
-%       my $type = $domain_record->rectype eq '_mstr'
-%                    ? "(slave)"
-%                    : $domain_record->recaf. ' '. $domain_record->rectype;
-
-
-    <tr>
-      <td CLASS="grid" BGCOLOR="<% $bgcolor %>"><% $domain_record->reczone %></td>
-      <td CLASS="grid" BGCOLOR="<% $bgcolor %>"><% $type %></td>
-      <td CLASS="grid" BGCOLOR="<% $bgcolor %>"><% $domain_record->recdata %>
-
-% unless ( $domain_record->rectype eq 'SOA'
-%          || ! $FS::CurrentUser::CurrentUser->access_right('Edit domain nameservice')
-%        ) { 
-%   ( my $recdata = $domain_record->recdata ) =~ s/"/\\'\\'/g;
-      (<A HREF="javascript:areyousure('<%$p%>misc/delete-domain_record.cgi?<%$domain_record->recnum%>', 'Delete \'<% $domain_record->reczone %> <% $type %> <% $recdata %>\' ?' )">delete</A>)
-% } 
-      </td>
-    </tr>
-
-
-%   if ( $bgcolor eq $bgcolor1 ) {
-%      $bgcolor = $bgcolor2;
-%    } else {
-%      $bgcolor = $bgcolor1;
-%    }
-
-% } 
-
-  </table>
-% } 
-
-% if ( $FS::CurrentUser::CurrentUser->access_right('Edit domain nameservice') ) {
-    <BR>
-    <FORM METHOD="POST" ACTION="<%$p%>edit/process/domain_record.cgi">
-      <INPUT TYPE="hidden" NAME="svcnum" VALUE="<%$svcnum%>">
-      <INPUT TYPE="text" NAME="reczone"> 
-      <INPUT TYPE="hidden" NAME="recaf" VALUE="IN"> IN 
-      <SELECT NAME="rectype">
-%       foreach (qw( A NS CNAME MX PTR TXT) ) { 
-          <OPTION VALUE="<%$_%>"><%$_%></OPTION>
-%       } 
-      </SELECT>
-      <INPUT TYPE="text" NAME="recdata">
-      <INPUT TYPE="submit" VALUE="Add record">
-    </FORM>
-
-    <BR><BR>
-    or
-    <BR><BR>
-
-    <FORM NAME="SlaveForm" METHOD="POST" ACTION="<%$p%>edit/process/domain_record.cgi">
-      <INPUT TYPE="hidden" NAME="svcnum" VALUE="<%$svcnum%>">
-%     if ( @records ) { 
-         Delete all records and 
-%     } 
-      Slave from nameserver IP 
-      <INPUT TYPE="hidden" NAME="svcnum" VALUE="<%$svcnum%>">
-      <INPUT TYPE="hidden" NAME="reczone" VALUE="@"> 
-      <INPUT TYPE="hidden" NAME="recaf" VALUE="IN">
-      <INPUT TYPE="hidden" NAME="rectype" VALUE="_mstr">
-      <INPUT TYPE="text" NAME="recdata">
-      <INPUT TYPE="submit" VALUE="Slave domain" onClick="return slave_areyousure()">
-    </FORM>
+  <% include("/elements/header.html",'View domain', menubar(
+       "Cancel this (unaudited) domain" =>
+         "javascript:areyousure('${p}misc/cancel-unaudited.cgi?$svcnum', 'Delete $domain and all records?')",
+     ))
+  %>
 
 % }
 
-<BR><BR>
+<% include('/elements/error.html') %>
+
+<% include('svc_domain/basics.html', $svc_domain,
+             'part_svc' => $part_svc,
+             'custnum'  => $custnum,
+          )
+%>
+<BR>
+
+<% include('svc_domain/acct_defaults.html', $svc_domain,
+             'part_svc' => $part_svc,
+          )
+%>
+<BR>
+
+<% include('svc_domain/dns.html', $svc_domain ) %>
+<BR>
+
+<% include('elements/svc_export_settings.html', $svc_domain) %>
 
 <% joblisting({'svcnum'=>$svcnum}, 1) %>
 
@@ -140,6 +44,8 @@ Service #<% $svcnum %>
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('View customer services');
 
+my $conf = new FS::Conf;
+
 my($query) = $cgi->keywords;
 $query =~ /^(\d+)$/;
 my $svcnum = $1;
@@ -171,46 +77,6 @@ if ($pkgnum) {
 my $part_svc = qsearchs('part_svc',{'svcpart'=> $cust_svc->svcpart } );
 die "Unknown svcpart" unless $part_svc;
 
-my $email = '';
-if ($svc_domain->catchall) {
-  my $svc_acct = qsearchs('svc_acct',{'svcnum'=> $svc_domain->catchall } );
-  die "Unknown svcpart" unless $svc_acct;
-  $email = $svc_acct->email;
-}
-
 my $domain = $svc_domain->domain;
 
-my $status = 'Unknown';
-my %ops = ();
-
-my @exports = $part_svc->part_export();
-
-my $registrar;
-my $export;
-
-# Find the first export that does domain registration
-foreach (@exports) {
-       $export = $_ if $_->can('registrar');
-}
-# If we have a domain registration export, get the registrar object
-if ($export) {
-       $registrar = $export->registrar;
-       my $domstat = $export->get_status( $svc_domain );
-       if (defined($domstat->{'message'})) {
-               $status = $domstat->{'message'};
-       } elsif (defined($domstat->{'unregistered'})) {
-               $status = 'Not registered';
-               $ops{'register'} = "Register";
-       } elsif (defined($domstat->{'status'})) {
-               $status = $domstat->{'status'} . ' ' . $domstat->{'contact_email'} . ' ' . $domstat->{'last_update_time'};
-       } elsif (defined($domstat->{'expdate'})) {
-               $status = "Expires " . $domstat->{'expdate'};
-               $ops{'renew'} = "Renew";
-               $ops{'revoke'} = "Revoke";
-       } else {
-               $status = $domstat->{'reason'};
-               $ops{'transfer'} = "Transfer";
-       }
-}
-
 </%init>
diff --git a/httemplate/view/svc_domain/acct_defaults.html b/httemplate/view/svc_domain/acct_defaults.html
new file mode 100644 (file)
index 0000000..0c072bf
--- /dev/null
@@ -0,0 +1,71 @@
+% if ( $communigate ) {
+
+  Account defaults
+  <% &ntable("#cccccc") %><TR><TD><% &ntable("#cccccc",2) %>
+
+  <% include('/view/elements/tr.html',
+               label=>'Password modification',
+               value=>$svc_domain->acct_def_password_selfchange ? 'YES' : 'NO',
+            )
+  %>
+   <% include('/view/elements/tr.html',
+               label=>'Password recovery',
+               value=>$svc_domain->acct_def_password_recover ? 'YES' : 'NO',
+            )
+  %>
+    
+  <% include('/view/elements/tr.html',
+               label=>'Enabled services',
+               value=>$svc_domain->acct_def_cgp_accessmodes,
+            )
+  %>
+    
+  <% include('/view/elements/tr.html',
+               label=>'Mail storage limit',
+               value=>$svc_domain->acct_def_quota,
+            )
+  %>
+    
+  <% include('/view/elements/tr.html',
+               label=>'File storage limit',
+               value=>$svc_domain->acct_def_file_quota,
+            )
+  %>
+    
+  <% include('/view/elements/tr.html',
+               label=>'Files limt',
+               value=>$svc_domain->acct_def_file_maxnum,
+            )
+  %>
+    
+  <% include('/view/elements/tr.html',
+               label=>'File size limit',
+               value=>$svc_domain->acct_def_file_maxsize,
+            )
+  %>
+    
+  <% include('/view/elements/tr.html',
+               label=>'Message delete method',
+               value=>$svc_domain->acct_def_cgp_deletemode,
+            )
+  %>
+    
+  <% include('/view/elements/tr.html',
+               label=>'On logout remove trash',
+               value=>$svc_domain->acct_def_cgp_emptytrash,
+            )
+  %>
+
+  </TABLE></TD></TR></TABLE>
+
+% }
+<%init>
+
+my($svc_domain, %opt) = @_;
+
+my $part_svc = $opt{'part_svc'};
+
+my $communigate = scalar($part_svc->part_export('communigate_pro'));
+                # || scalar($part_svc->part_export('communigate_pro_singledomain'));
+
+</%init>
diff --git a/httemplate/view/svc_domain/basics.html b/httemplate/view/svc_domain/basics.html
new file mode 100644 (file)
index 0000000..db4fac1
--- /dev/null
@@ -0,0 +1,134 @@
+Service #<B><% $svcnum %></B>
+% #if ( $conf->exists('svc_domain-edit_domain') ) {
+  | <A HREF="<%$p%>edit/svc_domain.cgi?<%$svcnum%>">Edit this domain</A>
+% #}
+
+<% &ntable("#cccccc") %><TR><TD><% &ntable("#cccccc",2) %>
+
+<TR>
+  <TD ALIGN="right">Service</TD>
+  <TD BGCOLOR="#ffffff"><% $part_svc->svc %></TD>
+</TR>
+
+<TR>
+  <TD ALIGN="right">Domain</TD>
+  <TD BGCOLOR="#ffffff">
+    <B><% $domain %></B>
+    <A HREF="<% ${p} %>misc/whois.cgi?custnum=<%$custnum%>;svcnum=<%$svcnum%>;domain=<%$domain%>">(view whois information)</A>
+  </TD>
+</TR>
+
+% if ($export) {
+  <TR>
+    <TD ALIGN="right">Registration status</TD>
+    <TD BGCOLOR="#ffffff"><B><% $status %></B>
+
+%   if ( $FS::CurrentUser::CurrentUser->access_right('Manage domain registration') ) {
+%     if ( defined($ops{'register'}) ) {
+    <A HREF="<% ${p} %>edit/process/domreg.cgi?op=register&svcnum=<% $svcnum %>">Register at <% $registrar->{'name'} %></A>&nbsp;
+%     }
+%     if ( defined($ops{'transfer'}) ) {
+    <A HREF="<% ${p} %>edit/process/domreg.cgi?op=transfer&svcnum=<% $svcnum %>">Transfer to <% $registrar->{'name'} %></A>&nbsp;
+%     }
+%     if ( defined($ops{'renew'}) ) {
+    <A HREF="<% ${p} %>edit/process/domreg.cgi?op=renew&svcnum=<% $svcnum %>&period=1">Renew at <% $registrar->{'name'} %></A>&nbsp;
+%     }
+%     if ( defined($ops{'revoke'}) ) {
+    <A HREF="<% ${p} %>edit/process/domreg.cgi?op=revoke&svcnum=<% $svcnum %>">Revoke</A>
+%     }
+%   }
+
+    </TD>
+  </TR>
+% }
+
+% if ( $communigate ) {
+
+  <TR>
+    <TD ALIGN="right">Administrator domain</TD>
+    <TD BGCOLOR="#ffffff">
+%     if ( $svc_domain->parent_svcnum ) {
+% #XXX agent-virt aware the link
+        <A HREF="svc_domain.cgi?<% $svc_domain->parent_svcnum %>"><% $svc_domain->parent_svc_x->domain %></A>
+%     } else {
+        <I>(none)</I>
+%     }
+    </TD>
+  </TR>
+
+  <TR>
+    <TD ALIGN="right">Aliases</TD>
+    <TD BGCOLOR="#ffffff"><% $svc_domain->cgp_aliases %></TD>
+  </TR>
+
+% }
+
+% if ( $communigate && $svc_domain->max_accounts ) {
+  <TR>
+    <TD ALIGN="right">Maximum number of Accounts</TD>
+    <TD BGCOLOR="#ffffff"><% $svc_domain->max_accounts %></TD>
+  </TR>
+% }
+
+<TR>
+  <TD ALIGN="right">Catch all email</TD>
+  <TD BGCOLOR="#ffffff"><% $email ? "<B>$email</B>" : '<I>(none)</I>' %>
+% if ( $FS::CurrentUser::CurrentUser->access_right('Edit domain catchall') ) {
+     <A HREF="<% ${p} %>misc/catchall.cgi?<% $svcnum %>">(change)</A>
+% }
+  </TD>
+</TR>
+
+<TR>
+  <TD ALIGN="right">Enabled services</TD>
+  <TD BGCOLOR="#ffffff"><% $svc_domain->cgp_accessmodes %></TD>
+</TR>
+
+</TABLE></TD></TR></TABLE>
+
+<%init>
+
+my($svc_domain, %opt) = @_;
+my $svcnum = $svc_domain->svcnum;
+my $domain = $svc_domain->domain;
+my $custnum = $opt{'custnum'};
+my $part_svc = $opt{'part_svc'};
+
+my $communigate = scalar($part_svc->part_export('communigate_pro'));
+                # || scalar($part_svc->part_export('communigate_pro_singledomain'));
+
+my $email = '';
+if ($svc_domain->catchall) {
+  my $svc_acct = qsearchs('svc_acct',{'svcnum'=> $svc_domain->catchall } );
+  die "Unknown svcpart" unless $svc_acct;
+  $email = $svc_acct->email;
+}
+
+# Find the first export that does domain registration
+my @exports = grep $_->can('registrar'), $part_svc->part_export;
+my $export = $exports[0];
+# If we have a domain registration export, get the registrar object
+my $registrar;
+my $status = 'Unknown';
+my %ops = ();
+if ($export) {
+       $registrar = $export->registrar;
+       my $domstat = $export->get_status( $svc_domain );
+       if (defined($domstat->{'message'})) {
+               $status = $domstat->{'message'};
+       } elsif (defined($domstat->{'unregistered'})) {
+               $status = 'Not registered';
+               $ops{'register'} = "Register";
+       } elsif (defined($domstat->{'status'})) {
+               $status = $domstat->{'status'} . ' ' . $domstat->{'contact_email'} . ' ' . $domstat->{'last_update_time'};
+       } elsif (defined($domstat->{'expdate'})) {
+               $status = "Expires " . $domstat->{'expdate'};
+               $ops{'renew'} = "Renew";
+               $ops{'revoke'} = "Revoke";
+       } else {
+               $status = $domstat->{'reason'};
+               $ops{'transfer'} = "Transfer";
+       }
+}
+
+</%init>
diff --git a/httemplate/view/svc_domain/dns.html b/httemplate/view/svc_domain/dns.html
new file mode 100644 (file)
index 0000000..f6f8c71
--- /dev/null
@@ -0,0 +1,94 @@
+<SCRIPT>
+  function areyousure(href, message) {
+    if ( confirm(message) == true )
+      window.location.href = href;
+  }
+  function slave_areyousure() {
+    return confirm("Remove all records and slave from " + document.SlaveForm.recdata.value + "?");
+  }
+</SCRIPT>
+
+DNS records
+% my @records; if ( @records = $svc_domain->domain_record ) { 
+
+  <% include('/elements/table-grid.html') %>
+
+% my $bgcolor1 = '#eeeeee';
+%     my $bgcolor2 = '#ffffff';
+%     my $bgcolor = $bgcolor2;
+
+  <tr>
+    <th CLASS="grid" BGCOLOR="#cccccc">Zone</th>
+    <th CLASS="grid" BGCOLOR="#cccccc">Type</th>
+    <th CLASS="grid" BGCOLOR="#cccccc">Data</th>
+  </tr>
+
+% foreach my $domain_record ( @records ) {
+%       my $type = $domain_record->rectype eq '_mstr'
+%                    ? "(slave)"
+%                    : $domain_record->recaf. ' '. $domain_record->rectype;
+
+
+    <tr>
+      <td CLASS="grid" BGCOLOR="<% $bgcolor %>"><% $domain_record->reczone %></td>
+      <td CLASS="grid" BGCOLOR="<% $bgcolor %>"><% $type %></td>
+      <td CLASS="grid" BGCOLOR="<% $bgcolor %>"><% $domain_record->recdata %>
+
+% unless ( $domain_record->rectype eq 'SOA'
+%          || ! $FS::CurrentUser::CurrentUser->access_right('Edit domain nameservice')
+%        ) { 
+%   ( my $recdata = $domain_record->recdata ) =~ s/"/\\'\\'/g;
+      (<A HREF="javascript:areyousure('<%$p%>misc/delete-domain_record.cgi?<%$domain_record->recnum%>', 'Delete \'<% $domain_record->reczone %> <% $type %> <% $recdata %>\' ?' )">delete</A>)
+% }
+      </td>
+    </tr>
+
+
+%   if ( $bgcolor eq $bgcolor1 ) {
+%      $bgcolor = $bgcolor2;
+%    } else {
+%      $bgcolor = $bgcolor1;
+%    }
+
+% } 
+
+  </table>
+% } 
+
+% if ( $FS::CurrentUser::CurrentUser->access_right('Edit domain nameservice') ) {
+    <FORM METHOD="POST" ACTION="<%$p%>edit/process/domain_record.cgi">
+      <INPUT TYPE="hidden" NAME="svcnum" VALUE="<%$svcnum%>">
+      <INPUT TYPE="text" NAME="reczone"> 
+      <INPUT TYPE="hidden" NAME="recaf" VALUE="IN"> IN 
+      <SELECT NAME="rectype">
+%       foreach (qw( A NS CNAME MX PTR TXT) ) { 
+          <OPTION VALUE="<%$_%>"><%$_%></OPTION>
+%       } 
+      </SELECT>
+      <INPUT TYPE="text" NAME="recdata">
+      <INPUT TYPE="submit" VALUE="Add record">
+    </FORM>
+
+    <FORM NAME="SlaveForm" METHOD="POST" ACTION="<%$p%>edit/process/domain_record.cgi">
+      <INPUT TYPE="hidden" NAME="svcnum" VALUE="<%$svcnum%>">
+%     if ( @records ) { 
+         Delete all records and 
+%     } 
+      Or slave from nameserver IP 
+      <INPUT TYPE="hidden" NAME="svcnum" VALUE="<%$svcnum%>">
+      <INPUT TYPE="hidden" NAME="reczone" VALUE="@"> 
+      <INPUT TYPE="hidden" NAME="recaf" VALUE="IN">
+      <INPUT TYPE="hidden" NAME="rectype" VALUE="_mstr">
+      <INPUT TYPE="text" NAME="recdata">
+      <INPUT TYPE="submit" VALUE="Slave domain" onClick="return slave_areyousure()">
+    </FORM>
+
+% }
+
+<%init>
+
+my($svc_domain, %opt) = @_;
+my $svcnum = $svc_domain->svcnum;
+
+</%init>
+
index 0847a5e..43d8a4e 100755 (executable)
@@ -1,12 +1,26 @@
-<% include('/elements/header.html', 'Mail Forward View', menubar(
-  ( ( $pkgnum || $custnum )
-    ? ( "View this customer (#$display_custnum)" => "${p}view/cust_main.cgi?$custnum",
-      )
-    : ( "Cancel this (unaudited) mail forward" =>
-          "${p}misc/cancel-unaudited.cgi?$svcnum" )
-  )
-))
-%>
+% if ( $custnum ) {
+
+  <% include("/elements/header.html","View mail forward") %>
+  <% include( '/elements/small_custview.html', $custnum, '', 1,
+     "${p}view/cust_main.cgi") %>
+  <BR>
+
+% } else {
+
+  <% include("/elements/header.html",'View mail forward', menubar(
+       "Cancel this (unaudited) mail forward" =>
+         "javascript:areyousure('${p}misc/cancel-unaudited.cgi?$svcnum')",
+     ))
+  %>
+
+  <SCRIPT>
+  function areyousure(href) {
+      if (confirm("Permanently delete this mail forward?") == true)
+          window.location.href = href;
+  }
+  </SCRIPT>
+
+% }
 
 <A HREF="<% $p %>edit/svc_forward.cgi?<% $svcnum %>">Edit this information</A>
 
diff --git a/httemplate/view/svc_mailinglist.cgi b/httemplate/view/svc_mailinglist.cgi
new file mode 100644 (file)
index 0000000..f646a41
--- /dev/null
@@ -0,0 +1,71 @@
+<% include('elements/svc_Common.html',
+             'table' => 'svc_mailinglist',
+             %opt,
+          )
+%>
+<%init>
+
+my %opt = ();
+
+my $info = FS::svc_mailinglist->table_info;
+
+$opt{'name'} = $info->{'name'};
+
+my $fields = $info->{'fields'};
+my %labels = map { $_ =>  ( ref($fields->{$_})
+                             ? $fields->{$_}{'label'}
+                             : $fields->{$_}
+                         );
+                 }
+             keys %$fields;
+
+#$opt{'fields'} = [ keys %$fields ];
+$opt{'fields'} = [
+  'username',
+  'domain',
+  'listname',
+  'reply_to',
+  'remove_from',
+  'reject_auto',
+  'remove_to_and_cc',
+];
+
+$opt{'labels'} = \%labels;
+
+$opt{'html_foot'} = sub {
+  my $svc_mailinglist = shift;
+  my $listnum = $svc_mailinglist->listnum;
+
+  my $sql = 'SELECT COUNT(*) FROM mailinglistmember WHERE listnum = ?';
+  my $sth = dbh->prepare($sql) or die dbh->errstr;
+  $sth->execute($listnum) or die $sth->errstr;
+  my $num = $sth->fetchrow_arrayref->[0];
+
+  my $add_url = $p."edit/mailinglistmember.html?listnum=$listnum";
+
+  my $add_link = include('/elements/init_overlib.html').
+                 include('/elements/popup_link.html',
+                           'action' => $add_url,
+                           'label'  => 'add',
+                           'actionlabel' => 'Add list member',
+                           'width'  => 392,
+                           'height' => 192,
+                        );
+
+  ntable('#cccccc').'<TR><TD>'.ntable('#cccccc',2). qq[
+    <TR>
+      <TD>List members</TD>
+      <TD BGCOLOR="#ffffff">
+        $num members
+        ( <A HREF="${p}search/mailinglistmember.html?listnum=$listnum">view</A>
+        | $add_link )
+      </TD>
+    </TR>
+    </TABLE></TD></TR></TABLE>
+
+    <BR><BR>
+  ]. include('svc_export_settings.html', $svc_mailinglist);
+
+};
+
+</%init>
index c5fce62..75591c7 100644 (file)
@@ -1,15 +1,11 @@
 <% include('elements/svc_Common.html',
               'table'     => 'svc_phone',
-              'fields'    => [qw(
-                                  countrycode
-                                  phonenum
-                                  sip_password
-                                  pin
-                                  phone_name
-                             )],
+              'fields'    => \@fields,
               'labels'    => {
                                'countrycode'  => 'Country code',
                                'phonenum'     => 'Phone number',
+                               'domain'       => 'Domain',
+                               'pbx_title'    => 'PBX',
                                'sip_password' => 'SIP password',
                                'pin'          => 'PIN',
                                'phone_name'   => 'Name',
 %>
 <%init>
 
+my $conf = new FS::Conf;
+my $countrydefault = $conf->config('countrydefault') || 'US';
+
+my @fields = qw( countrycode phonenum );
+push @fields, 'domain' if $conf->exists('svc_phone-domain');
+push @fields, qw( pbx_title sip_password pin phone_name );
+
 my $html_foot = sub {
   my $svc_phone = shift;
 
   ###
+  # E911 Info
+  ###
+
+  my $e911 = 
+    'E911 Information'.
+    &ntable("#cccccc"). '<TR><TD>'. ntable("#cccccc",2).
+      '<TR><TD>Location</TD>'.
+      '<TD BGCOLOR="#FFFFFF">'.
+        $svc_phone->location_label( 'join_string'     => '<BR>',
+                                    'double_space'    => ' &nbsp; ',
+                                    'escape_function' => \&encode_entities,
+                                    'countrydefault'  => $countrydefault,
+                                  ).
+      '</TD></TR>'.
+    '</TABLE></TD></TR></TABLE>'.
+    '<BR>'
+  ;
+
+  ###
   # Devices
   ###
 
@@ -56,6 +78,7 @@ my $html_foot = sub {
             '<TH CLASS="grid" BGCOLOR="#cccccc">Type</TH>'.
             '<TH CLASS="grid" BGCOLOR="#cccccc">MAC Addr</TH>'.
             '<TH CLASS="grid" BGCOLOR="#cccccc"></TH>'.
+            '<TH CLASS="grid" BGCOLOR="#cccccc"></TH>'.
           '</TR>';
       my $bgcolor1 = '#eeeeee';
       my $bgcolor2 = '#ffffff';
@@ -71,10 +94,12 @@ my $html_foot = sub {
         my $td = qq(<TD CLASS="grid" BGCOLOR="$bgcolor">);
 
         my $devicenum = $phone_device->devicenum;
+        my $export_links = join( '<BR>', @{ $phone_device->export_links } );
 
         $devices .= '<TR>'.
                       $td. $phone_device->part_device->devicename. '</TD>'.
                       $td. $phone_device->mac_addr. '</TD>'.
+                      $td. $export_links. '</TD>'.
                       "$td( ".
                         qq(<A HREF="${p}edit/phone_device.html?$devicenum">edit</A> | ).
                         qq(<A HREF="javascript:areyousure('${p}misc/delete-phone_device.html?$devicenum')">delete</A>).
@@ -118,6 +143,7 @@ my $html_foot = sub {
   # concatenate & return
   ###
 
+  $e911.
   $devices.
   join(' | ', @links ). '<BR>'.
   join(' | ', @ilinks). '<BR>';
index 9312270..d6e4967 100644 (file)
@@ -1,5 +1,5 @@
 %{!?_initrddir:%define _initrddir /etc/rc.d/init.d}
-%{!?version:%define version 1.9.1}
+%{!?version:%define version 1.9.2}
 %{!?release:%define release 8}
 
 Summary: Freeside ISP Billing System
diff --git a/rt/etc/rt.spec b/rt/etc/rt.spec
deleted file mode 100644 (file)
index 14200c1..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-Summary: rt Request Tracker
-
-Name: rt
-Version: 2.0.9pre5
-Release: 1
-Group: Applications/Web
-Packager: Jesse Vincent <jesse@bestpractical.com>
-Vendor: http://www.fsck.com/projects/rt
-Requires: perl
-Requires: mod_perl > 1.22
-Requires: perl-DBI >= 1.18
-Requires: perl-DBIx-DataSource >= 0.02
-Requires: perl-DBIx-SearchBuilder >= 0.47
-Requires: perl-HTML-Parser
-Requires: perl-MLDBM
-Requires: perl-libnet
-Requires: perl-CGI.pm >= 2.78
-Requires: perl-Params-Validate >= 0.02
-Requires: perl-HTML-Mason >= 0.896
-Requires: perl-libapreq
-Requires: perl-Apache-Session >= 1.53
-Requires: perl-MIME-tools >= 5.411
-Requires: perl-MailTools >= 1.20
-Requires: perl-Getopt-Long >= 2.24
-Requires: perl-Tie-IxHash
-Requires: perl-TimeDate
-Requires: perl-Time-HiRes
-Requires: perl-Text-Wrapper
-Requires: perl-Text-Template
-Requires: perl-File-Spec >= 0.8
-Requires: perl-FreezeThaw
-Requires: perl-Storable
-Requires: perl-File-Temp
-Requires: perl-Log-Dispatch >= 1.6                     
-
-Source: http://www.fsck.com/pub/rt/release/%{name}.tar.gz
-Copyright: GPL 
-BuildRoot: /var/tmp/rt-root
-
-%description
-RT is an industrial-grade ticketing system. It lets a group
-of people intelligently and efficiently manage requests
-submitted by a community of users. RT is used by systems
-administrators, customer support staffs, NOCs, developers
-and even marketing departments at over a thousand sites
-around the world. 
-
-%prep
-groupadd rt || true
-%setup -q -n %{name}
-
-%build
-
-%install
-
-if [ x$RPM_BUILD_ROOT != x ]; then
-rm -rf $RPM_BUILD_ROOT
-fi
-
-#
-# Perform all the non-site specfic steps whilst building the package
-#
-make dirs libs-install html-install bin-install  DESTDIR=$RPM_BUILD_ROOT
-#
-# fixperms needs these, so make fake empty files
-touch $RPM_BUILD_ROOT/opt/rt2/etc/insertdata $RPM_BUILD_ROOT/opt/rt2/etc/config.pm
-make fixperms insert-install WEB_USER=www DESTDIR=$RPM_BUILD_ROOT
-
-#
-# Copy in the files needed again after install
-#
-mkdir -p $RPM_BUILD_ROOT/opt/rt2/postinstall/bin
-cp -rp Makefile etc tools $RPM_BUILD_ROOT/opt/rt2/postinstall
-cp -rp bin/initacls.* $RPM_BUILD_ROOT/opt/rt2/postinstall/bin
-
-# logging in /var/log/rt2
-mkdir -p $RPM_BUILD_ROOT/var/log/rt2
-chown www $RPM_BUILD_ROOT/var/log/rt2
-chgrp rt $RPM_BUILD_ROOT/var/log/rt2
-chmod ug=rwx,o= $RPM_BUILD_ROOT/var/log/rt2
-
-%clean
-if [ x$RPM_BUILD_ROOT != x ]; then
-rm -rf $RPM_BUILD_ROOT
-fi
-
-#
-# A new rt groups is required
-#
-%pre
-groupadd rt || true
-
-#
-# Show the user the site specific steps required after install
-#
-%post
-cat <<EOF
------------------------------------------------------------------------
-rt2 installation is complete. Now create the rt2 database by running:
------------------------------------------------------------------------
-
-# cd /opt/rt2/postinstall
-# make config-replace initialize.mysql insert RT_LOG_PATH=/var/log/rt2 DB_RT_PASS=new_rt_user_password
-
-Choose your own new_rt_user_password. You will need the mysql root password.
-You can try Pg or Oracle instead of mysql - untested.
-
-Review and configure your site specific details in /opt/rt2/etc/config.pm
-EOF
-
-%preun
-
-%files
-%dir /opt/rt2
-/opt/rt2/bin
-/opt/rt2/WebRT
-/opt/rt2/lib
-/opt/rt2/local
-/opt/rt2/man
-/opt/rt2/postinstall
-%dir /opt/rt2/etc
-/opt/rt2/etc/insertdata
-%config /opt/rt2/etc/config.pm
-%dir /var/log/rt2
-
-%changelog
-* Mon Sep 24 2001 Jesse Vincent <jesse@bestpractical.com>
-  Switch to rt DESTDIR support
-* Fri Sep 14 2001 Cris Bailiff <c.bailiff@devsecure.com>
-  Fix permissions on created /var/log/rt2 and roll in 2.0.7
-* Tue Sep 4 2001 Cris Bailiff <c.bailiff@devsecure.com>
-- created initial spec file
-* Tue Sep 4 2001 Cris Bailiff <c.bailiff@devsecure.com>
-- created initial spec file
-* Tue Sep 4 2001 Cris Bailiff <c.bailiff@devsecure.com>
-- created initial spec file
index d73dbac..57c2a2c 100644 (file)
@@ -132,7 +132,7 @@ sub _FreesideURILabel {
 
   my $self = shift;
 
-  $RT::Logger->debug("Called _FreesideURILabel()");
+  #$RT::Logger->debug("Called _FreesideURILabel()");
 
   return unless (exists($self->{'fstable'}) and
                  exists($self->{'fspkey'}));
@@ -140,17 +140,21 @@ sub _FreesideURILabel {
   my $label;
   my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'});
 
-  if ($table ne 'cust_main') {
-    warn "FS::${table} not currently supported";
-    return;
-  }
+  #if ($table ne 'cust_main') {
+  #  warn "FS::${table} not currently supported";
+  #  return;
+  #}
 
   my $rec = $self->_FreesideGetRecord();
 
-  if (ref($rec) eq 'HASH' and $table eq 'cust_main') {
+  if (ref($rec) eq 'HASH' && $table eq 'cust_main') {
     my $name = $rec->{'last'} . ', ' . $rec->{'first'};
     $name = $rec->{'company'} . " ($name)" if $rec->{'company'};
     $label = "$pkey: $name";
+  } elsif ( $table eq 'cust_svc' && ref($rec) && $rec->{'_object'} ) {
+    #Internal only
+    my($l,$v) = $rec->{'_object'}->label;
+    $label = "$l: $v";
   } else {
     $label = "$pkey: $table";
   }