ya todo update
[freeside.git] / TODO
1 $Id: TODO,v 1.39 1999-09-22 22:06:34 ivan Exp $
2
3 If you are interested in helping with any of these, please join the mailing
4 list (send a blank message to ivan-freeside-subscribe@sisd.com) to avoid 
5 duplication of effort.
6
7 ---
8
9 Your suggested script with back up /usr/local/etc/freeside, but will miss
10 any database not named `freeside'.  Both of our scripts are specific to
11 MySQL.  If you're interested in contributing to Freeside, maybe you could
12 work on a script which: reads the mapsecrets configuration file and then
13 each secrets file to find out what specific database engine(s) (MySQL,
14 PostgreSQL, etc.) and database(s) need to be backed up, then does so,
15 serializing backups of the same engine, i.e. stop mysql, do all the mysql
16 backups, start mysql, stop postgresql, do all the postgresql backups,
17 start postgresql, etc.
18 > #!/bin/sh                                                                     
19 > apachectl stop                                                                
20 > mysqldump -t freeside > fs-backup.sql                                         
21 > apachectl start                                                               
22 > tar -Pzcvf fs-backup-`date +%y%m%d%H%M%S`.tgz fs-backup.sql /usr/local/etc/freeside/                                                       
23 > rm fs-backup.sql                                                              
24
25 I chose to use counters in the filesystem because there is no standard way
26 to get the value of an auto-incrementing keyfield which is common across  
27 all databases (as seen through DBI/DBD).
28 .
29 It certainly wouldn't be a bad idea to use the database-specific methods,
30 when available.
31
32 htdocs/edit/svc_acct.cgi:
33 (Does the `*HIDDEN*' show up when you are adding a new account, and 
34 specify the password, then receive an error and are returned to the form?)
35
36 more DOC:
37 Thought some of you might be interested in this:
38   
39 <ftp://ftp.minivend.com/pub> has CyberCash compatibility modules for 
40 Paymentnet <http://www.paymentnet.com> and Authorizenet 
41 <http://www.authorizenet.com> which should allow you process transactions
42 using those services as well as CyberCash.
43
44 The files are named CCLib.pm.paymentnet and CCLib.pm_authorizenet,
45 respectively, and are installed by renaming to CCLib.pm and moving to your
46 site_perl directory.  Otherwise, follow the directions for Cybercash v2 in
47 htdocs/docs/config.html
48
49 DOC:
50 fs_passwd/ is a client-server replacement for the `passwd', `chfn' and    
51 `chsh' commands that updates the Freeside database.  (so for that to be   
52 useful, you'd have to be exporting that data periodically)
53   
54 fs_radlog/ is a client-server RADIUS log parser that stuffs the data into
55 SQL.  It isn't finished, and probably won't be unless someone who I can't
56 convince to use one of the RADIUS daemons that logs to SQL directly pays  
57 me money or something.
58   
59 fs_signup/ is a client-server signup server.  i'm just finishing it up    
60 now; probably isn't on your machine yet.
61
62
63 http://www.sisd.com/freeside/list-archive/msg00812.html
64
65 package definitions should be implicit allow wrt agent types, not implicit deny
66 (with the old behavior possible via a config file)
67
68 > So is there anyway it could be setup to allow you to select a "primary
69 > service" from each package?  This service would be the one you were prompted
70 > for.  Could the signup server then be expanded to allow users to go into
71 > their package and "turn-on" the remaining non-primary services(using the
72 > primary account.)
73
74 take the GPL'ed whois proxy stuff at www.geektools.com and turn it into
75 intelligence for Net::Whois.
76
77 A web version of the fs_passwd stuff would be nifty.   
78
79 If you have Cistron authenticating directly from MySQL, you can replicate
80 in real-time instead of exporting periodically.  See 
81 <http://www.mysql.com/Manual_chapter/manual_Common_problems.html#Replication>.
82
83 these go in docs:
84 <http://www.sisd.com/freeside/list-archive/msg00546.html>, and
85 <http://www.sisd.com/freeside/list-archive/msg00554.html>
86
87 and http://www.sisd.com/freeside/list-archive/msg00423.html
88
89 > > 5: Is there anyway to get freeside to send a sysadmin a warning when a
90 > > credit card has expired?
91 No, but there should be.
92
93 Put this in the doc (quoting Mark Wells <mark@pc-intouch.com>):
94 >Of course, thanks to the sheer coolness of SQL and MyODBC, you can do
95 >whatever reports you want in basically whatever application you want.
96 >There's no need for Freeside itself to do any reports at all.
97
98 middle names and titles
99
100 On Wed, Jul 07, 1999 at 01:11:40PM -0400, Frank Nazario wrote:
101 > Playing and entering information to Freeside i encountered the following
102 > missing reports:
103
104 > View Customers by Agent
105
106 > View Pending Invoices
107
108
109 grep 'uncomment this to encrypt password immediately' site_perl/svc_acct.pm
110 Not to say that it shouldn't be a configurable option.
111
112 in site_perl/cust_main_invoice.pm (elsewhere?), error out if mydomain config file is gone
113 (at least until the idea of a default domain goes away)
114
115 FS::Record::qsearch does an eval every loop iteration (which is itself not
116 guaranteed to work across all DBD's and should be fixed).  This has got to be
117 slow.  Fix it.  (I think recent Perls might have a way to accept a variable
118 there, no eval needed?)
119
120 Could you have added /bin/sync, /sbin/shutdown, and /bin/halt to the
121 `shells' configuration file before importing, and removed them afterwords?
122 (even better if svc_acct.import did that automatically - it could just    
123 munge and restore @FS::svc_acct::shells... hmm.)
124
125 > BTW, Ivan, I am trying to verify in an additional database table that a
126 > particular user doesn't exist. This database is used to store email aliases a$
127 > additional POP boxes for our customers (kinda like AOL allows). I have toyed  
128 > with the idea of just writing the aliases to an email only svc_acct that
129 > doesn't write to the password file, but that isn't really how I want to do it.
130
131 Actually, I think that's a pretty good way to do it.  Cerkit contributed
132 support a little while back for svc_acct.pm and svc_acct.export for
133 multiple export targets.  It needs to be cleaned up and documented, which
134 I'll try to get to soon.  For this to work correctly, the svc_acct_sm
135 table should go away, along with the concept of a "default" domain.  
136
137 default setting for new packages should allow all agents to purchase them...
138 with a config file for the old behaviour
139
140 replace Term::Query  with Quiz::Question?
141
142 Check config file reading stuff from CPAN
143  
144 Authorizenet module from CPAN!
145
146 <http://www.math.fu-berlin.de/~leitner/mutt/faq.html> has a good y2k complience
147 statement!
148
149     I'm hoping Freeside can support arbitrailly complex pricing plans
150     because of a simple concept: all prices are perl expressions.  So if
151     you use `19.95' for example, perl evalates that to be `19.95'.  But if
152     you need to do a complex pricing scheme, you just need to write an
153     appropriate perl expression, which will most likely pull data from the
154     database to return pricing.  Some things will already log to SQL; for
155     example most RADIUS servers can or have a patch available.  Getting
156     Freeside to bill based on any sort of data then becomes a matter of
157     importing the data into the database.
158  
159     There are some issues involved with pro-rating, partial month charges,
160     that sort of thing.  Expressions will need a standard way to have the
161     applicable time/data ranges passed to them.  Also the expressions are
162     currently running under the Safe perl module, and the opmask might not
163     be right in all situations.  I'll try to spend some time working on
164     this if you are using it.
165
166 > 2. can customers view their bills on-line.                                    
167  
168 Not yet; it needs to be proxied from Freeside to a customer web server in
169 a secure way using something not completely unlike the fs_passwd,
170 fs_passwdd, fs_passwd_server trio.
171
172
173 > Lastly, if someone over pays on an invoice, the credit part does not flow
174 > over to other invoices..
175
176 The total balance flows over correctly, but individual payments don't.
177 The code you're looking for is in FS::cust_pay::insert
178
179 The question of what to do with overpayments that don't have another 
180 invoice to flow into (yet.. or possibly not) is still an open one.    The
181 legacy system Freeside replaced long ago had a separate place for this
182 (payments waiting for an invoice) for each customer, and it gave our
183 bookeeper fits.
184
185
186 option to relax username uniqueness in favor of username+domain or mail/shell
187 vs. radius to ease import for isp's with namespace problems or who buy others.
188
189 do i have to store anything for radius realms besides regular radius attributes
190 (which are handled fine now)?
191
192 warn or complain or something when invoice_from is empty (and we use it)
193
194 Right now Freeside uses the `freq' field of a package definition as a 
195 number of months.  The specific section of code you're looking for is in  
196 FS::cust_main::bill:
197         
198         #change this bit to use Date::Manip?
199         #$sdate=$cust_pkg->bill || time;
200         #$sdate=$cust_pkg->bill || $time;
201         $sdate = $cust_pkg->bill || $cust_pkg->setup || $time;
202         my ($sec,$min,$hour,$mday,$mon,$year) =
203           (localtime($sdate) )[0,1,2,3,4,5];
204         $mon += $part_pkg->getfield('freq');
205         until ( $mon < 12 ) { $mon -= 12; $year++; }
206         $cust_pkg->setfield('bill',
207           timelocal($sec,$min,$hour,$mday,$mon,$year));
208         $cust_pkg_mod_flag = 1;
209   
210 ..and when I went poking for this, looks like it tells us just what needs   
211 to be done!  Hehehe...
212
213 Date::Manip can handle cool things like "+ 1 month" (actually the current
214 case of /^(\d+)$/ would have to be added as a special case of "+ $1 
215 month") and "+ 30 days" (what you need) and even "+ 5 business days" !
216
217
218 On Wed, Apr 28, 1999 at 08:38:16PM +0000, Kristian Hoffmann wrote:
219 > I can't quite seem to figure out how this exporting works.  From what I
220 > understand, when you run svc_acct.export, it rewrites the /etc/passwd,
221 > /etc/shadow, etc. files.  Is this only for initial setups with the
222 > export hooks being in the pm's?
223  
224 You can use both, or just one method.  The configuration files control    
225 this.  One of the things in the TODO is to take out the last few things   
226 that aren't customizable wrt this and put them in config files.
227
228 http://www.daemonnews.org/199905/user-mgmt.html
229
230 Term::Query doesn't install out of the box from CPAN.  Fix it (and get it 
231 submitted upstream!), or remove requirement from bin/svc_acct.import and
232 bin/svc_acct_sm.import and take it out of the install instructions.
233
234 use this cool link to explain the Freeside API
235 ftp://cpan.nas.nasa.gov/pub/perl/CPAN/doc/FMTEYEWTK/easy_objects.html
236
237 Multiple tax rates by geographic region (county, state, and county) are   
238 supported; just choose View/Edit tax rates from the main menu.
239
240 Multiple tax rates by package are not (yet) supported.
241
242 On Wed, Jul 07, 1999 at 12:13:36PM -0400, Shaun Batterton wrote:
243 > How would you handle something like multiple tax rates and multiple   
244 > states?  For example in Connecticut, they just changed computer and/or
245 > data processing services to 3% (whatever that is), and everything else
246 > is 6%.
247
248
249 > Second, when trying to add a new user I get two types of errors; first one
250 > is when I place an e-mail address and select the "submit," Freeside
251 > complains with "Error: Unknown local account (specified literally)"
252 .  
253 You probably put a (local) email address in for email invoices.  Freeside
254 stores these as references to the database records, so (for example) they
255 follow username changes.
256 .
257 I'm guessing you put in the email address that you were creating, and got
258 that error because it didn't exist yet.  Sounds like a buglet to me.  I'll
259 try to fix that soon; in the meantime you can add the invoicing email 
260 address afterwords.
261
262 Postgres `money' time sucks rocks anyway.  I'll probably just require 6.5
263 and use the numeric types, which *finally* work right.
264 On Sat, Apr 24, 1999 at 12:52:00PM -0700, Mr. Poet wrote:
265 > Software error:
266 > Error creating cust_bill record: ERROR: parser:
267 > attribute 'charged' is of type 'money' but expression
268 > is of type 'float8' You will need to rewrite or cast 
269 > the expression ! Check updated but unbilled packages 
270 > for customer1
271 .
272 Postgres `money' time sucks rocks anyway.  I'll probably just require 6.5
273 and use the numeric types, which *finally* work right (well, according to 
274 the web site, anyway).
275 .
276 In the mean-time, this could probably be fixed with the reverse of        
277 the kludge in FS::Record::new.  This removes `$' and `,' from money fields
278 coming out of the database.  Something which fixed up the data so Postgres
279 was happy with it could go in FS::Record::_quote, for data going into the
280 database.
281
282 our data display problem might be a Freeside problem wrt not using 
283 Oracle-compatible DBI syntax (uses the return value from $sth->execute as
284 a number of rows).  Fixing this is on the TODO.
285
286 hooks for arbitrary commands out of configuration files
287 svc_acct.pm svc_acct_sm.pm etc.
288
289 Add this to a FAQ, along with doing it for middle names:
290
291
292 >  What I'm finding difficult is how to easily 
293 > customize fields.  For example, I am trying to add a "middle name" field
294 > to the Customer Edit, view, etc.  If I'm going about it right, it appears
295 > I have to edit the cust_main.cgi under edit and edit/process and the
296 > site_perl/cust_main.pm, as well as other things.  Perhaps you could shed
297 > some light on the best way of doing this.
298
299 You have the basic idea.  To implement that completely, I would:
300 - Add the new field to bin/fs-setup for new users
301 - Document the field in htdocs/docs/schema.html
302 - Document the change in a new file, htdocs/docs/upgrade4.html
303 * Run bin/dbdef-create
304 * Add the new field to edit/cust_main.cgi and edit/process/cust_main.cgi
305
306 For bonus points, I'd grep around for the various bits which use "$first 
307 $last" or "$last, $first" and replace them with a method call in cust_main.pm,
308  , like search/cust_main.cgi
309
310 document security model:
311 Don't forget about Apache usernames - since, via the mapsecrets file, each
312 user can login to the SQL database with a different username and
313 password, you can utitilize the security model of the SQL database as
314 well.  Also, each username here can point to a different configuration
315 directory where you could store user-specific configuration info.  Then   
316 you could link each username to one-to-many agents. 
317 (The web demo works using a trivial version of this.)
318
319 Yes, queue processing or the equivalent via checkpoint fields on various  
320 talbes (which you pick up via a pretty simple SELECT) would be really 
321 nice too.
322
323 default (and ordering) state/county/country config file
324 expand the
325 cust_main_county table to provide a preferred ordering, so the most common
326 entries would be at the top of the selection box.  automatically, based on
327 recent selections?
328
329 hmm... maybe svc_acct__shell should check off the legal shells list if
330 applicable?  yeah... cool.
331
332 payinfo field should me much larger than 16
333
334
335 [Mon Apr 12 20:31:21 1999] [error] [Mon Apr 12 20:31:21 1999] null: Error closing true: Broken pipe at /usr/local/lib/site_perl/FS/cust_main.pm line 615.
336
337 javascript (yuck!) "are you sure?" confirmation on cancelations, etc.
338 (view/cust_pkg and view/svc_*)
339
340 get rid of time2str("%D") which formats dates in a non-y2k-safe looking fashion
341 (all the actual date handling uses UNIX timestamps and is fine)
342
343 uncomment expire in view/cust_pkg.cgi and find the expire cron from fsold
344
345 (Test this)
346 one-time/per-customer/? changes in rates and descriptions ('remembered
347 invoices'): implement by creating a new package on the fly... but it isn't 
348 associated with any agent types so it won't show up for other customers to buy.
349 (but also... make sure they go away when the customer does! - need this? :
350  one-off package edits! : need a cust_pkgs or cust_part_pkgs or something table,
351  with custnum and partpkg (like type_pkgs)
352 (what happens if you hit "custom pricing" but the pricing is already custom?)
353
354 Lay out any remaining ugly forms better.
355
356 remove "records identical" warning?  gets in the way of more important stuff.
357 or fix logic which tries to update identical records??
358 1.2 should be quiet enough that the error log is useful, hopefully.
359
360 Postgres has a maximum column length of 31 characters (but see NAMEDATALEN in
361 postgres_ext.h).  part_svc has columns like: svc_acct__radius_Attribute_flag
362 (22 characters!)  It seems that stuff over the limit is silently ignored,
363 so we get 4 characters back.  So, Radius_Attributes are max 13 characters with
364 stock Postgres.  see rfc2138 for what's affected
365 What's a good fix?  (besides recompiling postgres with NAMEDATALEN 64)
366 (mysql has a 64 character max column length.  others?)
367
368 [Mon Mar 29 06:57:56 1999] -e: Use of uninitialized value at /usr/lib/perl5/Date/Format.pm line 333.
369 (when sending mail in cust_main.pm::bill or svc_domain.pm)
370
371 look at DBIx::Recordset!  (and Tie::DBI, and...)
372
373 undefined conf/lpr gives this uninfomative error:
374 [Fri Feb 26 16:42:36 1999] bill.cgi: Can't do bidirectional pipe at
375 /usr/lib/per
376 l5/site_perl/FS/cust_main.pm line 629.
377 [Fri Feb 26 16:42:38 1999] bill.cgi: Error closing : Broken pipe at
378 /usr/lib/per
379 l5/site_perl/FS/cust_main.pm line 631.
380 So give a meaningful error!
381
382 password and slipip stuff in svc_acct.pm store need to be split into two fields or something, so the silliness in svc_acct.pm and svc_acct.export with looking at the data to decide what to do with it can be fixed
383
384 i10n: Apache::Language
385
386 Apache::Session?  Other useful Apache::* ?
387
388 email invoices are only sent for the BILL payby.  If setup, should statements
389 (since they're not invoices) be sent for COMP and CARD as well?
390
391 $cgi->keywords is causing the (hard to trace) error:
392         Use of uninitialized value at (eval 5) line 5
393
394 edit/cust_main.cgi gives an uninformative error message:
395 > Can't call method "agentnum" without a package or object reference at   
396 > /usr/local/apache-ssl/htdocs/freeside/edit/cust_main.cgi line 116.
397 if there are no agents.
398
399 (is this missing on any web screens?  (easy with $cust_svc->label)
400 Add the ability for services to filter information up to the package level
401 for web screens, so you can select a particlar package based
402 on username or domain name, etc.
403
404 Allow a cancelled/suspended/active status from packages to bubble up to
405 the customer lists.  Put active, then suspended, then cancelled accounts.
406 Similar ordering on the package listing inside a single customer.
407
408 false laziness: edit/cust_main.cgi got some parts copied from edit/svc_acct.cgi
409 the web interface in general needs to be redone in a more abstract way.
410
411 false laziness: some of search/svc_acct_sm.cgi was copied to search/svc_domain.cgi.  but web interface in general needs to be rewritten in a mucho cleaner way.
412
413 Portability: in FS::Record, $sth->execute does not return a number of rows for all DBD's.  see man DBI
414
415 subroutine the where clause (eventually all SQL) as OO perhaps (has anyone done this?)
416
417 add a select method to FS::Record?
418
419 one-time/per-customer/? changes in rates and descriptions ('remembered
420 invoices'): implement by creating a new package on the fly... but it isn't 
421 associated with any agent types so it won't show up for other customers to buy.
422 (but also... make sure they go away when the customer does! - need this? :
423  one-off package edits! : need a cust_pkgs or cust_part_pkgs or something table,
424  with custnum and partpkg (like type_pkgs)
425 (what happens if you hit "custom pricing" but the pricing is already custom?)
426
427 You can't delete the stuff under administration yet.  Add this,
428 _including_ making sure the thing you are deleting is not in use!
429
430 add links on view/cust_main.cgi to setup services, like view/cust_pkg.cgi
431
432 FS::cust_pkg _require_'s FS::$svc, but this won't work with %FS::UID::callback
433 loading of configuration.  (pry need same idea, but will run immediately if
434 context allows).  Looks like error is masked by 'use FS::cust_svc' which in
435 turn 'use's FS::{svc_acct, svc_acct_sm, svc_domain}' which is now explicit
436 w/comments in source
437
438 Allow a cancelled/suspended/active status from packages to bubble up to
439 the customer lists.  Put active, then suspended, then cancelled accounts.
440 Similar ordering on the package listing inside a single customer.
441
442 svc_domain.pm mail sending uses Date::Format which doesn't seem to pick up 
443 correct timezone.
444
445 view/svc_domain.cgi needs to know the domain might be unaudited (cosmetic)
446
447 remove whois_hack set to 1 for svc_domain.pm?  add all known registries and
448 whois accordingly.
449 .us domains and others!
450 site_perl/svc_domain.cgi (hmm... or maybe should have a button?  or maybe svc_domain.pm should handle this) should set $whois_hack for non-internic domains, so you can add them...
451
452 turn on the depriciation warnings for [e]idiot in FS::CGI. Stop using [e]idiot
453 the last places it is (htdocs/search/ htdocs/misc/ htdocs/misc/process)
454
455 (test cust_main.pm with cybercash v2 and v3, especially with the callback
456  stuff AND with mod_perl w/cybercash v2 kludge in package main)
457 (callback stuff should be eliminated by now)
458
459 bah, table/itable/*table in FS::CGI is silly.
460
461 doc Apache::AuthDBI as well
462 ..
463 Provide sample httpd.conf files.
464
465 hey look: Tie::DBI!  Check that out.  Override its commit with something that
466 does perl-side caching for ? a performance improvement and as an emulation
467 layer to plug in f.ex mysql's atomic transactions
468 ..
469 Record.pm uses does some non-portable DBI things.  MySQL and Pg seem fine.
470 Fix it anyway unless we migrate to Tie::DBI.
471
472 faq
473
474 cust_bill.pm uses '==' comparison on dates because they're currently ints
475
476 config file for allowed card types
477
478 write instructions for adding new services w/svc_Common.pm.  Get rid of all
479 places where svc_* tables are hardcoded (rename svc_acct_pop to part_pop so
480 we can do that)
481
482 test and document libapache-dbi-logger (woo!)
483
484 radius logfile parsing and perl expression check.
485
486 Fix in cust_bill BUGS: 
487 There is an off-by-one error in print_text which causes a visual error (Page 1
488 of 2 printed on some single-page invoices).
489
490 fields should be a method against a FS::Record or derived object, as well as
491 being something you can call as FS::Record::fields('tablename').  Might
492 even be able to handle both in the same routine (that would be neato).
493
494 Immediate removal of incorrectly entered check payments (can't take too
495 long to do this, or accounting is fubared).
496
497 Add code to move from one service to another (POP to SLIP/PPP, etc.).
498 This _should_ be possible by working off the rules in part_svc rather than
499 hardcoding anything in.  The rules in part_svc may need some elaboration,
500 perhaps.
501
502 Use ut_ FS::Record methods in all derived classes (possibly some from dbdef?... eventually all from dbdef??? - but then `dbdef-create' would be impossible as there would be metadata we couldn't ask the backend for.  hmm.)
503
504 (bring back from fsold, ) Generalize config-sending stuff and make more configurable.
505 Expand the HylaFAX interface (also possibly generalize for other fax
506 softwar ie .comfaxe); allow things like arbitrary faxes of sales
507 literature, specific troubleshooting documents and so on.  Maybe even
508 allow users to do this (though that might not belong in Freeside).
509 misc/sendconfig.cgi
510 misc/process/sendconfig.cgi
511 Configure fax recipients via a separate box rather than using the finger
512 name or first+last from cust_main.
513
514 move all phone number logic out of Freeside - let HylaFAX or whatever
515 handle it.
516
517 soundex searches for customer name and company?  where are free soundex tools? (standard Text::Soundex duh) - I could have sworn I saw Text::Soundex on CPAN?!
518
519 should be able to link on some field in email alias (right now you can link
520 on username or domain with a fallback to svcnum)
521
522 generalize and make configurable new invoice printing scheme in FS::cust_main::collect (past due)
523
524 deleting an svc_domain should delete all associated svc_acct_sm records.
525 same with a svc_acct.
526
527 periodic password encrypter
528
529 Automated, configurable notification, suspension and cancellation of
530 defunct accounts.
531 ...
532 expire cron job
533 ...
534 Allow for a future setup date on accounts.
535
536 sub AUTOLOAD in FS::Record should warn? die? if used with a non-existant column
537 name?
538
539 edit (not just import, export and allow default/fixed) arbitrary radius stuff
540 in svc_acct
541 edit/svc_acct.cgi and edit/process/svc_acct.cgi should deal with arbitrary radius stuff
542
543 radius import should take DEFAULT entry and put it in /var/spool/freeside/conf/radius-default ; svc_acct.export should use it (and doc)
544
545 in UI, s/State/State\/Provence/go and s/County/County\/Locality/go
546
547 what else (besides l10n) for i18n? (money!)
548
549 audit htdocs/* for things that should be libraried and things that should be
550 new methods on the objects (need to do this before implementing a new UI)
551 all the big things are done
552
553 some places we die() where we should &FS::CGI::idiot (and perhaps vice-versa).
554 Decide based on whether or not the "error" should show up in logs.
555
556 all .cgi's should use standard header/footer and idiot() subroutines.  maybe HTML:: perl modules
557 for HTML creation.  Maybe Embperl or something along those lines.  ?
558
559 When running bin/bill, Fix this (Annoying but harmless):
560 Use of uninitialized value at /usr/local/lib/site_perl/FS/cust_pkg.pm line 99, <ADDRESS> chunk 4.
561 Use of uninitialized value at /usr/local/lib/site_perl/FS/cust_pkg.pm line 102, <ADDRESS> chunk 4.
562 Use of uninitialized value at /usr/local/lib/site_perl/FS/cust_pkg.pm line 105, <ADDRESS> chunk 4.
563
564 all cgi (but internal to the isp) places where package names are listed should also have
565 comment (like agent_type)
566
567 clean up $recref and other silliness and use -> calls where possible, or
568 one other alternative.  clean up everything else.
569 should FS::Record use Tie::Hash?  That would be very clean, but where do we
570 store the other information?  Maybe you could ask any FS::Record object for a
571 tied hash?
572
573 change all file access from regular open(FILE,) stuff to OO, because of 
574 problems scoping and passing filehandles like that.
575
576 the web interface should create a new object and use it instead of a blank
577 form for new records.  the create method of svc_ objects should set defaults
578 (from part_svc).
579
580 sub check in man FS::table_name should be rewriteen.  Get rid of $recref
581 stuff.  Make sure all fields that refer to other database are checked.
582
583 Integration with signup disks (are there any free ones?  Netscape?).
584
585 One-button cancel (+refund) for lusers who can't get online.
586
587 Keep information on virtual web servers (hostname, IP, host machine,
588 directory, etc.) and export this information for importation into the ISPs
589 web farm. 
590
591 Remove requirement that the first mail alias be the catchall?  Still make
592 sure only one catchall per domain is defined in any case, of course. 
593
594 Ability to move cust_pkg records from one customer to another? (proably
595 will need to cancel the old and create a new like when we move services
596 between packages). 
597
598 Auto-increment expired cards one year, and try again?
599
600 More non-US stuff - zip codes, country codes, foreign currencies, etc.
601
602 cust_refund.{cgi.pm} need to do cards xaxtions.  (now we only have cust_credit)
603
604 Nicer set of integrated reporting possibilities, like weekly sales totals
605 by customer, package, agent, referral, etc., aging reports sorted by lots
606 of different things, and so on.
607
608 Client/server setup for users to modify their own passwords, shells, etc,
609 via passwd or secure web interface (prelminary passwd/chfn/chsh
610 replacement done).  Complicated by the fact that we don't want to allow
611 incoming connections to the machine running Freeside, so we probably need
612 to have a daemon on each external shell or web machine that is contacted
613 by the Freeside machine.  Be very very careful for both traditional
614 security issues and DoS problems. 
615
616 An extension of the above to allow users to modify selected parts of their
617 own information, order and cancel services.  A web interface for new
618 customers.
619
620 Expand domain name stuff to house all domain information.  Export
621 named.boot/named.conf (primary and secondary) and named.{domain} files.
622 Add more registries (not just InterNIC's com org net edu)
623
624 Nice postscript paper invoices, rather than current ASCII invoices.
625
626 think about race-condititions in FS::Record and derived ->check ->insert
627 and so on, uid and username checks in svc_acct, etc.
628
629 Move to rsync over ssh file exportation rather than scp.
630
631 check 'n fix the proactive password checker. (cracklib?)
632
633 refunds of "BILL" payments: generate pseudo-check.
634
635 write batch senders and batch parsers for the different credit card processors
636 people use/
637 More CC processors/methods.
638
639 you should be able to fiddle the setup date in cust_pkg. (at least initially)
640
641 delete options in administration section
642
643 write a generic batch senders and batch parsers.
644
645 need a way to override svc_acct export on a per-machine basis; just use config files based on machine name i suppose; document that. (no, import desync_hosts
646 type stuff from cerkit)
647 ...
648 add a table with column of export services (passwd, shadow, master.passwd, .qmail file update, dns update, etc.) and rows machine groups and whether or not to export that (and any necessary parameters).  wasn't matt (vunderkid, not matt@michweb) working on this?  find him?  each machine goes in a group of its own as well as a group based on function.  add a table with only svcpart and machine group.  now, when you import from each machine, it can get its own accounts with one svcpart and universal accounts with another svcpart.  (though that does make the username duplicate checking more interesting)
649
650 you should be able to get column types as a method against an FS::Record object
651 as well as dbdef->table($table)->column($column)->type
652
653 move to perl module for fuzzy and soundex searching.
654
655 package view needs to list extraneous services; we need to prevent the
656 creation of them so this never happens (and mark it as such in the source)
657 (the creation problem should be fixed - though they will still happen if people
658 fsck around in the data manually, so list them anyway)
659
660 add attribute dictionary to fs-setup as a menu, plus analyze users file to
661 decide automatically
662
663 Check for and report on duplicate billing accounts (cust_main, though many
664 will have a need for these so probably don't disable them outright.)
665
666 create a ->warn as well as a ->check method for all FS::table classes?
667 (see above)
668
669 something to automate making a release and updating the web demo
670
671 export a debian-style (also redhat and?) /etc/group file aswell!
672
673 svc_acct_sm.import qmail import should pull in recipientmap people too.
674
675 .pm's like svc_acct.pm which need to do time-consuming things like ssh remotely
676 should fork and do them in a child.
677
678 i18n/l10n: take ALL messages and catalog them in english.txt or in database or something, so we can eventually go int'l.  int'l currency support would be a help aswell.
679
680 get some of { city, county, state, zip } from the missing bits if
681 possible (where can i get the data to do this?  usps.gov?)
682
683 additional interfaces (perltk?  java?)
684
685 Put the GPL notice in all files.
686
687 integrate w/IDEA's signup server
688
689 $cust_bill->owed database field to be eliminated, replaced by a method call
690 that calculates on the fly.  make sure to grep for ->(get|set)field('owed') 
691 same for cust_credit->credited
692
693 Export quota information.
694
695 move all configuration to a central place.  maybe in blob's in the
696 database.  maybe even things like the code to execute when a username is
697 changed can be in there, so less of the distributed scripts change between
698 different sites.
699
700 Implement setup and recurring fees as Safe perl expressions rather than
701 numbers, to allow for variable-rate services.  Backwards compatibility is
702 obtained because { 43 } in perl is still 43.  :)  Define API to pass
703 starting and ending dates and any other necessary data to expression
704 (fees are currently evaluated as Safe expressions but more work needs to
705 be done to define an opmask for various needs, write examples
706 (usage-based billing, etc.) and so on).
707 ...
708 Add the ability to modify the next billing date in cust_pkg, and take
709 appropriate action.  This will allow the implementation of pro-rate/1st of
710 the month billing as well as the ability to manually fiddle with
711 anniversary dates in cust_pkg, so you can sync a customer's anniversary
712 date even if you're using anniversary billing (manually or automatically).
713 (now with above, we need to have a way to automatically pro-rate /^(\d+)$/
714 charges - anything more complicated should figure it out itself given
715 starting and ending dates [document that!])
716 ...
717 Daily Radius log parsing into database; other logfile formats?
718 ...
719 Callbacks to enforce hourly limits on accounts (suspend until the end of
720 the billing period?), for those who limit customers rather than tack on
721 extra charges.
722
723 Flag packages (part_pkg) as taxable or non/taxable as some ISPs (for
724 example) need to charge tax on equipment but not service (separate flags
725 for setup and recurring fee... or perhaps a setup_tax, setup_notax,
726 recur_tax and recur_notax fees, and possibly something more flexible if
727 there is need).
728
729 Allow for a variable number of invoices for customers who need multiple
730 copies.
731
732 Add a mail alias service with table svc_acct (not domain mail aliasing
733 which is domain with svc_acct_sm)
734
735 (bring back from fsold) Change customer comment field from its current kludge to something more
736 workable.
737
738 Better work orders with more information.  Should eventually open a ticket
739 when we have such a thing.
740 edit/svc_wo.cgi
741 edit/process/svc_wo.cgi
742 Call tracking and trouble tickets.
743
744 More accoutability for complimentary accounts: approval, expiration, term
745 (no more than x months in advance) and notification.
746 Flag particular users (or all users, for that matter) as having their
747 passwords hidden and/or locked from users of Freeside (maybe need Freeside
748 security levels first?). 
749 ...
750 Better Freeside-level configurable access, for those ISP's who have
751 employees they can't trust.  Right now you're "stuck" with setting up
752 .htaccess stuff yourself.  This should really just be integrated. 
753
754 configuration/setup should get web interface
755 ...
756 /usr/local/etc/freeside should be configurable
757 ...
758 (probably as part of some automated installation process?)
759
760 This requires some serious magic in FS::Record:
761 ok, if date_type in fs-setup is to be something besides int,
762 now we need to create wrappers
763 for them so they behave identically across RDBMS's, ie date pops out as as
764 UNIX timestamp (or an object of some sort? maybe even a blessed $obj which
765 is a string not a hashref for backwards compatibility?) and so on. (remember
766 to treat '0' as Not a Date instead of 1/1/70.
767
768 Add Freeside-level transactions for RDBMS's which don't support
769 transcations?  (Currently we assume a minimal RDBMS which has no rollback,
770 transactions or atomic updates).  Or just require a RDBMS that supports
771 rollback and/or atomic updates and get rid of the work-arounds?  The /rdb
772 interface had this kludge on top of it but is a technical dead-end in most
773 other ways, unless it can gain an SQL parser and DBD interface.
774 ...
775 if i'm really bored, find the /rdb interface in fsold and port it to NoSQL,
776 and while I'm add it add interfaces for AnyDBM_File tied hash.. hmm.  Shouldn't
777 an FS::Record have something to do with a tied hash?  But we don't want
778 performance to go gaga... maybe something with commit to help out here?
779 ...
780 Ok: FS::Record gives you a tied hash, and you get methods for commit, etc.
781
782 Better automated comparison of our CC records with processors (CyberCash,
783 at least, has not always had 100% accuracy, though recent versions are
784 much better) 
785
786 Expect or other pty based login check, where we actually connect to a
787 terminal server or shell machine and test logging in as the user (if we
788 are keeping a cleartext password for that user)  (This is something tech
789 support often needs for new customers)
790
791 Use cust_main table for pre-sales tracking as well?
792
793 Automatic commision report and check generation via freq and prog (to
794 become a Safe perl expression) fields in agent table, and possibly others.
795
796 Database and add a mailed-out date and method for disk/CD mailing, so a
797 customer can call and you can say, "sent on xx/xx/xx via {US Mail, Fedex,
798 UPS, etc}" 
799
800 Inventory tracking for physical items such as routers (for sale or
801 lease... probably doesn't make a difference in the ordering... but if you
802 cancel a router lease the inventory should come back.  hmm.)
803
804 -- Matt's wishlist ---
805
806 From matt@michweb.net Fri Feb 20 16:39:53 1998
807 Date: Thu, 19 Feb 1998 23:20:11 -0500
808 From: Matt Simerson <matt@michweb.net>
809 Reply-To: quadran-developer@netgoth.com
810 To: quadran-developer@netgoth.com
811 Subject: Re: Welcome to quadran-developer
812
813 >Whats it based on and what is it supposed to do?  I'm interested, but
814 >unfortunatly, I don't have that much time to help on the project (I'm busily
815 >working on one of my own based around MySQL and Qt right now -- don't know
816 >if it will be GPL'ed or not yet -- we'll probably just use it in house since
817 >it is designed around our system)...
818
819 That's what I set out to find, but didn't find anything on the web site.
820 I'm looking for something that will do the following:
821
822 Single point of entry for users on a secure system:
823         Creates account on user (public) systems
824                 update /etc/passwd/master.passwd file
825                 update radius database (if necessary)
826         Set up up disk quotas (although I hacked adduser to do this)
827         Option for adding user to a mailing list(s)
828         Export of new user info to customizable report (for automated entry
829 into
830                 accounting software, etc...)
831
832 Automated billing:
833         Export credit card info for batch processing and have hooks built
834                 in for other forms of electronic processing.
835         Batch-Payment (apply payments from formatted text file).
836         Customizable reports for manual entry/importing into Accounting
837 software
838         Email or laser print invoices
839         Sanity checks credit card numbers before processing (code available)
840
841 Simple method for disabling an account.
842         Arbitrary Expiration Dates (on a given day, in x days)
843         Remove from radius.
844         Changing password to '*'
845         Virtual customers disabling dns, http server, log processing, etc..
846
847 Billing for different account types:
848         Dialup monthly flat rate. Prorates for partial months.
849         Dialup monthly flat rate for x hours + hourly usage.
850         Dialup email only
851         Email only accounts
852         Virtual Web accounts - w/multiple mailboxes
853         Leased line accounts
854         Disk space used over quota.
855         Tech support minimum + hourly charges
856         Other for misc stuff (modem, RAM, etc...)
857
858 Per user definable RADIUS attributes (ties in with above)
859         Fixed IP
860         Simultaneous Use
861         IP filters (for dialup email only)
862
863 Keep logs of modem usage generated daily from radius accounting logs stored
864 on multiple radius servers.
865
866 Keep logs of disk usage generated from quota.
867
868 Method of adding virtual domains to your system:
869         Automatically grabs an IP address from a preassigned pool.
870         Creates a domain.com database file from database fields
871         Updates /etc/named.conf or /etc/named.boot and reloads named.
872         Add's virtual.com to /etc/sendmail.cw or qmail control files.
873         Edits your web servers httpd.conf file and restarts http server.
874         An optional section for adding vif's can be added if the users OS
875                 supports adding them on the fly. Otherwise it's up to the end
876                 user. Make a hook that can run a custom script that the user
877                 tweaks for his system.
878         Update or create the config file your web stats analyzer needs. I've
879                 done this for analog (free) and http-analyze. Probably
880                 should only officially support analog and let users hack
881                 it to their hearts desire.
882 I've already written scripts that do most of the virtual web stuff on my
883 system...in bash. Shouldn't be hard for a perlmeister to convert. In fact,
884 as long as all the info was stored in the database (username, domain name,
885 and ip pool) this could easily just be run as an external script that the
886 user tweaks to match his system.
887
888 We use a great accounting software (M.Y.O.B) that does all the AP, AR,
889 Payroll, Tax stuff, and most everything else we could need. It's already
890 set up for the type of checks we have, etc, etc... I just need something to
891 do the billing part. I can import/export sales and payments directly once
892 the billing part is done. You can't write accounting software as good as
893 M.Y.O.B. for $120.
894
895