a1d3bdaa42240b63d4b0da12052edf5fbcf56bf9
[freeside.git] / TODO
1 $Id: TODO,v 1.55 2000-12-11 01:30:11 ivan Exp $
2
3 If you are interested in helping with any of these, please join the
4 *development* mailing list (send a blank message to
5 ivan-freeside-devel-subscribe@sisd.com) to avoid duplication of effort.
6
7 ---
8
9 wishlist from drenalin@ultimanet.com:
10 * delete button for customers
11 - 15th of the month billing
12 - field for customer referrals (naming who it is) and automatically crediting
13 +that account
14 - ability to edit referrals
15 - catch expired credit cards and notify via email when they are expiring
16 * show passwords
17 - set default shell to /bin/false when adding ppp account
18 - import list of POPs from Megapop (see www.ultimanet.com and click on locations
19 +from text in index page)
20
21
22 wishlist wrt projects/consulting from jivko@ijs.com:
23 >The other thing, which is the serious part, is the following: We do not
24 >offer dial-up services and that part of the system does not have to work,
25 >but we have many customer, for which we do both hosting and consulting work.
26 .
27 >The hosting can be handled by freeside fine, but in the little time I spent 
28 >on it I could not see how exactly to solve the consulting problem. What I
29 >would love to see there is a way to create 'projects' for each customer and
30 >ability to follow up on those (I mean to be able to add new comments,
31 >descriptions, progress updates etc.). You already have the feature, which
32 >allows multiple people to access the system with different access rights so
33 >it should be possible to make it keep track of who and when updated given
34 >'project' so we could have the developers access the database and update
35 >the projects they are working on.
36 .
37 Hmm.  Is this accurate:  Each project is related to a single customer, and
38 zero or more packages (billing items).  Each project has a name, due date,    
39 and zero or more log entries consisting of date, user, and a text field
40 (for "new comments, descriptions, progress updates etc." - would you like
41 anything more specific?)
42
43 In conjunction with that it looks like you need the ability to create
44 "one-off" packages on the fly for arbitrary charges.
45
46 > Additionally it would be nice to have a page, where all open projects can
47 > be listed and not only that but be able list them by date too. (Say I want
48 > to find out which projects are due today or two days from today, or which
49 > projects are running late)
50 .
51 Browse/search project by date and customer.
52 .
53 > Finally it would be real nice if the billing script could add the cost for
54 > all completed projects (or work done by the hour) to the monthly bill along   
55 > with the hosting information and using the description of the work from the
56 > 'project' table. 
57 .
58 Can you be more specific about your needs here?
59 .
60 > This is a lot of work, unless you disagree :-), and I would not expect you
61 > to do all of it - we can work on it too - but I would hope for you to lead 
62 > the effort.
63 .
64 I'm trying to get a handle on specifically what you need.
65 .
66 > Oh, and there is one more thing, but that should be simple to do. I would
67 > like to be able to give the customers access to selected information from
68 > their account. I want them to be able to monitor the progress of their
69 > projects and the status of their accounts. 
70 .
71 Ok.
72 .
73 > Does all this make sense? It must be close to what you need at your office
74 > though or at least I think so.
75 .
76 Yes, but we're small and have been tracking projects manually.
77 .
78 .
79 >You may have this already .. what I have in mind is the following. Say you
80 >have a customer for which you do hosting and some consulting (CGI, JAVA
81 >etc) At the end of the month you need to bill the customer for the hosting,
82 >35hours of Java programming and 10 hours of HTML authoring. The last two
83 >are not because the project is over but because the work was done during
84 >that month.
85 >
86 >So the way I see it, and it could be wrong, is that during the month the
87 >people who work on particular project enter their comments and time spent
88 >on the project. At the end of the month the billing script generates
89 >invoices in which besides the hosting charges there are also charges for
90 >work done during the period.
91 >
92 >Currently we do this in a very stupid way by maintaining a customer file,
93 >in which a script saves things to be invoiced. At the end of the month a
94 >script goes through these files and generates invoices with all items from
95 >the files, which have not been flagged as 'paid'. The convenience of this
96 >is that no one needs to worry about the invoices containing the items they
97 >need to contain.
98
99
100
101 first package select field in edit/cust_main.cgi isn't sticky on errors, yuck
102
103 > 1. A Web Form to the user get his account added automatically . The
104 > /etc/raddb/users and /etc/passwd would be updated automatically (these
105 > file are on the same machine Freeside is). I guess the the Add
106 > Customer
107 > page with some customization could be the work.
108 > 2. A Canceling Account Web Form available to user cancel his account   
109 > at
110 > any time he wants.
111 > 3. A Password Changing Web Form where the user could change your
112 > password by sending your username, old and new password.
113 > 4. Additional POP Accounts Creation where the user supply only his
114 > main
115 > username/password (probably provided from a PPP Account already
116 > created)
117 > and his POP username/password for this specific account.
118 (actually need something more general i guess - probably need some way to say
119 which accounts (svc_acct) can log in and make changes per customer (cust_main) )
120
121 this is awfully vauge, perhaps email for more info?  don't want to alientate
122 someone with accounting experience, but i just don't have time right now.
123 .
124 Hi Ivan,
125 .
126 Thanks for the information. It took me a little while to figure it out, but I
127 +was
128 able to create an invoice. As a lamer and an accountant, may I make a few
129 suggestions?
130 .
131 On the Customer view page:
132 1) Layout the information in the manner the invoicing process is conducted.
133     a) Customer information                                                
134     b) Package Ordering    
135     c)  Add a "Create & Edit Invoice" section - this allows auditing of  the
136 invoice     before it is processed.
137     d) then put the billing section to actually process the invoice
138     e) then put payment history information                        
139 .
140 Thanks,
141 Mark Roberts <mroberts@iopenenterprises.com>
142
143
144 new overdue code might be overzealous.  test carefully.
145
146 Port Freeside to use the modules that were abstracted from it:
147 Net::SSH, Net::SCP, DBIx::DataSource and DBIx::DBSchema, at least.
148
149 "first package" and email invoice (?) not sticky on errors in new/edit customer
150 screen.
151
152 http://www.ipmeter.com/ integration would be useful
153
154 http://tangram.sourceforge.net/
155 Tie::DBI
156
157 mmm, http://pootpoot.com/~dlowe/DBIx-Table/
158
159 The cybercash links in htdocs/docs/config.html are b0rken.
160
161 Yes.  Which is what I've been trying to tell you.  (destination user,
162 destination domainname) would be represented by the svcnum of a record in
163 svc_acct.  (In retrospect, using the uid instead of the svcnum was a bad
164 choice).  (domuser, domain name) would be part of the svc_acct_sm record,
165 as domuser and domsvc.
166
167 Upon further consideration, I'll probably eliminate the svc_acct_sm table
168 completely, and just add a field for the svcnum of a domain and the svcnum
169 of a destination mailbox to svc_acct (or perhaps a one-to-many
170 relationship - multiple svcnum(s) for multiple destination mailboxes.
171 hmm.)
172
173 > > > > Longer-term, I need to do something about the length of the             
174 > > > > column names -                                                          
175 > > > > The SQL1992 standard defines 18 character column names,                 
176 > > > > which would be a                                                        
177 > > > > reasonable goal.                                                        
178 > > >                                                                           
179 > > > Maybe the thing to do would be to separate these out to separate          
180 > > > tables.                                                                   
181 > > > then we could simply use something like id, attrib_name,                  
182 > > attrib_value                                                                
183 > > > to                                                                        
184 > > > store all of the radius values.                                           
185 > >                                                                             
186 > > Hmm, no, that's not quite right.  You don't want to store the actual        
187 > > strings in the records for each account.  Probably need a table that        
188 > > corresponds to the RADIUS dictionary file, with a list of                   
189 > > attributes and                                                              
190 > > attribute id's, then reference the attribute by id and not name.            
191 > >                                                                             
192 > > The more difficult bit is handling the service definitions                  
193 > > correctly -                                                                 
194 > > part_svc and it's effects.                                                  
195 >                                                                               
196 > Yes that could be a bit tricky. Perhaps just one "radius" field in            
197 > part_svc that held a list of id's from the radius table that applied          
198 > that particular service?                                                      
199
200 No, that wouldn't let you set defaults or fixed values for each attribute,
201 like part_svc currently does.
202  
203
204
205 hmm - if you delete an account in svc_acct somehow that a mail alias points to,
206 svc_acct_sm.export will fail.  make sure this can't be done using
207 the web interface.
208
209 Bug: during the linking process apparantly you can link too many services to 
210 a package.  *sigh*
211
212 zip code i18n is not very good :( but at least US, CA, HU, ?
213
214 ut_phonen doesn't check data length.  several
215 orthogonal cleanup projects here.  *sigh*
216
217 update the cybercash links in config.html and in the homepage.  add more explicit support for other payment types.  etc.
218
219 From "Tim Jung" <tjung@igateway.net>
220 .
221 Automatic CC Decline Notices via email
222 Block Time billing for prepaid internet cards (400 hours or whatever block
223 time of hours)
224 Trouble Ticket System with simple search function for Knowledge Base feature
225 Employee Timecards
226 Credit Card System support for Red Hat's CCVS, and other Linux credit card
227 programs
228 Contact Manager/Lead Tracking
229 Pre-Sale Quotes
230 Cisco NetFlow Account for IP traffic billing
231 VoIP and FoIP billing
232 Roaming per minute billing based on Radius Proxy support or number they
233 dialed into from Radius logs (800# etc)
234 Support for OpenSRS Domain Registration
235 Support for TUCOWS signup CDs
236
237
238 dbdef-create for postgres
239
240 pro-rating, fiddling dates
241
242 It looks like svc_acct.import doesn't deal well with comments and
243 multi-attribute lines.
244
245 ivan@rootwood:~/freeside_current$ rgrep -r domuid * | cut -d: -f1 | sort |
246 uniq
247 CVS/Base/TODO
248 TODO
249 bin/fs-setup
250 bin/svc_acct_sm.export
251 bin/svc_acct_sm.import
252 htdocs/docs/man/svc_acct_sm.txt
253 htdocs/docs/schema.html
254 htdocs/edit/CVS/Base/part_svc.cgi
255 htdocs/edit/part_svc.cgi
256 htdocs/edit/process/svc_acct_sm.cgi
257 htdocs/edit/svc_acct_sm.cgi
258 htdocs/search/svc_acct_sm.cgi
259 htdocs/view/svc_acct_sm.cgi
260 site_perl/svc_acct_sm.pm
261
262 rootwood:COMPLETEHOST/TODO
263
264 Currently, you set a value in the %FS::UID::callback hash with a coderef  
265 of the code you want to execute, but this was bad design and will shortly
266 be changed to a subroutine to which you pass your coderef to register it.
267
268 This is not a bug, it is how the system is currently designed.  After 
269 defining a new package, you need to specifically allow agent types to
270 purchase packages.  You can do this from the edit screen of the new agent
271 type.
272 .
273 It wouldn't be a bad idea to add a configuration value that makes new
274 packages available for all currently existing agent types automatically.
275 .
276 On Fri, Apr 07, 2000 at 10:50:35AM -0500, David Morton wrote:
277 > For some reason, the type_pkgs table didn't get updated when I tried to
278 > create a domain service and package...  insert into type_pkgs values   
279 > (4,1);  fixed it up so that I could actually order the package.
280
281
282 From: Chuck Cochems <zaphod@tdl.com>
283 .
284 1) automated generating of late notices.  So far the only way I know to
285 generate one is to re-invoice manually.
286
287 2) smart credit card rejection handling.  It should e-mail a note at
288 least, explainig that it did't go through, and why.
289
290 3)coment field in the main customer record.
291 .
292 4) streamlined payment entry feature. the current scheme has it fairly
293 buried.
294
295 5) queries to show al customers who owe money,and such stuff as that.
296
297
298 credits aren't counted against past invoices?  hmm.  something needs to be
299 done to "apply payment" genericly. and zero out invoices etc.
300
301 more email which should make it into a more organized TODO list:
302 .
303 I would also love to see Freeside support bandwidth billing by reading the
304 Cisco NetFlow Accounting data so we and other ISP's could automatically bill
305 co-located servers and even potentially other virtually hosted sites like
306 MUD, Palace Chat, IRC Chat, etc based on the bandwidth they use or average
307 sustained rates or whatever. I'm not much of a programmer so I don't know
308 what all this entails but I did download a NetFlow client agent/whatever for
309 Linux though.
310  .
311 It would also be nice to see Freeside be able to read Apache log files and
312 bill customers for web traffic that way as an option also. Plus an option to
313 bill for excessive disk usage without having to use quotas if you didn't
314 want to, would be a nice feature as well. So you could monitor with a script
315 or something to see how much disk space a user was using then get some
316 average and charge a certain amount for anything above some preset limit for
317 that account type. I might be able to hack something like this up, but I'm
318 not 100% sure where to start or if there is something out there that could
319 be modified or not.
320 .
321 Do you think that you will ever support the HKS CCVS (Hell's Kitchen
322 Software Credit Card Verification Software) since Red Hat bought them out
323 and is going to be including that for credit card processing when you buy
324 the professional version? What about possibly supporting the OpenCCVS which
325 is a GNU/GPL version of a credit card program? I haven't had time to comb
326 through the Freeside code to see how hard it would be to add support for
327 these as externally called programs.
328 .
329 Also any thoughts on help desk, and knowledge base stuff? Any thoughts on
330 this stuff, and how possible and what kinds of work or time frame would be
331 involved?
332 .
333 Tim Jung
334 System Admin
335 Internet Gateway Inc.
336 tjung@igateway.net
337
338
339
340            CVS via SSH (Score:1)
341            by platinum (jedgar at fxp dot org) on Thursday September 30, @07:13PM EDT (#4)
342            (User Info) http://www.fxp.org/~jedgar
343            The links above are your best bet for basic cvs server configuration. Once you have a pserver set up, you
344            may consider using cvs via ssh. All you need to do is the following: 
345
346            1) Have ssh and sshd set up on the client and server machines 
347            2) Set CVSROOT="joe@example.com:/home/ncvs" 
348            3) Set CVS_RSH="/usr/local/bin/ssh" 
349            4) Use cvs normally 
350            (Obviously, insert the proper host/paths above) 
351
352            You can also set up cvs/ssh to not need a password every time (similiar to an initial 'cvs login'): 
353
354            1) run ssh-keygen on client machine using no passphrase. 
355            2) copy/add ~/.ssh/identity.pub on the client to ~/.ssh/authorized_keys on the server 
356            (man ssh for more details) 
357
358            The main reason I mentio
359            CVS via SSH (Score:1)
360            by platinum (jedgar at fxp dot org) on Thursday September 30, @07:13PM EDT (#4)
361            (User Info) http://www.fxp.org/~jedgar
362
363
364 There's no way to do this currently, though it would be pretty
365 straightforward to modify the source - specifically, the _collect_
366 subroutine in FS::cust_main.
367 >
368 On Mon, Dec 13, 1999 at 04:05:32PM -0700, Jeff Garner wrote:
369 > Freeside will e-mail my users when they are billed if they are setup as
370 > billing.
371 >
372 > When setup by credit card it does not e-mail them.  Is there a way to
373 > turn on e-mail invoices for those who are billed via credit card?  Kind
374 > of like a recipt of billing....
375
376
377 doc: http://www.softagency.co.jp/mysql/qmail.en.html
378
379 sql1992.txt standard is 18 character column names.  shoot for that, not just
380 32 (postgresql default)
381
382 Also note that (AFAIK) Freeside won't display any package that has more
383 than one service on the "Add Customer" page.  The reason for this is
384 because there's no way to dynamically alter the displayed html form
385 based on which package is selected. One possible solution would be to
386 make an additional page that's used in the signup process that would
387 display the form for each package, like a MS-style "Wizard".  The first
388 page lets you select the package, then the second page has the custom
389 form with fields for each service in that package and a save button. Of
390 course, that would require a little perl work.
391 .
392 Later,
393 Scott Cruzen <sic@boernenet.com>
394
395
396 Your suggested script with back up /usr/local/etc/freeside, but will miss
397 any database not named `freeside'.  Both of our scripts are specific to
398 MySQL.  If you're interested in contributing to Freeside, maybe you could
399 work on a script which: reads the mapsecrets configuration file and then
400 each secrets file to find out what specific database engine(s) (MySQL,
401 PostgreSQL, etc.) and database(s) need to be backed up, then does so,
402 serializing backups of the same engine, i.e. stop mysql, do all the mysql
403 backups, start mysql, stop postgresql, do all the postgresql backups,
404 start postgresql, etc.
405 > #!/bin/sh                                                                     
406 > apachectl stop                                                                
407 > mysqldump -t freeside > fs-backup.sql                                         
408 > apachectl start                                                               
409 > tar -Pzcvf fs-backup-`date +%y%m%d%H%M%S`.tgz fs-backup.sql /usr/local/etc/freeside/                                                       
410 > rm fs-backup.sql                                                              
411
412 I chose to use counters in the filesystem because there is no standard way
413 to get the value of an auto-incrementing keyfield which is common across  
414 all databases (as seen through DBI/DBD).
415 .
416 It certainly wouldn't be a bad idea to use the database-specific methods,
417 when available.
418
419 htdocs/edit/svc_acct.cgi:
420 (Does the `*HIDDEN*' show up when you are adding a new account, and 
421 specify the password, then receive an error and are returned to the form?)
422
423 more DOC:
424 Thought some of you might be interested in this:
425   
426 <ftp://ftp.minivend.com/pub> has CyberCash compatibility modules for 
427 Paymentnet <http://www.paymentnet.com> and Authorizenet 
428 <http://www.authorizenet.com> which should allow you process transactions
429 using those services as well as CyberCash.
430
431 The files are named CCLib.pm.paymentnet and CCLib.pm_authorizenet,
432 respectively, and are installed by renaming to CCLib.pm and moving to your
433 site_perl directory.  Otherwise, follow the directions for Cybercash v2 in
434 htdocs/docs/config.html
435
436 DOC:
437 fs_passwd/ is a client-server replacement for the `passwd', `chfn' and    
438 `chsh' commands that updates the Freeside database.  (so for that to be   
439 useful, you'd have to be exporting that data periodically)
440   
441 fs_radlog/ is a client-server RADIUS log parser that stuffs the data into
442 SQL.  It isn't finished, and probably won't be unless someone who I can't
443 convince to use one of the RADIUS daemons that logs to SQL directly pays  
444 me money or something.
445   
446 fs_signup/ is a client-server signup server.  i'm just finishing it up    
447 now; probably isn't on your machine yet.
448
449
450 http://www.sisd.com/freeside/list-archive/msg00812.html
451
452 package definitions should be implicit allow wrt agent types, not implicit deny
453 (with the old behavior possible via a config file)
454
455 > So is there anyway it could be setup to allow you to select a "primary
456 > service" from each package?  This service would be the one you were prompted
457 > for.  Could the signup server then be expanded to allow users to go into
458 > their package and "turn-on" the remaining non-primary services(using the
459 > primary account.)
460
461 take the GPL'ed whois proxy stuff at www.geektools.com and turn it into
462 intelligence for Net::Whois.
463
464 A web version of the fs_passwd stuff would be nifty.   
465
466 If you have Cistron authenticating directly from MySQL, you can replicate
467 in real-time instead of exporting periodically.  See 
468 <http://www.mysql.com/Manual_chapter/manual_Common_problems.html#Replication>.
469
470 these go in docs:
471 <http://www.sisd.com/freeside/list-archive/msg00541.html> (was 546), and
472
473 and http://www.sisd.com/freeside/list-archive/msg00421.html (was 423)
474
475 > > 5: Is there anyway to get freeside to send a sysadmin a warning when a
476 > > credit card has expired?
477 No, but there should be.
478
479 Put this in the doc (quoting Mark Wells <mark@pc-intouch.com>):
480 >Of course, thanks to the sheer coolness of SQL and MyODBC, you can do
481 >whatever reports you want in basically whatever application you want.
482 >There's no need for Freeside itself to do any reports at all.
483
484 middle names and titles
485
486 On Wed, Jul 07, 1999 at 01:11:40PM -0400, Frank Nazario wrote:
487 > Playing and entering information to Freeside i encountered the following
488 > missing reports:
489
490 > View Customers by Agent
491
492 > View Pending Invoices
493
494
495 grep 'uncomment this to encrypt password immediately' site_perl/svc_acct.pm
496 Not to say that it shouldn't be a configurable option.
497
498 in site_perl/cust_main_invoice.pm (elsewhere?), error out if mydomain config file is gone
499 (at least until the idea of a default domain goes away)
500
501 FS::Record::qsearch does an eval every loop iteration (which is itself not
502 guaranteed to work across all DBD's and should be fixed).  This has got to be
503 slow.  Fix it.  (I think recent Perls might have a way to accept a variable
504 there, no eval needed?)
505
506 Could you have added /bin/sync, /sbin/shutdown, and /bin/halt to the
507 `shells' configuration file before importing, and removed them afterwords?
508 (even better if svc_acct.import did that automatically - it could just    
509 munge and restore @FS::svc_acct::shells... hmm.)
510
511 > BTW, Ivan, I am trying to verify in an additional database table that a
512 > particular user doesn't exist. This database is used to store email aliases a$
513 > additional POP boxes for our customers (kinda like AOL allows). I have toyed  
514 > with the idea of just writing the aliases to an email only svc_acct that
515 > doesn't write to the password file, but that isn't really how I want to do it.
516
517 Actually, I think that's a pretty good way to do it.  Cerkit contributed
518 support a little while back for svc_acct.pm and svc_acct.export for
519 multiple export targets.  It needs to be cleaned up and documented, which
520 I'll try to get to soon.  For this to work correctly, the svc_acct_sm
521 table should go away, along with the concept of a "default" domain.  
522
523 default setting for new packages should allow all agents to purchase them...
524 with a config file for the old behaviour
525
526 fix or replace Term::Query (Quiz::Question doesn't do what i need)
527
528 Check config file reading stuff from CPAN
529  
530 Authorizenet module from CPAN!
531
532 <http://www.math.fu-berlin.de/~leitner/mutt/faq.html> has a good y2k complience
533 statement!
534
535     I'm hoping Freeside can support arbitrailly complex pricing plans
536     because of a simple concept: all prices are perl expressions.  So if
537     you use `19.95' for example, perl evalates that to be `19.95'.  But if
538     you need to do a complex pricing scheme, you just need to write an
539     appropriate perl expression, which will most likely pull data from the
540     database to return pricing.  Some things will already log to SQL; for
541     example most RADIUS servers can or have a patch available.  Getting
542     Freeside to bill based on any sort of data then becomes a matter of
543     importing the data into the database.
544  
545     There are some issues involved with pro-rating, partial month charges,
546     that sort of thing.  Expressions will need a standard way to have the
547     applicable time/data ranges passed to them.  Also the expressions are
548     currently running under the Safe perl module, and the opmask might not
549     be right in all situations.  I'll try to spend some time working on
550     this if you are using it.
551
552 > 2. can customers view their bills on-line.                                    
553  
554 Not yet; it needs to be proxied from Freeside to a customer web server in
555 a secure way using something not completely unlike the fs_passwd,
556 fs_passwdd, fs_passwd_server trio.
557
558
559 > Lastly, if someone over pays on an invoice, the credit part does not flow
560 > over to other invoices..
561
562 The total balance flows over correctly, but individual payments don't.
563 The code you're looking for is in FS::cust_pay::insert
564
565 The question of what to do with overpayments that don't have another 
566 invoice to flow into (yet.. or possibly not) is still an open one.    The
567 legacy system Freeside replaced long ago had a separate place for this
568 (payments waiting for an invoice) for each customer, and it gave our
569 bookeeper fits.
570
571
572 option to relax username uniqueness in favor of username+domain or mail/shell
573 vs. radius to ease import for isp's with namespace problems or who buy others.
574
575 do i have to store anything for radius realms besides regular radius attributes
576 (which are handled fine now)?
577
578 warn or complain or something when invoice_from is empty (and we use it)
579
580 Right now Freeside uses the `freq' field of a package definition as a 
581 number of months.  The specific section of code you're looking for is in  
582 FS::cust_main::bill:
583         
584         #change this bit to use Date::Manip?
585         #$sdate=$cust_pkg->bill || time;
586         #$sdate=$cust_pkg->bill || $time;
587         $sdate = $cust_pkg->bill || $cust_pkg->setup || $time;
588         my ($sec,$min,$hour,$mday,$mon,$year) =
589           (localtime($sdate) )[0,1,2,3,4,5];
590         $mon += $part_pkg->getfield('freq');
591         until ( $mon < 12 ) { $mon -= 12; $year++; }
592         $cust_pkg->setfield('bill',
593           timelocal($sec,$min,$hour,$mday,$mon,$year));
594         $cust_pkg_mod_flag = 1;
595   
596 ..and when I went poking for this, looks like it tells us just what needs   
597 to be done!  Hehehe...
598
599 Date::Manip can handle cool things like "+ 1 month" (actually the current
600 case of /^(\d+)$/ would have to be added as a special case of "+ $1 
601 month") and "+ 30 days" (what you need) and even "+ 5 business days" !
602
603
604 On Wed, Apr 28, 1999 at 08:38:16PM +0000, Kristian Hoffmann wrote:
605 > I can't quite seem to figure out how this exporting works.  From what I
606 > understand, when you run svc_acct.export, it rewrites the /etc/passwd,
607 > /etc/shadow, etc. files.  Is this only for initial setups with the
608 > export hooks being in the pm's?
609  
610 You can use both, or just one method.  The configuration files control    
611 this.  One of the things in the TODO is to take out the last few things   
612 that aren't customizable wrt this and put them in config files.
613
614 http://www.daemonnews.org/199905/user-mgmt.html
615
616 Term::Query doesn't install out of the box from CPAN.  Fix it (and get it 
617 submitted upstream!), or remove requirement from bin/svc_acct.import and
618 bin/svc_acct_sm.import and take it out of the install instructions.
619
620 use this cool link to explain the Freeside API
621 ftp://cpan.nas.nasa.gov/pub/perl/CPAN/doc/FMTEYEWTK/easy_objects.html
622
623 Multiple tax rates by geographic region (county, state, and county) are   
624 supported; just choose View/Edit tax rates from the main menu.
625
626 Multiple tax rates by package are not (yet) supported.
627
628 On Wed, Jul 07, 1999 at 12:13:36PM -0400, Shaun Batterton wrote:
629 > How would you handle something like multiple tax rates and multiple   
630 > states?  For example in Connecticut, they just changed computer and/or
631 > data processing services to 3% (whatever that is), and everything else
632 > is 6%.
633
634
635 > Second, when trying to add a new user I get two types of errors; first one
636 > is when I place an e-mail address and select the "submit," Freeside
637 > complains with "Error: Unknown local account (specified literally)"
638 .  
639 You probably put a (local) email address in for email invoices.  Freeside
640 stores these as references to the database records, so (for example) they
641 follow username changes.
642 .
643 I'm guessing you put in the email address that you were creating, and got
644 that error because it didn't exist yet.  Sounds like a buglet to me.  I'll
645 try to fix that soon; in the meantime you can add the invoicing email 
646 address afterwords.
647
648 (workaround for postgres before 6.5) (unlikely to ever be implemented)
649 In the mean-time, this could probably be fixed with the reverse of        
650 the kludge in FS::Record::new.  This removes `$' and `,' from money fields
651 coming out of the database.  Something which fixed up the data so Postgres
652 was happy with it could go in FS::Record::_quote, for data going into the
653 database.
654
655 our data display problem might be a Freeside problem wrt not using 
656 Oracle-compatible DBI syntax (fixed using the return value from $sth->execute
657 as a number of rows - something else?).
658
659 hooks for arbitrary commands out of configuration files
660 svc_acct.pm svc_acct_sm.pm etc.
661
662 Add this to a FAQ, along with doing it for middle names:
663
664
665 >  What I'm finding difficult is how to easily 
666 > customize fields.  For example, I am trying to add a "middle name" field
667 > to the Customer Edit, view, etc.  If I'm going about it right, it appears
668 > I have to edit the cust_main.cgi under edit and edit/process and the
669 > site_perl/cust_main.pm, as well as other things.  Perhaps you could shed
670 > some light on the best way of doing this.
671
672 You have the basic idea.  To implement that completely, I would:
673 - Add the new field to bin/fs-setup for new users
674 - Document the field in htdocs/docs/schema.html
675 - Document the change in a new file, htdocs/docs/upgrade4.html
676 * Run bin/dbdef-create
677 * Add the new field to edit/cust_main.cgi and edit/process/cust_main.cgi
678
679 For bonus points, I'd grep around for the various bits which use "$first 
680 $last" or "$last, $first" and replace them with a method call in cust_main.pm,
681  , like search/cust_main.cgi
682
683 document security model:
684 Don't forget about Apache usernames - since, via the mapsecrets file, each
685 user can login to the SQL database with a different username and
686 password, you can utitilize the security model of the SQL database as
687 well.  Also, each username here can point to a different configuration
688 directory where you could store user-specific configuration info.  Then   
689 you could link each username to one-to-many agents. 
690 (The web demo works using a trivial version of this.)
691
692 Yes, queue processing or the equivalent via checkpoint fields on various  
693 talbes (which you pick up via a pretty simple SELECT) would be really 
694 nice too.
695
696 default (and ordering) state/county/country config file
697 expand the
698 cust_main_county table to provide a preferred ordering, so the most common
699 entries would be at the top of the selection box.  automatically, based on
700 recent selections?
701
702 hmm... maybe svc_acct__shell should check off the legal shells list if
703 applicable?  yeah... cool.
704
705 payinfo field should me much larger than 16
706
707
708 [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.
709
710 javascript (yuck!) "are you sure?" confirmation on cancelations, etc.
711 (view/cust_pkg and view/svc_*)
712
713 get rid of time2str("%D") which formats dates in a non-y2k-safe looking fashion
714 (all the actual date handling uses UNIX timestamps and is fine)
715
716 uncomment expire in view/cust_pkg.cgi and find the expire cron from fsold
717
718 (Test this)
719 one-time/per-customer/? changes in rates and descriptions ('remembered
720 invoices'): implement by creating a new package on the fly... but it isn't 
721 associated with any agent types so it won't show up for other customers to buy.
722 (but also... make sure they go away when the customer does! - need this? :
723  one-off package edits! : need a cust_pkgs or cust_part_pkgs or something table,
724  with custnum and partpkg (like type_pkgs)
725 (what happens if you hit "custom pricing" but the pricing is already custom?)
726
727 Lay out any remaining ugly forms better.
728
729 remove "records identical" warning?  gets in the way of more important stuff.
730 or fix logic which tries to update identical records??
731 1.2 should be quiet enough that the error log is useful, hopefully.
732
733 Postgres has a maximum column length of 31 characters (but see NAMEDATALEN in
734 postgres_ext.h).  part_svc has columns like: svc_acct__radius_Attribute_flag
735 (22 characters!)  It seems that stuff over the limit is silently ignored,
736 so we get 4 characters back.  So, Radius_Attributes are max 13 characters with
737 stock Postgres.  see rfc2138 for what's affected
738 What's a good fix?  (besides recompiling postgres with NAMEDATALEN 64)
739 (mysql has a 64 character max column length.  others?)
740
741 [Mon Mar 29 06:57:56 1999] -e: Use of uninitialized value at /usr/lib/perl5/Date/Format.pm line 333.
742 (when sending mail in cust_main.pm::bill or svc_domain.pm)
743
744 look at DBIx::Recordset!  (and Tie::DBI, and...)
745
746 undefined conf/lpr gives this uninfomative error:
747 [Fri Feb 26 16:42:36 1999] bill.cgi: Can't do bidirectional pipe at
748 /usr/lib/per
749 l5/site_perl/FS/cust_main.pm line 629.
750 [Fri Feb 26 16:42:38 1999] bill.cgi: Error closing : Broken pipe at
751 /usr/lib/per
752 l5/site_perl/FS/cust_main.pm line 631.
753 So give a meaningful error!
754
755 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
756
757 i10n: Apache::Language
758
759 Apache::Session?  Other useful Apache::* ?
760
761 email invoices are only sent for the BILL payby.  If setup, should statements
762 (since they're not invoices) be sent for COMP and CARD as well?
763
764 $cgi->keywords is causing the (hard to trace) error:
765         Use of uninitialized value at (eval 5) line 5
766
767 edit/cust_main.cgi gives an uninformative error message:
768 > Can't call method "agentnum" without a package or object reference at   
769 > /usr/local/apache-ssl/htdocs/freeside/edit/cust_main.cgi line 116.
770 if there are no agents.
771
772 (is this missing on any web screens?  (easy with $cust_svc->label)
773 Add the ability for services to filter information up to the package level
774 for web screens, so you can select a particlar package based
775 on username or domain name, etc.
776
777 Allow a cancelled/suspended/active status from packages to bubble up to
778 the customer lists.  Put active, then suspended, then cancelled accounts.
779 Similar ordering on the package listing inside a single customer.
780
781 false laziness: edit/cust_main.cgi got some parts copied from edit/svc_acct.cgi
782 the web interface in general needs to be redone in a more abstract way.
783
784 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.
785
786 subroutine the where clause (eventually all SQL) as OO perhaps (has anyone done this?)
787
788 add a select method to FS::Record?
789
790 one-time/per-customer/? changes in rates and descriptions ('remembered
791 invoices'): implement by creating a new package on the fly... but it isn't 
792 associated with any agent types so it won't show up for other customers to buy.
793 (but also... make sure they go away when the customer does! - need this? :
794  one-off package edits! : need a cust_pkgs or cust_part_pkgs or something table,
795  with custnum and partpkg (like type_pkgs)
796 (what happens if you hit "custom pricing" but the pricing is already custom?)
797
798 You can't delete the stuff under administration yet.  Add this,
799 _including_ making sure the thing you are deleting is not in use!
800
801 add links on view/cust_main.cgi to setup services, like view/cust_pkg.cgi
802
803 FS::cust_pkg _require_'s FS::$svc, but this won't work with %FS::UID::callback
804 loading of configuration.  (pry need same idea, but will run immediately if
805 context allows).  Looks like error is masked by 'use FS::cust_svc' which in
806 turn 'use's FS::{svc_acct, svc_acct_sm, svc_domain}' which is now explicit
807 w/comments in source
808
809 Allow a cancelled/suspended/active status from packages to bubble up to
810 the customer lists.  Put active, then suspended, then cancelled accounts.
811 Similar ordering on the package listing inside a single customer.
812
813 svc_domain.pm mail sending uses Date::Format which doesn't seem to pick up 
814 correct timezone.
815
816 view/svc_domain.cgi needs to know the domain might be unaudited (cosmetic)
817
818 remove whois_hack set to 1 for svc_domain.pm?  add all known registries and
819 whois accordingly.
820 .us domains and others!
821 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...
822
823 turn on the depriciation warnings for [e]idiot in FS::CGI. Stop using [e]idiot
824 the last places it is (htdocs/search/ htdocs/misc/ htdocs/misc/process)
825
826 (test cust_main.pm with cybercash v2 and v3, especially with the callback
827  stuff AND with mod_perl w/cybercash v2 kludge in package main)
828 (callback stuff should be eliminated by now)
829
830 bah, table/itable/*table in FS::CGI is silly.
831
832 doc Apache::AuthDBI as well
833 ..
834 Provide sample httpd.conf files.
835
836 hey look: Tie::DBI!  Check that out.  Override its commit with something that
837 does perl-side caching for ? a performance improvement and as an emulation
838 layer to plug in f.ex mysql's atomic transactions
839 ..
840 Record.pm uses does some non-portable DBI things.  MySQL and Pg seem fine.
841 Fix it anyway unless we migrate to Tie::DBI.
842
843 faq
844
845 cust_bill.pm uses '==' comparison on dates because they're currently ints
846
847 config file for allowed card types
848
849 write instructions for adding new services w/svc_Common.pm.  Get rid of all
850 places where svc_* tables are hardcoded (rename svc_acct_pop to part_pop so
851 we can do that)
852
853 test and document libapache-dbi-logger (woo!)
854
855 radius logfile parsing and perl expression check.
856
857 Fix in cust_bill BUGS: 
858 There is an off-by-one error in print_text which causes a visual error (Page 1
859 of 2 printed on some single-page invoices).
860
861 fields should be a method against a FS::Record or derived object, as well as
862 being something you can call as FS::Record::fields('tablename').  Might
863 even be able to handle both in the same routine (that would be neato).
864
865 Immediate removal of incorrectly entered check payments (can't take too
866 long to do this, or accounting is fubared).
867
868 Add code to move from one service to another (POP to SLIP/PPP, etc.).
869 This _should_ be possible by working off the rules in part_svc rather than
870 hardcoding anything in.  The rules in part_svc may need some elaboration,
871 perhaps.
872
873 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.)
874
875 (bring back from fsold, ) Generalize config-sending stuff and make more configurable.
876 Expand the HylaFAX interface (also possibly generalize for other fax
877 softwar ie .comfaxe); allow things like arbitrary faxes of sales
878 literature, specific troubleshooting documents and so on.  Maybe even
879 allow users to do this (though that might not belong in Freeside).
880 misc/sendconfig.cgi
881 misc/process/sendconfig.cgi
882 Configure fax recipients via a separate box rather than using the finger
883 name or first+last from cust_main.
884
885 move all phone number logic out of Freeside - let HylaFAX or whatever
886 handle it.
887
888 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?!
889
890 should be able to link on some field in email alias (right now you can link
891 on username or domain with a fallback to svcnum)
892
893 generalize and make configurable new invoice printing scheme in FS::cust_main::collect (past due)
894
895 deleting an svc_domain should delete all associated svc_acct_sm records.
896 same with a svc_acct.
897
898 periodic password encrypter
899
900 Automated, configurable notification, suspension and cancellation of
901 defunct accounts.
902 ...
903 expire cron job
904 ...
905 Allow for a future setup date on accounts.
906
907 sub AUTOLOAD in FS::Record should warn? die? if used with a non-existant column
908 name?
909
910 edit (not just import, export and allow default/fixed) arbitrary radius stuff
911 in svc_acct
912 edit/svc_acct.cgi and edit/process/svc_acct.cgi should deal with arbitrary radius stuff
913
914 radius import should take DEFAULT entry and put it in /var/spool/freeside/conf/radius-default ; svc_acct.export should use it (and doc)
915
916 in UI, s/State/State\/Provence/go and s/County/County\/Locality/go
917
918 what else (besides l10n) for i18n? (money!)
919
920 audit htdocs/* for things that should be libraried and things that should be
921 new methods on the objects (need to do this before implementing a new UI)
922 all the big things are done
923
924 some places we die() where we should &FS::CGI::idiot (and perhaps vice-versa).
925 Decide based on whether or not the "error" should show up in logs.
926
927 all .cgi's should use standard header/footer and idiot() subroutines.  maybe HTML:: perl modules
928 for HTML creation.  Maybe Embperl or something along those lines.  ?
929
930 When running bin/bill, Fix this (Annoying but harmless):
931 Use of uninitialized value at /usr/local/lib/site_perl/FS/cust_pkg.pm line 99, <ADDRESS> chunk 4.
932 Use of uninitialized value at /usr/local/lib/site_perl/FS/cust_pkg.pm line 102, <ADDRESS> chunk 4.
933 Use of uninitialized value at /usr/local/lib/site_perl/FS/cust_pkg.pm line 105, <ADDRESS> chunk 4.
934
935 all cgi (but internal to the isp) places where package names are listed should also have
936 comment (like agent_type)
937
938 clean up $recref and other silliness and use -> calls where possible, or
939 one other alternative.  clean up everything else.
940 should FS::Record use Tie::Hash?  That would be very clean, but where do we
941 store the other information?  Maybe you could ask any FS::Record object for a
942 tied hash?
943
944 change all file access from regular open(FILE,) stuff to OO, because of 
945 problems scoping and passing filehandles like that.
946
947 the web interface should create a new object and use it instead of a blank
948 form for new records.  the create method of svc_ objects should set defaults
949 (from part_svc).
950
951 sub check in man FS::table_name should be rewriteen.  Get rid of $recref
952 stuff.  Make sure all fields that refer to other database are checked.
953
954 Integration with signup disks (are there any free ones?  Netscape?).
955
956 One-button cancel (+refund) for lusers who can't get online.
957
958 Keep information on virtual web servers (hostname, IP, host machine,
959 directory, etc.) and export this information for importation into the ISPs
960 web farm. 
961
962 Remove requirement that the first mail alias be the catchall?  Still make
963 sure only one catchall per domain is defined in any case, of course. 
964
965 Ability to move cust_pkg records from one customer to another? (proably
966 will need to cancel the old and create a new like when we move services
967 between packages). 
968
969 Auto-increment expired cards one year, and try again?
970
971 More non-US stuff - zip codes, country codes, foreign currencies, etc.
972
973 cust_refund.{cgi.pm} need to do cards xaxtions.  (now we only have cust_credit)
974
975 Nicer set of integrated reporting possibilities, like weekly sales totals
976 by customer, package, agent, referral, etc., aging reports sorted by lots
977 of different things, and so on.
978
979 Client/server setup for users to modify their own passwords, shells, etc,
980 via passwd or secure web interface (prelminary passwd/chfn/chsh
981 replacement done).  Complicated by the fact that we don't want to allow
982 incoming connections to the machine running Freeside, so we probably need
983 to have a daemon on each external shell or web machine that is contacted
984 by the Freeside machine.  Be very very careful for both traditional
985 security issues and DoS problems. 
986
987 An extension of the above to allow users to modify selected parts of their
988 own information, order and cancel services.  A web interface for new
989 customers.
990
991 Expand domain name stuff to house all domain information.  Export
992 named.boot/named.conf (primary and secondary) and named.{domain} files.
993 Add more registries (not just InterNIC's com org net edu)
994
995 Nice postscript paper invoices, rather than current ASCII invoices.
996
997 think about race-condititions in FS::Record and derived ->check ->insert
998 and so on, uid and username checks in svc_acct, etc.
999
1000 Move to rsync over ssh file exportation rather than scp.
1001
1002 check 'n fix the proactive password checker. (cracklib?)
1003
1004 refunds of "BILL" payments: generate pseudo-check.
1005
1006 write batch senders and batch parsers for the different credit card processors
1007 people use/
1008 More CC processors/methods.
1009
1010 you should be able to fiddle the setup date in cust_pkg. (at least initially)
1011
1012 delete options in administration section
1013
1014 write a generic batch senders and batch parsers.
1015
1016 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
1017 type stuff from cerkit)
1018 ...
1019 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)
1020
1021 you should be able to get column types as a method against an FS::Record object
1022 as well as dbdef->table($table)->column($column)->type
1023
1024 move to perl module for fuzzy and soundex searching.
1025
1026 package view needs to list extraneous services; we need to prevent the
1027 creation of them so this never happens (and mark it as such in the source)
1028 (the creation problem should be fixed - though they will still happen if people
1029 fsck around in the data manually, so list them anyway)
1030
1031 add attribute dictionary to fs-setup as a menu, plus analyze users file to
1032 decide automatically
1033
1034 Check for and report on duplicate billing accounts (cust_main, though many
1035 will have a need for these so probably don't disable them outright.)
1036
1037 create a ->warn as well as a ->check method for all FS::table classes?
1038 (see above)
1039
1040 something to automate making a release and updating the web demo
1041
1042 export a debian-style (also redhat and?) /etc/group file aswell!
1043
1044 svc_acct_sm.import qmail import should pull in recipientmap people too.
1045
1046 .pm's like svc_acct.pm which need to do time-consuming things like ssh remotely
1047 should fork and do them in a child.
1048
1049 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.
1050
1051 get some of { city, county, state, zip } from the missing bits if
1052 possible (where can i get the data to do this?  usps.gov?)
1053
1054 additional interfaces (perltk?  java?)
1055
1056 Put the GPL notice in all files.
1057
1058 integrate w/IDEA's signup server
1059
1060 $cust_bill->owed database field to be eliminated, replaced by a method call
1061 that calculates on the fly.  make sure to grep for ->(get|set)field('owed') 
1062 same for cust_credit->credited
1063
1064 Export quota information.
1065
1066 move all configuration to a central place.  maybe in blob's in the
1067 database.  maybe even things like the code to execute when a username is
1068 changed can be in there, so less of the distributed scripts change between
1069 different sites.
1070
1071 Implement setup and recurring fees as Safe perl expressions rather than
1072 numbers, to allow for variable-rate services.  Backwards compatibility is
1073 obtained because { 43 } in perl is still 43.  :)  Define API to pass
1074 starting and ending dates and any other necessary data to expression
1075 (fees are currently evaluated as Safe expressions but more work needs to
1076 be done to define an opmask for various needs, write examples
1077 (usage-based billing, etc.) and so on).
1078 ...
1079 Add the ability to modify the next billing date in cust_pkg, and take
1080 appropriate action.  This will allow the implementation of pro-rate/1st of
1081 the month billing as well as the ability to manually fiddle with
1082 anniversary dates in cust_pkg, so you can sync a customer's anniversary
1083 date even if you're using anniversary billing (manually or automatically).
1084 (now with above, we need to have a way to automatically pro-rate /^(\d+)$/
1085 charges - anything more complicated should figure it out itself given
1086 starting and ending dates [document that!])
1087 ...
1088 Daily Radius log parsing into database; other logfile formats?
1089 ...
1090 Callbacks to enforce hourly limits on accounts (suspend until the end of
1091 the billing period?), for those who limit customers rather than tack on
1092 extra charges.
1093
1094 Flag packages (part_pkg) as taxable or non/taxable as some ISPs (for
1095 example) need to charge tax on equipment but not service (separate flags
1096 for setup and recurring fee... or perhaps a setup_tax, setup_notax,
1097 recur_tax and recur_notax fees, and possibly something more flexible if
1098 there is need).
1099
1100 Allow for a variable number of invoices for customers who need multiple
1101 copies.
1102
1103 Add a mail alias service with table svc_acct (not domain mail aliasing
1104 which is domain with svc_acct_sm)
1105
1106 (bring back from fsold) Change customer comment field from its current kludge to something more
1107 workable.
1108
1109 Better work orders with more information.  Should eventually open a ticket
1110 when we have such a thing.
1111 edit/svc_wo.cgi
1112 edit/process/svc_wo.cgi
1113 Call tracking and trouble tickets.
1114
1115 More accoutability for complimentary accounts: approval, expiration, term
1116 (no more than x months in advance) and notification.
1117 Flag particular users (or all users, for that matter) as having their
1118 passwords hidden and/or locked from users of Freeside (maybe need Freeside
1119 security levels first?). 
1120 ...
1121 Better Freeside-level configurable access, for those ISP's who have
1122 employees they can't trust.  Right now you're "stuck" with setting up
1123 .htaccess stuff yourself.  This should really just be integrated. 
1124
1125 configuration/setup should get web interface
1126 ...
1127 /usr/local/etc/freeside should be configurable
1128 ...
1129 (probably as part of some automated installation process?)
1130
1131 This requires some serious magic in FS::Record:
1132 ok, if date_type in fs-setup is to be something besides int,
1133 now we need to create wrappers
1134 for them so they behave identically across RDBMS's, ie date pops out as as
1135 UNIX timestamp (or an object of some sort? maybe even a blessed $obj which
1136 is a string not a hashref for backwards compatibility?) and so on. (remember
1137 to treat '0' as Not a Date instead of 1/1/70.
1138
1139 Add Freeside-level transactions for RDBMS's which don't support
1140 transcations?  (Currently we assume a minimal RDBMS which has no rollback,
1141 transactions or atomic updates).  Or just require a RDBMS that supports
1142 rollback and/or atomic updates and get rid of the work-arounds?  The /rdb
1143 interface had this kludge on top of it but is a technical dead-end in most
1144 other ways, unless it can gain an SQL parser and DBD interface.
1145 ...
1146 if i'm really bored, find the /rdb interface in fsold and port it to NoSQL,
1147 and while I'm add it add interfaces for AnyDBM_File tied hash.. hmm.  Shouldn't
1148 an FS::Record have something to do with a tied hash?  But we don't want
1149 performance to go gaga... maybe something with commit to help out here?
1150 ...
1151 Ok: FS::Record gives you a tied hash, and you get methods for commit, etc.
1152
1153 Better automated comparison of our CC records with processors (CyberCash,
1154 at least, has not always had 100% accuracy, though recent versions are
1155 much better) 
1156
1157 Expect or other pty based login check, where we actually connect to a
1158 terminal server or shell machine and test logging in as the user (if we
1159 are keeping a cleartext password for that user)  (This is something tech
1160 support often needs for new customers)
1161
1162 Use cust_main table for pre-sales tracking as well?
1163
1164 Automatic commision report and check generation via freq and prog (to
1165 become a Safe perl expression) fields in agent table, and possibly others.
1166
1167 Database and add a mailed-out date and method for disk/CD mailing, so a
1168 customer can call and you can say, "sent on xx/xx/xx via {US Mail, Fedex,
1169 UPS, etc}" 
1170
1171 Inventory tracking for physical items such as routers (for sale or
1172 lease... probably doesn't make a difference in the ordering... but if you
1173 cancel a router lease the inventory should come back.  hmm.)
1174
1175 -- Matt's wishlist ---
1176
1177 From matt@michweb.net Fri Feb 20 16:39:53 1998
1178 Date: Thu, 19 Feb 1998 23:20:11 -0500
1179 From: Matt Simerson <matt@michweb.net>
1180 Reply-To: quadran-developer@netgoth.com
1181 To: quadran-developer@netgoth.com
1182 Subject: Re: Welcome to quadran-developer
1183
1184 >Whats it based on and what is it supposed to do?  I'm interested, but
1185 >unfortunatly, I don't have that much time to help on the project (I'm busily
1186 >working on one of my own based around MySQL and Qt right now -- don't know
1187 >if it will be GPL'ed or not yet -- we'll probably just use it in house since
1188 >it is designed around our system)...
1189
1190 That's what I set out to find, but didn't find anything on the web site.
1191 I'm looking for something that will do the following:
1192
1193 Single point of entry for users on a secure system:
1194         Creates account on user (public) systems
1195                 update /etc/passwd/master.passwd file
1196                 update radius database (if necessary)
1197         Set up up disk quotas (although I hacked adduser to do this)
1198         Option for adding user to a mailing list(s)
1199         Export of new user info to customizable report (for automated entry
1200 into
1201                 accounting software, etc...)
1202
1203 Automated billing:
1204         Export credit card info for batch processing and have hooks built
1205                 in for other forms of electronic processing.
1206         Batch-Payment (apply payments from formatted text file).
1207         Customizable reports for manual entry/importing into Accounting
1208 software
1209         Email or laser print invoices
1210         Sanity checks credit card numbers before processing (code available)
1211
1212 Simple method for disabling an account.
1213         Arbitrary Expiration Dates (on a given day, in x days)
1214         Remove from radius.
1215         Changing password to '*'
1216         Virtual customers disabling dns, http server, log processing, etc..
1217
1218 Billing for different account types:
1219         Dialup monthly flat rate. Prorates for partial months.
1220         Dialup monthly flat rate for x hours + hourly usage.
1221         Dialup email only
1222         Email only accounts
1223         Virtual Web accounts - w/multiple mailboxes
1224         Leased line accounts
1225         Disk space used over quota.
1226         Tech support minimum + hourly charges
1227         Other for misc stuff (modem, RAM, etc...)
1228
1229 Per user definable RADIUS attributes (ties in with above)
1230         Fixed IP
1231         Simultaneous Use
1232         IP filters (for dialup email only)
1233
1234 Keep logs of modem usage generated daily from radius accounting logs stored
1235 on multiple radius servers.
1236
1237 Keep logs of disk usage generated from quota.
1238
1239 Method of adding virtual domains to your system:
1240         Automatically grabs an IP address from a preassigned pool.
1241         Creates a domain.com database file from database fields
1242         Updates /etc/named.conf or /etc/named.boot and reloads named.
1243         Add's virtual.com to /etc/sendmail.cw or qmail control files.
1244         Edits your web servers httpd.conf file and restarts http server.
1245         An optional section for adding vif's can be added if the users OS
1246                 supports adding them on the fly. Otherwise it's up to the end
1247                 user. Make a hook that can run a custom script that the user
1248                 tweaks for his system.
1249         Update or create the config file your web stats analyzer needs. I've
1250                 done this for analog (free) and http-analyze. Probably
1251                 should only officially support analog and let users hack
1252                 it to their hearts desire.
1253 I've already written scripts that do most of the virtual web stuff on my
1254 system...in bash. Shouldn't be hard for a perlmeister to convert. In fact,
1255 as long as all the info was stored in the database (username, domain name,
1256 and ip pool) this could easily just be run as an external script that the
1257 user tweaks to match his system.
1258
1259 We use a great accounting software (M.Y.O.B) that does all the AP, AR,
1260 Payroll, Tax stuff, and most everything else we could need. It's already
1261 set up for the type of checks we have, etc, etc... I just need something to
1262 do the billing part. I can import/export sales and payments directly once
1263 the billing part is done. You can't write accounting software as good as
1264 M.Y.O.B. for $120.
1265
1266