diff options
240 files changed, 15109 insertions, 5499 deletions
@@ -1,3 +1,1496 @@ +2010-04-04 23:58 ivan + + * conf/invoice_from: company email + +2010-04-04 23:57 ivan + + * FS/bin/freeside-upgrade: require DBIx::DBSchema 0.39 for mysql + +2010-04-04 23:50 ivan + + * FS/FS/part_export/thirdlane.pm: thirdlane deletion fix + +2010-04-04 22:20 ivan + + * FS/FS/part_export/indosoft.pm: initial indosoft export, RT#4068 + +2010-04-04 18:23 ivan + + * httemplate/search/part_pkg.html: last fix for employee + commisssion report, RT#6991 + +2010-04-04 17:59 ivan + + * httemplate/elements/menu.html: add employee commission report to + menu, RT#6991 + +2010-04-04 16:47 ivan + + * FS/FS/Schema.pm: fix otaker upgrade + +2010-04-04 16:37 ivan + + * FS/FS/cust_pay_void.pm: fix otaker upgrade + +2010-04-04 16:27 ivan + + * FS/FS/: cust_attachment.pm, cust_main_note.pm: fix otaker upgrade + for cust_attachment & cust_main_note, hopefully + +2010-04-04 16:18 ivan + + * FS/FS/: cust_attachment.pm, cust_main_note.pm: fix otaker upgrade + for cust_attachment & cust_main_note, hopefully + +2010-04-04 15:52 ivan + + * FS/FS/: cust_main.pm: fix otaker upgrade for cust_main + +2010-04-04 15:44 ivan + + * FS/FS/cust_main_note.pm: fix note editing of old notes until we + can fix the cust_main_note.otaker disaster, RT#7991 + +2010-04-01 14:30 mark + + * httemplate/search/elements/cust_main_dayranges.html: fix column + alignment + +2010-04-01 01:10 ivan + + * FS/FS/part_pkg/: flat.pm, subscription.pm: fix nasty discount + fallout (i hope) + +2010-04-01 00:39 ivan + + * FS/FS/part_pkg/flat.pm: fix nasty discount fallout (i hope) + +2010-03-31 21:43 mark + + * 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 + +2010-03-31 08:48 jeff + + * FS/: MANIFEST, FS/part_export/dashcs_e911.pm: add dash carrier + services e911 support RT7103 + +2010-03-31 00:41 mark + + * 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 + +2010-03-31 00:35 ivan + + * 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 + +2010-03-30 23:30 ivan + + * FS/FS/Misc.pm: eliminate harmless "Use of uninitialized value + $enc in string eq" warnings + +2010-03-30 05:12 ivan + + * httemplate/search/part_pkg.html, FS/FS/Schema.pm: employee + commission reporting, RT#6991 + +2010-03-30 05:07 ivan + + * 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 + +2010-03-29 20:28 ivan + + * FS/FS/Record.pm: regexp_sql + +2010-03-29 20:10 ivan + + * FS/MANIFEST: employee (otaker / access_user) commissioning, + RT#6991 + +2010-03-29 19:53 ivan + + * 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 + +2010-03-29 19:52 ivan + + * FS/FS/part_event/Action/pkg_employee_credit.pm: employee + commissions, RT#6991 + +2010-03-29 19:04 ivan + + * 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 + +2010-03-29 02:18 mark + + * 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 + +2010-03-28 17:38 ivan + + * FS/FS/cust_pay.pm: move from otaker to proper usernum FK + +2010-03-28 17:23 ivan + + * 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 + +2010-03-26 23:21 ivan + + * FS/FS/cust_bill_pkg_detail.pm: fix cust_bill_pkg_detail throwing + a fatal error w/MySQL + +2010-03-26 23:09 ivan + + * 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 + +2010-03-26 21:37 ivan + + * FS/FS/Upgrade.pm: these are now supported in supported in + DBIx-DBSchema and friends + +2010-03-26 20:43 ivan + + * FS/FS/: reason.pm, tax_rate.pm: these are now supported in + supported in DBIx-DBSchema and friends + +2010-03-26 15:25 ivan + + * httemplate/elements/: select-areacode.html, select-did.html: fix + E911 vs. DID selector on phone provision, RT#7819 + +2010-03-26 14:43 ivan + + * FS/FS/cust_pkg.pm: no DISTINCT ON in MySQL makes kittens cry + +2010-03-26 00:52 ivan + + * httemplate/elements/: freeside-menu.css, freeside.css: that'll do + for now + +2010-03-25 22:02 ivan + + * 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 + +2010-03-25 21:50 ivan + + * FS/FS/UID.pm: don't warn about the configuration table during + setup + +2010-03-25 19:19 ivan + + * bin/build_exten.php: adding build_exten.php since FreePBX won't + ship it + +2010-03-25 18:06 ivan + + * rt/lib/RT/: Ticket_Overlay.pm: ticket auto-association in the + correct spot. how the hell did it get merged there? RT#7882 + +2010-03-25 15:30 ivan + + * httemplate/elements/header.html: fix new header in RT + +2010-03-25 15:21 ivan + + * rt/lib/RT/User_Overlay.pm: fix user modification? + +2010-03-25 14:22 ivan + + * rt/lib/RT/URI/freeside.pm: generate a stack backtrace for mystery + freeside link resolution problems + +2010-03-25 13:21 ivan + + * 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 + +2010-03-24 18:37 mark + + * FS/FS/Mason.pm, httemplate/view/cust_main/notes.html: RT#6226: + security fix for customer notes + +2010-03-24 01:37 ivan + + * 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 + +2010-03-23 02:13 ivan + + * 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 + +2010-03-23 01:27 ivan + + * httemplate/images/: black-gray-side.png, gray-black-side.png: + goodbye and good riddance + +2010-03-22 20:53 ivan + + * 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 + +2010-03-22 20:47 ivan + + * 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 + +2010-03-22 20:34 ivan + + * httemplate/elements/freeside.css: little bit further, just a + little bit more + +2010-03-22 18:17 ivan + + * httemplate/elements/menubar.html: don't like that <BR> after + all... for now + +2010-03-22 18:07 ivan + + * httemplate/elements/freeside.css: wfm + +2010-03-22 18:04 ivan + + * httemplate/elements/: xmenu.css, xmenu.top.css: purple on pink is + WAY too my little pony. man, its not easy being purple + +2010-03-22 12:46 ivan + + * httemplate/elements/: freeside.css, menubar.html: 1.9-style + menubar was hurting my eyes + +2010-03-22 07:08 jeff + + * FS/FS/tax_rate.pm: fix restore of setup and recur taxproducts on + tax data replacement + +2010-03-21 23:34 ivan + + * httemplate/elements/freeside.css: fix link hover effect so it + doesn't underline A NAME tags + +2010-03-21 16:56 ivan + + * httemplate/elements/freeside.css: fix inadvertant button styling + +2010-03-21 16:13 ivan + + * 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 + +2010-03-21 12:34 ivan + + * rt/etc/RT_SiteConfig.pm: make the fckeditor taller, way too small + +2010-03-20 22:18 ivan + + * rt/FREESIDE_MODIFIED: think this fixes the "results box color + infects everything else" problem + +2010-03-20 16:30 ivan + + * httemplate/docs/credits.html: more RT integration / reskin / 2.1, + RT#6640 + +2010-03-20 16:22 ivan + + * httemplate/: elements/menu.html, + elements/popup_link_onclick.html, images/cvv2.png, + images/cvv2_amex.png: more RT integration / reskin / 2.1, RT#6640 + +2010-03-20 15:44 ivan + + * httemplate/elements/: freeside-menu.css, header.html, xmenu.css, + xmenu.js, xmenu.top.css: more RT integration / reskin / 2.1, + RT#6640 + +2010-03-20 15:11 ivan + + * 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 + +2010-03-19 01:27 ivan + + * 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 + +2010-03-19 01:26 ivan + + * rt/FREESIDE_MODIFIED: skin RT 3.8, RT#6640 + +2010-03-19 01:20 mark + + * httemplate/misc/batch-cust_pay.html: RT#7812: confirm before + closing quick payment entry + +2010-03-18 01:02 ivan + + * httemplate/edit/cust_main/top_misc.html: signup date fix? + +2010-03-18 00:59 ivan + + * 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 + +2010-03-12 03:48 mark + + * httemplate/edit/svc_broadband.cgi: RT#7765: sort broadband router + names + +2010-03-11 19:36 ivan + + * 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 + +2010-03-11 19:30 ivan + + * FS/MANIFEST: add location to svc_phone, RT#7047 + +2010-03-10 19:27 ivan + + * FS/FS/TicketSystem/RT_External.pm, + httemplate/view/cust_main/tickets.html: add queue selection to + customer ticket creation, RT#7656 + +2010-03-10 18:15 ivan + + * httemplate/docs/credits.html: Mark Wells is now a member of the + core team. Kristian Hoffman has been moved to the core emeritus + +2010-03-10 00:20 mark + + * httemplate/edit/svc_acct.cgi: fix probably misplaced text field + +2010-03-09 23:50 mark + + * httemplate/edit/svc_domain.cgi: fix probably misplaced text field + +2010-03-09 22:52 ivan + + * 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 + +2010-03-09 22:47 ivan + + * httemplate/edit/process/REAL_cust_pkg.cgi: fix warning about + adding a start date to actually check its *added*, RT#7352 + +2010-03-09 15:47 ivan + + * httemplate/misc/delay_susp_pkg.html: tyop too + +2010-03-09 14:37 mark + + * httemplate/misc/cancel_pkg.html: fix typo + +2010-03-09 13:57 mark + + * FS/FS/prepay_credit.pm, httemplate/edit/prepay_credit.cgi, + httemplate/edit/process/prepay_credit.cgi: RT#7407, variable + length prepaid card codes + +2010-03-09 00:37 ivan + + * FS/FS/part_pkg/sql_external.pm: move sql_external to use + recur_Common, RT#7212 + +2010-03-09 00:05 ivan + + * httemplate/edit/REAL_cust_pkg.cgi: date editing fix, fallout from + date_format + +2010-03-08 18:43 ivan + + * FS/FS/: cust_pkg.pm, part_pkg/flat.pm: a package that starts on + the 1st and expires after N months, RT#7738 + +2010-03-08 18:39 ivan + + * FS/FS/cust_main.pm: fix ACH refunds w/IPPay. B:OP 3.01 and IPPay + 0.05_02 required. RT#_7673 + +2010-03-08 18:12 ivan + + * FS/FS/cust_pkg.pm: init ticket system new-style + +2010-03-08 16:23 jeff + + * FS/FS/Setup.pm: tyop broke populate_initial_data + +2010-03-08 16:18 jeff + + * FS/FS/reason_type.pm: and this is not 1.7.x + +2010-03-08 15:07 jeff + + * FS/FS/part_export/prizm.pm: try a delete before adding an element + to prizm + +2010-03-08 14:13 ivan + + * FS/FS/cust_main.pm: fix ACH refunds w/IPPay. B:OP 3.01 and IPPay + 0.05_02 required. RT#_7673 + +2010-03-08 02:57 ivan + + * 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 + +2010-03-07 23:02 ivan + + * 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 + +2010-03-07 10:07 jeff + + * FS/FS/tax_rate.pm: pass format and correct filenames + +2010-03-05 11:09 ivan + + * 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 + +2010-03-05 11:02 ivan + + * 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 + +2010-03-05 10:25 ivan + + * httemplate/docs/ssh.html: moved to wiki + +2010-03-05 10:24 ivan + + * 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 + +2010-03-05 10:10 ivan + + * 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 + +2010-03-03 21:31 jeff + + * FS/FS/cust_bill.pm: always show the previous section when + previous_balance-summary_only is enabled + +2010-03-02 17:39 jeff + + * FS/FS/tax_rate.pm, httemplate/misc/tax-import.cgi: tweak, + rearrange, and avoid the vacuum + +2010-03-02 17:00 jeff + + * httemplate/edit/cust_main/bottomfixup.js: clear geocode when we + DO have plus four + +2010-03-02 09:18 ivan + + * 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 + +2010-03-01 14:18 ivan + + * httemplate/edit/elements/svc_Common.html: fixup editing w/manual + inventory, RT#7010 + +2010-03-01 14:00 ivan + + * httemplate/elements/select-table.html: fix up editing services + w/manual select from inventory, RT#7010 + +2010-03-01 13:56 ivan + + * FS/FS/svc_Common.pm: fix up editing services w/manual select from + inventory, RT#7010 + +2010-03-01 13:36 ivan + + * httemplate/edit/elements/edit.html: fix up editing services + w/manual select from inventory, RT#7010 + +2010-03-01 13:05 ivan + + * httemplate/search/inventory_item.html: fix inventory item links + to non-svc_acct services, RT#7010 + +2010-03-01 11:38 ivan + + * FS/FS/svc_Common.pm: enable manual selection from inventory + dropdowns for svc_broadband, svc_external & svc_phone, RT#7010 + +2010-03-01 11:29 ivan + + * 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 + +2010-03-01 11:10 jeff + + * Makefile: get along better with RTless installs + +2010-02-26 19:15 ivan + + * httemplate/edit/cust_refund.cgi: expiration date not meaningful + for non-CARD, RT#7419 + +2010-02-26 18:59 ivan + + * FS/FS/cust_bill_ApplicationCommon.pm: fix rare "Illegal division + by zero" error applying things when using weights, RT#7491 + +2010-02-24 15:32 mark + + * 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 + +2010-02-22 02:35 ivan + + * FS/FS/part_export/communigate_pro.pm: communigate: domain account + defaults, RT#7083 + +2010-02-22 01:18 ivan + + * httemplate/edit/svc_domain.cgi: communigate: domain account + defaults, RT#7083 + +2010-02-22 01:14 ivan + + * 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 + +2010-02-21 23:13 ivan + + * 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 + +2010-02-21 19:22 ivan + + * 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 + +2010-02-21 14:54 ivan + + * 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 + +2010-02-21 01:19 ivan + + * 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 + +2010-02-20 23:32 ivan + + * httemplate/view/svc_acct/basics.html: communigate, RT#7083 + +2010-02-20 23:28 ivan + + * 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 + +2010-02-20 19:16 ivan + + * 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 + +2010-02-20 14:34 ivan + + * FS/FS/Conf.pm: communigate pro provisioning, RT#7083 + +2010-02-20 14:31 ivan + + * 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 + +2010-02-17 19:48 mark + + * FS/bin/freeside-void-payments: Documentation cleanup + +2010-02-17 01:00 ivan + + * httemplate/edit/svc_Common.html: fix svc_pbx provisioniing + +2010-02-17 00:30 ivan + + * 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 + +2010-02-16 10:36 ivan + + * 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 + +2010-02-15 18:19 jeff + + * 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 + +2010-02-15 08:34 jeff + + * htetc/handler.pl: lexical instead of dynamic warnings + +2010-02-15 06:39 jeff + + * htetc/handler.pl: get rid of some very annoying and pointless + noise + +2010-02-14 18:09 ivan + + * 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 + +2010-02-12 18:53 ivan + + * 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 + +2010-02-12 18:16 ivan + + * httemplate/search/: inventory_item.html: fix inventory item + search w/customer classes + +2010-02-12 15:44 ivan + + * 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 + +2010-02-12 14:42 ivan + + * httemplate/search/: svc_acct.cgi, elements/search-html.html: + totals time used on svc_acct report + +2010-02-12 13:49 ivan + + * fs_selfservice/java/freeside_create_ticket_example.java: tyop, + RT#7007 + +2010-02-12 11:28 ivan + + * 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 + +2010-02-12 11:14 ivan + + * 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 + +2010-02-11 19:26 ivan + + * FS/FS/part_export/thirdlane.pm: add omit_countrycode option, + RT#7379 + +2010-02-11 17:35 ivan + + * 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 + +2010-02-11 15:14 jeff + + * FS/FS/part_export/grandstream.pm: fix quoting + +2010-02-09 18:12 mark + + * FS/FS/: pay_batch.pm, pay_batch/RBC.pm: RT#7274: accept CR/LF in + RBC batch import + +2010-02-09 13:49 ivan + + * 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 + +2010-02-09 11:56 ivan + + * httemplate/edit/process/discount.html: doh, fix for discounts + winding up with both amount and percent, RT#6679 + +2010-02-08 19:37 ivan + + * rt/lib/RT/Config.pm: fix RT wackiness when loaded concurrently + with Fcntl + +2010-02-08 11:01 ivan + + * FS/: FS.pm, FS/h_svc_pbx.pm, t/h_svc_pbx.t, MANIFEST: + h_svc_pbx.pm, RT#7322 + +2010-02-08 07:37 jeff + + * 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 + +2010-02-05 18:57 ivan + + * FS/FS/: cust_pkg_discount.pm, part_pkg/flat.pm: discount + reporting, RT#6679 + +2010-02-05 18:54 ivan + + * 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 + +2010-02-04 19:02 ivan + + * httemplate/edit/process/cust_pkg_discount.html: discounts, + RT#6679 + +2010-02-04 18:39 ivan + + * 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 + +2010-02-04 12:39 ivan + + * 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 + +2010-02-04 02:00 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 + +2010-02-03 22:53 ivan + + * httemplate/: elements/phonenumber.html, pref/pref-process.html, + pref/pref.html: snom autodial integration + +2010-02-03 20:48 ivan + + * FS/FS/part_event/Condition/every.pm: fix SQL error with date + field when using this condition, RT#7218 + +2010-02-03 11:27 ivan + + * FS/FS/cust_main.pm: better error msg for profiling + +2010-02-02 18:16 ivan + + * FS/FS/svc_acct.pm: fix time limits getting double added if the + service is provisioned before first billing + +2010-01-30 23:04 ivan + + * FS/FS/discount.pm: discounts, RT#6679 + +2010-01-30 19:00 ivan + + * httemplate/browse/part_pkg_taxclass.html: fix header on report + +2010-01-30 18:57 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 + +2010-01-30 15:00 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 + +2010-01-30 12:05 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 + +2010-01-30 00:55 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 + +2010-01-29 23:55 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 + +2010-01-29 23:38 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 + +2010-01-29 12:21 ivan + + * FS/FS/Conf.pm: add Cleartext-Password to radius-password export + options, RT#7150 + +2010-01-29 11:52 ivan + + * FS/FS/part_export/thirdlane.pm: ssl option + +2010-01-26 21:27 ivan + + * FS/FS/part_export/thirdlane.pm: URI escape pw, RT#7051 + +2010-01-26 21:21 ivan + + * FS/FS/part_export/thirdlane.pm: add port option, RT#7051 + +2010-01-26 02:40 ivan + + * FS/FS/svc_pbx.pm: deleting an svc_pbx unlinks svc_phones and + deletes svc_accts, RT#7051 + +2010-01-26 02:34 ivan + + * FS/FS/part_export/thirdlane.pm: admin operations from svc_acct + records + +2010-01-26 02:05 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 + +2010-01-26 00:35 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 + +2010-01-26 00:18 ivan + + * FS/FS/svc_pbx.pm: label isn't thirdlane-specific, RT#7051 + +2010-01-25 23:15 ivan + + * FS/FS/part_export/thirdlane.pm: figured out success/failure + reporting, and wrote DID creation/deletion/assign/unassign, + RT#7051 + +2010-01-25 22:15 ivan + + * FS/FS/part_export/thirdlane.pm: initial thirdlane export w/tenant + insert/delete/replace, RT#7051 + +2010-01-25 22:14 ivan + + * FS/FS/svc_pbx.pm: fix label method and doc work + +2010-01-25 22:14 ivan + + * FS/FS/svc_Common.pm: remove debugging + +2010-01-25 20:47 jayce + + * 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. + + 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 + +2010-01-25 14:14 ivan + + * 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 + +2010-01-25 09:41 ivan + + * httemplate/edit/part_svc.cgi, FS/MANIFEST, FS/FS/Mason.pm, + FS/FS/Schema.pm: initial svc_pbx implementation, RT#7051 + +2010-01-25 09:35 ivan + + * FS/: FS/svc_pbx.pm, t/svc_pbx.t: initial svc_pbx implementation, + RT#7051 + +2010-01-24 16:31 ivan + + * FS/FS/svc_acct.pm: fix password length checks from applyhing to + already-crypted legacy passwords, RT#7139 + +2010-01-24 14:38 ivan + + * httemplate/elements/: overlibmws.js, overlibmws_crossframe.js, + overlibmws_draggable.js, overlibmws_iframe.js: update overlib to + upstream v281 (jan 20, 2010) + +2010-01-24 12:37 ivan + + * FS/FS/UI/Web.pm: right-align customer # in reports + +2010-01-24 11:53 ivan + + * httemplate/search/cust_bill.html: fix alignment of customer data + +2010-01-24 11:52 ivan + + * httemplate/search/cust_bill_pay.html: separate out the invoice + and payment info into multiple columns, and fix application date + showing as payment date + +2010-01-21 00:54 ivan + + * FS/FS/Conf.pm: correct description for selfservice-body_footer + +2010-01-21 00:38 ivan + + * fs_selfservice/FS-SelfService/cgi/selfservice.cgi: more + self-service skinning config options, and start taking a stab at + reorganizing config sections, RT#6893 + +2010-01-21 00:34 ivan + + * 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, + 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 + +2010-01-20 17:25 ivan + + * FS/: FS/ClientAPI.pm, FS/Mason.pm, + bin/freeside-selfservice-server: fix self-service fallout from RT + 3.8, RT#6640 + +2010-01-19 15:11 jeff + + * FS/FS/part_export/prizm.pm: SM in new window + +2010-01-19 09:48 jeff + + * FS/FS/cust_main.pm: eliminate harmless uninitialized value noise + +2010-01-18 20:54 ivan + + * FS/FS/pay_batch/paymentech.pm: patch from Peter Loeppky to make + sure some xml fields don't get larger than what paymentech wants + +2010-01-18 19:24 mark + + * httemplate/search/elements/search-csv.html: Fix mime type for CSV + files, RT#1526 + +2010-01-18 18:09 jeff + + * FS/FS/part_export/domreg_opensrs.pm: don't really need debugging + on + +2010-01-18 18:03 jeff + + * FS/FS/: cust_bill_ApplicationCommon.pm, + part_export/domreg_opensrs.pm: debugged and tested opensrs export + +2010-01-18 16:13 ivan + + * httemplate/search/cust_bill_pkg.cgi: fix color/style after + removal of billpkgnum display + +2010-01-16 22:40 ivan + + * FS/FS/ClientAPI/MasonComponent.pm: fix for + selfservice_server-base_url without a trailing / + +2010-01-16 19:31 ivan + + * 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 + +2010-01-16 18:34 ivan + + * FS/FS/svc_phone.pm: strip non-digits and 1- when searching for + phone numbers, RT#7000 + +2010-01-16 18:22 ivan + + * 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 + +2010-01-16 17:20 ivan + + * ChangeLog: preparing for 2.1.0 + +2010-01-16 16:22 jeff + + * FS/FS/cust_pkg.pm: work around bug in pre-perl5.10 which is at + best noisy and at worst missorting + +2010-01-16 15:39 ivan + + * FS/FS/part_pkg/: cdr_termination.pm: add usage_mandate option to + termination price plan, RT#6932 + +2010-01-16 15:06 ivan + + * httemplate/search/cust_svc.html: fix searching for unlinked + services? RT#7059 + 2010-01-14 19:59 ivan * httemplate/edit/process/part_pkg.cgi: remove extraneous debugging @@ -7,15 +1500,41 @@ * FS/FS/tax_rate.pm: if ignore_icalculable_taxes is on, don't call the errors fatal -2010-01-12 09:17 jeff +2010-01-12 09:08 jeff * FS/FS/part_export/prizm.pm: add some debugging -2010-01-12 09:16 jeff +2010-01-12 08:40 jeff * FS/FS/part_export/prizm.pm: eliminate harmless argument isn't numeric messages +2010-01-09 15:41 ivan + + * rt/etc/RT_SiteConfig.pm: QuickCreateLong obsolete with the better + quick create in 3.8 + +2010-01-09 15:36 ivan + + * 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 + +2010-01-09 15:03 ivan + + * rt/html/NoAuth/images/small-logo.png: removing HTML files in old + location wrt RT 3.8 + +2010-01-09 14:53 ivan + + * rt/html/NoAuth/css/3.5-default/freeside.css: removing HTML files + in old location wrt RT 3.8 + +2010-01-09 14:48 ivan + + * Makefile, rt/FREESIDE_MODIFIED, rt/sbin/rt-setup-database.in: + fixup initial RT setup for 3.8 + 2010-01-09 02:03 ivan * FS/FS/Record.pm: need DBIx::DBSchema w/quoted_default to make @@ -25,6 +1544,16 @@ * FS/bin/freeside-upgrade: undo damage from DBIx::DBSchema 0.37_03 +2010-01-08 08:05 jeff + + * 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) + 2010-01-07 01:48 mark * FS/FS/: pay_batch.pm, pay_batch/RBC.pm: Fix problems with RBC @@ -44,18 +1573,463 @@ * FS/FS/cust_main.pm: doc +2010-01-03 20:13 jeff + + * 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) + 2010-01-03 19:23 jeff * bin/monitor: add some debugging -2010-01-02 18:54 ivan +2010-01-03 00:04 ivan + + * 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 + +2010-01-02 23:40 ivan + + * 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 + +2010-01-02 22:42 ivan + + * rt/html/Ticket/Elements/: AddCustomers, EditCustomers, + ShowCustomers: moved to new location in RT 3.8 + +2010-01-02 22:24 ivan - * Makefile: fix RT_SiteConfig.pm substitution + * FS/FS/TicketSystem/RT_Internal.pm: attempt to get more + information on errors using an RT-instansiated session?? + +2010-01-02 19:07 ivan + + * 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-12-31 15:03 mark * FS/FS/pay_batch/RBC.pm: Add pre-header line +2009-12-31 06:31 ivan + + * rt/: Makefile, Makefile.in: prevent fatality + +2009-12-31 06:11 ivan + + * rt/Makefile: otherwise it aborts bitchinga bout missing + schema.Oracle + +2009-12-31 06:08 ivan + + * rt/: Makefile, config.status: install-sh???? + +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 @@ -105,6 +2079,13 @@ * 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 @@ -144,15 +2125,43 @@ * 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:33 mark +2009-12-28 16:38 ivan + + * FS/: FS/Conf.pm, bin/freeside-queued: add queued-sleep_time - * FS/FS/Conf.pm: RT#6358 +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 @@ -160,7 +2169,7 @@ 2009-12-26 17:00 jeff - * FS/FS/: cust_main.pm, cust_location.pm: improve spacing around + * FS/FS/: cust_location.pm, cust_main.pm: improve spacing around county 2009-12-23 15:32 jeff @@ -169,12 +2178,7 @@ 2009-12-23 15:29 jeff - * bin/: monitor: add non-forking one machine monitor program - -2009-12-23 15:29 jeff - - * bin/monitor: file monitor was added on branch FREESIDE_1_9_BRANCH - on 2009-12-23 23:29:54 +0000 + * bin/monitor: add non-forking one machine monitor program 2009-12-23 15:14 jeff @@ -190,29 +2194,21 @@ 2009-12-22 16:30 mark * 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 - -2009-12-21 06:36 jeff - - * 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 + httemplate/edit/process/svc_acct.cgi: Tweak set_password per + RT#6358 -2009-12-21 06:36 jeff +2009-12-21 06:44 jeff - * bin/reassemble_taxes: file reassemble_taxes was added on branch - FREESIDE_1_9_BRANCH on 2009-12-21 14:37:22 +0000 + * 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 - * 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 - -2009-12-20 18:56 mark - - * httemplate/search/elements/search-xls.html: Fix filename for - Excel spreadsheet reports + * 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 @@ -252,6 +2248,23 @@ * 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 @@ -262,12 +2275,6 @@ * httemplate/view/cust_main/payment_history.html: make room for credit reasons in popup -2009-12-19 12:58 mark - - * FS/: bin/freeside-paymentech-upload, FS/pay_batch/paymentech.pm, - bin/freeside-paymentech-download: Fix date format string and - quoting of password - 2009-12-19 12:29 ivan * FS/FS/cust_main_Mixin.pm: fix event report w/ a customer status @@ -282,12 +2289,33 @@ * 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:07 jeff +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, @@ -305,6 +2333,11 @@ 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, @@ -313,9 +2346,17 @@ httemplate/view/cust_main/attachments.html: Add access right to view attachments -2009-12-12 18:10 ivan +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 - * ChangeLog: 1.9.2ish + * 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 @@ -325,11 +2366,18 @@ * 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:29 mark +2009-12-07 22:21 mark * FS/FS/Schema.pm: Fix cust_attachment.disabled type @@ -349,7 +2397,7 @@ * FS/FS/Schema.pm: more reasonable sizes for filename, mime type and title, RT#6823 -2009-12-05 15:36 jeff +2009-12-04 10:37 jeff * FS/FS/cust_bill.pm: holy cow! correct sense of skip usage testing @@ -362,19 +2410,25 @@ 2009-12-03 20:40 ivan * 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/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 @@ -492,32 +2546,24 @@ 2009-11-23 23:23 ivan - * httemplate/search/: report_timeworked.html: add date constratint - on time worked search - -2009-11-23 23:23 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/: 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 17:11 mark +2009-11-23 14:09 mark - * 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/Schema.pm: Add title field to cust_attachment + +2009-11-22 16:25 jeff -2009-11-20 09:39 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, @@ -550,16 +2596,6 @@ 2009-11-19 01:32 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 - -2009-11-19 01:32 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 - -2009-11-19 01:32 ivan - * FS/: FS/cdr_batch.pm, t/cdr_batch.t: proper cdr_batch table, RT#6386 @@ -575,17 +2611,12 @@ 2009-11-18 01:39 mark - * FS/FS/Conf.pm, FS/FS/pay_batch/RBC.pm, - httemplate/search/cust_pay_batch.cgi: RT#4786, RBC batch format - -2009-11-18 01:27 mark - - * FS/FS/pay_batch/RBC.pm: RT#4768, RBC batch format + * httemplate/search/cust_pay_batch.cgi: RT#4786, RBC batch format 2009-11-18 01:27 mark - * 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 + * 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 @@ -593,17 +2624,6 @@ misc/cust_attachment.cgi: cust_attachment improvement, RT#4964 and #6225 -2009-11-18 01:09 mark - - * 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 - -2009-11-18 01:09 mark - - * 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 - 2009-11-17 14:06 ivan * FS/FS/cust_main.pm: do a case-insensive search on @@ -611,6 +2631,11 @@ (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, @@ -622,6 +2647,14 @@ * 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, @@ -641,11 +2674,41 @@ 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/: tax_rate.pm, Schema.pm: correct bugs in tax replacement + * 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 @@ -681,10 +2744,6 @@ freeside-paymentech-upload: back to old host name, info from customer/paymentech was bogus, RT#5650 -2009-11-05 11:40 ivan - - * FS/FS/pkg_category.pm: fix pkg_category upgrade on 1.9 too - 2009-11-04 17:47 ivan * FS/bin/: freeside-paymentech-download, @@ -695,6 +2754,20 @@ * 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, @@ -712,21 +2785,15 @@ * FS/FS/part_pkg.pm: silence "use of uninitialized value in split" warning -2009-11-03 16:53 ivan - - * 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 - 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-download, - freeside-paymentech-upload: check for zip and unzip commands, use - multi-arg version of system to prevent the shell getting its + * 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 @@ -741,18 +2808,6 @@ 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:54 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 - -2009-11-03 10:54 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 - 2009-11-03 10:53 ivan * bin/paymentech-download, bin/paymentech-upload, @@ -762,14 +2817,9 @@ 2009-11-02 19:13 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 - -2009-11-02 19:13 ivan - - * FS/FS/Conf.pm, FS/bin/freeside-daily, - httemplate/config/config-process.cgi, - httemplate/config/config-view.cgi, httemplate/config/config.cgi, + * 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 @@ -792,47 +2842,25 @@ * httemplate/edit/payment_gateway.html: add Elavon, SagePay, WorldPay, fix extra space on PlugnPay, PPIPayMover, Protx -2009-11-01 15:03 jeff +2009-11-01 14:12 jeff * httemplate/search/: 477.html, elements/search-csv.html: form 477 improvements #6499 -2009-10-31 14:22 jeff +2009-10-31 13:09 jeff * FS/FS/cust_bill.pm: unbork summary page invoices 2009-10-30 16:29 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 - -2009-10-30 16:29 ivan - - * 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 - -2009-10-30 16:29 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, + * 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:55 ivan - - * FS/FS/: pay_batch.pm, pay_batch/paymentech.pm: backporting recent - paymentech changes to _1_9_BRANCH - -2009-10-30 11:51 ivan - - * bin/: paymentech-download, paymentech-upload: adding paymentech-* - on _1_9_BRANCH - 2009-10-30 11:37 ivan * FS/FS/: Conf.pm: add paymentech to batch config options @@ -844,14 +2872,14 @@ edit/process/bulk-cust_main_county.html: bulk tax changes, RT#6445 -2009-10-29 16:42 mark +2009-10-29 16:43 mark - * bin/paymentech-upload: add option to upload all open batches + * FS/FS/pay_batch/paymentech.pm: use XML::Writer for tighter + compliance with spec -2009-10-29 16:42 ivan +2009-10-29 16:42 mark - * bin/paymentech-upload: file paymentech-upload was added on branch - FREESIDE_1_9_BRANCH on 2009-10-30 18:51:05 +0000 + * bin/paymentech-upload: add option to upload all open batches 2009-10-29 16:37 ivan @@ -868,9 +2896,48 @@ * 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 15:18 mark +2009-10-29 12:10 ivan - * httemplate/edit/payment_gateway.html: add Jety to the list + * 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 @@ -879,6 +2946,15 @@ (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 @@ -902,6 +2978,10 @@ * 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 @@ -912,9 +2992,22 @@ * httemplate/elements/tr-select-pkg_class.html: better fix for ignoring disabled package classes that doesn't search them twice -2009-10-26 14:55 ivan +2009-10-26 00:12 jeff - * FS/FS/cust_bill_pkg.pm: turn off debugging + * 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 @@ -926,14 +3019,15 @@ * FS/FS/: cust_main.pm, ClientAPI/MyAccount.pm: add apply option to realtime_collect, RT#5071 -2009-10-24 16:37 ivan +2009-10-24 17:29 ivan - * bin/paymentech-download: file paymentech-download was added on - branch FREESIDE_1_9_BRANCH on 2009-10-30 18:51:05 +0000 + * httemplate/search/cust_bill.html: import legacy invoice numbers + to cust_bill.agent_invid, RT#5351 2009-10-24 16:37 mark - * bin/: paymentech-download, paymentech-upload: Scripts for + * 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 @@ -964,6 +3058,11 @@ * 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 @@ -974,6 +3073,35 @@ * 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 @@ -1052,11 +3180,46 @@ inadvertant "unknown package" error, fallout from pkg-balance work, RT#6125 -2009-10-11 23:43 ivan +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 @@ -1181,7 +3344,8 @@ 2009-10-07 16:44 ivan - * FS/FS/cust_bill.pm, httemplate/misc/send-invoice.cgi, + * 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, @@ -1739,6 +3903,7 @@ 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 @@ -1844,7 +4009,7 @@ 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 @@ -2339,6 +4504,11 @@ * 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 @@ -2365,9 +4535,9 @@ 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 @@ -2791,6 +4961,11 @@ * 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 @@ -3481,8 +5656,8 @@ 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 @@ -3890,6 +6065,7 @@ 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, @@ -4538,6 +6714,10 @@ * 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 @@ -4811,8 +6991,9 @@ 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, @@ -5332,13 +7513,15 @@ 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 @@ -5394,8 +7577,8 @@ 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 @@ -5428,9 +7611,11 @@ * 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 @@ -6212,6 +8397,11 @@ * 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 @@ -6239,7 +8429,8 @@ 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 @@ -6681,7 +8872,7 @@ 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: @@ -7014,7 +9205,7 @@ 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 @@ -7126,7 +9317,7 @@ 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" @@ -7370,7 +9561,9 @@ 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 @@ -8291,6 +10484,10 @@ (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 & @@ -8496,12 +10693,15 @@ 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 @@ -8604,6 +10804,14 @@ * 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 @@ -8693,6 +10901,7 @@ 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, @@ -8995,25 +11204,21 @@ 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, + 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, - misc/audio.php, misc/popup.css, misc/recording_popup.php, - modules/VmX.module, includes/asi.php, includes/bootstrap.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, - locale/readme.txt, locale/ari.utf-8.po, locale/locale.txt, + 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, @@ -9023,7 +11228,7 @@ 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] + Initial revision 2008-03-16 09:57 jeff @@ -9201,594 +11406,16 @@ html/Widgets/TitleBoxStart, sbin/rt-setup-database.in: merge in rt 3.6.6. *gulp*! -2008-03-01 20:10 ivan +2008-03-01 20:11 ivan - * 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 - -2008-03-01 20:05 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 - -2008-03-01 20:02 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 + * 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 @@ -10392,7 +12019,9 @@ 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 @@ -10556,6 +12185,10 @@ 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 @@ -10603,8 +12236,8 @@ 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 @@ -10867,6 +12500,7 @@ 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 @@ -10939,7 +12573,7 @@ 2007-11-20 09:18 ivan - * AGPL: it finally happened + * AGPL, GPL: it finally happened 2007-11-18 12:02 ivan @@ -10988,12 +12622,14 @@ 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 @@ -11011,6 +12647,11 @@ 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 @@ -11019,8 +12660,9 @@ 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 @@ -11376,6 +13018,10 @@ * 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 @@ -11683,7 +13329,8 @@ 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 @@ -11809,8 +13456,10 @@ 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, @@ -11858,9 +13507,9 @@ 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 @@ -11960,7 +13609,10 @@ 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 @@ -11991,183 +13643,43 @@ * 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, @@ -12175,7 +13687,6 @@ 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, @@ -12191,18 +13702,25 @@ 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/images/autohandler, html/NoAuth/images/bplogo.gif, + 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, @@ -12216,168 +13734,22 @@ 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/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/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/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 @@ -12385,13 +13757,13 @@ 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, @@ -12814,6 +14186,7 @@ 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! @@ -12823,10 +14196,10 @@ * 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 @@ -12962,7 +14335,7 @@ 2007-07-06 01:08 ivan - * README: v3! + * GPL, README: v3! 2007-07-05 15:05 ivan @@ -12973,6 +14346,11 @@ * 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 @@ -12993,8 +14371,8 @@ 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 @@ -13508,8 +14886,9 @@ * 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 @@ -13791,8 +15170,9 @@ 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 @@ -13886,6 +15266,10 @@ * 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 @@ -13896,8 +15280,9 @@ 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 @@ -13956,8 +15341,9 @@ 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 @@ -14086,6 +15472,10 @@ * 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, @@ -14097,8 +15487,9 @@ * 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, @@ -14492,8 +15883,8 @@ 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 @@ -14785,6 +16176,11 @@ * 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 @@ -14803,6 +16199,14 @@ * 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 @@ -14833,6 +16237,7 @@ * 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" @@ -14844,7 +16249,8 @@ 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 @@ -14981,8 +16387,8 @@ 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 @@ -15009,8 +16415,9 @@ 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 @@ -15064,6 +16471,11 @@ * 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! @@ -15273,6 +16685,10 @@ * 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 @@ -15419,14 +16835,18 @@ 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, @@ -15449,6 +16869,11 @@ 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 @@ -15456,40 +16881,13 @@ 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 @@ -15544,8 +16942,8 @@ 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 @@ -15646,7 +17044,8 @@ 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 @@ -15805,6 +17204,16 @@ * 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: @@ -15834,6 +17243,10 @@ * 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$ @@ -15908,7 +17321,8 @@ 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, @@ -15952,9 +17366,13 @@ 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 @@ -15969,6 +17387,7 @@ 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, @@ -15983,7 +17402,7 @@ 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, @@ -15994,6 +17413,7 @@ 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, @@ -16013,6 +17433,9 @@ 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, @@ -16028,6 +17451,7 @@ 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, @@ -16102,8 +17526,9 @@ 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, @@ -16116,7 +17541,7 @@ 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, @@ -16124,7 +17549,7 @@ 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, @@ -16139,6 +17564,7 @@ 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, @@ -16169,7 +17595,8 @@ 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, @@ -16179,16 +17606,18 @@ 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 @@ -16208,7 +17637,18 @@ 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 @@ -16233,8 +17673,8 @@ 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 @@ -16317,6 +17757,10 @@ * 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, @@ -16326,10 +17770,10 @@ 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 @@ -16400,8 +17844,8 @@ 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) @@ -16413,8 +17857,11 @@ * 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 @@ -16461,11 +17908,12 @@ 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 @@ -16606,10 +18054,11 @@ 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, @@ -16693,6 +18142,10 @@ * 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: @@ -16801,7 +18254,8 @@ 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 @@ -16821,6 +18275,7 @@ 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 @@ -16890,6 +18345,31 @@ * 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 @@ -16897,7 +18377,8 @@ 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 @@ -16905,6 +18386,11 @@ * 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 @@ -16913,10 +18399,18 @@ * 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? @@ -16931,9 +18425,11 @@ 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 @@ -16944,7 +18440,7 @@ 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, @@ -16956,7 +18452,7 @@ 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, @@ -16968,6 +18464,7 @@ 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, @@ -16986,15 +18483,21 @@ 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, @@ -17002,9 +18505,10 @@ 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 @@ -17025,6 +18529,11 @@ * 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, @@ -17034,6 +18543,7 @@ 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 @@ -17041,12 +18551,15 @@ 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, @@ -17067,9 +18580,15 @@ * 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 @@ -17104,7 +18623,8 @@ 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, @@ -17118,7 +18638,8 @@ 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) @@ -17135,14 +18656,19 @@ 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 @@ -17228,6 +18754,8 @@ * 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... @@ -17267,8 +18795,8 @@ 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 @@ -17292,8 +18820,8 @@ 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 @@ -17321,11 +18849,13 @@ 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 @@ -17395,6 +18925,7 @@ * 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. @@ -17403,9 +18934,9 @@ * 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, @@ -17420,8 +18951,10 @@ 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 @@ -17442,7 +18975,8 @@ * 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, @@ -17450,6 +18984,10 @@ 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, @@ -17459,9 +18997,9 @@ 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 @@ -17474,10 +19012,15 @@ * 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 @@ -17527,10 +19070,12 @@ 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, @@ -17541,8 +19086,9 @@ 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, @@ -17582,20 +19128,29 @@ 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, @@ -17628,7 +19183,8 @@ 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 @@ -17662,10 +19218,15 @@ 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, @@ -17686,8 +19247,8 @@ 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 @@ -17779,6 +19340,26 @@ * 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 @@ -17790,6 +19371,10 @@ 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 @@ -17866,6 +19451,11 @@ * 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 @@ -17933,6 +19523,10 @@ * 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 @@ -17950,7 +19544,8 @@ 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 @@ -17969,10 +19564,15 @@ 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 @@ -18015,6 +19615,10 @@ 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 @@ -18046,12 +19650,20 @@ * 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 @@ -18059,6 +19671,10 @@ 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' @@ -18081,7 +19697,7 @@ 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 @@ -18166,216 +19782,78 @@ 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 - * rt/html/Elements/Header: land RT 3.4.4 on HEAD + * 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/Elements/Footer, + * 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, - sbin/rt-setup-database.in: landing rt 3.4.4 on HEAD + 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/: UPGRADING, configure, Makefile.in, README, configure.ac, - Changelog, aclocal.m4, docs/rt3-schema-relationships.dot, - docs/design_docs/realflow.txt, m4/rt_layout.m4, + * rt/: docs/design_docs/realflow.txt, 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, + 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, @@ -18395,96 +19873,28 @@ 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 @@ -18515,7 +19925,9 @@ 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, @@ -18529,14 +19941,19 @@ 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 @@ -18550,8 +19967,9 @@ 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 @@ -18599,6 +20017,10 @@ 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 @@ -18619,12 +20041,16 @@ 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... @@ -18659,8 +20085,9 @@ 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 @@ -18670,6 +20097,9 @@ 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! @@ -18741,8 +20171,8 @@ 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 @@ -18752,11 +20182,17 @@ 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 @@ -18764,11 +20200,12 @@ 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, @@ -18817,12 +20254,13 @@ 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 @@ -18839,14 +20277,20 @@ 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 @@ -18856,8 +20300,8 @@ 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 @@ -18867,6 +20311,11 @@ * 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 @@ -18912,7 +20361,7 @@ 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, @@ -18927,11 +20376,16 @@ 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 @@ -18958,18 +20412,30 @@ 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: @@ -19013,6 +20479,10 @@ * 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 @@ -19026,6 +20496,10 @@ * 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 @@ -19046,8 +20520,8 @@ 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 @@ -19201,10 +20675,10 @@ 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 @@ -19379,10 +20853,18 @@ * 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 @@ -19405,9 +20887,10 @@ 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 @@ -19470,9 +20953,10 @@ 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 @@ -19484,6 +20968,10 @@ * 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 @@ -19560,12 +21048,22 @@ * 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 @@ -19642,6 +21140,11 @@ * 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 @@ -19659,16 +21162,20 @@ 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 @@ -19676,6 +21183,11 @@ 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 @@ -19685,6 +21197,11 @@ * 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 @@ -19701,11 +21218,11 @@ 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 @@ -19740,6 +21257,10 @@ * 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. @@ -19777,6 +21298,12 @@ * 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 @@ -19784,9 +21311,10 @@ 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 @@ -19809,6 +21337,21 @@ 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, @@ -19817,7 +21360,7 @@ 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, @@ -19842,9 +21385,10 @@ 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 @@ -19856,6 +21400,10 @@ * 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 @@ -19869,14 +21417,19 @@ * 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 @@ -19903,7 +21456,8 @@ 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 @@ -19919,8 +21473,10 @@ 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, @@ -19942,11 +21498,11 @@ 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 @@ -19956,6 +21512,10 @@ * 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, @@ -19974,6 +21534,22 @@ * 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. @@ -19984,9 +21560,16 @@ 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 @@ -20000,6 +21583,10 @@ * 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 @@ -20012,19 +21599,27 @@ 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; @@ -20048,7 +21643,7 @@ 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 @@ -20101,9 +21696,9 @@ 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 @@ -20131,6 +21726,11 @@ * 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 @@ -20158,6 +21758,10 @@ 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 @@ -20173,9 +21777,10 @@ 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 @@ -20209,10 +21814,10 @@ 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 @@ -20224,15 +21829,16 @@ 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 @@ -20256,6 +21862,15 @@ * 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 @@ -20265,9 +21880,11 @@ * 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 @@ -20282,8 +21899,9 @@ 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, @@ -20403,6 +22021,18 @@ * 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: @@ -20423,14 +22053,19 @@ 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 @@ -20478,11 +22113,14 @@ 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 @@ -20544,6 +22182,11 @@ * 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 @@ -20553,6 +22196,11 @@ * 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 @@ -20562,6 +22210,10 @@ * 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, @@ -20571,10 +22223,16 @@ 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 @@ -20743,98 +22401,44 @@ * 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, @@ -20846,152 +22450,34 @@ 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 @@ -21012,8 +22498,8 @@ 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 @@ -21051,7 +22537,8 @@ 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 @@ -21109,11 +22596,12 @@ 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 @@ -21130,15 +22618,17 @@ * 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 @@ -21176,63 +22666,12 @@ * rt/sbin/rt-setup-database.in: merge in changes to rt-setup-database -2004-11-11 04:13 ivan +2004-11-11 04:11 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: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 @@ -21278,14 +22717,27 @@ * 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 @@ -21301,9 +22753,9 @@ * 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, @@ -21311,8 +22763,9 @@ 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, @@ -21432,8 +22885,8 @@ 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 @@ -21452,15 +22905,16 @@ 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 @@ -21539,6 +22993,10 @@ 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, @@ -21859,6 +23317,10 @@ * 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, @@ -21874,14 +23336,16 @@ 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 @@ -21938,10 +23402,11 @@ 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 @@ -21986,6 +23451,10 @@ * 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 @@ -22033,6 +23502,10 @@ 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 @@ -22049,8 +23522,10 @@ 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 @@ -22077,7 +23552,8 @@ 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 @@ -22112,6 +23588,11 @@ * 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. @@ -22231,8 +23712,8 @@ 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 @@ -22361,6 +23842,10 @@ * 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 @@ -22457,6 +23942,10 @@ * 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... @@ -22472,16 +23961,22 @@ 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, @@ -22500,6 +23995,10 @@ * 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 @@ -22571,6 +24070,14 @@ * 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 @@ -22585,14 +24092,14 @@ 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 @@ -22648,7 +24155,8 @@ 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 @@ -22662,11 +24170,17 @@ * 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 @@ -22684,11 +24198,29 @@ * 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 @@ -22789,10 +24321,24 @@ * 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 @@ -22842,8 +24388,9 @@ 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 @@ -22909,9 +24456,10 @@ 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 @@ -22940,8 +24488,8 @@ 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 @@ -22949,8 +24497,8 @@ 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 @@ -22988,10 +24536,20 @@ * 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 @@ -23002,6 +24560,19 @@ * 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 @@ -23017,88 +24588,38 @@ 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 @@ -23119,11 +24640,16 @@ * 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 @@ -23169,10 +24695,20 @@ * 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 @@ -23218,6 +24754,10 @@ * 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 @@ -23243,6 +24783,10 @@ * 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, @@ -23251,13 +24795,14 @@ 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 @@ -23275,7 +24820,8 @@ 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 @@ -23307,14 +24853,20 @@ * 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 @@ -23423,6 +24975,10 @@ * 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 @@ -23434,6 +24990,15 @@ * 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 @@ -23535,8 +25100,9 @@ 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 @@ -23545,15 +25111,16 @@ 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 @@ -23574,6 +25141,11 @@ * 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 @@ -23607,6 +25179,11 @@ * 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 @@ -23639,8 +25216,9 @@ 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 @@ -23737,8 +25315,10 @@ 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 @@ -23759,6 +25339,11 @@ 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 @@ -23802,6 +25387,11 @@ * 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 @@ -23809,7 +25399,8 @@ 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 @@ -23880,6 +25471,11 @@ * 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 @@ -23948,6 +25544,11 @@ * 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 @@ -23972,13 +25573,28 @@ * 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 @@ -24000,14 +25616,22 @@ 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. @@ -24047,9 +25671,14 @@ * 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 @@ -24086,6 +25715,11 @@ * 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 @@ -24149,6 +25783,10 @@ * 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 @@ -24162,13 +25800,17 @@ 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 @@ -24201,7 +25843,8 @@ 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 @@ -24213,6 +25856,10 @@ * 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 @@ -24234,13 +25881,19 @@ 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 @@ -24265,6 +25918,15 @@ * 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 @@ -24293,6 +25955,11 @@ * 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 @@ -24516,7 +26183,8 @@ * 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, @@ -24525,7 +26193,8 @@ 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 @@ -24538,17 +26207,20 @@ 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 @@ -24557,7 +26229,7 @@ 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 @@ -24599,10 +26271,12 @@ 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, @@ -24612,6 +26286,14 @@ 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 @@ -24645,52 +26327,60 @@ 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, @@ -24702,7 +26392,9 @@ 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, @@ -24719,6 +26411,8 @@ 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, @@ -24734,6 +26428,7 @@ 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, @@ -24741,14 +26436,16 @@ 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, @@ -24758,11 +26455,23 @@ 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, @@ -24770,7 +26479,8 @@ 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, @@ -24779,79 +26489,78 @@ 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, @@ -24866,13 +26575,15 @@ 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 @@ -24925,10 +26636,18 @@ * 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 @@ -24939,6 +26658,10 @@ * 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 @@ -24950,7 +26673,7 @@ 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 @@ -24973,7 +26696,8 @@ 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 @@ -25018,6 +26742,20 @@ * 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 @@ -25124,6 +26862,11 @@ * 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 @@ -25147,6 +26890,11 @@ * 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 @@ -25172,6 +26920,18 @@ * 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 @@ -25189,11 +26949,6 @@ * 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" @@ -25208,6 +26963,7 @@ * 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! @@ -25224,6 +26980,7 @@ * 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) @@ -25317,12 +27074,13 @@ 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 @@ -25353,6 +27111,19 @@ * 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: @@ -25424,7 +27195,8 @@ 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 @@ -25453,13 +27225,15 @@ 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 @@ -25475,7 +27249,8 @@ 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 @@ -25489,8 +27264,9 @@ 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: @@ -25538,9 +27314,9 @@ 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 @@ -25552,9 +27328,9 @@ * 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 @@ -25614,6 +27390,10 @@ 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 @@ -25650,13 +27430,32 @@ 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, @@ -25664,14 +27463,19 @@ 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 @@ -25699,8 +27503,9 @@ 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 @@ -25738,9 +27543,9 @@ 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 @@ -25764,6 +27569,12 @@ * 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 @@ -25853,6 +27664,11 @@ * 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, @@ -25864,8 +27680,8 @@ 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 @@ -25885,6 +27701,10 @@ * 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 @@ -25904,7 +27724,8 @@ 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 @@ -25968,8 +27789,9 @@ 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 @@ -26036,6 +27858,10 @@ * 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, @@ -26072,10 +27898,18 @@ * 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 @@ -26083,7 +27917,8 @@ 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 @@ -26144,8 +27979,8 @@ 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 @@ -26199,6 +28034,11 @@ 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/ @@ -26224,7 +28064,15 @@ 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 @@ -26242,8 +28090,9 @@ 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 @@ -26321,7 +28170,8 @@ 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 - @@ -26355,6 +28205,11 @@ * 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 @@ -26377,7 +28232,7 @@ 2002-09-25 02:11 ivan - * Makefile: doc + * Makefile, httemplate/docs/install.html: doc 2002-09-25 02:09 ivan @@ -26390,8 +28245,9 @@ 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 @@ -26399,12 +28255,14 @@ 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 @@ -26424,10 +28282,11 @@ 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 @@ -26439,17 +28298,29 @@ 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 @@ -26459,6 +28330,10 @@ * 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, @@ -26473,7 +28348,8 @@ 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 @@ -26485,10 +28361,15 @@ * 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 @@ -26501,6 +28382,10 @@ 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 @@ -26514,18 +28399,34 @@ * 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 @@ -26571,7 +28472,7 @@ 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 @@ -26592,6 +28493,10 @@ * 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 @@ -26783,14 +28688,52 @@ 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 @@ -26815,6 +28758,14 @@ * 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 @@ -26824,9 +28775,16 @@ * 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 @@ -26843,8 +28801,8 @@ 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, @@ -26864,7 +28822,7 @@ 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 @@ -26872,9 +28830,15 @@ * 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 @@ -26897,20 +28861,110 @@ * 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 @@ -26923,12 +28977,16 @@ 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, @@ -26947,8 +29005,9 @@ 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 @@ -27029,6 +29088,10 @@ * 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!! @@ -27066,6 +29129,10 @@ * 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 @@ -27103,7 +29170,7 @@ 2002-06-30 04:01 ivan - * CREDITS: administrivia + * ANNOUCE.1.4.0, CREDITS: administrivia 2002-06-30 00:17 ivan @@ -27130,7 +29197,12 @@ 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 @@ -27186,8 +29258,8 @@ 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 @@ -27265,6 +29337,10 @@ * 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 @@ -27278,15 +29354,23 @@ * 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, @@ -27334,7 +29418,7 @@ 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 @@ -27356,7 +29440,11 @@ 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 @@ -27396,9 +29484,22 @@ * 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 @@ -27406,7 +29507,7 @@ 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 @@ -27476,14 +29577,14 @@ 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. @@ -27497,6 +29598,11 @@ * 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 @@ -27512,6 +29618,10 @@ * 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 @@ -27579,12 +29689,15 @@ 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 @@ -27599,8 +29712,8 @@ 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 @@ -27633,11 +29746,19 @@ * 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 @@ -27648,6 +29769,11 @@ 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 @@ -27668,6 +29794,10 @@ * 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 @@ -27676,12 +29806,13 @@ 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 @@ -27708,6 +29839,10 @@ * Makefile: INSTALLGROUP +2002-05-09 09:41 ivan + + * bin/populate-msgcat: permissions + 2002-05-09 08:26 ivan * Makefile: final make release? @@ -27725,6 +29860,12 @@ * 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 @@ -27733,13 +29874,15 @@ 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 @@ -27748,10 +29891,12 @@ 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 @@ -27762,6 +29907,10 @@ * 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 @@ -27769,15 +29918,16 @@ 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 @@ -27804,8 +29954,8 @@ 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 @@ -27843,13 +29993,14 @@ 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 @@ -27864,6 +30015,14 @@ * 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 @@ -27903,6 +30062,35 @@ * 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 @@ -27919,9 +30107,9 @@ 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 @@ -27945,14 +30133,18 @@ * 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 @@ -27975,16 +30167,22 @@ 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 @@ -28015,8 +30213,9 @@ * 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, @@ -28027,11 +30226,12 @@ 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 @@ -28055,10 +30255,11 @@ 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: @@ -28072,6 +30273,11 @@ 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 @@ -28079,8 +30285,9 @@ 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 @@ -28107,9 +30314,9 @@ 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 @@ -28118,13 +30325,16 @@ 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 @@ -28140,23 +30350,32 @@ 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 @@ -28166,11 +30385,17 @@ 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: for @@ -28184,6 +30409,10 @@ * 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/ @@ -28191,9 +30420,9 @@ 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 @@ -28205,6 +30434,10 @@ 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, @@ -28251,11 +30484,12 @@ 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 @@ -28273,9 +30507,12 @@ 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) @@ -28311,6 +30548,11 @@ * 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: @@ -28319,6 +30561,10 @@ 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 @@ -28341,11 +30587,11 @@ 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 @@ -28359,15 +30605,24 @@ 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 @@ -28381,14 +30636,36 @@ * 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 @@ -28396,8 +30673,14 @@ 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 @@ -28450,7 +30733,8 @@ 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 @@ -28463,10 +30747,16 @@ * 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 @@ -28511,8 +30801,9 @@ 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 @@ -28545,17 +30836,27 @@ 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 @@ -28587,6 +30888,10 @@ * 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 ) @@ -28609,7 +30914,8 @@ 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 @@ -28617,6 +30923,15 @@ 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 @@ -28636,13 +30951,16 @@ 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 @@ -28652,13 +30970,17 @@ 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! @@ -28700,8 +31022,8 @@ 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/ @@ -28713,6 +31035,11 @@ * 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 @@ -28720,8 +31047,8 @@ 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 @@ -28729,13 +31056,31 @@ 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 @@ -28745,6 +31090,10 @@ * 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 @@ -28766,18 +31115,33 @@ 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 @@ -28846,7 +31210,8 @@ 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 @@ -28854,9 +31219,10 @@ 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 @@ -28891,8 +31257,11 @@ * 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, @@ -28903,20 +31272,26 @@ 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. @@ -28932,8 +31307,11 @@ * 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, @@ -28941,11 +31319,14 @@ 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, @@ -28955,26 +31336,33 @@ 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 @@ -29008,11 +31396,18 @@ 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, @@ -29031,8 +31426,9 @@ 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 @@ -29056,13 +31452,18 @@ 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 @@ -29072,24 +31473,54 @@ * FS/FS/Record.pm: better error messages if you haven't run fs-setup ? +2002-02-05 10:24 ivan + + * httemplate/docs/install.html: 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! @@ -29101,22 +31532,27 @@ 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, @@ -29126,26 +31562,33 @@ 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 @@ -29153,15 +31596,17 @@ 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 @@ -29173,6 +31618,10 @@ 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 @@ -29180,14 +31629,17 @@ 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 @@ -29247,7 +31699,8 @@ 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 @@ -29263,8 +31716,17 @@ 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 @@ -29275,20 +31737,27 @@ 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 @@ -29301,17 +31770,18 @@ 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 @@ -29323,22 +31793,28 @@ 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 @@ -29351,7 +31827,8 @@ 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 @@ -29360,8 +31837,9 @@ 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 @@ -29375,6 +31853,10 @@ * 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, @@ -29521,10 +32003,20 @@ * 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 @@ -29610,14 +32102,23 @@ * 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 @@ -29643,6 +32144,11 @@ * 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 @@ -29659,6 +32165,10 @@ * 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 @@ -29668,6 +32178,10 @@ * 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 @@ -29676,6 +32190,11 @@ * 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 @@ -29690,6 +32209,10 @@ 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 @@ -29709,9 +32232,15 @@ * 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 @@ -29734,22 +32263,31 @@ 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 @@ -29766,9 +32304,11 @@ 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 @@ -29776,22 +32316,29 @@ 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 @@ -29803,25 +32350,31 @@ 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 @@ -29849,9 +32402,11 @@ * 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 @@ -29861,6 +32416,11 @@ 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 @@ -29868,6 +32428,15 @@ 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 @@ -29887,18 +32456,26 @@ 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 @@ -29925,15 +32502,22 @@ 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 @@ -29962,15 +32546,22 @@ 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 @@ -29981,10 +32572,15 @@ * 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 @@ -30005,7 +32601,12 @@ 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 @@ -30026,12 +32627,17 @@ * 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 @@ -30040,12 +32646,13 @@ 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 @@ -30075,7 +32682,8 @@ 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 @@ -30108,9 +32716,10 @@ 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 @@ -30127,6 +32736,10 @@ * 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 @@ -30134,19 +32747,25 @@ 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 @@ -30200,17 +32819,24 @@ 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 @@ -30218,22 +32844,28 @@ 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 @@ -30249,22 +32881,28 @@ 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 @@ -30280,17 +32918,49 @@ * 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, @@ -30325,19 +32995,28 @@ 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 @@ -30345,8 +33024,9 @@ 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 @@ -30355,13 +33035,19 @@ 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 @@ -30374,7 +33060,8 @@ 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 @@ -30384,10 +33071,14 @@ * 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 @@ -30423,14 +33114,21 @@ * 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! @@ -30453,10 +33151,12 @@ 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 @@ -30467,13 +33167,13 @@ 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 @@ -30482,23 +33182,28 @@ 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 @@ -30540,16 +33245,17 @@ 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 @@ -30564,11 +33270,23 @@ 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 @@ -30599,6 +33317,7 @@ 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" @@ -30607,7 +33326,7 @@ 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 @@ -30615,7 +33334,8 @@ 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 @@ -30648,16 +33368,27 @@ * 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 @@ -30681,6 +33412,10 @@ * 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 @@ -30749,6 +33484,11 @@ 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: @@ -30756,57 +33496,82 @@ 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 @@ -30816,14 +33581,18 @@ * 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 @@ -30838,10 +33607,24 @@ * 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 @@ -30852,6 +33635,14 @@ * 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 @@ -30896,6 +33687,10 @@ * 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 @@ -30965,16 +33760,19 @@ 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 @@ -30984,6 +33782,10 @@ * 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: @@ -30991,21 +33793,30 @@ 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 @@ -31027,6 +33838,19 @@ * 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 @@ -31060,13 +33884,13 @@ 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 @@ -31078,7 +33902,15 @@ 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 @@ -31088,15 +33920,19 @@ * 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 @@ -31109,7 +33945,15 @@ 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 @@ -31117,8 +33961,12 @@ 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 @@ -31127,7 +33975,12 @@ 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 @@ -31139,13 +33992,17 @@ 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 @@ -31164,11 +34021,20 @@ * 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 @@ -31176,19 +34042,56 @@ 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 @@ -31199,6 +34102,15 @@ * 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() @@ -31208,6 +34120,11 @@ * 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" @@ -31218,6 +34135,18 @@ * 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 @@ -31233,14 +34162,18 @@ 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 @@ -31252,7 +34185,12 @@ 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 @@ -31263,6 +34201,15 @@ * 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 @@ -31277,10 +34224,61 @@ * 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 - @@ -31291,6 +34289,10 @@ * 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 @@ -31299,8 +34301,9 @@ 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 @@ -31309,28 +34312,53 @@ 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 @@ -31352,14 +34380,28 @@ * 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 @@ -31379,16 +34421,20 @@ 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 @@ -31401,11 +34447,31 @@ 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 @@ -31421,13 +34487,47 @@ * 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 @@ -31437,33 +34537,88 @@ * 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 @@ -31473,21 +34628,77 @@ * 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 @@ -31498,14 +34709,77 @@ * 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 @@ -31513,11 +34787,16 @@ 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:12 ivan +1998-10-12 00:08 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 @@ -31527,14 +34806,26 @@ * 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 @@ -31543,15 +34834,32 @@ * 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 @@ -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 diff --git a/FS/FS/AccessRight.pm b/FS/FS/AccessRight.pm index 46e740cc1..03b98763a 100644 --- a/FS/FS/AccessRight.pm +++ b/FS/FS/AccessRight.pm @@ -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 diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index dbc355205..50dc89c73 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -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 { diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index f2960cd77..45d11c45c 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -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 based on 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" }, diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm index e732eb77d..cc2bdcc7c 100644 --- a/FS/FS/Mason.pm +++ b/FS/FS/Mason.pm @@ -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 ) { diff --git a/FS/FS/Misc.pm b/FS/FS/Misc.pm index 5231350fa..71670f758 100644 --- a/FS/FS/Misc.pm +++ b/FS/FS/Misc.pm @@ -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 ... diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm index 201e7b23c..3b1967e42 100644 --- a/FS/FS/Record.pm +++ b/FS/FS/Record.pm @@ -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 diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index e5bb4fe15..660a072b8 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -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' => { diff --git a/FS/FS/TicketSystem/RT_External.pm b/FS/FS/TicketSystem/RT_External.pm index 8ccc93712..46af1f5a1 100644 --- a/FS/FS/TicketSystem/RT_External.pm +++ b/FS/FS/TicketSystem/RT_External.pm @@ -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; diff --git a/FS/FS/TicketSystem/RT_Internal.pm b/FS/FS/TicketSystem/RT_Internal.pm index 033c746ba..52e3922c9 100644 --- a/FS/FS/TicketSystem/RT_Internal.pm +++ b/FS/FS/TicketSystem/RT_Internal.pm @@ -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; diff --git a/FS/FS/UI/Web.pm b/FS/FS/UI/Web.pm index 148085c4c..5e987429c 100644 --- a/FS/FS/UI/Web.pm +++ b/FS/FS/UI/Web.pm @@ -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; diff --git a/FS/FS/UID.pm b/FS/FS/UID.pm index e3a4604b4..e042c05b1 100644 --- a/FS/FS/UID.pm +++ b/FS/FS/UID.pm @@ -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 ) { diff --git a/FS/FS/Upgrade.pm b/FS/FS/Upgrade.pm index c39680ef7..ff577f2f2 100644 --- a/FS/FS/Upgrade.pm +++ b/FS/FS/Upgrade.pm @@ -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' => [], diff --git a/FS/FS/access_user.pm b/FS/FS/access_user.pm index 8cc8b64fc..1bf6e9387 100644 --- a/FS/FS/access_user.pm +++ b/FS/FS/access_user.pm @@ -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 diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm index 0f08aaa51..28a7257cd 100644 --- a/FS/FS/cust_bill.pm +++ b/FS/FS/cust_bill.pm @@ -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 ) }; } diff --git a/FS/FS/cust_bill_ApplicationCommon.pm b/FS/FS/cust_bill_ApplicationCommon.pm index 7449679a8..8ba57f36f 100644 --- a/FS/FS/cust_bill_ApplicationCommon.pm +++ b/FS/FS/cust_bill_ApplicationCommon.pm @@ -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; diff --git a/FS/FS/cust_bill_pkg_detail.pm b/FS/FS/cust_bill_pkg_detail.pm index f2e60d2f4..4d9ee8191 100644 --- a/FS/FS/cust_bill_pkg_detail.pm +++ b/FS/FS/cust_bill_pkg_detail.pm @@ -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' ) { diff --git a/FS/FS/cust_credit.pm b/FS/FS/cust_credit.pm index 6c3effa13..d0aa3a4b4 100644 --- a/FS/FS/cust_credit.pm +++ b/FS/FS/cust_credit.pm @@ -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; diff --git a/FS/FS/cust_event.pm b/FS/FS/cust_event.pm index d2fcfc1e2..52b5911dc 100644 --- a/FS/FS/cust_event.pm +++ b/FS/FS/cust_event.pm @@ -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 = ''; diff --git a/FS/FS/cust_location.pm b/FS/FS/cust_location.pm index 87c6c3eb6..a90fbe170 100644 --- a/FS/FS/cust_location.pm +++ b/FS/FS/cust_location.pm @@ -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 diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index 4b712de44..88aceb935 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -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); diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm index 8415d629d..89eadd599 100644 --- a/FS/FS/cust_pkg.pm +++ b/FS/FS/cust_pkg.pm @@ -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 diff --git a/FS/FS/cust_svc.pm b/FS/FS/cust_svc.pm index 3c2820412..3ce13144c 100644 --- a/FS/FS/cust_svc.pm +++ b/FS/FS/cust_svc.pm @@ -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 index 000000000..3d1fd272a --- /dev/null +++ b/FS/FS/h_svc_mailinglist.pm @@ -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 index 000000000..db702f322 --- /dev/null +++ b/FS/FS/h_svc_pbx.pm @@ -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 index 000000000..d45738682 --- /dev/null +++ b/FS/FS/location_Mixin.pm @@ -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 index 000000000..129461092 --- /dev/null +++ b/FS/FS/mailinglist.pm @@ -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 index 000000000..8655d61b2 --- /dev/null +++ b/FS/FS/mailinglistmember.pm @@ -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 index 000000000..aeda92f91 --- /dev/null +++ b/FS/FS/part_event/Action/Mixin/credit_pkg.pm @@ -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 index 000000000..4bcee983b --- /dev/null +++ b/FS/FS/part_event/Action/pkg_agent_credit.pm @@ -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 index 000000000..b3e11817d --- /dev/null +++ b/FS/FS/part_event/Action/pkg_agent_credit_pkg.pm @@ -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 index 000000000..e4913a21f --- /dev/null +++ b/FS/FS/part_event/Action/pkg_employee_credit.pm @@ -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 index 000000000..e3b867fb2 --- /dev/null +++ b/FS/FS/part_event/Action/pkg_employee_credit_pkg.pm @@ -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; diff --git a/FS/FS/part_event/Action/pkg_referral_credit.pm b/FS/FS/part_event/Action/pkg_referral_credit.pm index 98d982066..e7c92d650 100644 --- a/FS/FS/part_event/Action/pkg_referral_credit.pm +++ b/FS/FS/part_event/Action/pkg_referral_credit.pm @@ -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'); diff --git a/FS/FS/part_event/Action/pkg_referral_credit_pkg.pm b/FS/FS/part_event/Action/pkg_referral_credit_pkg.pm index eb9b5107c..667c4ce19 100644 --- a/FS/FS/part_event/Action/pkg_referral_credit_pkg.pm +++ b/FS/FS/part_event/Action/pkg_referral_credit_pkg.pm @@ -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; diff --git a/FS/FS/part_event/Condition/balance.pm b/FS/FS/part_event/Condition/balance.pm index 65670c030..3b8854ab8 100644 --- a/FS/FS/part_event/Condition/balance.pm +++ b/FS/FS/part_event/Condition/balance.pm @@ -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) )"; } diff --git a/FS/FS/part_event/Condition/balance_age.pm b/FS/FS/part_event/Condition/balance_age.pm index f1a970796..fc3461210 100644 --- a/FS/FS/part_event/Condition/balance_age.pm +++ b/FS/FS/part_event/Condition/balance_age.pm @@ -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 { diff --git a/FS/FS/part_event/Condition/balance_under.pm b/FS/FS/part_event/Condition/balance_under.pm index 9c7159011..2002c7018 100644 --- a/FS/FS/part_event/Condition/balance_under.pm +++ b/FS/FS/part_event/Condition/balance_under.pm @@ -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) )"; } diff --git a/FS/FS/part_event/Condition/cust_bill_has_service.pm b/FS/FS/part_event/Condition/cust_bill_has_service.pm index 91d75ddac..d85af261e 100644 --- a/FS/FS/part_event/Condition/cust_bill_has_service.pm +++ b/FS/FS/part_event/Condition/cust_bill_has_service.pm @@ -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; diff --git a/FS/FS/part_event/Condition/cust_bill_owed.pm b/FS/FS/part_event/Condition/cust_bill_owed.pm index 0fd992282..d8c77c777 100644 --- a/FS/FS/part_event/Condition/cust_bill_owed.pm +++ b/FS/FS/part_event/Condition/cust_bill_owed.pm @@ -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; diff --git a/FS/FS/part_event/Condition/cust_bill_owed_under.pm b/FS/FS/part_event/Condition/cust_bill_owed_under.pm index a0bf92f27..4eb6439b6 100644 --- a/FS/FS/part_event/Condition/cust_bill_owed_under.pm +++ b/FS/FS/part_event/Condition/cust_bill_owed_under.pm @@ -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; diff --git a/FS/FS/part_event/Condition/every.pm b/FS/FS/part_event/Condition/every.pm index 3408b0aa9..1910674f8 100644 --- a/FS/FS/part_event/Condition/every.pm +++ b/FS/FS/part_event/Condition/every.pm @@ -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"; diff --git a/FS/FS/part_event_condition.pm b/FS/FS/part_event_condition.pm index d13e84927..32f19a3ae 100644 --- a/FS/FS/part_event_condition.pm +++ b/FS/FS/part_event_condition.pm @@ -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 )"; } diff --git a/FS/FS/part_export.pm b/FS/FS/part_export.pm index 16aad6dcd..588606dc1 100644 --- a/FS/FS/part_export.pm +++ b/FS/FS/part_export.pm @@ -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 diff --git a/FS/FS/part_export/communigate_pro.pm b/FS/FS/part_export/communigate_pro.pm index ecb378090..7f5cece59 100644 --- a/FS/FS/part_export/communigate_pro.pm +++ b/FS/FS/part_export/communigate_pro.pm @@ -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; diff --git a/FS/FS/part_export/domain_shellcommands.pm b/FS/FS/part_export/domain_shellcommands.pm index 994c113bf..582e29217 100644 --- a/FS/FS/part_export/domain_shellcommands.pm +++ b/FS/FS/part_export/domain_shellcommands.pm @@ -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> diff --git a/FS/FS/part_export/forward_shellcommands.pm b/FS/FS/part_export/forward_shellcommands.pm index cee24e452..0f79edea0 100644 --- a/FS/FS/part_export/forward_shellcommands.pm +++ b/FS/FS/part_export/forward_shellcommands.pm @@ -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 index 000000000..5c6f1ed8d --- /dev/null +++ b/FS/FS/part_export/grandstream.pm @@ -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 index 000000000..b5734019b --- /dev/null +++ b/FS/FS/part_export/indosoft.pm @@ -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; diff --git a/FS/FS/part_export/netsapiens.pm b/FS/FS/part_export/netsapiens.pm index 332edccc0..83f0f0184 100644 --- a/FS/FS/part_export/netsapiens.pm +++ b/FS/FS/part_export/netsapiens.pm @@ -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, diff --git a/FS/FS/part_export/phone_shellcommands.pm b/FS/FS/part_export/phone_shellcommands.pm index fbb7a0bf8..040af27a7 100644 --- a/FS/FS/part_export/phone_shellcommands.pm +++ b/FS/FS/part_export/phone_shellcommands.pm @@ -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> diff --git a/FS/FS/part_export/shellcommands.pm b/FS/FS/part_export/shellcommands.pm index 0b9e475db..ec861d3b2 100644 --- a/FS/FS/part_export/shellcommands.pm +++ b/FS/FS/part_export/shellcommands.pm @@ -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> diff --git a/FS/FS/part_export/shellcommands_withdomain.pm b/FS/FS/part_export/shellcommands_withdomain.pm index c209002c8..d5a618733 100644 --- a/FS/FS/part_export/shellcommands_withdomain.pm +++ b/FS/FS/part_export/shellcommands_withdomain.pm @@ -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> diff --git a/FS/FS/part_export/textradius.pm b/FS/FS/part_export/textradius.pm index 3cd7039f8..869c7c7dc 100644 --- a/FS/FS/part_export/textradius.pm +++ b/FS/FS/part_export/textradius.pm @@ -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 index 000000000..60c099748 --- /dev/null +++ b/FS/FS/part_export/thirdlane.pm @@ -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; diff --git a/FS/FS/part_export/vpopmail.pm b/FS/FS/part_export/vpopmail.pm index 4cda65755..799a8e1c1 100644 --- a/FS/FS/part_export/vpopmail.pm +++ b/FS/FS/part_export/vpopmail.pm @@ -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 ); diff --git a/FS/FS/part_export/www_shellcommands.pm b/FS/FS/part_export/www_shellcommands.pm index 7e4be9ce4..91b294eab 100644 --- a/FS/FS/part_export/www_shellcommands.pm +++ b/FS/FS/part_export/www_shellcommands.pm @@ -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> diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index 46f4e7241..276889d62 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -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 diff --git a/FS/FS/part_pkg/flat.pm b/FS/FS/part_pkg/flat.pm index f9aaebee7..be17fd803 100644 --- a/FS/FS/part_pkg/flat.pm +++ b/FS/FS/part_pkg/flat.pm @@ -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 ), ], diff --git a/FS/FS/part_pkg/sql_external.pm b/FS/FS/part_pkg/sql_external.pm index 70f9f048a..effc101ee 100644 --- a/FS/FS/part_pkg/sql_external.pm +++ b/FS/FS/part_pkg/sql_external.pm @@ -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; diff --git a/FS/FS/part_pkg/voip_cdr.pm b/FS/FS/part_pkg/voip_cdr.pm index 0c87581ed..38e5941a9 100644 --- a/FS/FS/part_pkg/voip_cdr.pm +++ b/FS/FS/part_pkg/voip_cdr.pm @@ -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; } diff --git a/FS/FS/part_svc.pm b/FS/FS/part_svc.pm index db39ea9ae..3ed153e0c 100644 --- a/FS/FS/part_svc.pm +++ b/FS/FS/part_svc.pm @@ -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->{$_}; diff --git a/FS/FS/rate_detail.pm b/FS/FS/rate_detail.pm index b7b23babe..f6cdedf6e 100644 --- a/FS/FS/rate_detail.pm +++ b/FS/FS/rate_detail.pm @@ -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 diff --git a/FS/FS/reason.pm b/FS/FS/reason.pm index 5311ec5aa..377da4985 100644 --- a/FS/FS/reason.pm +++ b/FS/FS/reason.pm @@ -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 diff --git a/FS/FS/svc_Common.pm b/FS/FS/svc_Common.pm index a67504a5b..fd2745dac 100644 --- a/FS/FS/svc_Common.pm +++ b/FS/FS/svc_Common.pm @@ -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 index 000000000..202899cab --- /dev/null +++ b/FS/FS/svc_Domain_Mixin.pm @@ -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; diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index 3e264e6a3..fbf47072d 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -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; - diff --git a/FS/FS/svc_domain.pm b/FS/FS/svc_domain.pm index 8ca30c2ff..d6eaf2579 100644 --- a/FS/FS/svc_domain.pm +++ b/FS/FS/svc_domain.pm @@ -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) } diff --git a/FS/FS/svc_external.pm b/FS/FS/svc_external.pm index aca7c1bcc..338fdbcd9 100644 --- a/FS/FS/svc_external.pm +++ b/FS/FS/svc_external.pm @@ -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 index 000000000..ba297eedc --- /dev/null +++ b/FS/FS/svc_mailinglist.pm @@ -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 index 000000000..6ae04189c --- /dev/null +++ b/FS/FS/svc_pbx.pm @@ -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; + diff --git a/FS/FS/svc_phone.pm b/FS/FS/svc_phone.pm index 88582d393..30572ecc0 100644 --- a/FS/FS/svc_phone.pm +++ b/FS/FS/svc_phone.pm @@ -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 diff --git a/FS/FS/tax_rate.pm b/FS/FS/tax_rate.pm index 30d7f58d0..75e72c542 100644 --- a/FS/FS/tax_rate.pm +++ b/FS/FS/tax_rate.pm @@ -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 diff --git a/FS/MANIFEST b/FS/MANIFEST index 56436792f..4755f1f64 100644 --- a/FS/MANIFEST +++ b/FS/MANIFEST @@ -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 diff --git a/FS/bin/freeside-paymentech-upload b/FS/bin/freeside-paymentech-upload index 06bef68be..3f8abc047 100755 --- a/FS/bin/freeside-paymentech-upload +++ b/FS/bin/freeside-paymentech-upload @@ -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. diff --git a/FS/bin/freeside-upgrade b/FS/bin/freeside-upgrade index 97c704c91..f4ff1c28e 100755 --- a/FS/bin/freeside-upgrade +++ b/FS/bin/freeside-upgrade @@ -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 index 000000000..d75575a81 --- /dev/null +++ b/FS/t/h_svc_mailinglist.t @@ -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 index 000000000..8b30f52a7 --- /dev/null +++ b/FS/t/h_svc_pbx.t @@ -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 index 000000000..b6a9bf23f --- /dev/null +++ b/FS/t/location_Mixin.t @@ -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 index 000000000..45b7dd583 --- /dev/null +++ b/FS/t/mailinglist.t @@ -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 index 000000000..1ceb2f567 --- /dev/null +++ b/FS/t/mailinglistmember.t @@ -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 index 000000000..261af7537 --- /dev/null +++ b/FS/t/svc_Domain_Mixin.t @@ -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 index 000000000..73896da3c --- /dev/null +++ b/FS/t/svc_mailinglist.t @@ -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 index 000000000..2a41372a0 --- /dev/null +++ b/FS/t/svc_pbx.t @@ -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"; @@ -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 diff --git a/conf/invoice_from b/conf/invoice_from index 110ec8f41..e20d96bcf 100644 --- a/conf/invoice_from +++ b/conf/invoice_from @@ -1 +1 @@ -ivan-unconfigured-freeside-installation@420.am +ivan-unconfigured-freeside-installation@freeside.biz diff --git a/debian/changelog b/debian/changelog index 20a0b4fe6..7f9977c2e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -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 diff --git a/debian/control b/debian/control index 75869a07e..4ea4815d2 100644 --- a/debian/control +++ b/debian/control @@ -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 diff --git a/fs_selfservice/FS-SelfService/SelfService.pm b/fs_selfservice/FS-SelfService/SelfService.pm index 49629d423..7e6821b60 100644 --- a/fs_selfservice/FS-SelfService/SelfService.pm +++ b/fs_selfservice/FS-SelfService/SelfService.pm @@ -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', diff --git a/fs_selfservice/FS-SelfService/cgi/ach_payment_results.html b/fs_selfservice/FS-SelfService/cgi/ach_payment_results.html index 987b97efb..9cdb65e36 100644 --- a/fs_selfservice/FS-SelfService/cgi/ach_payment_results.html +++ b/fs_selfservice/FS-SelfService/cgi/ach_payment_results.html @@ -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 { diff --git a/fs_selfservice/FS-SelfService/cgi/change_bill.html b/fs_selfservice/FS-SelfService/cgi/change_bill.html index c0977d946..7941971ba 100755 --- a/fs_selfservice/FS-SelfService/cgi/change_bill.html +++ b/fs_selfservice/FS-SelfService/cgi/change_bill.html @@ -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>!; } ''; %> diff --git a/fs_selfservice/FS-SelfService/cgi/change_password.html b/fs_selfservice/FS-SelfService/cgi/change_password.html index 9b91d2cad..68b6fd824 100644 --- a/fs_selfservice/FS-SelfService/cgi/change_password.html +++ b/fs_selfservice/FS-SelfService/cgi/change_password.html @@ -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>!; diff --git a/fs_selfservice/FS-SelfService/cgi/change_pay.html b/fs_selfservice/FS-SelfService/cgi/change_pay.html index bbe452786..9633e8920 100644 --- a/fs_selfservice/FS-SelfService/cgi/change_pay.html +++ b/fs_selfservice/FS-SelfService/cgi/change_pay.html @@ -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>!; } ''; %> diff --git a/fs_selfservice/FS-SelfService/cgi/change_ship.html b/fs_selfservice/FS-SelfService/cgi/change_ship.html index f03aeb5be..59f91767a 100755 --- a/fs_selfservice/FS-SelfService/cgi/change_ship.html +++ b/fs_selfservice/FS-SelfService/cgi/change_ship.html @@ -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>!; } ''; %> diff --git a/fs_selfservice/FS-SelfService/cgi/customer_change_pkg.html b/fs_selfservice/FS-SelfService/cgi/customer_change_pkg.html index 95bdab76c..37dccaaf2 100644 --- a/fs_selfservice/FS-SelfService/cgi/customer_change_pkg.html +++ b/fs_selfservice/FS-SelfService/cgi/customer_change_pkg.html @@ -1,5 +1,5 @@ <%= $url = "$selfurl?session=$session_id;action="; ''; %> -<%= include('header') %> +<%= include('header', 'Change package') %> <%= include('change_pkg') %> diff --git a/fs_selfservice/FS-SelfService/cgi/customer_order_pkg.html b/fs_selfservice/FS-SelfService/cgi/customer_order_pkg.html index a20e8acbc..192c29fa4 100755 --- a/fs_selfservice/FS-SelfService/cgi/customer_order_pkg.html +++ b/fs_selfservice/FS-SelfService/cgi/customer_order_pkg.html @@ -1,5 +1,5 @@ <%= $url = "$selfurl?session=$session_id;action="; ''; %> -<%= include('header') %> +<%= include('header', 'Purchase additional package') %> <%= include('order_pkg') %> diff --git a/fs_selfservice/FS-SelfService/cgi/delete_svc.html b/fs_selfservice/FS-SelfService/cgi/delete_svc.html index e16b01eea..80a14f85c 100644 --- a/fs_selfservice/FS-SelfService/cgi/delete_svc.html +++ b/fs_selfservice/FS-SelfService/cgi/delete_svc.html @@ -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>!; diff --git a/fs_selfservice/FS-SelfService/cgi/header.html b/fs_selfservice/FS-SelfService/cgi/header.html index 630959e33..692348f44 100644 --- a/fs_selfservice/FS-SelfService/cgi/header.html +++ b/fs_selfservice/FS-SelfService/cgi/header.html @@ -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; @@ -17,7 +39,24 @@ } //--></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] %> </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 index 000000000..e951dcd1a --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/image.cgi @@ -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}; + diff --git a/fs_selfservice/FS-SelfService/cgi/make_ach_payment.html b/fs_selfservice/FS-SelfService/cgi/make_ach_payment.html index 8802a5d97..09391e7ae 100644 --- a/fs_selfservice/FS-SelfService/cgi/make_ach_payment.html +++ b/fs_selfservice/FS-SelfService/cgi/make_ach_payment.html @@ -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> diff --git a/fs_selfservice/FS-SelfService/cgi/make_payment.html b/fs_selfservice/FS-SelfService/cgi/make_payment.html index 96a17ba4c..e454647cc 100644 --- a/fs_selfservice/FS-SelfService/cgi/make_payment.html +++ b/fs_selfservice/FS-SelfService/cgi/make_payment.html @@ -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> diff --git a/fs_selfservice/FS-SelfService/cgi/make_thirdparty_payment.html b/fs_selfservice/FS-SelfService/cgi/make_thirdparty_payment.html index b2900b1e9..4055ed09e 100755 --- a/fs_selfservice/FS-SelfService/cgi/make_thirdparty_payment.html +++ b/fs_selfservice/FS-SelfService/cgi/make_thirdparty_payment.html @@ -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{ diff --git a/fs_selfservice/FS-SelfService/cgi/myaccount.html b/fs_selfservice/FS-SelfService/cgi/myaccount.html index 9b54794bc..0de738515 100644 --- a/fs_selfservice/FS-SelfService/cgi/myaccount.html +++ b/fs_selfservice/FS-SelfService/cgi/myaccount.html @@ -1,5 +1,5 @@ <%= $url = "$selfurl?session=$session_id;action="; ''; %> -<%= include('header') %> +<%= include('header', 'My Account') %> Hello <%= $name %>!<BR><BR> <%= $small_custview %> diff --git a/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html b/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html index 8765323fa..9d330361c 100644 --- a/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html +++ b/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html @@ -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 .= ' ' x $item->{'indent'} - if exists $item->{'indent'}; + if ( $menu_skipheadings ) { + $OUT .= ' '; + } else { + $OUT .= ' ' 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/ / /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> diff --git a/fs_selfservice/FS-SelfService/cgi/order_pkg.html b/fs_selfservice/FS-SelfService/cgi/order_pkg.html index 4abfd8440..79335a0c2 100644 --- a/fs_selfservice/FS-SelfService/cgi/order_pkg.html +++ b/fs_selfservice/FS-SelfService/cgi/order_pkg.html @@ -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>!; } ''; %> diff --git a/fs_selfservice/FS-SelfService/cgi/payment_results.html b/fs_selfservice/FS-SelfService/cgi/payment_results.html index 987b97efb..9cdb65e36 100644 --- a/fs_selfservice/FS-SelfService/cgi/payment_results.html +++ b/fs_selfservice/FS-SelfService/cgi/payment_results.html @@ -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 { diff --git a/fs_selfservice/FS-SelfService/cgi/process_change_bill.html b/fs_selfservice/FS-SelfService/cgi/process_change_bill.html index a4402848d..bf7ad778d 100644 --- a/fs_selfservice/FS-SelfService/cgi/process_change_bill.html +++ b/fs_selfservice/FS-SelfService/cgi/process_change_bill.html @@ -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') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_change_password.html b/fs_selfservice/FS-SelfService/cgi/process_change_password.html index ffe0cab35..4eca91fb6 100644 --- a/fs_selfservice/FS-SelfService/cgi/process_change_password.html +++ b/fs_selfservice/FS-SelfService/cgi/process_change_password.html @@ -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> diff --git a/fs_selfservice/FS-SelfService/cgi/process_change_pay.html b/fs_selfservice/FS-SelfService/cgi/process_change_pay.html index a4402848d..e399aea17 100644 --- a/fs_selfservice/FS-SelfService/cgi/process_change_pay.html +++ b/fs_selfservice/FS-SelfService/cgi/process_change_pay.html @@ -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') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_change_pkg.html b/fs_selfservice/FS-SelfService/cgi/process_change_pkg.html index c7c69f0a5..bf15b6ea6 100644 --- a/fs_selfservice/FS-SelfService/cgi/process_change_pkg.html +++ b/fs_selfservice/FS-SelfService/cgi/process_change_pkg.html @@ -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') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_change_ship.html b/fs_selfservice/FS-SelfService/cgi/process_change_ship.html index a4402848d..bf7ad778d 100644 --- a/fs_selfservice/FS-SelfService/cgi/process_change_ship.html +++ b/fs_selfservice/FS-SelfService/cgi/process_change_ship.html @@ -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') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_order_pkg.html b/fs_selfservice/FS-SelfService/cgi/process_order_pkg.html index b86893715..649d92092 100755 --- a/fs_selfservice/FS-SelfService/cgi/process_order_pkg.html +++ b/fs_selfservice/FS-SelfService/cgi/process_order_pkg.html @@ -1,5 +1,5 @@ <%= $url = "$selfurl?session=$session_id;action="; ''; %> -<%= include('header') %> +<%= include('header', 'Package order successful') %> <FONT SIZE=4>Package order successful.</FONT> diff --git a/fs_selfservice/FS-SelfService/cgi/process_order_recharge.html b/fs_selfservice/FS-SelfService/cgi/process_order_recharge.html index 9dfc32807..4a16ec56a 100644 --- a/fs_selfservice/FS-SelfService/cgi/process_order_recharge.html +++ b/fs_selfservice/FS-SelfService/cgi/process_order_recharge.html @@ -1,5 +1,5 @@ <%= $url = "$selfurl?session=$session_id;action="; ''; %> -<%= include('header') %> +<%= include('header', "$svc recharged successfully") %> <FONT SIZE=4><%= $svc %> recharged successfully.</FONT> diff --git a/fs_selfservice/FS-SelfService/cgi/process_svc_acct.html b/fs_selfservice/FS-SelfService/cgi/process_svc_acct.html index 39920cb0d..d6515e7f4 100644 --- a/fs_selfservice/FS-SelfService/cgi/process_svc_acct.html +++ b/fs_selfservice/FS-SelfService/cgi/process_svc_acct.html @@ -1,5 +1,5 @@ <%= $url = "$selfurl?session=$session_id;action="; ''; %> -<%= include('header') %> +<%= include('header', "$svc setup successfully") %> <FONT SIZE=4><%= $svc %> setup successfully.</FONT> diff --git a/fs_selfservice/FS-SelfService/cgi/process_svc_external.html b/fs_selfservice/FS-SelfService/cgi/process_svc_external.html index 103eb9e35..c20aae02c 100644 --- a/fs_selfservice/FS-SelfService/cgi/process_svc_external.html +++ b/fs_selfservice/FS-SelfService/cgi/process_svc_external.html @@ -1,5 +1,5 @@ <%= $url = "$selfurl?session=$session_id;action="; ''; %> -<%= include('header') %> +<%= include('header', "$svc setup successfully") %> <FONT SIZE=4><%= $svc %> setup successfully.</FONT> diff --git a/fs_selfservice/FS-SelfService/cgi/provision.html b/fs_selfservice/FS-SelfService/cgi/provision.html index f5b2c2b71..7c0f861e4 100644 --- a/fs_selfservice/FS-SelfService/cgi/provision.html +++ b/fs_selfservice/FS-SelfService/cgi/provision.html @@ -1,5 +1,5 @@ <%= $url = "$selfurl?session=$session_id;action="; ''; %> -<%= include('header') %> +<%= include('header', 'Setup my services') %> <%= include('provision_list') %> diff --git a/fs_selfservice/FS-SelfService/cgi/provision_svc_acct.html b/fs_selfservice/FS-SelfService/cgi/provision_svc_acct.html index bffd22fd1..bae57305e 100644 --- a/fs_selfservice/FS-SelfService/cgi/provision_svc_acct.html +++ b/fs_selfservice/FS-SelfService/cgi/provision_svc_acct.html @@ -1,5 +1,5 @@ <%= $url = "$selfurl?session=$session_id;action="; ''; %> -<%= include('header') %> +<%= include('header', 'Setup account') %> <%= include('svc_acct') %> diff --git a/fs_selfservice/FS-SelfService/cgi/recharge_prepay.html b/fs_selfservice/FS-SelfService/cgi/recharge_prepay.html index 6f0aa1f62..c716e8242 100644 --- a/fs_selfservice/FS-SelfService/cgi/recharge_prepay.html +++ b/fs_selfservice/FS-SelfService/cgi/recharge_prepay.html @@ -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"> diff --git a/fs_selfservice/FS-SelfService/cgi/recharge_results.html b/fs_selfservice/FS-SelfService/cgi/recharge_results.html index af15365b0..147b66bbe 100644 --- a/fs_selfservice/FS-SelfService/cgi/recharge_results.html +++ b/fs_selfservice/FS-SelfService/cgi/recharge_results.html @@ -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 { diff --git a/fs_selfservice/FS-SelfService/cgi/selfservice.cgi b/fs_selfservice/FS-SelfService/cgi/selfservice.cgi index 734563be7..2252852d9 100644 --- a/fs_selfservice/FS-SelfService/cgi/selfservice.cgi +++ b/fs_selfservice/FS-SelfService/cgi/selfservice.cgi @@ -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; diff --git a/fs_selfservice/FS-SelfService/cgi/view_cdr_details.html b/fs_selfservice/FS-SelfService/cgi/view_cdr_details.html index 32bd632b4..6d4d8475e 100644 --- a/fs_selfservice/FS-SelfService/cgi/view_cdr_details.html +++ b/fs_selfservice/FS-SelfService/cgi/view_cdr_details.html @@ -1,10 +1,10 @@ <%= $url = "$selfurl?session=$session_id;action="; ''; %> -<%= include('header') %> - -<FONT SIZE=4>Call usage for -<%= Date::Format::time2str('%b %o %Y', $beginning) %> - -<%= Date::Format::time2str('%b %o %Y', $ending) %> -</FONT><BR><BR> +<%= include('header', 'Call usage for '. + Date::Format::time2str('%b %o %Y', $beginning). + ' - '. + Date::Format::time2str('%b %o %Y', $ending) + ) +%> <%= if ( $error ) { $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!; diff --git a/fs_selfservice/FS-SelfService/cgi/view_invoice.html b/fs_selfservice/FS-SelfService/cgi/view_invoice.html index 8a1c1c73d..072a4147c 100644 --- a/fs_selfservice/FS-SelfService/cgi/view_invoice.html +++ b/fs_selfservice/FS-SelfService/cgi/view_invoice.html @@ -1,5 +1,5 @@ <%= $url = "$selfurl?session=$session_id;action="; ''; %> -<%= include('header') %> +<%= include('header', 'Invoice') %> <%= $invoice_html %> diff --git a/fs_selfservice/FS-SelfService/cgi/view_usage.html b/fs_selfservice/FS-SelfService/cgi/view_usage.html index b492102ce..69437632b 100644 --- a/fs_selfservice/FS-SelfService/cgi/view_usage.html +++ b/fs_selfservice/FS-SelfService/cgi/view_usage.html @@ -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> diff --git a/fs_selfservice/FS-SelfService/cgi/view_usage_details.html b/fs_selfservice/FS-SelfService/cgi/view_usage_details.html index 9f02eba79..c4cc177e1 100644 --- a/fs_selfservice/FS-SelfService/cgi/view_usage_details.html +++ b/fs_selfservice/FS-SelfService/cgi/view_usage_details.html @@ -1,10 +1,10 @@ <%= $url = "$selfurl?session=$session_id;action="; ''; %> -<%= include('header') %> - -<FONT SIZE=4>Service usage details for -<%= Date::Format::time2str('%b %o %Y', $beginning) %> - -<%= Date::Format::time2str('%b %o %Y', $ending) %> -</FONT><BR><BR> +<%= include('header', 'Service usage details for '. + Date::Format::time2str('%b %o %Y', $beginning). + ' - '. + Date::Format::time2str('%b %o %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 index 000000000..759a4a6a3 --- /dev/null +++ b/fs_selfservice/java/freeside_create_ticket_example.java @@ -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 index 000000000..0ccada291 --- /dev/null +++ b/fs_selfservice/perl/xmlrpc-create_ticket.pl @@ -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; diff --git a/httemplate/browse/access_user.html b/httemplate/browse/access_user.html index 321025b69..3162e3a6c 100644 --- a/httemplate/browse/access_user.html +++ b/httemplate/browse/access_user.html @@ -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> diff --git a/httemplate/browse/part_pkg_taxclass.html b/httemplate/browse/part_pkg_taxclass.html index 04e0e23d6..fb70ee417 100644 --- a/httemplate/browse/part_pkg_taxclass.html +++ b/httemplate/browse/part_pkg_taxclass.html @@ -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', ], diff --git a/httemplate/browse/rate_detail.html b/httemplate/browse/rate_detail.html index 23bc23ff8..3371926b4 100644 --- a/httemplate/browse/rate_detail.html +++ b/httemplate/browse/rate_detail.html @@ -15,6 +15,7 @@ 'Region', 'Prefix(es)', 'Included<BR>minutes', + 'Connection<BR>charge', 'Charge per<BR>minute', 'Granularity', 'Usage class', @@ -22,12 +23,9 @@ 'fields' => [ 'regionname', sub { shift->dest_region->prefixes_short }, - sub { shift->min_included. - ' <FONT SIZE="-1">(edit)</FONT>'; - }, - sub { $money_char. shift->min_charge. - ' <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 = ' <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> diff --git a/httemplate/config/config-view.cgi b/httemplate/config/config-view.cgi index 13286cf21..08f6c1020 100644 --- a/httemplate/config/config-view.cgi +++ b/httemplate/config/config-view.cgi @@ -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 = (); diff --git a/httemplate/docs/about.html b/httemplate/docs/about.html index 04af73db8..056c17c3e 100644 --- a/httemplate/docs/about.html +++ b/httemplate/docs/about.html @@ -8,7 +8,7 @@ </CENTER> <CENTER> -<FONT SIZE="-1">© 2009 Freeside Internet Services, Inc.<BR> +<FONT SIZE="-1">© 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"> diff --git a/httemplate/docs/credits.html b/httemplate/docs/credits.html index d927722e0..10b9e70a4 100644 --- a/httemplate/docs/credits.html +++ b/httemplate/docs/credits.html @@ -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 index e69de29bb..000000000 --- a/httemplate/docs/man/FS/part_export/.cvs_is_on_crack +++ /dev/null diff --git a/httemplate/edit/REAL_cust_pkg.cgi b/httemplate/edit/REAL_cust_pkg.cgi index c31213805..29c8ca63f 100755 --- a/httemplate/edit/REAL_cust_pkg.cgi +++ b/httemplate/edit/REAL_cust_pkg.cgi @@ -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" }); @@ -128,21 +128,20 @@ </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 ); diff --git a/httemplate/edit/access_user.html b/httemplate/edit/access_user.html index 73488ef9a..1f52b4789 100644 --- a/httemplate/edit/access_user.html +++ b/httemplate/edit/access_user.html @@ -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', ''); diff --git a/httemplate/edit/cust_credit.cgi b/httemplate/edit/cust_credit.cgi index febf281f9..dc80847de 100755 --- a/httemplate/edit/cust_credit.cgi +++ b/httemplate/edit/cust_credit.cgi @@ -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> @@ -64,12 +64,10 @@ </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'); diff --git a/httemplate/edit/cust_main/top_misc.html b/httemplate/edit/cust_main/top_misc.html index 041050664..d1d436851 100644 --- a/httemplate/edit/cust_main/top_misc.html +++ b/httemplate/edit/cust_main/top_misc.html @@ -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> @@ -61,13 +62,13 @@ <!-- <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> !; </%init> diff --git a/httemplate/edit/cust_main_note.cgi b/httemplate/edit/cust_main_note.cgi index 6c6a1a9a0..e2501cb54 100755 --- a/httemplate/edit/cust_main_note.cgi +++ b/httemplate/edit/cust_main_note.cgi @@ -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; diff --git a/httemplate/edit/cust_pay.cgi b/httemplate/edit/cust_pay.cgi index 07e51989e..a6b73b13a 100755 --- a/httemplate/edit/cust_pay.cgi +++ b/httemplate/edit/cust_pay.cgi @@ -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'); diff --git a/httemplate/edit/cust_refund.cgi b/httemplate/edit/cust_refund.cgi index 94c0993d7..59417b4c4 100755 --- a/httemplate/edit/cust_refund.cgi +++ b/httemplate/edit/cust_refund.cgi @@ -41,14 +41,14 @@ </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'); diff --git a/httemplate/edit/elements/ApplicationCommon.html b/httemplate/edit/elements/ApplicationCommon.html index a485d37de..1fc8a09a9 100644 --- a/httemplate/edit/elements/ApplicationCommon.html +++ b/httemplate/edit/elements/ApplicationCommon.html @@ -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'}; diff --git a/httemplate/edit/elements/edit.html b/httemplate/edit/elements/edit.html index fd73e031e..1a1023cbd 100644 --- a/httemplate/edit/elements/edit.html +++ b/httemplate/edit/elements/edit.html @@ -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 { diff --git a/httemplate/edit/elements/svc_Common.html b/httemplate/edit/elements/svc_Common.html index ef04bd04a..36950b2c9 100644 --- a/httemplate/edit/elements/svc_Common.html +++ b/httemplate/edit/elements/svc_Common.html @@ -34,12 +34,14 @@ '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; @@ -48,12 +50,20 @@ #$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' ) { @@ -61,7 +71,41 @@ ? '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 { @@ -111,12 +155,33 @@ 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 index 000000000..2391cb697 --- /dev/null +++ b/httemplate/edit/mailinglistmember.html @@ -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> diff --git a/httemplate/edit/part_device.html b/httemplate/edit/part_device.html index 4f2fe93b4..146070fd9 100644 --- a/httemplate/edit/part_device.html +++ b/httemplate/edit/part_device.html @@ -6,6 +6,7 @@ 'devicename' => 'Device name', }, 'viewall_dir' => 'browse', + 'html_bottom' => $html_bottom_sub, ) %> <%init> @@ -13,4 +14,32 @@ 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> + diff --git a/httemplate/edit/part_pkg.cgi b/httemplate/edit/part_pkg.cgi index a02545f84..f9818c4f9 100755 --- a/httemplate/edit/part_pkg.cgi +++ b/httemplate/edit/part_pkg.cgi @@ -162,15 +162,17 @@ { 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+)$/ && diff --git a/httemplate/edit/part_svc.cgi b/httemplate/edit/part_svc.cgi index 79703435c..98ed9fec1 100755 --- a/httemplate/edit/part_svc.cgi +++ b/httemplate/edit/part_svc.cgi @@ -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}; % % } % diff --git a/httemplate/edit/process/REAL_cust_pkg.cgi b/httemplate/edit/process/REAL_cust_pkg.cgi index 22aab44e8..b5796ebf5 100755 --- a/httemplate/edit/process/REAL_cust_pkg.cgi +++ b/httemplate/edit/process/REAL_cust_pkg.cgi @@ -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 index 000000000..f1842b8ef --- /dev/null +++ b/httemplate/edit/process/mailinglistmember.html @@ -0,0 +1,6 @@ +<% include( 'elements/process.html', + 'table' => 'mailinglistmember', + 'popup_reload' => 'Member added', + ) +%> +%#XXX ACL diff --git a/httemplate/edit/process/rate_region.cgi b/httemplate/edit/process/rate_region.cgi index 882991e9d..8036f7388 100755 --- a/httemplate/edit/process/rate_region.cgi +++ b/httemplate/edit/process/rate_region.cgi @@ -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', {} ); diff --git a/httemplate/edit/process/svc_acct.cgi b/httemplate/edit/process/svc_acct.cgi index 515d89e91..0d2c007f1 100755 --- a/httemplate/edit/process/svc_acct.cgi +++ b/httemplate/edit/process/svc_acct.cgi @@ -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; } diff --git a/httemplate/edit/process/svc_domain.cgi b/httemplate/edit/process/svc_domain.cgi index 59b518097..381339bc8 100755 --- a/httemplate/edit/process/svc_domain.cgi +++ b/httemplate/edit/process/svc_domain.cgi @@ -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 index 000000000..3515afc4b --- /dev/null +++ b/httemplate/edit/process/svc_external.html @@ -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 index 000000000..580f6ccbd --- /dev/null +++ b/httemplate/edit/process/svc_mailinglist.html @@ -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> diff --git a/httemplate/edit/process/svc_phone.html b/httemplate/edit/process/svc_phone.html index 27a703cdf..e02ec5ccc 100644 --- a/httemplate/edit/process/svc_phone.html +++ b/httemplate/edit/process/svc_phone.html @@ -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> diff --git a/httemplate/edit/quick-charge.html b/httemplate/edit/quick-charge.html index c96fa6c81..64ad3a289 100644 --- a/httemplate/edit/quick-charge.html +++ b/httemplate/edit/quick-charge.html @@ -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; diff --git a/httemplate/edit/rate_detail.html b/httemplate/edit/rate_detail.html index dd8c3f6b3..869ace8d4 100644 --- a/httemplate/edit/rate_detail.html +++ b/httemplate/edit/rate_detail.html @@ -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', @@ -17,6 +19,13 @@ { 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; diff --git a/httemplate/edit/rate_region.cgi b/httemplate/edit/rate_region.cgi index 9ca3a3569..f77c0dbe7 100644 --- a/httemplate/edit/rate_region.cgi +++ b/httemplate/edit/rate_region.cgi @@ -52,6 +52,12 @@ <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"> @@ -88,7 +94,20 @@ </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 %>"> @@ -125,12 +144,19 @@ </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 ( { diff --git a/httemplate/edit/svc_Common.html b/httemplate/edit/svc_Common.html index 6666d9720..3da72d2e8 100644 --- a/httemplate/edit/svc_Common.html +++ b/httemplate/edit/svc_Common.html @@ -1,7 +1,7 @@ <% include('elements/svc_Common.html', 'table' => $table, 'post_url' => popurl(1). "process/svc_Common.html", - %opt, + %opt, ) %> <%init> diff --git a/httemplate/edit/svc_acct.cgi b/httemplate/edit/svc_acct.cgi index afbd002c1..99e4b74a4 100755 --- a/httemplate/edit/svc_acct.cgi +++ b/httemplate/edit/svc_acct.cgi @@ -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 = diff --git a/httemplate/edit/svc_broadband.cgi b/httemplate/edit/svc_broadband.cgi index 8a108f891..b11fec7a7 100644 --- a/httemplate/edit/svc_broadband.cgi +++ b/httemplate/edit/svc_broadband.cgi @@ -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; diff --git a/httemplate/edit/svc_domain.cgi b/httemplate/edit/svc_domain.cgi index 10079ce98..78faf12b2 100755 --- a/httemplate/edit/svc_domain.cgi +++ b/httemplate/edit/svc_domain.cgi @@ -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; diff --git a/httemplate/edit/svc_external.cgi b/httemplate/edit/svc_external.cgi index 0df842b21..54aa11f42 100644 --- a/httemplate/edit/svc_external.cgi +++ b/httemplate/edit/svc_external.cgi @@ -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' ) %> diff --git a/httemplate/edit/svc_forward.cgi b/httemplate/edit/svc_forward.cgi index 96a00a5aa..73f6465b9 100755 --- a/httemplate/edit/svc_forward.cgi +++ b/httemplate/edit/svc_forward.cgi @@ -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 index 000000000..c7c739daa --- /dev/null +++ b/httemplate/edit/svc_mailinglist.cgi @@ -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> diff --git a/httemplate/edit/svc_phone.cgi b/httemplate/edit/svc_phone.cgi index d7629ab6f..b77d96233 100644 --- a/httemplate/edit/svc_phone.cgi +++ b/httemplate/edit/svc_phone.cgi @@ -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> @@ -24,4 +23,55 @@ 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 index 000000000..6ce9ca587 --- /dev/null +++ b/httemplate/elements/communigate_pro-accessmodes.html @@ -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> diff --git a/httemplate/elements/header.html b/httemplate/elements/header.html index 22e872eca..8da91ef49 100644 --- a/httemplate/elements/header.html +++ b/httemplate/elements/header.html @@ -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 ) { diff --git a/httemplate/elements/location.html b/httemplate/elements/location.html index 07aaa69f0..0ec6c04e0 100644 --- a/httemplate/elements/location.html +++ b/httemplate/elements/location.html @@ -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> diff --git a/httemplate/elements/menu.html b/httemplate/elements/menu.html index d4a915e15..a68a5754d 100644 --- a/httemplate/elements/menu.html +++ b/httemplate/elements/menu.html @@ -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'); diff --git a/httemplate/elements/overlibmws.js b/httemplate/elements/overlibmws.js index df2bd1db7..6a446ab00 100644 --- a/httemplate/elements/overlibmws.js +++ b/httemplate/elements/overlibmws.js @@ -1,7 +1,7 @@ /*
Do not remove or change this notice.
- overlibmws.js core module - Copyright Foteos Macrides 2002-2008. All rights reserved.
- Initial: August 18, 2002 - Last Revised: March 22, 2008
+ overlibmws.js core module - Copyright Foteos Macrides 2002-2010. All rights reserved.
+ Initial: August 18, 2002 - Last Revised: January 5, 2010
This module is subject to the same terms of usage as for Erik Bosrup's overLIB,
though only a minority of the code and API now correspond with Erik's version.
See the overlibmws Change History and Command Reference via:
@@ -132,11 +132,12 @@ OLkon=(OLua.indexOf('konqueror')>=0)?1:0, OLkht=(OLsaf||OLkon)?1:0,
OLopr=(OLua.indexOf('opera')>=0)?1:0,
OLop7=(OLopr&&document.createTextNode)?1:0;
+OLop95=(OLop7&&document.getElementsByClassName)?1:0;
if(OLopr){OLns4=OLns6=OLgek=0;OLie4=(OLop7)?1:0;}
var OLieM=((OLie4&&OLmac)&&!(OLkht||OLopr))?1:0,
-OLie5=0,OLie55=0;OLie7=0;if(OLie4&&!OLop7){
+OLie5=0,OLie55=0,OLie7=0;OLie8=0;if(OLie4&&!OLop7){
if((OLv=OLua.match(/msie (\d\.\d+)\.*/i))&&(OLv=parseFloat(OLv[1]))>=5.0){
-OLie5=1;OLns6=0;if(OLv>=5.5)OLie55=1;if(OLv>=7.0)OLie7=1;}if(OLns6)OLie4=0;}
+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;}
if(OLns4)window.onresize=function(){location.reload();};var OLchkMh=1,OLdw;
if(OLns4||OLie4||OLns6){OLmh();if(window.addEventListener)window.addEventListener("unload",
OLulCl,false);}else{overlib=nd=cClick=OLpageDefaults=no_overlib;}
@@ -147,25 +148,25 @@ function OLulCl(){if(over)cClick();window.removeEventListener("unload",OLulCl,fa */
// Loads defaults then args into runtime variables.
function overlib(){
-if(!(OLloaded&&OLgateOK))return;if((OLexclusivePI)&&OLisExclusive(arguments))return true;if(OLchkMh)OLmh();
-if(OLndt&&!OLtimerid)OLndt=0;if(over)cClick();if(parent!=self){if(parent.OLo2Ref){parent.OLeval(parent.OLo2Ref);
-parent.OLo2Ref="";}if(parent.OLifRef){parent.OLeval(parent.OLifRef);parent.OLifRef="";}}if(OLo2Ref){eval(OLo2Ref);
-OLo2Ref="";}if(OLifRef){eval(OLifRef);OLifRef="";}OLload(OLp1or2);OLload(OLp1);OLfnRef="";OLifX=0;OLifY=0;OLhover=0;
-OLsetRunTimeVar();OLparseTokens('o3_',arguments);if(!(over=OLmkLyr()))return false;if(o3_decode)OLdecode();if(OLprintPI)
-OLchkPrint();if(OLbubblePI)OLchkForBubbleEffect();if(OLdebugPI)OLsetDebugCanShow();if(OLshadowPI)OLinitShadow();
-if(OLiframePI)OLinitIfs();if(OLfilterPI)OLinitFilterLyr();if(OLexclusivePI&&o3_exclusive&&o3_exclusivestatus!="")
-o3_status=o3_exclusivestatus;else if(o3_autostatus==2&&o3_cap!="")o3_status=o3_cap;else if(o3_autostatus==1&&o3_text!="")
-o3_status=o3_text;if(!o3_delay){return OLmain();}else{OLdelayid=setTimeout("OLmain()",o3_delay);if(o3_status!=""){
-self.status=o3_status;return true;}else if(!(OLop7&&event&&event.type=='mouseover'))return false;}
+if(!(OLloaded&&OLgateOK))return;if((OLexclusivePI)&&OLisExclusive(arguments))return true;if(OLchkMh)OLmh();if(OLndt&&
+!OLtimerid)OLndt=0;if(over){if(OLfilterPI)o3_filter=0;cClick();}if(parent!=self){if(parent.OLo2Ref){parent.OLeval(
+parent.OLo2Ref);parent.OLo2Ref="";}if(parent.OLifRef){parent.OLeval(parent.OLifRef);parent.OLifRef="";}}if(OLo2Ref){
+eval(OLo2Ref);OLo2Ref="";}if(OLifRef){eval(OLifRef);OLifRef="";}OLload(OLp1or2);OLload(OLp1);OLfnRef="";OLifX=0;OLifY=0;
+OLhover=0;if(OLcrossframePI&&parent!=self)OLchkFRAME(arguments);OLsetRunTimeVar();OLparseTokens('o3_',arguments);if(!(
+over=OLmkLyr()))return false;over.onmouseover=over.onmouseout=null;if(o3_decode)OLdecode();if(OLprintPI)OLchkPrint();
+if(OLbubblePI)OLchkForBubbleEffect();if(OLdebugPI)OLsetDebugCanShow();if(OLshadowPI)OLinitShadow();if(OLiframePI)OLinitIfs();
+if(OLfilterPI)OLinitFilterLyr();if(OLexclusivePI&&o3_exclusive&&o3_exclusivestatus!="")o3_status=o3_exclusivestatus;else
+if(o3_autostatus==2&&o3_cap!="")o3_status=o3_cap;else if(o3_autostatus==1&&o3_text!="")o3_status=o3_text;if(!o3_delay){
+return OLmain();}else{OLdelayid=setTimeout("OLmain()",o3_delay);if(o3_status!=""){self.status=o3_status;return true;}else
+if(!(OLop7&&event&&event.type=='mouseover'))return false;}
}
function OLeval(s){eval(s);}
// Clears popups if appropriate
function nd(time){
-if(OLloaded&&OLgateOK){if(!((OLexclusivePI)&&OLisExclusive())){if(time&&over&&!o3_delay){
-if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=(OLhover&&o3_frame==self&&!OLcursorOff())?0:
-setTimeout("cClick()",(o3_timeout=OLndt=time));}else{if(!OLshowingsticky){OLallowmove=0;
-if(over)OLhideObject(over);}}}}return false;
+if(OLloaded&&OLgateOK){if(!((OLexclusivePI)&&OLisExclusive())){if(time&&over&&!o3_delay){if(OLtimerid>0)
+clearTimeout(OLtimerid);OLtimerid=(OLhover&&!OLcursorOff())?0:setTimeout("cClick()",(o3_timeout=OLndt=time));
+}else{if(!OLshowingsticky){OLallowmove=0;if(over)OLhideObject(over);}}}}return false;
}
// Close function for stickies
@@ -189,11 +190,12 @@ function no_overlib(){return false;} OVERLIB MAIN FUNCTION SET
*/
function OLmain(){
-o3_delay=0;if(parent!=self&&o3_frame==parent&&parent.OLscrollPI&&parent.over)parent.OLclearScroll();if(o3_frame==self){
-if(o3_noclose)OLoptMOUSEOFF(0);else if(o3_mouseoff)OLoptMOUSEOFF(1);}if(o3_sticky){OLshowingsticky=1;if(OLfnRef&&
-parent!=self&&o3_frame==parent&&parent.overlib){parent.OLifRef=OLfnRef+'cClick()';}}OLdoLyr();OLallowmove=0;if(o3_timeout>0){
-if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=setTimeout("cClick()",o3_timeout);}OLchkRef();OLdisp(o3_status);
-if(OLdraggablePI)OLcheckDrag();if(o3_status!="")return true;else if(!(OLop7&&event&&event.type=='mouseover'))return false;
+o3_delay=0;if(parent!=self&&o3_frame==parent&&parent.OLscrollPI&&parent.over)parent.OLclearScroll();if(o3_noclose)
+OLoptMOUSEOFF(0);else if(o3_mouseoff)OLoptMOUSEOFF(1);if(o3_sticky){OLshowingsticky=1;if(OLfnRef&&parent!=self&&
+o3_frame==parent&&parent.overlib)parent.OLifRef=(OLfilterPI?OLfnRef+'o3_filter=0;':'')+OLfnRef+'cClick();';}OLdoLyr();
+OLallowmove=0;if(o3_timeout>0){if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=setTimeout("cClick()",o3_timeout);}
+OLchkRef();OLdisp(o3_status);if(OLdraggablePI)OLcheckDrag();if(o3_status!="")return true;else if(!(OLop7&&event&&
+event.type=='mouseover'))return false;
}
function OLchkRef(){
if(o3_ref){OLrefXY=OLgetRefXY(o3_ref);if(OLrefXY[0]==null&&OLcrossframePI)OLchkIfRef();
@@ -211,11 +213,10 @@ OLcontentSimple(o3_text):(o3_sticky)?OLcontentCaption(o3_text,o3_cap,o3_close):O // Makes Layer
function OLmkLyr(id,f,z){
-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]=new Layer(1024,f);else if(OLie4&&!OLop7){
-fd.body.insertAdjacentHTML('AfterBegin','<div id="'+id+'"></div>');d=fd.all[id];}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=d.style;o.position='absolute';
-o.visibility='hidden';o.zIndex=z;}}return d;
+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]=
+new Layer(1024,f);else if(OLie4&&!OLop7){fd.body.insertAdjacentHTML('AfterBegin','<div id="'+id+'"></div>');d=fd.all[id];}
+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=
+d.style;o.position='absolute';o.visibility='hidden';o.zIndex=z;}}return d;
}
// Creates and writes layer content
@@ -225,9 +226,9 @@ if(o3_fgbackground!='')o3_fgbackground=' background="'+o3_fgbackground+'"'; if(o3_bgbackground!='')o3_bgbackground=' background="'+o3_bgbackground+'"';
if(o3_cgbackground!='')o3_cgbackground=' background="'+o3_cgbackground+'"';
if(o3_fgcolor!='')o3_fgcolor=' bgcolor="'+o3_fgcolor+'"';if(o3_bgcolor!='')o3_bgcolor=' bgcolor="'+o3_bgcolor+'"';
-if(o3_cgcolor!='')o3_cgcolor=' bgcolor="'+o3_cgcolor+'"';if(o3_height>0)o3_height=' height="'+o3_height+'"';
-else o3_height='';}if(!OLns4)OLrepositionTo(over,(OLns6?20:0),0);var lyrHtml=OLdoLGF();
-if(o3_wrap&&!o3_fullhtml){OLlayerWrite(lyrHtml);o3_width=(OLns4?over.clip.width:over.offsetWidth);if(OLie4){
+if(o3_cgcolor!='')o3_cgcolor=' bgcolor="'+o3_cgcolor+'"';if(o3_height>0)o3_height=(OLns4)?' height="'+o3_height+'"':
+' style="height:'+o3_height+'px;"';else o3_height='';}if(!OLns4)OLrepositionTo(over,(OLns6?20:0),0);var lyrHtml=OLdoLGF();
+if(o3_wrap&&!o3_fullhtml){OLlayerWrite(lyrHtml);o3_width=(OLns4?over.clip.width:over.offsetWidth);if(OLie4&&!OLop95){
var w=OLfd().clientWidth;if(o3_width>=w){if(OLop7){if(OLovertwoPI&&over==over2){var z=over2.style.zIndex;
o3_frame.document.body.removeChild(over);over2=OLmkLyr('overDiv2',o3_frame,z);over=over2;}else{
o3_frame.document.body.removeChild(over);over=OLmkLyr();}}o3_width=w-20;}}
@@ -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>';
}
function OLwd(a){return(o3_wrap?'':' width="'+(!a?'100%':(a==1?o3_width:(o3_width-o3_padxl-o3_padxr)))+'"');}
-function OLhL(s){return(s?' style="width:100%;"':'width:100%;');}
+function OLhL(s){if(!OLie5)return '';return(s?' style="overflow:auto;"':'overflow:auto;');}
// Loads image into the div.
function OLsetBackground(i){
@@ -308,18 +309,18 @@ else{if(OLns4)over.background.src=i;else{if(OLns6)over.style.width=o3_width+'px' // Displays layer
function OLdisp(s){
if(OLmodalPI&&!o3_modalscroll)OLchkModal();if(!OLallowmove){if(OLshadowPI)OLdispShadow();if(OLiframePI)OLdispIfs();
-OLplaceLayer();if(OLmodalPI&&o3_modalscroll)OLchkModal();if(OLndt)OLshowObject(over);
-else OLshowid=setTimeout("OLshowObject(over)",1);OLallowmove=(o3_sticky||o3_nofollow)?0:1;}OLndt=0;if(s!="")self.status=s;
+OLplaceLayer();if(OLmodalPI&&o3_modalscroll)OLchkModal();if(OLndt)OLshowObject(over);else OLshowid=
+setTimeout("OLshowObject(over)",1);OLallowmove=(o3_sticky||o3_nofollow)?0:1;}OLndt=0;if(s!="")self.status=s;
}
// Decides placement of layer.
function OLplaceLayer(){
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(),
nsb=(OLgek>=20010505&&!o3_frame.scrollbars.visible)?1:0;
-if(!OLkht&&o&&o.clientWidth)iWd=o.clientWidth;
+if(!OLkht&&!OLop95&&o&&o.clientWidth)iWd=o.clientWidth;
else if(o3_frame.innerWidth){SB=Math.ceil(1.4*(o3_frame.outerWidth-o3_frame.innerWidth));
if(SB>20)SB=20;iWd=o3_frame.innerWidth;}
-pgLeft=(OLie4)?o.scrollLeft:o3_frame.pageXOffset;
+pgLeft=(OLie4&&!OLop95)?o.scrollLeft:o3_frame.pageXOffset;
if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow)SB=CX=5;else
if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowx){SB+=((o3_shadowx>0)?o3_shadowx:0);
LM=((o3_shadowx<0)?Math.abs(o3_shadowx):0);CX=Math.abs(o3_shadowx);}
@@ -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;}
if(!o3_nojustx&&X+pWd>pgLeft+iWd-SB)
X=iWd+pgLeft-pWd-SB;if(!o3_nojustx&&X-LM<pgLeft)X=pgLeft+LM;
-pgTop=OLie4?o.scrollTop:o3_frame.pageYOffset;
-if(!OLkht&&!nsb&&o&&o.clientHeight)iHt=o.clientHeight;
+pgTop=OLie4&&!OLop95?o.scrollTop:o3_frame.pageYOffset;
+if(!OLkht&&!OLop95&&!nsb&&o&&o.clientHeight)iHt=o.clientHeight;
else if(o3_frame.innerHeight)iHt=o3_frame.innerHeight;
if(OLbubblePI&&o3_bubble)pHt=OLbubbleHt;else pHt=OLns4?over.clip.height:over.offsetHeight;
if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowy){TM=(o3_shadowy<0)?Math.abs(o3_shadowy):0;
@@ -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
function OLpageLoc(o,t){
var l=0,s=o;while(o.offsetParent&&o.offsetParent.tagName.toLowerCase()!='html'){l+=o['offset'+t];o=o.offsetParent;}
-l+=o['offset'+t];while(s=s.parentNode){if((s['scroll'+t]>0)&&s.tagName.toLowerCase()=='div')l-=s['scroll'+t];}return l;
+l+=o['offset'+t];if(!OLop7)while(s=s.parentNode){if((s['scroll'+t]>0)&&s.tagName.toLowerCase()=='div')l-=s['scroll'+t];}
+return l;
}
// Moves layer
function OLmouseMove(e){
-var e=(e||event);OLcC=(OLovertwoPI&&over2&&over==over2?cClick2:cClick);OLx=(e.pageX||e.clientX+OLfd().scrollLeft);
-OLy=(e.pageY||e.clientY+OLfd().scrollTop);if((OLallowmove&&over)&&(o3_frame==self||over==OLgetRefById()||(OLovertwoPI&&
-over2==over&&over==OLgetRefById('overDiv2')))){OLplaceLayer();if(OLhidePI)OLhideUtil(0,1,1,0,0,0);}if(OLhover&&over&&
-o3_frame==self&&OLcursorOff())if(o3_offdelay<1)OLcC();else{if(OLtimerid>0)clearTimeout(OLtimerid);
-OLtimerid=setTimeout("OLcC()",o3_offdelay);}
+var e=(e||event);OLx=(e.pageX||e.clientX+OLfd().scrollLeft);OLy=(e.pageY||e.clientY+OLfd().scrollTop);if((OLallowmove&&
+over)&&(o3_frame==self||over==OLgetRefById()||(OLovertwoPI&&over2==over&&over==OLgetRefById('overDiv2')))){OLplaceLayer();
+if(OLhidePI)OLhideUtil(0,1,1,0,0,0);}
}
// Capture mouse and chain other scripts.
@@ -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);
for(i=0;i<ar.length;i++){if(md<0){if(typeof ar[i]=='number'){OLudf=(par?1:0);i--;}
else{switch(pf){case 'ol_':ol_text=ar[i];break;default:o3_text=ar[i];}}md=0;}else{
-if(ar[i]==INARRAY){OLudf=0;eval(pf+'text=ol_texts['+ar[++i]+']');continue;}
-if(ar[i]==CAPARRAY){eval(pf+'cap=ol_caps['+ar[++i]+']');continue;}
+if(ar[i]==INARRAY){OLudf=0;eval(pf+'text=ol_texts['+ar[(++i)]+']');continue;}
+if(ar[i]==CAPARRAY){eval(pf+'cap=ol_caps['+ar[(++i)]+']');continue;}
if(ar[i]==CAPTION){q(ar[++i],pf+'cap');continue;}
if(Math.abs(ar[i])==STICKY){t(ar[i],pf+'sticky');continue;}
if(Math.abs(ar[i])==NOFOLLOW){t(ar[i],pf+'nofollow');continue;}
@@ -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;
if(o3_frame!=self)o=OLgetRefById();if(o){if(o.onmouseover)o.onmouseover=null;if(OLscrollPI&&o==over)OLclearScroll();
if(OLdraggablePI)OLclearDrag();if(OLfilterPI)OLcleanupFilter(o);if(OLshadowPI)OLhideShadow();var os=(OLns4)?o:o.style;
-if(((OLfilterPI)&&!OLchkFadeOut(os))||!OLfilterPI){os.visibility="hidden";if(!OLie55||!OLfilterPI||!o3_filter||
-o3_fadeout<0)o.innerHTML='';}if(OLhidePI&&o==over)OLhideUtil(0,0,1);if(OLiframePI)OLhideIfs(o);}
+if(((OLfilterPI)&&!OLchkFadeOut(os))||!OLfilterPI){os.visibility="hidden";if(!OLie55||(typeof ggOnChange=='undefined'&&
+(!OLfilterPI||!o3_filter||o3_fadeout<0)))o.innerHTML='';}if(OLhidePI&&o==over)OLhideUtil(0,0,1);if(OLiframePI)OLhideIfs(o);}
}
// Moves layer
@@ -588,8 +588,9 @@ o=(OLns4)?o:o.style;o.left=(OLns4?xL:xL+'px');o.top=(OLns4?yL:yL+'px'); // Handle NOCLOSE-MOUSEOFF
function OLoptMOUSEOFF(c){
-if(!c)o3_close="";
-over.onmouseover=function(){OLhover=1;if(OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}}
+if(!c)o3_close="";over.onmouseover=function(){OLhover=1;if(OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}}
+over.onmouseout=function(){if(OLhover){OLcC=(OLovertwoPI&&over2&&over==over2?cClick2:cClick);if(OLtimerid>0)
+clearTimeout(OLtimerid);OLtimerid=setTimeout("OLcC()",(o3_offdelay<1)?1:o3_offdelay);}}
}
function OLcursorOff(){
var o=(OLns4?over:over.style),pHt=OLns4?over.clip.height:over.offsetHeight,left=parseInt(o.left),top=parseInt(o.top),
@@ -608,7 +609,7 @@ if(OLcmdLine.length){for(var k=0;k<OLcmdLine.length;k++){var j=OLcmdLine[k](pf,i }
function OLregCmds(c){
if(typeof c!='string')return;var pM=c.split(',');pMtr=pMtr.concat(pM);
-for(var i=0;i<pM.length;i++)eval(pM[i].toUpperCase()+'='+pmCnt++);
+for(var i=0;i<pM.length;i++)eval(pM[i].toUpperCase()+'='+(pmCnt++));
}
function OLregRunTimeFunc(f){
if(typeof f=='object')OLrunTime=OLrunTime.concat(f);else OLrunTime[OLrunTime.length++]=f;
diff --git a/httemplate/elements/overlibmws_crossframe.js b/httemplate/elements/overlibmws_crossframe.js index dd6422313..e1bbf413d 100644 --- a/httemplate/elements/overlibmws_crossframe.js +++ b/httemplate/elements/overlibmws_crossframe.js @@ -1,7 +1,7 @@ /*
- overlibmws_crossframe.js plug-in module - Copyright Foteos Macrides 2003-2008. All rights reserved.
+ overlibmws_crossframe.js plug-in module - Copyright Foteos Macrides 2003-2010. All rights reserved.
For support of FRAME.
- Initial: August 3, 2003 - Last Revised: January 16, 2008
+ Initial: August 3, 2003 - Last Revised: October 25, 2008
See the Change History and Command Reference for overlibmws via:
http://www.macridesweb.com/oltest/
@@ -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),
sFrm=OLgetFrameRef(top.frames,ol_frame);if(sFrm.length==tFrm.length) {l=tFrm.lastIndexOf('[');if(l){
while(sFrm.substring(0,l)!=tFrm.substring(0,l))l=tFrm.lastIndexOf('[',l-1);tFrm=tFrm.substr(l);sFrm=sFrm.substr(l);}}
-var i,k,cnt=0,p='',str=tFrm;while((k=str.lastIndexOf('['))!= -1){cnt++;str=str.substring(0,k);}
-for(i=0;i<cnt;i++)p=p+'parent.';OLfnRef=p+'frames'+sFrm+'.';var n=window.name,o;
+var i,k,cnt=0,p='',str=tFrm;while((k=str.lastIndexOf('['))!= -1){cnt++;str=str.substring(0,k);}if(!sFrm&&o3_frame==parent)
+sFrm=OLgetFrameRef(parent,self);else for(i=0;i<cnt;i++)p=p+'parent.';OLfnRef=p+'frames'+sFrm+'.';var n=window.name,o;
if((n&&parent!=self&&o3_frame==parent)&&(o=OLgetRef(n,parent.document))){if(OLie4&&!OLop7){
OLx=event.clientX+OLfd().scrollLeft;OLy=event.clientY+OLfd().scrollTop;}
OLifX=OLpageLoc(o,'Left')-(OLie4&&!OLop7?OLfd().scrollLeft:self.pageXOffset);
@@ -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));}}
}
+function OLchkFRAME(args){
+var OLfrmVal=self;for(var i=0;i<args.length;i++){if(typeof args[i]=='number'&&args[i]==FRAME){OLfrmVal=args[i+1];break;}}
+if(OLfrmVal!=self&&OLfrmVal.over&&OLfrmVal.cClick)OLfrmVal.cClick();
+}
+
OLregCmdLineFunc(OLparseCrossframe);
OLcrossframePI=1;
diff --git a/httemplate/elements/overlibmws_draggable.js b/httemplate/elements/overlibmws_draggable.js index 1bf0ecfd1..d2b5eb1ad 100644 --- a/httemplate/elements/overlibmws_draggable.js +++ b/httemplate/elements/overlibmws_draggable.js @@ -1,5 +1,5 @@ /*
- overlibmws_draggable.js plug-in module - Copyright Foteos Macrides 2002-2008. All rights reserved.
+ overlibmws_draggable.js plug-in module - Copyright Foteos Macrides 2002-2010. All rights reserved.
For support of the DRAGGABLE feature.
Initial: August 24, 2002 - Last Revised: January 26, 2008
See the Change History and Command Reference for overlibmws via:
diff --git a/httemplate/elements/overlibmws_iframe.js b/httemplate/elements/overlibmws_iframe.js index 4c937d3d7..a06bdc515 100644 --- a/httemplate/elements/overlibmws_iframe.js +++ b/httemplate/elements/overlibmws_iframe.js @@ -1,5 +1,5 @@ /*
- overlibmws_iframe.js plug-in module - Copyright Foteos Macrides 2003-2008. All rights reserved.
+ overlibmws_iframe.js plug-in module - Copyright Foteos Macrides 2003-2010. All rights reserved.
Masks system controls to prevent obscuring of popops for IE v5.5 or higher.
Initial: October 19, 2003 - Last Revised: January 26, 2008
See the Change History and Command Reference for overlibmws via:
diff --git a/httemplate/elements/phonenumber.html b/httemplate/elements/phonenumber.html index 60414a644..854f5846d 100644 --- a/httemplate/elements/phonenumber.html +++ b/httemplate/elements/phonenumber.html @@ -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> diff --git a/httemplate/elements/search-cust_main.html b/httemplate/elements/search-cust_main.html index dbcc2ed0b..23c4369e8 100644 --- a/httemplate/elements/search-cust_main.html +++ b/httemplate/elements/search-cust_main.html @@ -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; @@ -61,11 +74,11 @@ 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'; @@ -88,7 +101,7 @@ //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 = ''; @@ -117,17 +130,17 @@ } - 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'; @@ -142,7 +155,7 @@ } else { - what.form.<% $opt{'field_name'} %>.value = custnum; + what.form.<% $field %>.value = custnum; customer_obj.value = customer; customer_obj.style.color = '#000000'; @@ -165,7 +178,8 @@ <%init> my( %opt ) = @_; -$opt{'field_name'} ||= 'custnum'; + +my $field = $opt{'field'} || $opt{'field_name'} || 'custnum'; my $value = $opt{'curr_value'} || $opt{'value'}; diff --git a/httemplate/elements/select-areacode.html b/httemplate/elements/select-areacode.html index aa2d73b65..453205c02 100644 --- a/httemplate/elements/select-areacode.html +++ b/httemplate/elements/select-areacode.html @@ -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> diff --git a/httemplate/elements/select-did.html b/httemplate/elements/select-did.html index af8d59513..b62d6a089 100644 --- a/httemplate/elements/select-did.html +++ b/httemplate/elements/select-did.html @@ -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 index 000000000..4c04466db --- /dev/null +++ b/httemplate/elements/select-svc-domain.html @@ -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 index 000000000..19bce96ca --- /dev/null +++ b/httemplate/elements/select-svc_pbx.html @@ -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> diff --git a/httemplate/elements/select-table.html b/httemplate/elements/select-table.html index 10a8b2741..c280c3631 100644 --- a/httemplate/elements/select-table.html +++ b/httemplate/elements/select-table.html @@ -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'}; diff --git a/httemplate/elements/tr-input-beginning_ending.html b/httemplate/elements/tr-input-beginning_ending.html index 8a1dd62a9..2aa597479 100644 --- a/httemplate/elements/tr-input-beginning_ending.html +++ b/httemplate/elements/tr-input-beginning_ending.html @@ -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}; diff --git a/httemplate/elements/tr-input-date-field.html b/httemplate/elements/tr-input-date-field.html index 2a731e1e8..ff4996faf 100644 --- a/httemplate/elements/tr-input-date-field.html +++ b/httemplate/elements/tr-input-date-field.html @@ -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 index 000000000..9df91a18f --- /dev/null +++ b/httemplate/elements/tr-search-cust_main.html @@ -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> diff --git a/httemplate/elements/tr-select-cust_location.html b/httemplate/elements/tr-select-cust_location.html index da16dfe1c..bc3915441 100644 --- a/httemplate/elements/tr-select-cust_location.html +++ b/httemplate/elements/tr-select-cust_location.html @@ -118,7 +118,7 @@ Example: </SCRIPT> <TR> - <TH ALIGN="right">Service location</TH> + <<%$th%> ALIGN="right"><% $opt{'label'} || 'Service 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 index 000000000..437bc5896 --- /dev/null +++ b/httemplate/elements/tr-select-svc-domain.html @@ -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 index 000000000..b02bd65c3 --- /dev/null +++ b/httemplate/elements/tr-select-svc_pbx.html @@ -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 index 000000000..d594b558a --- /dev/null +++ b/httemplate/misc/bulk_pkg_increment_bill.cgi @@ -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> diff --git a/httemplate/misc/cancel_pkg.html b/httemplate/misc/cancel_pkg.html index 607ce13c4..67d2847cc 100755 --- a/httemplate/misc/cancel_pkg.html +++ b/httemplate/misc/cancel_pkg.html @@ -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" }); @@ -58,7 +58,10 @@ <%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') ) { diff --git a/httemplate/misc/delay_susp_pkg.html b/httemplate/misc/delay_susp_pkg.html index d4a6da18f..8adc40d55 100755 --- a/httemplate/misc/delay_susp_pkg.html +++ b/httemplate/misc/delay_susp_pkg.html @@ -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" }); @@ -42,7 +42,10 @@ <%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 index 000000000..6b91de807 --- /dev/null +++ b/httemplate/misc/delete-mailinglistmember.html @@ -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> diff --git a/httemplate/misc/order_pkg.html b/httemplate/misc/order_pkg.html index a7571ca58..85573e6b4 100644 --- a/httemplate/misc/order_pkg.html +++ b/httemplate/misc/order_pkg.html @@ -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; diff --git a/httemplate/misc/process/copy-rate_detail.html b/httemplate/misc/process/copy-rate_detail.html index 87a674566..60b2aebee 100644 --- a/httemplate/misc/process/copy-rate_detail.html +++ b/httemplate/misc/process/copy-rate_detail.html @@ -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'; diff --git a/httemplate/misc/rate_edit_excel.html b/httemplate/misc/rate_edit_excel.html index e73133c05..442d83aca 100644 --- a/httemplate/misc/rate_edit_excel.html +++ b/httemplate/misc/rate_edit_excel.html @@ -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> diff --git a/httemplate/pref/pref-process.html b/httemplate/pref/pref-process.html index 378164e7b..708583df5 100644 --- a/httemplate/pref/pref-process.html +++ b/httemplate/pref/pref-process.html @@ -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 ); diff --git a/httemplate/pref/pref.html b/httemplate/pref/pref.html index 562ef2980..7ded18377 100644 --- a/httemplate/pref/pref.html +++ b/httemplate/pref/pref.html @@ -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) %> diff --git a/httemplate/search/cust_bill.html b/httemplate/search/cust_bill.html index c1f5517af..8d72357dc 100755 --- a/httemplate/search/cust_bill.html +++ b/httemplate/search/cust_bill.html @@ -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, diff --git a/httemplate/search/cust_bill_pay.html b/httemplate/search/cust_bill_pay.html index 3c390e706..4272d8669 100644 --- a/httemplate/search/cust_bill_pay.html +++ b/httemplate/search/cust_bill_pay.html @@ -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 : '' } @@ -44,6 +44,10 @@ '', '', '', + '', + '', + '', + '', FS::UI::Web::cust_colors(), ], 'style' => [ @@ -51,6 +55,10 @@ '', '', '', + '', + '', + '', + '', 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(), diff --git a/httemplate/search/cust_bill_pkg.cgi b/httemplate/search/cust_bill_pkg.cgi index 9b0201c29..2e79cd75d 100644 --- a/httemplate/search/cust_bill_pkg.cgi +++ b/httemplate/search/cust_bill_pkg.cgi @@ -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(), @@ -24,7 +33,22 @@ }, #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' ) { @@ -36,6 +60,12 @@ } 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 : '' } @@ -52,12 +83,16 @@ ), ], #'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(), @@ -67,6 +102,7 @@ '', '', '', + ( $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(); diff --git a/httemplate/search/cust_main-zip.html b/httemplate/search/cust_main-zip.html index 56df924bc..e87b21474 100644 --- a/httemplate/search/cust_main-zip.html +++ b/httemplate/search/cust_main-zip.html @@ -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 diff --git a/httemplate/search/cust_pkg.cgi b/httemplate/search/cust_pkg.cgi index ee4c82d8e..83cd206cb 100755 --- a/httemplate/search/cust_pkg.cgi +++ b/httemplate/search/cust_pkg.cgi @@ -143,7 +143,6 @@ ), '', ], - '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> diff --git a/httemplate/search/elements/cust_pay_or_refund.html b/httemplate/search/elements/cust_pay_or_refund.html index b1296d1b0..4f83d0ab6 100755 --- a/httemplate/search/elements/cust_pay_or_refund.html +++ b/httemplate/search/elements/cust_pay_or_refund.html @@ -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> diff --git a/httemplate/search/elements/search-html.html b/httemplate/search/elements/search-html.html index c0bb721f7..6b915a617 100644 --- a/httemplate/search/elements/search-html.html +++ b/httemplate/search/elements/search-html.html @@ -144,11 +144,6 @@ % $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 index 000000000..99330fadd --- /dev/null +++ b/httemplate/search/h_cust_pay.html @@ -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' ], + ) +%> diff --git a/httemplate/search/inventory_item.html b/httemplate/search/inventory_item.html index cd37e267b..ba449ecd7 100644 --- a/httemplate/search/inventory_item.html +++ b/httemplate/search/inventory_item.html @@ -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 index 000000000..ee395f416 --- /dev/null +++ b/httemplate/search/mailinglistmember.html @@ -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 index 000000000..87237c7cf --- /dev/null +++ b/httemplate/search/part_pkg.html @@ -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> diff --git a/httemplate/search/report_cust_main-zip.html b/httemplate/search/report_cust_main-zip.html index aa802f302..00cb9ed2c 100644 --- a/httemplate/search/report_cust_main-zip.html +++ b/httemplate/search/report_cust_main-zip.html @@ -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 @@ -33,6 +33,23 @@ </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 index 000000000..a79630a76 --- /dev/null +++ b/httemplate/search/report_employee_commission.html @@ -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 index 000000000..4e47b3831 --- /dev/null +++ b/httemplate/search/report_h_cust_pay.html @@ -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> diff --git a/httemplate/search/report_prepaid_income.cgi b/httemplate/search/report_prepaid_income.cgi index ce928b81c..c0e2b807e 100644 --- a/httemplate/search/report_prepaid_income.cgi +++ b/httemplate/search/report_prepaid_income.cgi @@ -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> diff --git a/httemplate/search/report_prepaid_income.html b/httemplate/search/report_prepaid_income.html index d707bd81b..04801beee 100644 --- a/httemplate/search/report_prepaid_income.html +++ b/httemplate/search/report_prepaid_income.html @@ -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> diff --git a/httemplate/view/cust_main.cgi b/httemplate/view/cust_main.cgi index 6e024132b..6eea2b09e 100755 --- a/httemplate/view/cust_main.cgi +++ b/httemplate/view/cust_main.cgi @@ -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 ) %> diff --git a/httemplate/view/cust_main/notes.html b/httemplate/view/cust_main/notes.html index 833c92e67..71511dc93 100755 --- a/httemplate/view/cust_main/notes.html +++ b/httemplate/view/cust_main/notes.html @@ -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"> </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"!; @@ -50,8 +53,11 @@ <% $note->otaker%> </TD> <TD CLASS="grid" BGCOLOR="<% $bgcolor %>"> - <%$note->comments%><% $edit %> + <%$note->comments%> </TD> +% if($edit) { + <TD CLASS="grid" BGCOLOR="<% $bgcolor %>"><% $edit %></TD> +% } </TR> % } #end display notes diff --git a/httemplate/view/cust_main/payment_history.html b/httemplate/view/cust_main/payment_history.html index 56a2c4dde..0dc4c41d5 100644 --- a/httemplate/view/cust_main/payment_history.html +++ b/httemplate/view/cust_main/payment_history.html @@ -205,11 +205,11 @@ <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> @@ -297,7 +297,7 @@ <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 ) diff --git a/httemplate/view/cust_main/payment_history/credit.html b/httemplate/view/cust_main/payment_history/credit.html index 058c6f536..fa5838e4e 100644 --- a/httemplate/view/cust_main/payment_history/credit.html +++ b/httemplate/view/cust_main/payment_history/credit.html @@ -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 .= ' '. '$'. $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"; diff --git a/httemplate/view/cust_main/payment_history/payment.html b/httemplate/view/cust_main/payment_history/payment.html index a4a349bb8..53fc0dad3 100644 --- a/httemplate/view/cust_main/payment_history/payment.html +++ b/httemplate/view/cust_main/payment_history/payment.html @@ -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 .= ' '. '$'. $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"; diff --git a/httemplate/view/cust_main/payment_history/voided_payment.html b/httemplate/view/cust_main/payment_history/voided_payment.html index 610372721..be68ff091 100644 --- a/httemplate/view/cust_main/payment_history/voided_payment.html +++ b/httemplate/view/cust_main/payment_history/voided_payment.html @@ -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; diff --git a/httemplate/view/cust_main/tickets.html b/httemplate/view/cust_main/tickets.html index 167849c76..e1f9a131e 100644 --- a/httemplate/view/cust_main/tickets.html +++ b/httemplate/view/cust_main/tickets.html @@ -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 index 000000000..8ccfce3ff --- /dev/null +++ b/httemplate/view/cust_svc.cgi @@ -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 index 000000000..c5f2555bd --- /dev/null +++ b/httemplate/view/elements/svc_export_settings.html @@ -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 index 000000000..e2ec7d42f --- /dev/null +++ b/httemplate/view/elements/tr.html @@ -0,0 +1,9 @@ +<TR> + <TD ALIGN="right"><% $opt{'label'} %></TD> + <TD BGCOLOR="#ffffff"><% $opt{'value'} %></TD> +</TR> +<%init> + +my %opt = @_; + +</%init> diff --git a/httemplate/view/svc_acct.cgi b/httemplate/view/svc_acct.cgi index 44a2aa611..9135e67e9 100755 --- a/httemplate/view/svc_acct.cgi +++ b/httemplate/view/svc_acct.cgi @@ -14,328 +14,63 @@ } </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 index 000000000..92b9ad7fe --- /dev/null +++ b/httemplate/view/svc_acct/basics.html @@ -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 index 000000000..33d44a713 --- /dev/null +++ b/httemplate/view/svc_acct/change_svc.html @@ -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 index 000000000..4f10922ba --- /dev/null +++ b/httemplate/view/svc_acct/change_svc_form.html @@ -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 index 000000000..1d83603b7 --- /dev/null +++ b/httemplate/view/svc_acct/hosting.html @@ -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 index 000000000..e2253a34a --- /dev/null +++ b/httemplate/view/svc_acct/radius_usage.html @@ -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 index 000000000..9758d8332 --- /dev/null +++ b/httemplate/view/svc_acct/usage.html @@ -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> diff --git a/httemplate/view/svc_domain.cgi b/httemplate/view/svc_domain.cgi index a9fc775ee..3938a3406 100755 --- a/httemplate/view/svc_domain.cgi +++ b/httemplate/view/svc_domain.cgi @@ -1,136 +1,40 @@ -<% 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> -% } -% if ( defined($ops{'transfer'}) ) { - <A HREF="<% ${p} %>edit/process/domreg.cgi?op=transfer&svcnum=<% $svcnum %>">Transfer to <% $registrar->{'name'} %></A> -% } -% if ( defined($ops{'renew'}) ) { - <A HREF="<% ${p} %>edit/process/domreg.cgi?op=renew&svcnum=<% $svcnum %>&period=1">Renew at <% $registrar->{'name'} %></A> -% } -% 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 index 000000000..0c072bff5 --- /dev/null +++ b/httemplate/view/svc_domain/acct_defaults.html @@ -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 index 000000000..db4fac150 --- /dev/null +++ b/httemplate/view/svc_domain/basics.html @@ -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> +% } +% if ( defined($ops{'transfer'}) ) { + <A HREF="<% ${p} %>edit/process/domreg.cgi?op=transfer&svcnum=<% $svcnum %>">Transfer to <% $registrar->{'name'} %></A> +% } +% if ( defined($ops{'renew'}) ) { + <A HREF="<% ${p} %>edit/process/domreg.cgi?op=renew&svcnum=<% $svcnum %>&period=1">Renew at <% $registrar->{'name'} %></A> +% } +% 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 index 000000000..f6f8c71c7 --- /dev/null +++ b/httemplate/view/svc_domain/dns.html @@ -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> + diff --git a/httemplate/view/svc_forward.cgi b/httemplate/view/svc_forward.cgi index 0847a5e65..43d8a4e8b 100755 --- a/httemplate/view/svc_forward.cgi +++ b/httemplate/view/svc_forward.cgi @@ -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 index 000000000..f646a417d --- /dev/null +++ b/httemplate/view/svc_mailinglist.cgi @@ -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> diff --git a/httemplate/view/svc_phone.cgi b/httemplate/view/svc_phone.cgi index c5fce62d9..75591c747 100644 --- a/httemplate/view/svc_phone.cgi +++ b/httemplate/view/svc_phone.cgi @@ -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', @@ -19,10 +15,36 @@ %> <%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' => ' ', + '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>'; diff --git a/rpm/freeside.spec b/rpm/freeside.spec index 931227043..d6e4967dd 100644 --- a/rpm/freeside.spec +++ b/rpm/freeside.spec @@ -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 index 14200c1f3..000000000 --- a/rt/etc/rt.spec +++ /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 diff --git a/rt/lib/RT/URI/freeside.pm b/rt/lib/RT/URI/freeside.pm index d73dbacad..57c2a2c4e 100644 --- a/rt/lib/RT/URI/freeside.pm +++ b/rt/lib/RT/URI/freeside.pm @@ -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"; } |