<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://secure.freeside.biz/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jonathan</id>
		<title>Freeside - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://secure.freeside.biz/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jonathan"/>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php/Special:Contributions/Jonathan"/>
		<updated>2026-04-05T17:36:40Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.7</generator>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Developer:Overview&amp;diff=9647</id>
		<title>Freeside:4:Documentation:Developer:Overview</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Developer:Overview&amp;diff=9647"/>
				<updated>2017-01-25T21:59:17Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document provides an introductory overview of the major modules and scripts in the Freeside system.  It is targeted towards the version 4 branch.  It is not comprehensive, but is rather designed to help new developers get started.  Code snippets are illustrative, and developers should consult the embedded pod documentation for any given module or method before using it.&lt;br /&gt;
&lt;br /&gt;
==Code Base Structure==&lt;br /&gt;
&lt;br /&gt;
The most essential directories for you to know about:&lt;br /&gt;
&lt;br /&gt;
; FS/FS : perl modules in the '''FS''' namespace.&lt;br /&gt;
; httemplate : mason cgi scripts and other files for the main web interface&lt;br /&gt;
; FS/bin : standard installed scripts that keep Freeside running&lt;br /&gt;
; bin : additional helpful scripts, not automatically installed or integral to functioning&lt;br /&gt;
; fs_selfservice : a separate web interface to allow individual customers to access their accounts&lt;br /&gt;
; ng_selfservice : the &amp;quot;next generation&amp;quot; of the selfservice interface, built in php&lt;br /&gt;
; rt : code for the integrated ticket tracking system, mostly third-party but contains some customizations&lt;br /&gt;
&lt;br /&gt;
Typically, a project will involve updating process in FS/FS and view in httemplate.&lt;br /&gt;
&lt;br /&gt;
==Records==&lt;br /&gt;
&lt;br /&gt;
Most objects described below use '''FS::Record''' as a base.  This provides common methods&lt;br /&gt;
for storing and retrieving records from the database.  By convention, modules that create&lt;br /&gt;
Record-based objects have all-lowercase names, with mixed-case used for mixins and objects&lt;br /&gt;
that are not stored in the database.&lt;br /&gt;
&lt;br /&gt;
Record objects are not automatically updated in the database when manipulated;  for this, the&lt;br /&gt;
standard methods '''insert''', '''replace''' and '''delete''' are provided (though they are often overridden by individual modules to perform additional module-specific actions.)&lt;br /&gt;
&lt;br /&gt;
The standard method '''check''' is run by insert and replace to validate data before storing it it the database.  This is almost always overridden by individual modules according to its specific validation needs.   FS::Record provides a variety of common methods for validating individual fields in check (e.g. '''ut_float''' to validate a floating-point number, '''ut_floatn''' if that field is allowed to be null, etc.)&lt;br /&gt;
&lt;br /&gt;
To retrieve data from the database, functions '''qsearch''' (for multiple records) and '''qsearchs''' (when you expect only a single record) are provided.  These must be imported explicitly from FS::Record into your script.  They return appropriately blessed objects in the FS namespace.&lt;br /&gt;
&lt;br /&gt;
==Employees==&lt;br /&gt;
&lt;br /&gt;
People with access to the main web interface are known as Employees ('''FS::access_user''').  Each employee can belong to one or more Employee Groups ('''FS::access_group'''), which define their access rights to the system and the customers they are allowed to view.  Because of the module names, employees are also often just called users.&lt;br /&gt;
&lt;br /&gt;
Access rights are defined in '''FS::AccessRight''' and consist of plain english strings describing the right (e.g. 'Edit customer', 'Change customer package', etc.)  Appropriate access rights should always be checked in the web interface before any data processing occurs.&lt;br /&gt;
&lt;br /&gt;
Within the web interface, the '''FS::access_user''' object for current authenticated employee can be accessed in the variable ''$FS::CurrentUser::CurrentUser''.  Access rights can be checked for this object using the ''access_right'' method, e.g.&lt;br /&gt;
&lt;br /&gt;
  die &amp;quot;access denied&amp;quot;&lt;br /&gt;
    unless $FS::CurrentUser::CurrentUser-&amp;gt;access_right('Edit customer');&lt;br /&gt;
&lt;br /&gt;
Ensuring that agents only access their own customers is referred to in the code as &amp;quot;agent virtualization&amp;quot;, and for the most part it must be done individually in any qsearch call, with the aid of the FS::access_user method '''agentnums_sql''':&lt;br /&gt;
&lt;br /&gt;
  my @cust_main = qsearch(&lt;br /&gt;
    table     =&amp;gt; 'cust_main',&lt;br /&gt;
    extra_sql =&amp;gt; 'WHERE ' . $FS::CurrentUser::CurrentUser-&amp;gt;agentnums_sql,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
The SQL code returned by agentnums_sql will check the appropriate employee access rights and the agents associated with the employee group, returning only those records the employee has access to.  Additional parameters may need to be passed to agentnums_sql, depending on the circumstaces.&lt;br /&gt;
&lt;br /&gt;
==Agents==&lt;br /&gt;
&lt;br /&gt;
Agents ('''FS::agent''') are resellers in the system.  Each agent has many customers, but each customer has one and only one agent.  Even if a system is not being used by multiple agents, an initial &amp;quot;Internal&amp;quot; agent is created upon system installation, such that customers will always have an agent.&lt;br /&gt;
&lt;br /&gt;
Configuration for agents occurs under the '''Companies''' subheading in the Configuration drop-down menu of the main web interface, though that terminology is not used much beyond that.&lt;br /&gt;
&lt;br /&gt;
==Customers==&lt;br /&gt;
&lt;br /&gt;
An '''FS::cust_main''' object represents a customer.  For the most part, this will be regular telecom customers.  Most actions that can be taken, from ordering a package to generating a bill, occur through FS::cust_main methods.  A great number of tables link back to cust_main, and they will be discussed in their own sections below.&lt;br /&gt;
&lt;br /&gt;
There is also a master &amp;quot;System Accounts&amp;quot; customer created upon installation, and individual agents can also have a master customer assigned to them.  These are used for things like tracking system wide services such as domains.&lt;br /&gt;
&lt;br /&gt;
==Packages==&lt;br /&gt;
&lt;br /&gt;
==Services==&lt;br /&gt;
&lt;br /&gt;
==Conf==&lt;br /&gt;
&lt;br /&gt;
==Prospects==&lt;br /&gt;
&lt;br /&gt;
==Payments==&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Developer:Overview&amp;diff=9645</id>
		<title>Freeside:4:Documentation:Developer:Overview</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Developer:Overview&amp;diff=9645"/>
				<updated>2017-01-25T21:37:59Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: Jonathan moved page Freeside:4:Documentation:Developer to Freeside:4:Documentation:Developer:Overview: previous was too generic&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document provides an introductory overview of the major modules and scripts in the Freeside system.  It is not comprehensive, but is rather designed to help new developers get started.  It is targeted towards the version 4 branch.&lt;br /&gt;
&lt;br /&gt;
==Code Base Structure==&lt;br /&gt;
&lt;br /&gt;
The most essential directories for you to know about:&lt;br /&gt;
&lt;br /&gt;
; FS/FS : perl modules in the '''FS''' namespace.&lt;br /&gt;
; httemplate : mason cgi scripts and other files for the main web interface&lt;br /&gt;
; FS/bin : standard installed scripts that keep Freeside running&lt;br /&gt;
; bin : additional helpful scripts, not automatically installed or integral to functioning&lt;br /&gt;
; fs_selfservice : a separate web interface to allow individual customers to access their accounts&lt;br /&gt;
; ng_selfservice : the &amp;quot;next generation&amp;quot; of the selfservice interface, built in php&lt;br /&gt;
; rt : code for the integrated ticket tracking system, mostly third-party but contains some customizations&lt;br /&gt;
&lt;br /&gt;
Typically, a project will involve updating process in ''FS/FS'' and view in ''httemplate''.&lt;br /&gt;
&lt;br /&gt;
==Records==&lt;br /&gt;
&lt;br /&gt;
Most objects described below use '''FS::Record''' as a base.  This provides common methods&lt;br /&gt;
for storing and retrieving records from the database.  By convention, modules that create&lt;br /&gt;
Record-based objects have all-lowercase names, with mixed-case used for mixins and objects&lt;br /&gt;
that are not stored in the database.&lt;br /&gt;
&lt;br /&gt;
Record objects are not automatically updated in the database when manipulated;  for this, the&lt;br /&gt;
standard methods ''insert'', ''replace'' and ''delete'' are provided (though they are often overridden by individual modules to perform additional module-specific actions.)&lt;br /&gt;
&lt;br /&gt;
The standard method ''check'' is run by ''insert'' and ''replace'' to validate data before storing it it the database.  This is almost always overridden by individual modules according to its specific validation needs.   '''FS::Record''' provides a variety of common methods for validating individual fields in ''check'' (e.g. ''ut_float'' to validate a floating-point number, ''ut_floatn'' if that field is allowed to be null, etc.)&lt;br /&gt;
&lt;br /&gt;
To retrieve data from the database, functions ''qsearch'' (for multiple records) and ''qsearchs'' (when you expect only a single record) are provided.  These must be imported explicitly from '''FS::Record''' into your script.  They return appropriately blessed objects in the '''FS''' namespace.&lt;br /&gt;
&lt;br /&gt;
==Employees==&lt;br /&gt;
&lt;br /&gt;
People with access to the main web interface are known as Employees ('''FS::access_user''').  Each employee can belong to one or more Employee Groups ('''FS::access_group'''), which define their access rights to the system and the customers they are allowed to view.  Because of the module names, employees are also often just called users.&lt;br /&gt;
&lt;br /&gt;
Access rights are defined in '''FS::AccessRight''' and consist of plain english strings describing the right (e.g. 'Edit customer', 'Change customer package', etc.)  Appropriate access rights should always be checked in the web interface before any data processing occurs.&lt;br /&gt;
&lt;br /&gt;
Within the web interface, the '''FS::access_user''' object for current authenticated employee can be accessed in the variable ''$FS::CurrentUser::CurrentUser''.  Access rights can be checked for this object using the ''access_right'' method, e.g.&lt;br /&gt;
&lt;br /&gt;
  die &amp;quot;access denied&amp;quot;&lt;br /&gt;
    unless $FS::CurrentUser::CurrentUser-&amp;gt;access_right('Edit customer');&lt;br /&gt;
&lt;br /&gt;
==Agents==&lt;br /&gt;
&lt;br /&gt;
Agents ('''FS::agent''') are resellers in the system.  Each agent has many customers, but each customer has one and only one agent.&lt;br /&gt;
&lt;br /&gt;
==Customers==&lt;br /&gt;
&lt;br /&gt;
An FS::cust_main object represents a customer.&lt;br /&gt;
&lt;br /&gt;
==Packages==&lt;br /&gt;
&lt;br /&gt;
==Services==&lt;br /&gt;
&lt;br /&gt;
==Conf==&lt;br /&gt;
&lt;br /&gt;
==Prospects==&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Developer&amp;diff=9646</id>
		<title>Freeside:4:Documentation:Developer</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Developer&amp;diff=9646"/>
				<updated>2017-01-25T21:37:59Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: Jonathan moved page Freeside:4:Documentation:Developer to Freeside:4:Documentation:Developer:Overview: previous was too generic&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Freeside:4:Documentation:Developer:Overview]]&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Developer:Overview&amp;diff=9644</id>
		<title>Freeside:4:Documentation:Developer:Overview</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Developer:Overview&amp;diff=9644"/>
				<updated>2017-01-25T21:12:07Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document provides an introductory overview of the major modules and scripts in the Freeside system.  It is not comprehensive, but is rather designed to help new developers get started.  It is targeted towards the version 4 branch.&lt;br /&gt;
&lt;br /&gt;
==Code Base Structure==&lt;br /&gt;
&lt;br /&gt;
The most essential directories for you to know about:&lt;br /&gt;
&lt;br /&gt;
; FS/FS : perl modules in the '''FS''' namespace.&lt;br /&gt;
; httemplate : mason cgi scripts and other files for the main web interface&lt;br /&gt;
; FS/bin : standard installed scripts that keep Freeside running&lt;br /&gt;
; bin : additional helpful scripts, not automatically installed or integral to functioning&lt;br /&gt;
; fs_selfservice : a separate web interface to allow individual customers to access their accounts&lt;br /&gt;
; ng_selfservice : the &amp;quot;next generation&amp;quot; of the selfservice interface, built in php&lt;br /&gt;
; rt : code for the integrated ticket tracking system, mostly third-party but contains some customizations&lt;br /&gt;
&lt;br /&gt;
Typically, a project will involve updating process in ''FS/FS'' and view in ''httemplate''.&lt;br /&gt;
&lt;br /&gt;
==Records==&lt;br /&gt;
&lt;br /&gt;
Most objects described below use '''FS::Record''' as a base.  This provides common methods&lt;br /&gt;
for storing and retrieving records from the database.  By convention, modules that create&lt;br /&gt;
Record-based objects have all-lowercase names, with mixed-case used for mixins and objects&lt;br /&gt;
that are not stored in the database.&lt;br /&gt;
&lt;br /&gt;
Record objects are not automatically updated in the database when manipulated;  for this, the&lt;br /&gt;
standard methods ''insert'', ''replace'' and ''delete'' are provided (though they are often overridden by individual modules to perform additional module-specific actions.)&lt;br /&gt;
&lt;br /&gt;
The standard method ''check'' is run by ''insert'' and ''replace'' to validate data before storing it it the database.  This is almost always overridden by individual modules according to its specific validation needs.   '''FS::Record''' provides a variety of common methods for validating individual fields in ''check'' (e.g. ''ut_float'' to validate a floating-point number, ''ut_floatn'' if that field is allowed to be null, etc.)&lt;br /&gt;
&lt;br /&gt;
To retrieve data from the database, functions ''qsearch'' (for multiple records) and ''qsearchs'' (when you expect only a single record) are provided.  These must be imported explicitly from '''FS::Record''' into your script.  They return appropriately blessed objects in the '''FS''' namespace.&lt;br /&gt;
&lt;br /&gt;
==Employees==&lt;br /&gt;
&lt;br /&gt;
People with access to the main web interface are known as Employees ('''FS::access_user''').  Each employee can belong to one or more Employee Groups ('''FS::access_group'''), which define their access rights to the system and the customers they are allowed to view.  Because of the module names, employees are also often just called users.&lt;br /&gt;
&lt;br /&gt;
Access rights are defined in '''FS::AccessRight''' and consist of plain english strings describing the right (e.g. 'Edit customer', 'Change customer package', etc.)  Appropriate access rights should always be checked in the web interface before any data processing occurs.&lt;br /&gt;
&lt;br /&gt;
Within the web interface, the '''FS::access_user''' object for current authenticated employee can be accessed in the variable ''$FS::CurrentUser::CurrentUser''.  Access rights can be checked for this object using the ''access_right'' method, e.g.&lt;br /&gt;
&lt;br /&gt;
  die &amp;quot;access denied&amp;quot;&lt;br /&gt;
    unless $FS::CurrentUser::CurrentUser-&amp;gt;access_right('Edit customer');&lt;br /&gt;
&lt;br /&gt;
==Agents==&lt;br /&gt;
&lt;br /&gt;
Agents ('''FS::agent''') are resellers in the system.  Each agent has many customers, but each customer has one and only one agent.&lt;br /&gt;
&lt;br /&gt;
==Customers==&lt;br /&gt;
&lt;br /&gt;
An FS::cust_main object represents a customer.&lt;br /&gt;
&lt;br /&gt;
==Packages==&lt;br /&gt;
&lt;br /&gt;
==Services==&lt;br /&gt;
&lt;br /&gt;
==Conf==&lt;br /&gt;
&lt;br /&gt;
==Prospects==&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Developer:Overview&amp;diff=9643</id>
		<title>Freeside:4:Documentation:Developer:Overview</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Developer:Overview&amp;diff=9643"/>
				<updated>2017-01-25T21:11:12Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: Still under construction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Freeside Developer Code Overview=&lt;br /&gt;
&lt;br /&gt;
This document provides an introductory overview of the major modules and scripts in the Freeside system.  It is not comprehensive, but is rather designed to help new developers get started.  It is targeted towards the version 4 branch.&lt;br /&gt;
&lt;br /&gt;
==Code Base Structure==&lt;br /&gt;
&lt;br /&gt;
The most essential directories for you to know about:&lt;br /&gt;
&lt;br /&gt;
; FS/FS : perl modules in the '''FS''' namespace.&lt;br /&gt;
; httemplate : mason cgi scripts and other files for the main web interface&lt;br /&gt;
; FS/bin : standard installed scripts that keep Freeside running&lt;br /&gt;
; bin : additional helpful scripts, not automatically installed or integral to functioning&lt;br /&gt;
; fs_selfservice : a separate web interface to allow individual customers to access their accounts&lt;br /&gt;
; ng_selfservice : the &amp;quot;next generation&amp;quot; of the selfservice interface, built in php&lt;br /&gt;
; rt : code for the integrated ticket tracking system, mostly third-party but contains some customizations&lt;br /&gt;
&lt;br /&gt;
Typically, a project will involve updating process in ''FS/FS'' and view in ''httemplate''.&lt;br /&gt;
&lt;br /&gt;
==Records==&lt;br /&gt;
&lt;br /&gt;
Most objects described below use '''FS::Record''' as a base.  This provides common methods&lt;br /&gt;
for storing and retrieving records from the database.  By convention, modules that create&lt;br /&gt;
Record-based objects have all-lowercase names, with mixed-case used for mixins and objects&lt;br /&gt;
that are not stored in the database.&lt;br /&gt;
&lt;br /&gt;
Record objects are not automatically updated in the database when manipulated;  for this, the&lt;br /&gt;
standard methods ''insert'', ''replace'' and ''delete'' are provided (though they are often overridden by individual modules to perform additional module-specific actions.)&lt;br /&gt;
&lt;br /&gt;
The standard method ''check'' is run by ''insert'' and ''replace'' to validate data before storing it it the database.  This is almost always overridden by individual modules according to its specific validation needs.   '''FS::Record''' provides a variety of common methods for validating individual fields in ''check'' (e.g. ''ut_float'' to validate a floating-point number, ''ut_floatn'' if that field is allowed to be null, etc.)&lt;br /&gt;
&lt;br /&gt;
To retrieve data from the database, functions ''qsearch'' (for multiple records) and ''qsearchs'' (when you expect only a single record) are provided.  These must be imported explicitly from '''FS::Record''' into your script.  They return appropriately blessed objects in the '''FS''' namespace.&lt;br /&gt;
&lt;br /&gt;
==Employees==&lt;br /&gt;
&lt;br /&gt;
People with access to the main web interface are known as Employees ('''FS::access_user''').  Each employee can belong to one or more Employee Groups ('''FS::access_group'''), which define their access rights to the system and the customers they are allowed to view.  Because of the module names, employees are also often just called users.&lt;br /&gt;
&lt;br /&gt;
Access rights are defined in '''FS::AccessRight''' and consist of plain english strings describing the right (e.g. 'Edit customer', 'Change customer package', etc.)  Appropriate access rights should always be checked in the web interface before any data processing occurs.&lt;br /&gt;
&lt;br /&gt;
Within the web interface, the '''FS::access_user''' object for current authenticated employee can be accessed in the variable ''$FS::CurrentUser::CurrentUser''.  Access rights can be checked for this object using the ''access_right'' method, e.g.&lt;br /&gt;
&lt;br /&gt;
  die &amp;quot;access denied&amp;quot;&lt;br /&gt;
    unless $FS::CurrentUser::CurrentUser-&amp;gt;access_right('Edit customer');&lt;br /&gt;
&lt;br /&gt;
==Agents==&lt;br /&gt;
&lt;br /&gt;
Agents ('''FS::agent''') are resellers in the system.  Each agent has many customers, but each customer has one and only one agent.&lt;br /&gt;
&lt;br /&gt;
==Customers==&lt;br /&gt;
&lt;br /&gt;
An FS::cust_main object represents a customer.&lt;br /&gt;
&lt;br /&gt;
==Packages==&lt;br /&gt;
&lt;br /&gt;
==Services==&lt;br /&gt;
&lt;br /&gt;
==Conf==&lt;br /&gt;
&lt;br /&gt;
==Prospects==&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:3:Documentation:Installation&amp;diff=9588</id>
		<title>Freeside:3:Documentation:Installation</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:3:Documentation:Installation&amp;diff=9588"/>
				<updated>2016-09-12T23:24:26Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: /* Additional modules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
These are from-scratch installation instructions for the raw source code.  They are suitable for intermediate-to-advanced sysadmins.  Folks looking for easy installation are advised to try the VMware appliance or Debian packages instead.&lt;br /&gt;
&lt;br /&gt;
Install Freeside on a firewalled, private server, not a public (web, RADIUS, etc.) server.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
=== Packages ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.perl.org/ Perl], minimum version 5.8.4&lt;br /&gt;
* [http://httpd.apache.org/ Apache], SSL highly recommended&lt;br /&gt;
* [http://perl.apache.org/ mod_perl]&lt;br /&gt;
** If compiling your own mod_perl, make sure you set the EVERYTHING=1 compile-time option&lt;br /&gt;
* A '''transactional''' database engine [http://search.cpan.org/search?mode=module&amp;amp;query=DBD%3A%3A supported] by Perl's [http://dbi.perl.org/ DBI]. &lt;br /&gt;
** [http://www.postgresql.org PostgreSQL] is recommended.&lt;br /&gt;
** [http://www.mysql.com MySQL] and [http://www.mariadb.org/ MariaDB] are supported.  Freeside v3.4 or later and DBIx::DBSchema 0.35 or later are required.&lt;br /&gt;
&lt;br /&gt;
''Note: the above only applies to the database used by the Freeside software itself. Freeside can integrate with RADIUS and other servers running a different database than the backend.''&lt;br /&gt;
&lt;br /&gt;
* TeX (teTeX / TeX Live) and Ghostscript (included with most distributions) (Optional, enables typeset invoices)&lt;br /&gt;
&lt;br /&gt;
=== Perl modules ===&lt;br /&gt;
&lt;br /&gt;
==== Popular modules ====&lt;br /&gt;
&lt;br /&gt;
These modules are included in most distributions.&lt;br /&gt;
&amp;lt;!-- reference: CentOS/RHEL 5, i.e. http://linux.mirrors.es.net/centos/6/os/x86_64/Packages/&lt;br /&gt;
 if its there, its everywhere... right? --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://search.cpan.org/dist/libwww-perl libwww-perl] (CPAN: &amp;quot;install Bundle::LWP&amp;quot;)&lt;br /&gt;
** [http://search.cpan.org/dist/URI URI]&lt;br /&gt;
** [http://search.cpan.org/dist/HTML-Tagset HTML::Tagset]&lt;br /&gt;
** [http://search.cpan.org/dist/HTML-Parser HTML::Parser]&lt;br /&gt;
* [http://search.cpan.org/dist/DBI DBI]&lt;br /&gt;
** [http://search.cpan.org/search?mode=module&amp;amp;query=DBD%3A%3A DBD] for your database engine ([http://search.cpan.org/dist/DBD-Pg DBD::Pg] for PostgreSQL or [http://search.cpan.org/dist/DBD-mysql DBD::mysql] for MySQL)&lt;br /&gt;
* [http://search.cpan.org/dist/DateManip Date::Manip]&lt;br /&gt;
* [http://search.cpan.org/dist/DateTime DateTime]&lt;br /&gt;
* [http://search.cpan.org/dist/Frontier-RPC Frontier::RPC2]&lt;br /&gt;
* [http://search.cpan.org/dist/GD-Barcode GD::Barcode]&lt;br /&gt;
* [http://search.cpan.org/dist/IPC-Run IPC::Run]&lt;br /&gt;
* [http://search.cpan.org/dist/IPC-Run3 IPC::Run3]&lt;br /&gt;
* [http://search.cpan.org/dist/JSON JSON]&lt;br /&gt;
* [http://search.cpan.org/dist/MailTools MailTools] (CPAN: &amp;quot;install Mail::Internet&amp;quot;)&lt;br /&gt;
* [http://search.cpan.org/dist/MIME-tools MIME::Tools] (Note: do not use version 5.423)&lt;br /&gt;
* [http://search.cpan.org/dist/Net-SNMP Net::SNMP]&lt;br /&gt;
* [http://search.cpan.org/dist/SOAP-Lite SOAP::Lite]&lt;br /&gt;
* [http://search.cpan.org/dist/TimeDate TimeDate] (CPAN: &amp;quot;install Date::Format&amp;quot;)&lt;br /&gt;
* [http://search.cpan.org/dist/XML-LibXML XML::LibXML]&lt;br /&gt;
* [http://search.cpan.org/dist/XML-Simple XML::Simple]&lt;br /&gt;
&lt;br /&gt;
==== Common modules ====&lt;br /&gt;
&lt;br /&gt;
These modules are included in many distributions.&lt;br /&gt;
&amp;lt;!-- more nebulous criteria, but should be included in at least Debian, FreeBSD ports, have sigificant Perl mindshare --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://search.cpan.org/dist/Chart Chart] (CPAN: &amp;quot;install Chart::Base&amp;quot;)&lt;br /&gt;
* [http://search.cpan.org/dist/Cache-Cache Cache::Cache]&lt;br /&gt;
* [http://search.cpan.org/dist/DateTime-Format-Strptime DateTime::Format::Strptime]&lt;br /&gt;
* [http://search.cpan.org/dist/DateTime-Format-Natural DateTime-Format-Natural]&lt;br /&gt;
* [http://search.cpan.org/dist/Email-Sender Email::Sender]&lt;br /&gt;
* [http://search.cpan.org/dist/Email-Sender-Transport-SMTP-TLS Email::Sender::Transport::SMTP::TLS]&lt;br /&gt;
* [http://search.cpan.org/dist/Excel-Writer-XLSX Excel::Writer::XLSX]&lt;br /&gt;
* [http://search.cpan.org/dist/HTML-Mason HTML::Mason]&lt;br /&gt;
* [http://search.cpan.org/dist/Locale-Codes Locale-Codes] (CPAN: &amp;quot;install Locale::Country&amp;quot;)&lt;br /&gt;
* [http://search.cpan.org/dist/Locale-SubCountry Locale::SubCountry]&lt;br /&gt;
* [http://search.cpan.org/dist/Log-Dispatch Log::Dispatch]&lt;br /&gt;
* [http://search.cpan.org/dist/NetAddr-IP NetAddr::IP]&lt;br /&gt;
* [http://search.cpan.org/dist/Net-Ping Net::Ping]&lt;br /&gt;
* [http://search.cpan.org/dist/Net-Ping-External Net::Ping::External]&lt;br /&gt;
* [http://search.cpan.org/dist/Number-Format Number::Format]&lt;br /&gt;
* [http://search.cpan.org/dist/Spreadsheet-WriteExcel Spreadsheet::WriteExcel]&lt;br /&gt;
* [http://search.cpan.org/dist/String-Approx String::Approx]&lt;br /&gt;
* [http://search.cpan.org/dist/Text-CSV_XS Text::CSV_XS]&lt;br /&gt;
* [http://search.cpan.org/dist/Term-ReadKey Term::ReadKey]&lt;br /&gt;
* [http://search.cpan.org/dist/Text-Template Text::Template]&lt;br /&gt;
&lt;br /&gt;
==== Additional modules ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- our modules (DBIx::DBSchema, Net::SSH, H:W:SelectLayers, etc.) and other modules with questionable mindshare and distro pickup. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://search.cpan.org/dist/Authen-Passphrase Authen::Passphrase]&lt;br /&gt;
* [http://search.cpan.org/dist/Business-CreditCard Business::CreditCard]&lt;br /&gt;
* [http://search.cpan.org/dist/Business-US-USPS-WebTools Business::US::USPS::WebTools]&lt;br /&gt;
* [http://search.cpan.org/dist/CAM-PDF CAM::PDF]&lt;br /&gt;
* [http://search.cpan.org/dist/Color-Scheme Color::Scheme]&lt;br /&gt;
* [http://search.cpan.org/dist/Crypt-PasswdMD5 Crypt::PasswdMD5]&lt;br /&gt;
* [http://search.cpan.org/dist/Crypt-OpenSSL-RSA Crypt::OpenSSL::RSA]&lt;br /&gt;
* [http://search.cpan.org/dist/Date-Simple Date::Simple]&lt;br /&gt;
* [http://search.cpan.org/dist/DateTime-Format-ICal DateTime::Format::ICal]&lt;br /&gt;
* [http://search.cpan.org/dist/DateTime-Set DateTime::Set]&lt;br /&gt;
* [http://search.cpan.org/dist/DBIx-DBSchema DBIx::DBSchema]&lt;br /&gt;
* [http://search.cpan.org/dist/File-CounterFile File::CounterFile]&lt;br /&gt;
* [http://search.cpan.org/dist/File-Slurp File::Slurp]&lt;br /&gt;
* [http://search.cpan.org/dist/Geo-Coder-Googlev3 Geo::Coder::Googlev3]&lt;br /&gt;
* [http://search.cpan.org/dist/Geo-GoogleEarth-Pluggable Geo::GoogleEarth::Pluggable]&lt;br /&gt;
* [http://search.cpan.org/dist/HTML-Defang HTML::Defang]&lt;br /&gt;
* [http://search.cpan.org/dist/HTML-ElementTable HTML::ElementTable]&lt;br /&gt;
* [http://search.cpan.org/dist/HTML-TableExtract HTML::TableExtract]&lt;br /&gt;
* [http://search.cpan.org/dist/HTML-Widgets-SelectLayers HTML::Widgets::SelectLayers]&lt;br /&gt;
* [http://search.cpan.org/dist/IO-Scalar IO::Scalar]&lt;br /&gt;
* [http://search.cpan.org/dist/IO-String IO::String]&lt;br /&gt;
* [http://search.cpan.org/dist/IPC-Run-SafeHandles IPC::Run::SafeHandles]&lt;br /&gt;
* [http://search.cpan.org/dist/Lingua-EN-NameParse Lingua::EN::NameParse]&lt;br /&gt;
* [http://search.cpan.org/dist/Lingua-EN-Inflect Lingua::EN::Inflect]&lt;br /&gt;
* [http://search.cpan.org/dist/Net-Domain-TLD Net::Domain::TLD]&lt;br /&gt;
* [http://search.cpan.org/dist/Net-OpenSSH Net::OpenSSH]&lt;br /&gt;
* [http://search.cpan.org/dist/Net-SSH Net::SSH]&lt;br /&gt;
* [http://search.cpan.org/dist/Net-Whois-Raw Net::Whois::Raw]&lt;br /&gt;
* [http://search.cpan.org/dist/String-ShellQuote String::ShellQuote]&lt;br /&gt;
* [http://search.cpan.org/dist/Tie-IxHash Tie::IxHash]&lt;br /&gt;
* [http://search.cpan.org/dist/Time-Duration Time::Duration]&lt;br /&gt;
* [http://search.cpan.org/dist/XML-LibXML-LazyBuilder XML::LibXML::LazyBuilder]&lt;br /&gt;
* [http://search.cpan.org/dist/Net-HTTPS-Any Net::HTTPS::Any]&lt;br /&gt;
&lt;br /&gt;
==== Optional modules ====&lt;br /&gt;
&lt;br /&gt;
* [http://search.cpan.org/dist/Apache-DBI Apache::DBI] ''(recommended for better web interface performance)''&lt;br /&gt;
* [http://search.cpan.org/dist/Fax-Hylafax-Client Fax::Hylafax::Client] ''(only if faxing invoices)''&lt;br /&gt;
* [http://search.cpan.org/dist/POE POE] ''(only if using alternate standalone XML-RPC server)''&lt;br /&gt;
* [http://search.cpan.org/dist/Sys::SigAction Sys::SigAction] ''(only if port combining with network monitoring)''&lt;br /&gt;
&lt;br /&gt;
==== Note on missing modules ====&lt;br /&gt;
&lt;br /&gt;
Prerequisites missing from the documentation?  Please add them (in the appropriate section).&lt;br /&gt;
&lt;br /&gt;
== Download Freeside ==&lt;br /&gt;
* Get the source from one of the normal places &lt;br /&gt;
**[http://www.freeside.biz/freeside/developers.html Open source link from the home page]&lt;br /&gt;
**[http://www.freeside.biz/freeside/git.html Anonymous git]&lt;br /&gt;
* Uncompress the tarball&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== System User ===&lt;br /&gt;
* Add the user and group `freeside' to your system.&lt;br /&gt;
=== Database User ===&lt;br /&gt;
* Allow the freeside user full access to the freeside database. &lt;br /&gt;
with Postgresql:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ as postgres/pgsql user ]&lt;br /&gt;
$ createuser -P freeside &lt;br /&gt;
Enter password for new role: &lt;br /&gt;
Enter it again: &lt;br /&gt;
Shall the new role be a superuser? (y/n) n&lt;br /&gt;
Shall the new role be allowed to create databases? (y/n) y&lt;br /&gt;
Shall the new role be allowed to create more new roles? (y/n) n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or with MySQL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mysqladmin -u root password 'set_a_root_database_password'&lt;br /&gt;
$ mysql -u root -p&lt;br /&gt;
mysql&amp;gt; GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,ALTER,CREATE,DROP on freeside.* TO freeside@localhost IDENTIFIED BY 'set_a_freeside_database_password';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Database Access ===&lt;br /&gt;
*Edit the top-level Makefile: &lt;br /&gt;
** Configure the DATASOURCE to your DBI data source&lt;br /&gt;
*** Set the DB_TYPE (Pg or mysql)&lt;br /&gt;
*** See the DBI manpage and the manpage for your DBD for the exact syntax of your DBI data source. &lt;br /&gt;
** Set DB_PASSWORD to the freeside database user's password.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* Add the freeside database to your database engine: &lt;br /&gt;
with Postgres: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ su freeside&lt;br /&gt;
$ createdb -E UTF8 freeside&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or with MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mysqladmin -u freeside -p create freeside &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Perl Modules ===&lt;br /&gt;
* Build and install the Perl modules: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make perl-modules&lt;br /&gt;
$ su&lt;br /&gt;
# make install-perl-modules&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Basic configuration Files ===&lt;br /&gt;
* Create the necessary configuration files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ su&lt;br /&gt;
# make create-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Invoice Typesetting ===&lt;br /&gt;
* If you are using typeset invoices, install fslongtable.sty:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ su&lt;br /&gt;
# make install-texmf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Apache &amp;amp; Web GUI ===&lt;br /&gt;
* Configuration&lt;br /&gt;
** Enable mod_perl&lt;br /&gt;
** Run as &amp;lt;code&amp;gt;User freeside&amp;lt;/code&amp;gt;&lt;br /&gt;
*** If you have other things being served by Apache on this machine (hopefully internal things), it is recommended to run a '''separate''' iteration of Apache as the freeside user.&lt;br /&gt;
&lt;br /&gt;
* Edit the Makefile and set &amp;lt;code&amp;gt;FREESIDE_DOCUMENT_ROOT&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* To install the web interface, run: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ su&lt;br /&gt;
# make install-docs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Edit the Makefile and set &amp;lt;code&amp;gt;APACHE_VERSION&amp;lt;/code&amp;gt; to '''1''' (mod_perl v1.XX), '''1.99''' (mod_perl v2 prereleases up to and including 1.999_21, shipped with Debian 3.1, CentOS/RHEL 4, others), or '''2''' (mod_perl v2 proper and prereleases 1.999_22 and later).&lt;br /&gt;
&lt;br /&gt;
* Edit the Makefile and set &amp;lt;code&amp;gt;APACHE_CONF&amp;lt;/code&amp;gt; to the location of an Apache include directory (not a file).  (If your Apache doesn't have an existing include directory, create one and add a line such as &amp;quot;&amp;lt;code&amp;gt;Include /etc/apache/conf.d&amp;lt;/code&amp;gt;&amp;quot; to httpd.conf.)&lt;br /&gt;
&lt;br /&gt;
* To install the apache configs, run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ su&lt;br /&gt;
# make install-apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Note: Do not attempt to restart Apache (httpd) yet.''&lt;br /&gt;
&lt;br /&gt;
=== Initialize Data ===&lt;br /&gt;
* As the freeside UNIX user, run &amp;lt;code&amp;gt;freeside-setup -d your.domain.name&amp;lt;/code&amp;gt; to create the database tables and initial data.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ su freeside&lt;br /&gt;
$ freeside-setup -d example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Additional System Users ===&lt;br /&gt;
* Create the Freeside system users: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ su freeside&lt;br /&gt;
$ freeside-adduser -g 1 fs_queue&lt;br /&gt;
$ freeside-adduser -g 1 fs_daily&lt;br /&gt;
$ freeside-adduser -g 1 fs_selfservice&lt;br /&gt;
$ freeside-adduser -g 1 fs_api&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create Freeside Users ===&lt;br /&gt;
* Create one or more Freeside users (your internal sales/tech folks, not customer accounts):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ su freeside&lt;br /&gt;
$ freeside-adduser -g 1 username&lt;br /&gt;
$ htpasswd /usr/local/etc/freeside/htpasswd username&lt;br /&gt;
Password: &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Additional users can be added using the same command or from the web interface.&lt;br /&gt;
&lt;br /&gt;
=== Queue Daemon ===&lt;br /&gt;
&lt;br /&gt;
* freeside-queued was installed with the Perl modules. Start it now and ensure that is run upon system startup (Do this manually, or edit the top-level Makefile, replacing &amp;lt;code&amp;gt;INIT_FILE&amp;lt;/code&amp;gt; with the appropriate location on your system and &amp;lt;code&amp;gt;QUEUED_USER&amp;lt;/code&amp;gt; with the username of a Freeside user you created above, and run &amp;lt;code&amp;gt;make install-init&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== RT ===&lt;br /&gt;
* It is recommended to [[Freeside:3:Documentation:RT_Installation|install the integrated RT ticketing system]], even if you will not be using it.  Alternatively, if you are interested in working on fixes to run without integrated ticketing, delete the &amp;lt;code&amp;gt;ticket_system&amp;lt;/code&amp;gt; entry from your conf table.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su freeside&lt;br /&gt;
psql freeside&lt;br /&gt;
delete from conf where name = 'ticket_system';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finalize ===&lt;br /&gt;
* Restart Apache (httpd) and log into the web interface using the username and password you entered above.&lt;br /&gt;
&lt;br /&gt;
* Now proceed to the initial [[Freeside:1.9:Documentation:Administration|administration]] of your installation.&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Developer/FS/SelfService&amp;diff=9581</id>
		<title>Freeside:4:Documentation:Developer/FS/SelfService</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Developer/FS/SelfService&amp;diff=9581"/>
				<updated>2016-07-30T00:23:29Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==NAME==&lt;br /&gt;
FS::SelfService - Freeside self-service API&lt;br /&gt;
&lt;br /&gt;
==SYNOPSIS==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  # password and shell account changes&lt;br /&gt;
  use FS::SelfService qw(passwd chfn chsh);&lt;br /&gt;
 &lt;br /&gt;
  # &amp;quot;my account&amp;quot; functionality&lt;br /&gt;
  use FS::SelfService qw( login customer_info invoice cancel payment_info process_payment );&lt;br /&gt;
 &lt;br /&gt;
  #new-style login with an email address and password&lt;br /&gt;
  # can also be used for svc_acct login, set $emailaddress to username@domain&lt;br /&gt;
  my $rv = login ( { 'email'    =&amp;gt; $emailaddress,&lt;br /&gt;
                     'password' =&amp;gt; $password,&lt;br /&gt;
                   },&lt;br /&gt;
                 );&lt;br /&gt;
  if ( $rv-&amp;gt;{'error'} ) {&lt;br /&gt;
    #handle login error...&lt;br /&gt;
  } else {&lt;br /&gt;
    #successful login&lt;br /&gt;
    $session_id = $rv-&amp;gt;{'session_id'};&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  #classic svc_acct-based login with separate username and password&lt;br /&gt;
  my $rv = login( { 'username' =&amp;gt; $username,&lt;br /&gt;
                    'domain'   =&amp;gt; $domain,&lt;br /&gt;
                    'password' =&amp;gt; $password,&lt;br /&gt;
                  }&lt;br /&gt;
                );&lt;br /&gt;
  if ( $rv-&amp;gt;{'error'} ) {&lt;br /&gt;
    #handle login error...&lt;br /&gt;
  } else {&lt;br /&gt;
    #successful login&lt;br /&gt;
    $session_id = $rv-&amp;gt;{'session_id'};&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  #svc_phone login with phone number and PIN&lt;br /&gt;
  my $rv = login( { 'username' =&amp;gt; $phone_number,&lt;br /&gt;
                    'domain'   =&amp;gt; 'svc_phone',&lt;br /&gt;
                    'password' =&amp;gt; $pin,&lt;br /&gt;
                  }&lt;br /&gt;
                );&lt;br /&gt;
  if ( $rv-&amp;gt;{'error'} ) {&lt;br /&gt;
    #handle login error...&lt;br /&gt;
  } else {&lt;br /&gt;
    #successful login&lt;br /&gt;
    $session_id = $rv-&amp;gt;{'session_id'};&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  my $customer_info = customer_info( { 'session_id' =&amp;gt; $session_id } );&lt;br /&gt;
 &lt;br /&gt;
  #payment_info and process_payment are available in 1.5+ only&lt;br /&gt;
  my $payment_info = payment_info( { 'session_id' =&amp;gt; $session_id } );&lt;br /&gt;
 &lt;br /&gt;
  #!!! process_payment example&lt;br /&gt;
 &lt;br /&gt;
  #!!! list_pkgs example&lt;br /&gt;
 &lt;br /&gt;
  #ordering a package with an svc_acct service&lt;br /&gt;
  my $rv = order_pkg( { 'session_id' =&amp;gt; $session_id,&lt;br /&gt;
                        'pkgpart'    =&amp;gt; $pkgpart,&lt;br /&gt;
                        'svcpart'    =&amp;gt; $svcpart,&lt;br /&gt;
                        'username'   =&amp;gt; $username,&lt;br /&gt;
                        'domsvc'     =&amp;gt; $domsvc, #svcnum of svc_domain&lt;br /&gt;
                        '_password'  =&amp;gt; $password,&lt;br /&gt;
                      }&lt;br /&gt;
                    );&lt;br /&gt;
 &lt;br /&gt;
  #!!! ordering a package with an svc_domain service example&lt;br /&gt;
 &lt;br /&gt;
  #!!! ordering a package with an svc_phone service example&lt;br /&gt;
 &lt;br /&gt;
  #!!! ordering a package with an svc_external service example&lt;br /&gt;
 &lt;br /&gt;
  #!!! ordering a package with an svc_pbx service&lt;br /&gt;
 &lt;br /&gt;
  #ordering a package with no service&lt;br /&gt;
  my $rv = order_pkg( { 'session_id' =&amp;gt; $session_id,&lt;br /&gt;
                        'pkgpart'    =&amp;gt; $pkgpart,&lt;br /&gt;
                        'svcpart'    =&amp;gt; 'none',&lt;br /&gt;
                      }&lt;br /&gt;
                    );&lt;br /&gt;
 &lt;br /&gt;
  #quoting a package, then ordering after confirmation&lt;br /&gt;
 &lt;br /&gt;
  my $rv = quotation_new({ 'session_id' =&amp;gt; $session_id });&lt;br /&gt;
  my $qnum = $rv-&amp;gt;{quotationnum};&lt;br /&gt;
  #  add packages to the quotation&lt;br /&gt;
  $rv = quotation_add_pkg({ 'session_id'   =&amp;gt; $session_id,&lt;br /&gt;
                            'quotationnum' =&amp;gt; $qnum,&lt;br /&gt;
                            'pkgpart'      =&amp;gt; $pkgpart,&lt;br /&gt;
                            'quantity'     =&amp;gt; $quantity, # defaults to 1&lt;br /&gt;
                          });&lt;br /&gt;
  #  repeat until all packages are added&lt;br /&gt;
  #  view the pricing information&lt;br /&gt;
  $rv = quotation_info({ 'session_id'   =&amp;gt; $session_id,&lt;br /&gt;
                         'quotationnum' =&amp;gt; $qnum,&lt;br /&gt;
                      });&lt;br /&gt;
  print &amp;quot;Total setup charges: &amp;quot;.$rv-&amp;gt;{total_setup}.&amp;quot;\n&amp;quot;.&lt;br /&gt;
        &amp;quot;Total recurring charges: &amp;quot;.$rv-&amp;gt;{total_recur}.&amp;quot;\n&amp;quot;;&lt;br /&gt;
  #  quotation_info also provides a detailed breakdown of charges, in&lt;br /&gt;
  #  $rv-&amp;gt;{sections}.&lt;br /&gt;
 &lt;br /&gt;
  #  ask customer for confirmation, then:&lt;br /&gt;
  $rv = quotation_order({ 'session_id'   =&amp;gt; $session_id,&lt;br /&gt;
                          'quotationnum' =&amp;gt; $qnum,&lt;br /&gt;
                        });&lt;br /&gt;
 &lt;br /&gt;
  #!!! cancel_pkg example&lt;br /&gt;
 &lt;br /&gt;
  # signup functionality&lt;br /&gt;
  use FS::SelfService qw( signup_info new_customer new_customer_minimal );&lt;br /&gt;
 &lt;br /&gt;
  my $signup_info = signup_info;&lt;br /&gt;
 &lt;br /&gt;
  $rv = new_customer( {&lt;br /&gt;
                        'first'            =&amp;gt; $first,&lt;br /&gt;
                        'last'             =&amp;gt; $last,&lt;br /&gt;
                        'company'          =&amp;gt; $company,&lt;br /&gt;
                        'address1'         =&amp;gt; $address1,&lt;br /&gt;
                        'address2'         =&amp;gt; $address2,&lt;br /&gt;
                        'city'             =&amp;gt; $city,&lt;br /&gt;
                        'state'            =&amp;gt; $state,&lt;br /&gt;
                        'zip'              =&amp;gt; $zip,&lt;br /&gt;
                        'country'          =&amp;gt; $country,&lt;br /&gt;
                        'daytime'          =&amp;gt; $daytime,&lt;br /&gt;
                        'night'            =&amp;gt; $night,&lt;br /&gt;
                        'fax'              =&amp;gt; $fax,&lt;br /&gt;
                        'payby'            =&amp;gt; $payby,&lt;br /&gt;
                        'payinfo'          =&amp;gt; $payinfo,&lt;br /&gt;
                        'paycvv'           =&amp;gt; $paycvv,&lt;br /&gt;
                        'paystart_month'   =&amp;gt; $paystart_month&lt;br /&gt;
                        'paystart_year'    =&amp;gt; $paystart_year,&lt;br /&gt;
                        'payissue'         =&amp;gt; $payissue,&lt;br /&gt;
                        'payip'            =&amp;gt; $payip&lt;br /&gt;
                        'paydate'          =&amp;gt; $paydate,&lt;br /&gt;
                        'payname'          =&amp;gt; $payname,&lt;br /&gt;
                        'invoicing_list'   =&amp;gt; $invoicing_list,&lt;br /&gt;
                        'referral_custnum' =&amp;gt; $referral_custnum,&lt;br /&gt;
                        'agentnum'         =&amp;gt; $agentnum,&lt;br /&gt;
                        'pkgpart'          =&amp;gt; $pkgpart,&lt;br /&gt;
 &lt;br /&gt;
                        'username'         =&amp;gt; $username,&lt;br /&gt;
                        '_password'        =&amp;gt; $password,&lt;br /&gt;
                        'popnum'           =&amp;gt; $popnum,&lt;br /&gt;
                        #OR&lt;br /&gt;
                        'countrycode'      =&amp;gt; 1,&lt;br /&gt;
                        'phonenum'         =&amp;gt; $phonenum,&lt;br /&gt;
                        'pin'              =&amp;gt; $pin,&lt;br /&gt;
                      }&lt;br /&gt;
                    );&lt;br /&gt;
  &lt;br /&gt;
  my $error = $rv-&amp;gt;{'error'};&lt;br /&gt;
  if ( $error eq '_decline' ) {&lt;br /&gt;
    print_decline();&lt;br /&gt;
  } elsif ( $error ) {&lt;br /&gt;
    reprint_signup();&lt;br /&gt;
  } else {&lt;br /&gt;
    print_success();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==DESCRIPTION==&lt;br /&gt;
Use this API to implement your own client &amp;quot;self-service&amp;quot; module.&lt;br /&gt;
&lt;br /&gt;
If you just want to customize the look of the existing &amp;quot;self-service&amp;quot; module, see XXXX instead.&lt;br /&gt;
&lt;br /&gt;
==PASSWORD, GECOS, SHELL CHANGING FUNCTIONS==&lt;br /&gt;
; passwd&lt;br /&gt;
:Changes the password for an existing user in svc_acct. Takes a hash reference with the following keys:&lt;br /&gt;
:; username&lt;br /&gt;
::Username of the account (required)&lt;br /&gt;
:; domain&lt;br /&gt;
::Domain of the account (required)&lt;br /&gt;
:; old_password&lt;br /&gt;
::Old password (required)&lt;br /&gt;
:; new_password&lt;br /&gt;
::New password (required)&lt;br /&gt;
:; new_gecos&lt;br /&gt;
::New gecos&lt;br /&gt;
:; new_shell&lt;br /&gt;
::New Shell&lt;br /&gt;
; chfn; chsh&lt;br /&gt;
==&amp;quot;MY ACCOUNT&amp;quot; FUNCTIONS==&lt;br /&gt;
; login HASHREF&lt;br /&gt;
:Creates a user session. Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; email&lt;br /&gt;
::Email address (username@domain), instead of username and domain. Required for contact-based self-service login, can also be used for svc_acct-based login.&lt;br /&gt;
:; username&lt;br /&gt;
::Username&lt;br /&gt;
:; domain&lt;br /&gt;
::Domain&lt;br /&gt;
:; password&lt;br /&gt;
::Password&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with the following keys:&lt;br /&gt;
:; error&lt;br /&gt;
::Empty on success, or an error message on errors.&lt;br /&gt;
:; session_id&lt;br /&gt;
::Session identifier for successful logins&lt;br /&gt;
; customer_info HASHREF&lt;br /&gt;
:Returns general customer information.&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with a single key: '''session_id'''&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with the following keys:&lt;br /&gt;
:; name&lt;br /&gt;
::Customer name&lt;br /&gt;
:; balance&lt;br /&gt;
::Balance owed&lt;br /&gt;
:; open&lt;br /&gt;
::Array reference of hash references of open inoices. Each hash reference has the following keys: invnum, date, owed&lt;br /&gt;
:; small_custview&lt;br /&gt;
::An HTML fragment containing shipping and billing addresses.&lt;br /&gt;
:; The following fields are also returned&lt;br /&gt;
::first last company address1 address2 city county state zip country daytime night fax ship_first ship_last ship_company ship_address1 ship_address2 ship_city ship_state ship_zip ship_country ship_daytime ship_night ship_fax payby payinfo payname month year invoicing_list postal_invoicing&lt;br /&gt;
; edit_info HASHREF&lt;br /&gt;
:Takes a hash reference as parameter with any of the following keys:&lt;br /&gt;
&lt;br /&gt;
:first last company address1 address2 city county state zip country daytime night fax ship_first ship_last ship_company ship_address1 ship_address2 ship_city ship_state ship_zip ship_country ship_daytime ship_night ship_fax payby payinfo paycvv payname month year invoicing_list postal_invoicing&lt;br /&gt;
&lt;br /&gt;
:If a field exists, the customer record is updated with the new value of that field. If a field does not exist, that field is not changed on the customer record.&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with a single key, '''error''', empty on success, or an error message on errors&lt;br /&gt;
; invoice HASHREF&lt;br /&gt;
:Returns an invoice. Takes a hash reference as parameter with two keys: session_id and invnum&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with the following keys:&lt;br /&gt;
:; error&lt;br /&gt;
::Empty on success, or an error message on errors&lt;br /&gt;
:; invnum&lt;br /&gt;
::Invoice number&lt;br /&gt;
:; invoice_text&lt;br /&gt;
::Invoice text&lt;br /&gt;
; list_invoices HASHREF&lt;br /&gt;
:Returns a list of all customer invoices. Takes a hash reference with a single key, session_id.&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with the following keys:&lt;br /&gt;
:; error&lt;br /&gt;
::Empty on success, or an error message on errors&lt;br /&gt;
:; invoices&lt;br /&gt;
::Reference to array of hash references with the following keys:&lt;br /&gt;
::; invnum&lt;br /&gt;
:::Invoice ID&lt;br /&gt;
::; _date&lt;br /&gt;
:::Invoice date, in UNIX epoch time&lt;br /&gt;
; list_payby HASHREF&lt;br /&gt;
:Returns a list of all stored customer payment information (credit cards and electronic check accounts). Takes a hash reference with a single key, session_id.&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with the following keys:&lt;br /&gt;
:; error&lt;br /&gt;
::Empty on success, or an error message on errors&lt;br /&gt;
:; payby&lt;br /&gt;
::Reference to array of hash references with the following keys:&lt;br /&gt;
::; custpaybynum::; weight&lt;br /&gt;
:::Numeric weighting. Stored payment information with a lower weight is attempted first.&lt;br /&gt;
::; payby&lt;br /&gt;
:::CARD (Automatic credit card), CHEK (Automatic electronic check), DCRD (on-demand credit card) or DCHK (on-demand electronic check).&lt;br /&gt;
::; paymask&lt;br /&gt;
:::Masked credit card number (or, masked account and routing numbers)&lt;br /&gt;
::; paydate&lt;br /&gt;
:::Credit card expiration date&lt;br /&gt;
::; payname&lt;br /&gt;
:::Exact name on card (or bank name, for electronic checks)&lt;br /&gt;
::; paystate&lt;br /&gt;
:::For electronic checks, bank state&lt;br /&gt;
::; paytype&lt;br /&gt;
:::For electronic checks, account type (Personal/Business, Checking/Savings)&lt;br /&gt;
; insert_payby HASHREF&lt;br /&gt;
:Adds new stored payment information for this customer. Takes a hash reference with the following keys:&lt;br /&gt;
:; session_id:; weight&lt;br /&gt;
::Numeric weighting. Stored payment information with a lower weight is attempted first.&lt;br /&gt;
:; payby&lt;br /&gt;
::CARD (Automatic credit card), CHEK (Automatic electronic check), DCRD (on-demand credit card) or DCHK (on-demand electronic check).&lt;br /&gt;
:; payinfo&lt;br /&gt;
::Credit card number (or electronic check &amp;quot;account@routing&amp;quot;)&lt;br /&gt;
:; paycvv&lt;br /&gt;
::CVV2 number / security code&lt;br /&gt;
:; paydate&lt;br /&gt;
::Credit card expiration date&lt;br /&gt;
:; payname&lt;br /&gt;
::Exact name on card (or bank name, for electronic checks)&lt;br /&gt;
:; paystate&lt;br /&gt;
::For electronic checks, bank state&lt;br /&gt;
:; paytype&lt;br /&gt;
::For electronic checks, account type (i.e. &amp;quot;Personal Savings&amp;quot;, &amp;quot;Personal Checking&amp;quot;, &amp;quot;Business Checking&amp;quot;)A&lt;br /&gt;
:; payip&lt;br /&gt;
::Optional IP address from which payment was submitted&lt;br /&gt;
&lt;br /&gt;
:If there is an error, returns a hash reference with a single key, '''error''', otherwise returns a hash reference with a single key, '''custpaybynum'''.&lt;br /&gt;
&lt;br /&gt;
; update_payby HASHREF&lt;br /&gt;
:Updates stored payment information for this customer. Takes a hash reference with the following keys:&lt;br /&gt;
:; custpaybynum&lt;br /&gt;
::ID of stored payment information to update&lt;br /&gt;
:; session_id:; weight&lt;br /&gt;
::Numeric weighting. Stored payment information with a lower weight is attempted first.&lt;br /&gt;
:; payby&lt;br /&gt;
::CARD (Automatic credit card), CHEK (Automatic electronic check), DCRD (on-demand credit card) or DCHK (on-demand electronic check).&lt;br /&gt;
:; payinfo&lt;br /&gt;
::Credit card number (or electronic check &amp;quot;account@routing&amp;quot;)&lt;br /&gt;
:; paycvv&lt;br /&gt;
::CVV2 number / security code&lt;br /&gt;
:; paydate&lt;br /&gt;
::Credit card expiration date&lt;br /&gt;
:; payname&lt;br /&gt;
::Exact name on card (or bank name, for electronic checks)&lt;br /&gt;
:; paystate&lt;br /&gt;
::For electronic checks, bank state&lt;br /&gt;
:; paytype&lt;br /&gt;
::For electronic checks, account type (i.e. &amp;quot;Personal Savings&amp;quot;, &amp;quot;Personal Checking&amp;quot;, &amp;quot;Business Checking&amp;quot;)A&lt;br /&gt;
:; payip&lt;br /&gt;
::Optional IP address from which payment was submitted&lt;br /&gt;
&lt;br /&gt;
:All keys except '''sessionid''' and '''custpaybynum''' are optional;  if omitted, the previous values in the record will be preserved.&lt;br /&gt;
:If there is an error, returns a hash reference with a single key, '''error''', otherwise returns a hash reference with a single key, '''custpaybynum'''.&lt;br /&gt;
&lt;br /&gt;
; delete_payby HASHREF&lt;br /&gt;
:Removes stored payment information. Takes a hash reference with two keys, '''session_id''' and '''custpaybynum'''. Returns a hash reference with a single key, '''error''', which is an error message or empty for successful removal.&lt;br /&gt;
; cancel HASHREF&lt;br /&gt;
:Cancels this customer.&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with a single key: '''session_id'''&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with a single key, '''error''', which is empty on success or an error message on errors.&lt;br /&gt;
; payment_info HASHREF&lt;br /&gt;
:Returns information that may be useful in displaying a payment page.&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with a single key: '''session_id'''.&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with the following keys:&lt;br /&gt;
:; error&lt;br /&gt;
::Empty on success, or an error message on errors&lt;br /&gt;
:; balance&lt;br /&gt;
::Balance owed&lt;br /&gt;
:; payname&lt;br /&gt;
::Exact name on credit card (CARD/DCRD)&lt;br /&gt;
:; address1&lt;br /&gt;
::Address line one&lt;br /&gt;
:; address2&lt;br /&gt;
::Address line two&lt;br /&gt;
:; city&lt;br /&gt;
::City&lt;br /&gt;
:; state&lt;br /&gt;
::State&lt;br /&gt;
:; zip&lt;br /&gt;
::Zip or postal code&lt;br /&gt;
:; payby&lt;br /&gt;
::Customer's current default payment type.&lt;br /&gt;
:; card_type&lt;br /&gt;
::For CARD/DCRD payment types, the card type (Visa card, MasterCard, Discover card, American Express card, etc.)&lt;br /&gt;
:; payinfo&lt;br /&gt;
::For CARD/DCRD payment types, the card number&lt;br /&gt;
:; month&lt;br /&gt;
::For CARD/DCRD payment types, expiration month&lt;br /&gt;
:; year&lt;br /&gt;
::For CARD/DCRD payment types, expiration year&lt;br /&gt;
:; cust_main_county&lt;br /&gt;
::County/state/country data - array reference of hash references, each of which has the fields of a cust_main_county record (see [[Freeside:4:Documentation:Developer/FS/cust main county|FS::cust_main_county]]). Note these are not FS::cust_main_county objects, but hash references of columns and values.&lt;br /&gt;
:; states&lt;br /&gt;
::Array reference of all states in the current default country.&lt;br /&gt;
:; card_types&lt;br /&gt;
::Hash reference of card types; keys are card types, values are the exact strings passed to the process_payment function&lt;br /&gt;
; process_payment HASHREF&lt;br /&gt;
:Processes a payment and possible change of address or payment type. Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id&lt;br /&gt;
::Session identifier&lt;br /&gt;
:; amount&lt;br /&gt;
::Amount&lt;br /&gt;
:; save&lt;br /&gt;
::If true, address and card information entered will be saved for subsequent transactions.&lt;br /&gt;
:; auto&lt;br /&gt;
::If true, future credit card payments will be done automatically (sets payby to CARD). If false, future credit card payments will be done on-demand (sets payby to DCRD). This option only has meaning if '''save''' is set true.&lt;br /&gt;
:; payname&lt;br /&gt;
::Name on card&lt;br /&gt;
:; address1&lt;br /&gt;
::Address line one&lt;br /&gt;
:; address2&lt;br /&gt;
::Address line two&lt;br /&gt;
:; city&lt;br /&gt;
::City&lt;br /&gt;
:; state&lt;br /&gt;
::State&lt;br /&gt;
:; zip&lt;br /&gt;
::Zip or postal code&lt;br /&gt;
:; country&lt;br /&gt;
::Two-letter country code&lt;br /&gt;
:; payinfo&lt;br /&gt;
::Card number&lt;br /&gt;
:; month&lt;br /&gt;
::Card expiration month&lt;br /&gt;
:; year&lt;br /&gt;
::Card expiration year&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with a single key, '''error''', empty on success, or an error message on errors.&lt;br /&gt;
; process_payment_order_pkg&lt;br /&gt;
:Combines the '''process_payment''' and '''order_pkg''' functions in one step. If the payment processes sucessfully, the package is ordered. Takes a hash reference as parameter with the keys of both methods.&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with a single key, '''error''', empty on success, or an error message on errors.&lt;br /&gt;
; process_payment_change_pkg&lt;br /&gt;
:Combines the '''process_payment''' and '''change_pkg''' functions in one step. If the payment processes sucessfully, the package is ordered. Takes a hash reference as parameter with the keys of both methods.&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with a single key, '''error''', empty on success, or an error message on errors.&lt;br /&gt;
; process_payment_order_renew&lt;br /&gt;
:Combines the '''process_payment''' and '''order_renew''' functions in one step. If the payment processes sucessfully, the renewal is processed. Takes a hash reference as parameter with the keys of both methods.&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with a single key, '''error''', empty on success, or an error message on errors.&lt;br /&gt;
; list_pkgs&lt;br /&gt;
:Returns package information for this customer. For more detail on services, see [[#list_svcs|&amp;quot;list_svcs&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with a single key: '''session_id'''&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference containing customer package information. The hash reference contains the following keys:&lt;br /&gt;
:; custnum&lt;br /&gt;
::Customer number&lt;br /&gt;
:; error&lt;br /&gt;
::Empty on success, or an error message on errors.&lt;br /&gt;
:; cust_pkg HASHREF&lt;br /&gt;
::Array reference of hash references, each of which has the fields of a cust_pkg record (see [[Freeside:4:Documentation:Developer/FS/cust pkg|FS::cust_pkg]]) as well as the fields below. Note these are not the internal FS:: objects, but hash references of columns and values.&lt;br /&gt;
::; part_pkg fields&lt;br /&gt;
:::All fields of part_pkg for this specific cust_pkg (be careful with this information - it may reveal more about your available packages than you would like users to know in aggregate)&lt;br /&gt;
::; part_svc&lt;br /&gt;
:::An array of hash references indicating information on unprovisioned services available for provisioning for this specific cust_pkg. Each has the following keys:&lt;br /&gt;
:::; part_svc fields&lt;br /&gt;
::::All fields of part_svc (be careful with this information - it may reveal more about your available packages than you would like users to know in aggregate)&lt;br /&gt;
::; cust_svc&lt;br /&gt;
:::An array of hash references indicating information on the customer services already provisioned for this specific cust_pkg. Each has the following keys:&lt;br /&gt;
:::; label&lt;br /&gt;
::::Array reference with three elements: The first element is the name of this service. The second element is a meaningful user-specific identifier for the service (i.e. username, domain or mail alias). The last element is the table name of this service.&lt;br /&gt;
::; svcnum&lt;br /&gt;
:::Primary key for this service&lt;br /&gt;
::; svcpart&lt;br /&gt;
:::Service definition (see [[Freeside:4:Documentation:Developer/FS/part svc|FS::part_svc]])&lt;br /&gt;
::; pkgnum&lt;br /&gt;
:::Customer package (see [[Freeside:4:Documentation:Developer/FS/cust pkg|FS::cust_pkg]])&lt;br /&gt;
::; overlimit&lt;br /&gt;
:::Blank if the service is not over limit, or the date the service exceeded its usage limit (as a UNIX timestamp).&lt;br /&gt;
; list_svcs&lt;br /&gt;
:Returns service information for this customer.&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with a single key: '''session_id'''&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference containing customer package information. The hash reference contains the following keys:&lt;br /&gt;
:; custnum&lt;br /&gt;
::Customer number&lt;br /&gt;
:; svcs&lt;br /&gt;
::An array of hash references indicating information on all of this customer's services. Each has the following keys:&lt;br /&gt;
::; svcnum&lt;br /&gt;
:::Primary key for this service&lt;br /&gt;
::; label&lt;br /&gt;
:::Name of this service&lt;br /&gt;
::; value&lt;br /&gt;
:::Meaningful user-specific identifier for the service (i.e. username, domain, or mail alias).&lt;br /&gt;
&lt;br /&gt;
::Account (svc_acct) services also have the following keys:&lt;br /&gt;
::; username&lt;br /&gt;
:::Username&lt;br /&gt;
::; email&lt;br /&gt;
:::username@domain&lt;br /&gt;
::; seconds&lt;br /&gt;
:::Seconds remaining&lt;br /&gt;
::; upbytes&lt;br /&gt;
:::Upload bytes remaining&lt;br /&gt;
::; downbytes&lt;br /&gt;
:::Download bytes remaining&lt;br /&gt;
::; totalbytes&lt;br /&gt;
:::Total bytes remaining&lt;br /&gt;
::; recharge_amount&lt;br /&gt;
:::Cost of a recharge&lt;br /&gt;
::; recharge_seconds&lt;br /&gt;
:::Number of seconds gained by recharge&lt;br /&gt;
::; recharge_upbytes&lt;br /&gt;
:::Number of upload bytes gained by recharge&lt;br /&gt;
::; recharge_downbytes&lt;br /&gt;
:::Number of download bytes gained by recharge&lt;br /&gt;
::; recharge_totalbytes&lt;br /&gt;
:::Number of total bytes gained by recharge&lt;br /&gt;
; order_pkg&lt;br /&gt;
:Orders a package for this customer.&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id&lt;br /&gt;
::Session identifier&lt;br /&gt;
:; pkgpart&lt;br /&gt;
::Package to order (see [[Freeside:4:Documentation:Developer/FS/part pkg|FS::part_pkg]]).&lt;br /&gt;
:; quantity&lt;br /&gt;
::Quantity for this package order (default 1).&lt;br /&gt;
:; locationnum&lt;br /&gt;
::Optional locationnum for this package order, for existing locations.&lt;br /&gt;
&lt;br /&gt;
::Or, for new locations, pass the following fields: address1*, address2, city*, county, state*, zip*, country. (* = required in this case)&lt;br /&gt;
:; address1:; address 2:; city:; :; svcpart&lt;br /&gt;
::Service to order (see [[Freeside:4:Documentation:Developer/FS/part svc|FS::part_svc]]).&lt;br /&gt;
&lt;br /&gt;
::Normally optional; required only to provision a non-svc_acct service, or if the package definition does not contain one svc_acct service definition with quantity 1 (it may contain others with quantity &amp;gt;1). A svcpart of &amp;quot;none&amp;quot; can also be specified to indicate that no initial service should be provisioned.&lt;br /&gt;
&lt;br /&gt;
:Fields used when provisioning an svc_acct service:&lt;br /&gt;
:; username&lt;br /&gt;
::Username&lt;br /&gt;
:; _password&lt;br /&gt;
::Password&lt;br /&gt;
:; sec_phrase&lt;br /&gt;
::Optional security phrase&lt;br /&gt;
:; popnum&lt;br /&gt;
::Optional Access number number&lt;br /&gt;
&lt;br /&gt;
:Fields used when provisioning an svc_domain service:&lt;br /&gt;
:; domain&lt;br /&gt;
::Domain&lt;br /&gt;
&lt;br /&gt;
:Fields used when provisioning an svc_phone service:&lt;br /&gt;
:; phonenum&lt;br /&gt;
::Phone number&lt;br /&gt;
:; pin&lt;br /&gt;
::Voicemail PIN&lt;br /&gt;
:; sip_password&lt;br /&gt;
::SIP password&lt;br /&gt;
&lt;br /&gt;
:Fields used when provisioning an svc_external service:&lt;br /&gt;
:; id&lt;br /&gt;
::External numeric ID.&lt;br /&gt;
:; title&lt;br /&gt;
::External text title.&lt;br /&gt;
&lt;br /&gt;
:Fields used when provisioning an svc_pbx service:&lt;br /&gt;
:; id&lt;br /&gt;
::Numeric ID.&lt;br /&gt;
:; name&lt;br /&gt;
::Text name.&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with a single key, '''error''', empty on success, or an error message on errors. The special error '_decline' is returned for declined transactions.&lt;br /&gt;
; change_pkg&lt;br /&gt;
:Changes a package for this customer.&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id&lt;br /&gt;
::Session identifier&lt;br /&gt;
:; pkgnum&lt;br /&gt;
::Existing customer package.&lt;br /&gt;
:; pkgpart&lt;br /&gt;
::New package to order (see [[Freeside:4:Documentation:Developer/FS/part pkg|FS::part_pkg]]).&lt;br /&gt;
:; quantity&lt;br /&gt;
::Quantity for this package order (default 1).&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with the following keys:&lt;br /&gt;
:; error&lt;br /&gt;
::Empty on success, or an error message on errors.&lt;br /&gt;
:; pkgnum&lt;br /&gt;
::On success, the new pkgnum&lt;br /&gt;
; renew_info&lt;br /&gt;
:Provides useful info for early renewals.&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id&lt;br /&gt;
::Session identifier&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference. On errors, it contains a single key, '''error''', with the error message. Otherwise, contains a single key, '''dates''', pointing to an array refernce of hash references. Each hash reference contains the following keys:&lt;br /&gt;
:; bill_date&lt;br /&gt;
::(Future) Bill date. Indicates a future date for which billing could be run. Specified as a integer UNIX timestamp. Pass this value to the '''order_renew''' function.&lt;br /&gt;
:; bill_date_pretty&lt;br /&gt;
::(Future) Bill date as a human-readable string. (Convenience for display; subject to change, so best not to parse for the date.)&lt;br /&gt;
:; amount&lt;br /&gt;
::Base amount which will be charged if renewed early as of this date.&lt;br /&gt;
:; renew_date&lt;br /&gt;
::Renewal date; i.e. even-futher future date at which the customer will be paid through if the early renewal is completed with the given '''bill-date'''. Specified as a integer UNIX timestamp.&lt;br /&gt;
:; renew_date_pretty&lt;br /&gt;
::Renewal date as a human-readable string. (Convenience for display; subject to change, so best not to parse for the date.)&lt;br /&gt;
:; pkgnum&lt;br /&gt;
::Package that will be renewed.&lt;br /&gt;
:; expire_date&lt;br /&gt;
::Expiration date of the package that will be renewed.&lt;br /&gt;
:; expire_date_pretty&lt;br /&gt;
::Expiration date of the package that will be renewed, as a human-readable string. (Convenience for display; subject to change, so best not to parse for the date.)&lt;br /&gt;
; order_renew&lt;br /&gt;
:Renews this customer early; i.e. runs billing for this customer in advance.&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id&lt;br /&gt;
::Session identifier&lt;br /&gt;
:; date&lt;br /&gt;
::Integer date as returned by the '''renew_info''' function, indicating the advance date for which to run billing.&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with a single key, '''error''', empty on success, or an error message on errors.&lt;br /&gt;
; cancel_pkg&lt;br /&gt;
:Cancels a package for this customer.&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id&lt;br /&gt;
::Session identifier&lt;br /&gt;
:; pkgpart&lt;br /&gt;
::pkgpart of package to cancel&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with a single key, '''error''', empty on success, or an error message on errors.&lt;br /&gt;
; provision_acct&lt;br /&gt;
:Provisions an account (svc_acct).&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id&lt;br /&gt;
::Session identifier&lt;br /&gt;
:; pkgnum&lt;br /&gt;
::pkgnum of package into which this service is provisioned&lt;br /&gt;
:; svcpart&lt;br /&gt;
::svcpart or service definition to provision&lt;br /&gt;
:; username:; domsvc:; _password; provision_phone&lt;br /&gt;
:Provisions a phone number (svc_phone).&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id&lt;br /&gt;
::Session identifier&lt;br /&gt;
:; pkgnum&lt;br /&gt;
::pkgnum of package into which this service is provisioned&lt;br /&gt;
:; svcpart&lt;br /&gt;
::svcpart or service definition to provision&lt;br /&gt;
:; countrycode:; phonenum:; address1:; address2:; city:; county:; state:; zip:; country&lt;br /&gt;
::E911 Address (optional)&lt;br /&gt;
; provision_pbx&lt;br /&gt;
:Provisions a customer PBX (svc_pbx).&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id&lt;br /&gt;
::Session identifier&lt;br /&gt;
:; pkgnum&lt;br /&gt;
::pkgnum of package into which this service is provisioned&lt;br /&gt;
:; svcpart&lt;br /&gt;
::svcpart or service definition to provision&lt;br /&gt;
:; id:; title:; max_extensions:; max_simultaneous:; ip_addr; provision_external&lt;br /&gt;
:Provisions an external service (svc_external).&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id&lt;br /&gt;
::Session identifier&lt;br /&gt;
:; pkgnum&lt;br /&gt;
::pkgnum of package into which this service is provisioned&lt;br /&gt;
:; svcpart&lt;br /&gt;
::svcpart or service definition to provision&lt;br /&gt;
:; id:; title&lt;br /&gt;
===&amp;quot;MY ACCOUNT&amp;quot; CONTACT FUNCTIONS===&lt;br /&gt;
; contact_passwd&lt;br /&gt;
:Changes the password for the currently-logged in contact.&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id:; new_password&lt;br /&gt;
:Returns a hash reference with a single parameter, '''error''', which contains an error message, or empty on success.&lt;br /&gt;
; list_contacts&lt;br /&gt;
:Takes a hash reference as parameter with a single key, '''session_id'''.&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with two parameters: '''error''', which contains an error message, or empty on success, and '''contacts''', a list of contacts.&lt;br /&gt;
&lt;br /&gt;
:'''contacts''' is an array reference of hash references (i.e. an array of structs, in XML-RPC). Each hash reference (struct) has the following keys:&lt;br /&gt;
; contactnum; class&lt;br /&gt;
:Contact class name (contact type).&lt;br /&gt;
; first&lt;br /&gt;
:First name&lt;br /&gt;
; last&lt;br /&gt;
:Last name&lt;br /&gt;
; title&lt;br /&gt;
:Position (&amp;quot;Director of Silly Walks&amp;quot;), NOT honorific (&amp;quot;Mr.&amp;quot; or &amp;quot;Mrs.&amp;quot;)&lt;br /&gt;
; emailaddress&lt;br /&gt;
:Comma-separated list of email addresses&lt;br /&gt;
; comment; selfservice_access&lt;br /&gt;
:Y when enabled&lt;br /&gt;
&lt;br /&gt;
; edit_contact&lt;br /&gt;
:Updates information for the currently-logged in contact, or (optionally) the specified contact.&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id:; contactnum&lt;br /&gt;
::If already logged in as a contact, this is optional.&lt;br /&gt;
:; first:; last:; emailaddress&lt;br /&gt;
:Returns a hash reference with a single parameter, '''error''', which contains an error message, or empty on success.&lt;br /&gt;
; new_contact&lt;br /&gt;
:Creates a new contact.&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id:; first:; last:; emailaddress:; classnum&lt;br /&gt;
::Optional contact classnum (TODO: or name)&lt;br /&gt;
:; comment:; selfservice_access&lt;br /&gt;
::Y to enable self-service access&lt;br /&gt;
:; _password&lt;br /&gt;
:Returns a hash reference with a single parameter, '''error''', which contains an error message, or empty on success.&lt;br /&gt;
; delete_contact&lt;br /&gt;
:Deletes a contact. (Note: Cannot at this time delete the currently-logged in contact.)&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id:; contactnum&lt;br /&gt;
:Returns a hash reference with a single parameter, '''error''', which contains an error message, or empty on success.&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;MY ACCOUNT&amp;quot; QUOTATION FUNCTIONS===&lt;br /&gt;
All of these functions require the user to be logged in, and the 'session_id' key to be included in the argument hashref.`&lt;br /&gt;
&lt;br /&gt;
; list_quotations HASHREF&lt;br /&gt;
:Returns a hashref listing this customer's active self-service quotations. Contents are:&lt;br /&gt;
:; quotations&lt;br /&gt;
::an arrayref containing an element for each quotation.&lt;br /&gt;
:; quotationnum&lt;br /&gt;
::the primary key&lt;br /&gt;
:; _date&lt;br /&gt;
::the date it was started&lt;br /&gt;
:; num_pkgs&lt;br /&gt;
::the number of packages&lt;br /&gt;
:; total_setup&lt;br /&gt;
::the sum of setup fees&lt;br /&gt;
:; total_recur&lt;br /&gt;
::the sum of recurring charges&lt;br /&gt;
; quotation_new HASHREF&lt;br /&gt;
:Creates an empty quotation and returns a hashref containing 'quotationnum', the primary key of the new quotation.&lt;br /&gt;
; quotation_delete HASHREF&lt;br /&gt;
:Disables (does not really delete) a quotation. Takes the following arguments:&lt;br /&gt;
:; session_id:; quotationnum - the quotation to delete&lt;br /&gt;
:Returns 'error' =&amp;gt; a string, which will be empty on success.&lt;br /&gt;
; quotation_info HASHREF&lt;br /&gt;
:Returns total and detailed pricing information on a quotation.&lt;br /&gt;
&lt;br /&gt;
:Takes the following arguments:&lt;br /&gt;
:; session_id:; quotationnum - the quotation to return&lt;br /&gt;
:Returns a hashref containing:&lt;br /&gt;
&lt;br /&gt;
:- total_setup, the total of setup fees (and their taxes) - total_recur, the total of all recurring charges (and their taxes) - sections, an arrayref containing an element for each quotation section. - description, a line of text describing the group of charges - subtotal, the total of charges in this group (if appropriate) - detail_items, an arrayref of line items - pkgnum, the reference number of the package - description, the package name (or tax name) - quantity - amount, the amount charged If the detail item represents a subtotal, it will instead contain: - total_item: description of the subtotal - total_amount: the subtotal amount&lt;br /&gt;
; quotation_print HASHREF&lt;br /&gt;
:Renders the quotation as HTML or PDF. Takes the following arguments:&lt;br /&gt;
:; session_id:; quotationnum - the quotation to return:; format - 'html' or 'pdf'&lt;br /&gt;
:Returns a hashref containing 'document', the contents of the file.&lt;br /&gt;
; quotation_add_pkg HASHREF&lt;br /&gt;
:Adds a package to a quotation. Takes the following arguments:&lt;br /&gt;
:; session_id:; pkgpart - the package to add:; quotationnum - the quotation to add it to:; quantity - the package quantity (defaults to 1):; address1, address2, city, state, zip, country - address fields to set the service location&lt;br /&gt;
:Returns 'error' =&amp;gt; a string, which will be empty on success.&lt;br /&gt;
; quotation_remove_pkg HASHREF&lt;br /&gt;
:Removes a package from a quotation. Takes the following arguments:&lt;br /&gt;
:; session_id:; pkgnum - the primary key (quotationpkgnum) of the package to remove:; quotationnum - the quotation to remove it from&lt;br /&gt;
:Returns 'error' =&amp;gt; a string, which will be empty on success.&lt;br /&gt;
&lt;br /&gt;
; quotation_order HASHREF&lt;br /&gt;
:Converts the packages in a quotation into real packages. Takes the following arguments:&lt;br /&gt;
&lt;br /&gt;
:Takes the following arguments:&lt;br /&gt;
:; session_id:; quotationnum - the quotation to order&lt;br /&gt;
==SIGNUP FUNCTIONS==&lt;br /&gt;
; signup_info HASHREF&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; session_id - Optional agent/reseller interface session&lt;br /&gt;
:Returns a hash reference containing information that may be useful in displaying a signup page. The hash reference contains the following keys:&lt;br /&gt;
:; cust_main_county&lt;br /&gt;
::County/state/country data - array reference of hash references, each of which has the fields of a cust_main_county record (see [[Freeside:4:Documentation:Developer/FS/cust main county|FS::cust_main_county]]). Note these are not FS::cust_main_county objects, but hash references of columns and values.&lt;br /&gt;
:; part_pkg&lt;br /&gt;
::Available packages - array reference of hash references, each of which has the fields of a part_pkg record (see [[Freeside:4:Documentation:Developer/FS/part pkg|FS::part_pkg]]). Each hash reference also has an additional 'payby' field containing an array reference of acceptable payment types specific to this package (see below and [[Freeside:4:Documentation:Developer/FS/part pkg#payby|&amp;quot;payby&amp;quot; in FS/part pkg|FS::part_pkg#payby|&amp;quot;payby&amp;quot; in FS::part_pkg]]). Note these are not FS::part_pkg objects, but hash references of columns and values. Requires the 'signup_server-default_agentnum' configuration value to be set, or an agentnum specified explicitly via reseller interface session_id in the options.&lt;br /&gt;
:; agent&lt;br /&gt;
::Array reference of hash references, each of which has the fields of an agent record (see [[Freeside:4:Documentation:Developer/FS/agent|FS::agent]]). Note these are not FS::agent objects, but hash references of columns and values.&lt;br /&gt;
:; agentnum2part_pkg&lt;br /&gt;
::Hash reference; keys are agentnums, values are array references of available packages for that agent, in the same format as the part_pkg arrayref above.&lt;br /&gt;
:; svc_acct_pop&lt;br /&gt;
::Access numbers - array reference of hash references, each of which has the fields of an svc_acct_pop record (see [[Freeside:4:Documentation:Developer/FS/svc acct pop|FS::svc_acct_pop]]). Note these are not FS::svc_acct_pop objects, but hash references of columns and values.&lt;br /&gt;
:; security_phrase&lt;br /&gt;
::True if the &amp;quot;security_phrase&amp;quot; feature is enabled&lt;br /&gt;
:; payby&lt;br /&gt;
::Array reference of acceptable payment types for signup&lt;br /&gt;
::; CARD&lt;br /&gt;
:::credit card - automatic&lt;br /&gt;
::; DCRD&lt;br /&gt;
:::credit card - on-demand - version 1.5+ only&lt;br /&gt;
::; CHEK&lt;br /&gt;
:::electronic check - automatic&lt;br /&gt;
::; DCHK&lt;br /&gt;
:::electronic check - on-demand - version 1.5+ only&lt;br /&gt;
::; LECB&lt;br /&gt;
:::Phone bill billing&lt;br /&gt;
::; BILL&lt;br /&gt;
:::billing, not recommended for signups&lt;br /&gt;
::; COMP&lt;br /&gt;
:::free, definitely not recommended for signups&lt;br /&gt;
::; PREPAY&lt;br /&gt;
:::special billing type: applies a credit (see FS::prepay_credit) and sets billing type to BILL&lt;br /&gt;
:; cvv_enabled&lt;br /&gt;
::True if CVV features are available (1.5+ or 1.4.2 with CVV schema patch)&lt;br /&gt;
:; msgcat&lt;br /&gt;
::Hash reference of message catalog values, to support error message customization. Currently available keys are: passwords_dont_match, invalid_card, unknown_card_type, and not_a (as in &amp;quot;Not a Discover card&amp;quot;). Values are configured in the web interface under &amp;quot;View/Edit message catalog&amp;quot;.&lt;br /&gt;
:; statedefault&lt;br /&gt;
::Default state&lt;br /&gt;
:; countrydefault&lt;br /&gt;
::Default country&lt;br /&gt;
; new_customer_minimal HASHREF&lt;br /&gt;
:Creates a new customer.&lt;br /&gt;
&lt;br /&gt;
:Current differences from new_customer: An address is not required. promo_code and reg_code are not supported. If invoicing_list and _password is passed, a contact will be created with self-service access (no pkgpart or username is necessary). No initial billing is run (this may change in a future version).&lt;br /&gt;
&lt;br /&gt;
:Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; first&lt;br /&gt;
::first name (required)&lt;br /&gt;
:; last&lt;br /&gt;
::last name (required)&lt;br /&gt;
:; ss&lt;br /&gt;
::(not typically collected; mostly used for ACH transactions)&lt;br /&gt;
:; company&lt;br /&gt;
::Company name&lt;br /&gt;
:; address1&lt;br /&gt;
::Address line one&lt;br /&gt;
:; address2&lt;br /&gt;
::Address line two&lt;br /&gt;
:; city&lt;br /&gt;
::City&lt;br /&gt;
:; county&lt;br /&gt;
::County&lt;br /&gt;
:; state&lt;br /&gt;
::State&lt;br /&gt;
:; zip&lt;br /&gt;
::Zip or postal code&lt;br /&gt;
:; daytime&lt;br /&gt;
::Daytime phone number&lt;br /&gt;
:; night&lt;br /&gt;
::Evening phone number&lt;br /&gt;
:; fax&lt;br /&gt;
::Fax number&lt;br /&gt;
:; payby&lt;br /&gt;
::CARD, DCRD, CHEK, DCHK, LECB, BILL, COMP or PREPAY (see [[#signup_info|&amp;quot;signup_info&amp;quot;]] (required)&lt;br /&gt;
:; payinfo&lt;br /&gt;
::Card number for CARD/DCRD, account_number@aba_number for CHEK/DCHK, prepaid &amp;quot;pin&amp;quot; for PREPAY, purchase order number for BILL&lt;br /&gt;
:; paycvv&lt;br /&gt;
::Credit card CVV2 number (1.5+ or 1.4.2 with CVV schema patch)&lt;br /&gt;
:; paydate&lt;br /&gt;
::Expiration date for CARD/DCRD&lt;br /&gt;
:; payname&lt;br /&gt;
::Exact name on credit card for CARD/DCRD, bank name for CHEK/DCHK&lt;br /&gt;
:; invoicing_list&lt;br /&gt;
::comma-separated list of email addresses for email invoices. The special value 'POST' is used to designate postal invoicing (it may be specified alone or in addition to email addresses),&lt;br /&gt;
:; referral_custnum&lt;br /&gt;
::referring customer number&lt;br /&gt;
:; agentnum&lt;br /&gt;
::Agent number&lt;br /&gt;
:; pkgpart&lt;br /&gt;
::pkgpart of initial package&lt;br /&gt;
:; username&lt;br /&gt;
::Username&lt;br /&gt;
:; _password&lt;br /&gt;
::Password&lt;br /&gt;
:; sec_phrase&lt;br /&gt;
::Security phrase&lt;br /&gt;
:; popnum&lt;br /&gt;
::Access number (index, not the literal number)&lt;br /&gt;
:; countrycode&lt;br /&gt;
::Country code (to be provisioned as a service)&lt;br /&gt;
:; phonenum&lt;br /&gt;
::Phone number (to be provisioned as a service)&lt;br /&gt;
:; pin&lt;br /&gt;
::Voicemail PIN&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with the following keys:&lt;br /&gt;
:; error&lt;br /&gt;
::Empty on success, or an error message on errors. The special error '_decline' is returned for declined transactions; other error messages should be suitable for display to the user (and are customizable in under Configuration | View/Edit message catalog)&lt;br /&gt;
; new_customer HASHREF&lt;br /&gt;
:Creates a new customer. Takes a hash reference as parameter with the following keys:&lt;br /&gt;
:; first&lt;br /&gt;
::first name (required)&lt;br /&gt;
:; last&lt;br /&gt;
::last name (required)&lt;br /&gt;
:; ss&lt;br /&gt;
::(not typically collected; mostly used for ACH transactions)&lt;br /&gt;
:; company&lt;br /&gt;
::Company name&lt;br /&gt;
:; address1 (required)&lt;br /&gt;
::Address line one&lt;br /&gt;
:; address2&lt;br /&gt;
::Address line two&lt;br /&gt;
:; city (required)&lt;br /&gt;
::City&lt;br /&gt;
:; county&lt;br /&gt;
::County&lt;br /&gt;
:; state (required)&lt;br /&gt;
::State&lt;br /&gt;
:; zip (required)&lt;br /&gt;
::Zip or postal code&lt;br /&gt;
:; daytime&lt;br /&gt;
::Daytime phone number&lt;br /&gt;
:; night&lt;br /&gt;
::Evening phone number&lt;br /&gt;
:; fax&lt;br /&gt;
::Fax number&lt;br /&gt;
:; payby&lt;br /&gt;
::CARD, DCRD, CHEK, DCHK, LECB, BILL, COMP or PREPAY (see [[#signup_info|&amp;quot;signup_info&amp;quot;]] (required)&lt;br /&gt;
:; payinfo&lt;br /&gt;
::Card number for CARD/DCRD, account_number@aba_number for CHEK/DCHK, prepaid &amp;quot;pin&amp;quot; for PREPAY, purchase order number for BILL&lt;br /&gt;
:; paycvv&lt;br /&gt;
::Credit card CVV2 number (1.5+ or 1.4.2 with CVV schema patch)&lt;br /&gt;
:; paydate&lt;br /&gt;
::Expiration date for CARD/DCRD&lt;br /&gt;
:; payname&lt;br /&gt;
::Exact name on credit card for CARD/DCRD, bank name for CHEK/DCHK&lt;br /&gt;
:; invoicing_list&lt;br /&gt;
::comma-separated list of email addresses for email invoices. The special value 'POST' is used to designate postal invoicing (it may be specified alone or in addition to email addresses),&lt;br /&gt;
:; referral_custnum&lt;br /&gt;
::referring customer number&lt;br /&gt;
:; agentnum&lt;br /&gt;
::Agent number&lt;br /&gt;
:; pkgpart&lt;br /&gt;
::pkgpart of initial package&lt;br /&gt;
:; username&lt;br /&gt;
::Username&lt;br /&gt;
:; _password&lt;br /&gt;
::Password&lt;br /&gt;
:; sec_phrase&lt;br /&gt;
::Security phrase&lt;br /&gt;
:; popnum&lt;br /&gt;
::Access number (index, not the literal number)&lt;br /&gt;
:; countrycode&lt;br /&gt;
::Country code (to be provisioned as a service)&lt;br /&gt;
:; phonenum&lt;br /&gt;
::Phone number (to be provisioned as a service)&lt;br /&gt;
:; pin&lt;br /&gt;
::Voicemail PIN&lt;br /&gt;
&lt;br /&gt;
:Returns a hash reference with the following keys:&lt;br /&gt;
:; error&lt;br /&gt;
::Empty on success, or an error message on errors. The special error '_decline' is returned for declined transactions; other error messages should be suitable for display to the user (and are customizable in under Configuration | View/Edit message catalog)&lt;br /&gt;
; regionselector HASHREF | LIST&lt;br /&gt;
:Takes as input a hashref or list of key/value pairs with the following keys:&lt;br /&gt;
:; selected_county&lt;br /&gt;
::Currently selected county&lt;br /&gt;
:; selected_state&lt;br /&gt;
::Currently selected state&lt;br /&gt;
:; selected_country&lt;br /&gt;
::Currently selected country&lt;br /&gt;
:; prefix&lt;br /&gt;
::Specify a unique prefix string if you intend to use the HTML output multiple time son one page.&lt;br /&gt;
:; onchange&lt;br /&gt;
::Specify a javascript subroutine to call on changes&lt;br /&gt;
:; default_state&lt;br /&gt;
::Default state&lt;br /&gt;
:; default_country&lt;br /&gt;
::Default country&lt;br /&gt;
:; locales&lt;br /&gt;
::An arrayref of hash references specifying regions. Normally you can just pass the value of the ''cust_main_county'' field returned by '''signup_info'''.&lt;br /&gt;
&lt;br /&gt;
:Returns a list consisting of three HTML fragments for county selection, state selection and country selection, respectively.&lt;br /&gt;
; location_form HASHREF | LIST&lt;br /&gt;
:Takes as input a hashref or list of key/value pairs with the following keys:&lt;br /&gt;
:; session_id&lt;br /&gt;
::Current customer session_id&lt;br /&gt;
:; no_asterisks&lt;br /&gt;
::Omit red asterisks from required fields.&lt;br /&gt;
:; address1_label&lt;br /&gt;
::Label for first address line.&lt;br /&gt;
&lt;br /&gt;
:Returns an HTML fragment for a location form (address, city, state, zip, country)&lt;br /&gt;
; expselect PREFIX [ DATE ]&lt;br /&gt;
:Takes as input a unique prefix string and the current expiration date, in yyyy-mm-dd or m-d-yyyy format&lt;br /&gt;
&lt;br /&gt;
:Returns an HTML fragments for expiration date selection.&lt;br /&gt;
; popselector HASHREF | LIST&lt;br /&gt;
:Takes as input a hashref or list of key/value pairs with the following keys:&lt;br /&gt;
:; popnum&lt;br /&gt;
::Access number number&lt;br /&gt;
:; pops&lt;br /&gt;
::An arrayref of hash references specifying access numbers. Normally you can just pass the value of the ''svc_acct_pop'' field returned by '''signup_info'''.&lt;br /&gt;
&lt;br /&gt;
:Returns an HTML fragment for access number selection.&lt;br /&gt;
; domainselector HASHREF | LIST&lt;br /&gt;
:Takes as input a hashref or list of key/value pairs with the following keys:&lt;br /&gt;
:; pkgnum&lt;br /&gt;
::Package number&lt;br /&gt;
:; domsvc&lt;br /&gt;
::Service number of the selected item.&lt;br /&gt;
&lt;br /&gt;
:Returns an HTML fragment for domain selection.&lt;br /&gt;
; didselector HASHREF | LIST&lt;br /&gt;
:Takes as input a hashref or list of key/value pairs with the following keys:&lt;br /&gt;
:; field&lt;br /&gt;
::Field name for the returned HTML fragment.&lt;br /&gt;
:; svcpart&lt;br /&gt;
::Service definition (see [[Freeside:4:Documentation:Developer/FS/part svc|FS::part_svc]])&lt;br /&gt;
&lt;br /&gt;
:Returns an HTML fragment for DID selection.&lt;br /&gt;
&lt;br /&gt;
==RESELLER FUNCTIONS==&lt;br /&gt;
Note: Resellers can also use the '''signup_info''' and '''new_customer''' functions with their active session, and the '''customer_info''' and '''order_pkg''' functions with their active session and an additional ''custnum'' parameter.&lt;br /&gt;
&lt;br /&gt;
For the most part, development of the reseller web interface has been superceded by agent-virtualized access to the backend.&lt;br /&gt;
&lt;br /&gt;
; agent_login&lt;br /&gt;
:Agent login&lt;br /&gt;
; agent_info&lt;br /&gt;
:Agent info&lt;br /&gt;
; agent_list_customers&lt;br /&gt;
:List agent's customers.&lt;br /&gt;
&lt;br /&gt;
==BUGS==&lt;br /&gt;
==SEE ALSO==&lt;br /&gt;
[[Freeside:4:Documentation:Developer/bin/freeside-selfservice-clientd|freeside-selfservice-clientd]], [[Freeside:4:Documentation:Developer/bin/freeside-selfservice-server|freeside-selfservice-server]]&lt;br /&gt;
&lt;br /&gt;
==POD ERRORS==&lt;br /&gt;
Hey! '''The above document had some coding errors, which are explained below:'''&lt;br /&gt;
&lt;br /&gt;
; Around line 1503&amp;amp;#58;&lt;br /&gt;
:Unknown directive: =over4&lt;br /&gt;
; Around line 1535&amp;amp;#58;&lt;br /&gt;
:'=item' outside of any '=over'&lt;br /&gt;
; Around line 1612&amp;amp;#58;&lt;br /&gt;
:You forgot a '=back' before '=head2'&lt;br /&gt;
; Around line 1757&amp;amp;#58;&lt;br /&gt;
:'=item' outside of any '=over'&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation&amp;diff=9525</id>
		<title>Freeside:4:Documentation</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation&amp;diff=9525"/>
				<updated>2015-12-24T03:58:59Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: /* New feature documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Note =&lt;br /&gt;
&lt;br /&gt;
Documentation specific to git master / 4.x.  For now, refer to this as an add-on to the 3.x documentation.&lt;br /&gt;
&lt;br /&gt;
= Installation and upgrades =&lt;br /&gt;
&lt;br /&gt;
The minimum Perl version is now 5.10.&lt;br /&gt;
&lt;br /&gt;
== Backend Installation ==&lt;br /&gt;
&lt;br /&gt;
* New installation&lt;br /&gt;
* Integrated RT installation&lt;br /&gt;
* OS-specific installation guides (source)&lt;br /&gt;
** [[Freeside:4:Documentation:InstallingOnDebian7]]&lt;br /&gt;
&lt;br /&gt;
== Upgrading ==&lt;br /&gt;
&lt;br /&gt;
* [[Freeside:4:Documentation:Upgrading|Upgrading from 3.3 or later to 4.x]]&lt;br /&gt;
&lt;br /&gt;
= Administrator =&lt;br /&gt;
&lt;br /&gt;
* [[Freeside:4:Documentation:Administrator:Multi-currency|Multi-currency]]&lt;br /&gt;
* [[Freeside:4:Documentation:Administrator:Fees|Automated fees]] (under development)&lt;br /&gt;
* [[Freeside:4:Documentation:Cacti|Cacti Integration]]&lt;br /&gt;
* [[Freeside:4:Documentation:MagicMail|MagicMail Integration]]&lt;br /&gt;
&lt;br /&gt;
= Developer =&lt;br /&gt;
&lt;br /&gt;
* [[Freeside:4:Documentation:Developer:Authentication_Plugins|Authentication Plugins]]&lt;br /&gt;
* [[Freeside:4:Documentation:TaxEngine|Tax Engines]]&lt;br /&gt;
&lt;br /&gt;
= Changelog =&lt;br /&gt;
&lt;br /&gt;
* [[Freeside:4.0:Changelog|4.0 Changelog]]&lt;br /&gt;
&lt;br /&gt;
= New feature documentation =&lt;br /&gt;
&lt;br /&gt;
* [[Freeside:4:Documentation:Appointments]]&lt;br /&gt;
* Emails triggered by system log events can be set up at Configuration -&amp;gt; Miscellaneous -&amp;gt; System log emails&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=9508</id>
		<title>Freeside:4:Documentation:Cacti</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=9508"/>
				<updated>2015-11-24T08:06:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: /* Connecting Cacti To Freeside */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Connecting Cacti To Freeside ==&lt;br /&gt;
&lt;br /&gt;
Copy the freeside_cacti.php script from the bin directory of your Freeside&lt;br /&gt;
installation to the cli directory of your Cacti installation.  Give this file &lt;br /&gt;
the same permissions as the other files in that directory, and create &lt;br /&gt;
(or choose an existing) user with sufficient permission to read these scripts.&lt;br /&gt;
&lt;br /&gt;
In the regular Cacti interface, create a Host Template to be used by &lt;br /&gt;
devices exported by Freeside, and note the template's id number.  Make sure&lt;br /&gt;
the Host Template has Associated Graph Templates and Data Queries for &lt;br /&gt;
any graphs you wish to automatically generate.  Create a Graph Tree for &lt;br /&gt;
new devices to be automatically added to, and note the tree's id number.&lt;br /&gt;
Configure a Graph Export (under Settings) and note the Export Directory.  &lt;br /&gt;
&lt;br /&gt;
In Freeside, go to Configuration-&amp;gt;Services-&amp;gt;Provisioning exports to&lt;br /&gt;
add a new export.  From the Add Export page, select cacti for Export then enter...&lt;br /&gt;
&lt;br /&gt;
* Hostname or IP - of your Cacti server&lt;br /&gt;
&lt;br /&gt;
* User Name - with permission to run scripts in the cli directory&lt;br /&gt;
&lt;br /&gt;
* Script Path - full path to that directory (eg /usr/share/cacti/cli/)&lt;br /&gt;
&lt;br /&gt;
* Host Template ID - for adding new devices&lt;br /&gt;
&lt;br /&gt;
* Graph Tree ID - to which the host will be added&lt;br /&gt;
&lt;br /&gt;
* Description - for new devices.  You can use the tokens $ip_addr, $description and $contact to include the equivalent fields from the broadband service definition or associated customer&lt;br /&gt;
&lt;br /&gt;
* Graph Export Directory - as configured, including connection information if necessary (user@host:/path/to/graph/export/)&lt;br /&gt;
&lt;br /&gt;
* Minimum minutes between graph imports - graphs will be imported from the export directory into Freeside as needed, but not more often than this.  This should be at least as long as the minumum time between graph exports configured in Cacti. Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* Maximum size per graph - in MB.  Individual graphs that exceed this size will be quietly ignored by Freeside.  Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* Delete associated graphs and data sources when unprovisioning - if this is unchecked, only host will be deleted, but graphs and data sources will be preserved.  Note that this deletion process does not use official cacti api, but rather queries the cacti database directly; test before deploying (developed &amp;amp; tested on cacti 0.8.8a)&lt;br /&gt;
&lt;br /&gt;
* Path to cacti include dir (relative to script_path) - optional, defaults to ../site/include/ if unspecified, might need to be changed to ../include/ if you installed cacti from source&lt;br /&gt;
&lt;br /&gt;
Basic graphs will automatically be generated for each Graph Template associated with the Host Template, but if you want to add graphs based on associated Data Queries, you will have to specify their inputs explicitly at the bottom of this page.  See [http://www.cacti.net/downloads/docs/html/cli_add_graphs.html cacti add_graphs documentation] for details on these fields.  You can also specify additional Graph Templates here for basic graph generation, just leave the SNMP fields blank.&lt;br /&gt;
&lt;br /&gt;
After adding the export, go to Configuration-&amp;gt;Services-&amp;gt;Service definitions.&lt;br /&gt;
The export you just created will be available for selection when adding or&lt;br /&gt;
editing broadband service definitions; check the box to activate it for &lt;br /&gt;
a given service.  Note that you should only have one cacti export per&lt;br /&gt;
broadband service definition.&lt;br /&gt;
&lt;br /&gt;
When properly configured broadband services are provisioned, they will now&lt;br /&gt;
be added to Cacti using the Host Template you specified.  If you also specified&lt;br /&gt;
a Graph Tree, the created device will also be added to that.  Graphs will be&lt;br /&gt;
generated for each graph template you specified, as well as any you explicitly&lt;br /&gt;
configured.&lt;br /&gt;
&lt;br /&gt;
Once added, a link to the graphs for this host will be available when viewing &lt;br /&gt;
the details of the provisioned service in Freeside.&lt;br /&gt;
&lt;br /&gt;
Devices will be deleted from Cacti when the service is unprovisioned in Freeside, &lt;br /&gt;
and they will be deleted and re-added if the ip address changes.&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
After a device is provisioned, the graphs won't show up until the next time the&lt;br /&gt;
cacti server runs its poller and exports the graphs;  by default, this is every &lt;br /&gt;
five minutes.  If you try to view the graphs in this window, it will say they don't &lt;br /&gt;
exist.&lt;br /&gt;
&lt;br /&gt;
When upgrading a freeside server that uses this export, make sure to check that&lt;br /&gt;
the most recent freeside_cacti.php file is copied into the script directory&lt;br /&gt;
on the cacti server.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
&lt;br /&gt;
Currently does not support non-ASCII characters in Description, and apostrophes will be removed&lt;br /&gt;
&lt;br /&gt;
Currently does not support graph-title in graph generation (specify title in template instead)&lt;br /&gt;
&lt;br /&gt;
Currently does not support graphs that require custom input-fields&lt;br /&gt;
&lt;br /&gt;
Currently does not support specifying reindex-method for graphs from Data Queries&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8921</id>
		<title>Freeside:4:Documentation:Cacti</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8921"/>
				<updated>2015-07-03T22:10:21Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Connecting Cacti To Freeside ==&lt;br /&gt;
&lt;br /&gt;
Copy the freeside_cacti.php script from the bin directory of your Freeside&lt;br /&gt;
installation to the cli directory of your Cacti installation.  Give this file &lt;br /&gt;
the same permissions as the other files in that directory, and create &lt;br /&gt;
(or choose an existing) user with sufficient permission to read these scripts.&lt;br /&gt;
&lt;br /&gt;
In the regular Cacti interface, create a Host Template to be used by &lt;br /&gt;
devices exported by Freeside, and note the template's id number.  Make sure&lt;br /&gt;
the Host Template has Associated Graph Templates and Data Queries for &lt;br /&gt;
any graphs you wish to automatically generate.  Create a Graph Tree for &lt;br /&gt;
new devices to be automatically added to, and note the tree's id number.&lt;br /&gt;
Configure a Graph Export (under Settings) and note the Export Directory.  &lt;br /&gt;
&lt;br /&gt;
In Freeside, go to Configuration-&amp;gt;Services-&amp;gt;Provisioning exports to&lt;br /&gt;
add a new export.  From the Add Export page, select cacti for Export then enter...&lt;br /&gt;
&lt;br /&gt;
* Hostname or IP - of your Cacti server&lt;br /&gt;
&lt;br /&gt;
* User Name - with permission to run scripts in the cli directory&lt;br /&gt;
&lt;br /&gt;
* Script Path - full path to that directory (eg /usr/share/cacti/cli/)&lt;br /&gt;
&lt;br /&gt;
* Host Template ID - for adding new devices&lt;br /&gt;
&lt;br /&gt;
* Graph Tree ID - to which the host will be added&lt;br /&gt;
&lt;br /&gt;
* Description - for new devices.  You can use the tokens $ip_addr, $description and $contact to include the equivalent fields from the broadband service definition or associated customer&lt;br /&gt;
&lt;br /&gt;
* Graph Export Directory - as configured, including connection information if necessary (user@host:/path/to/graph/export/)&lt;br /&gt;
&lt;br /&gt;
* Minimum minutes between graph imports - graphs will be imported from the export directory into Freeside as needed, but not more often than this.  This should be at least as long as the minumum time between graph exports configured in Cacti. Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* Maximum size per graph - in MB.  Individual graphs that exceed this size will be quietly ignored by Freeside.  Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* Delete associated graphs and data sources when unprovisioning - if this is unchecked, only host will be deleted, but graphs and data sources will be preserved.  Note that this deletion process does not use official cacti api, but rather queries the cacti database directly; test before deploying (developed &amp;amp; tested on cacti 0.8.8a)&lt;br /&gt;
&lt;br /&gt;
Basic graphs will automatically be generated for each Graph Template associated with the Host Template, but if you want to add graphs based on associated Data Queries, you will have to specify their inputs explicitly at the bottom of this page.  See [http://www.cacti.net/downloads/docs/html/cli_add_graphs.html cacti add_graphs documentation] for details on these fields.  You can also specify additional Graph Templates here for basic graph generation, just leave the SNMP fields blank.&lt;br /&gt;
&lt;br /&gt;
After adding the export, go to Configuration-&amp;gt;Services-&amp;gt;Service definitions.&lt;br /&gt;
The export you just created will be available for selection when adding or&lt;br /&gt;
editing broadband service definitions; check the box to activate it for &lt;br /&gt;
a given service.  Note that you should only have one cacti export per&lt;br /&gt;
broadband service definition.&lt;br /&gt;
&lt;br /&gt;
When properly configured broadband services are provisioned, they will now&lt;br /&gt;
be added to Cacti using the Host Template you specified.  If you also specified&lt;br /&gt;
a Graph Tree, the created device will also be added to that.  Graphs will be&lt;br /&gt;
generated for each graph template you specified, as well as any you explicitly&lt;br /&gt;
configured.&lt;br /&gt;
&lt;br /&gt;
Once added, a link to the graphs for this host will be available when viewing &lt;br /&gt;
the details of the provisioned service in Freeside.&lt;br /&gt;
&lt;br /&gt;
Devices will be deleted from Cacti when the service is unprovisioned in Freeside, &lt;br /&gt;
and they will be deleted and re-added if the ip address changes.&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
After a device is provisioned, the graphs won't show up until the next time the&lt;br /&gt;
cacti server runs its poller and exports the graphs;  by default, this is every &lt;br /&gt;
five minutes.  If you try to view the graphs in this window, it will say they don't &lt;br /&gt;
exist.&lt;br /&gt;
&lt;br /&gt;
When upgrading a freeside server that uses this export, make sure to check that&lt;br /&gt;
the most recent freeside_cacti.php file is copied into the script directory&lt;br /&gt;
on the cacti server.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
&lt;br /&gt;
Currently does not support non-ASCII characters in Description, and apostrophes will be removed&lt;br /&gt;
&lt;br /&gt;
Currently does not support graph-title in graph generation (specify title in template instead)&lt;br /&gt;
&lt;br /&gt;
Currently does not support graphs that require custom input-fields&lt;br /&gt;
&lt;br /&gt;
Currently does not support specifying reindex-method for graphs from Data Queries&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:3:Documentation:NG_Self-Service&amp;diff=8862</id>
		<title>Freeside:3:Documentation:NG Self-Service</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:3:Documentation:NG_Self-Service&amp;diff=8862"/>
				<updated>2015-05-06T02:26:11Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: /* Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NG Self-service is the next generation version of our customer self-service portal.  The application is written in PHP and utilizes CSS to allow modification and manipulation to the look and feel easier than before.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
* Copy the ng_selfservice directory into the appropriate directory on your web/self-service portal server.&lt;br /&gt;
* Edit freeside.class.php to point to your Freeside server:&lt;br /&gt;
&amp;lt;pre&amp;gt;var $URL = 'http://yourfreesideserver:8080/';&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Enable selfservice-xmlrpc in Configuration -&amp;gt; Settings.&lt;br /&gt;
* Restart the Freeside services&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
* Configuration -&amp;gt; Settings: ng_selfservice-menu allows additional custom scripts and removal of default pages to enhance the capabilities of the self-service portal.  You can also rename the links in the menus to fix your specific needs.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
main.php Home&lt;br /&gt;
&lt;br /&gt;
services.php Services&lt;br /&gt;
services.php My Services&lt;br /&gt;
services_new.php Order a new service&lt;br /&gt;
&lt;br /&gt;
personal.php Profile&lt;br /&gt;
personal.php Personal Information&lt;br /&gt;
password.php Change Password&lt;br /&gt;
&lt;br /&gt;
payment.php Payments&lt;br /&gt;
payment_cc.php Credit Card Payment&lt;br /&gt;
payment_ach.php Electronic Check Payment&lt;br /&gt;
payment_paypal.php PayPal Payment&lt;br /&gt;
payment_webpay.php Webpay Payments&lt;br /&gt;
&lt;br /&gt;
usage.php Usage&lt;br /&gt;
usage_data.php Data usage&lt;br /&gt;
usage_cdr.php Call usage&lt;br /&gt;
&lt;br /&gt;
tickets.php Help Desk&lt;br /&gt;
tickets.php Open Tickets&lt;br /&gt;
tickets_resolved.php Resolved Tickets&lt;br /&gt;
ticket_create.php Create a new ticket&lt;br /&gt;
&lt;br /&gt;
docs.php FAQs&lt;br /&gt;
&lt;br /&gt;
logout.php Logout&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
* Communication is not encrypted.  Communication should be routed via a VPN or other secure tunnel/mechanism.&lt;br /&gt;
* You might also have to install debian package php5-xmlrpc&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8854</id>
		<title>Freeside:4:Documentation:Cacti</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8854"/>
				<updated>2015-04-30T22:01:00Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: /* Connecting Cacti To Freeside */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Connecting Cacti To Freeside ==&lt;br /&gt;
&lt;br /&gt;
Copy the freeside_cacti.php script from the bin directory of your Freeside&lt;br /&gt;
installation to the cli directory of your Cacti installation.  Give this file &lt;br /&gt;
the same permissions as the other files in that directory, and create &lt;br /&gt;
(or choose an existing) user with sufficient permission to read these scripts.&lt;br /&gt;
&lt;br /&gt;
In the regular Cacti interface, create a Host Template to be used by &lt;br /&gt;
devices exported by Freeside, and note the template's id number.  Make sure&lt;br /&gt;
the Host Template has Associated Graph Templates and Data Queries for &lt;br /&gt;
any graphs you wish to automatically generate.  Create a Graph Tree for &lt;br /&gt;
new devices to be automatically added to, and note the tree's id number.&lt;br /&gt;
Configure a Graph Export (under Settings) and note the Export Directory.  &lt;br /&gt;
&lt;br /&gt;
In Freeside, go to Configuration-&amp;gt;Services-&amp;gt;Provisioning exports to&lt;br /&gt;
add a new export.  From the Add Export page, select cacti for Export then enter...&lt;br /&gt;
&lt;br /&gt;
* Hostname or IP - of your Cacti server&lt;br /&gt;
&lt;br /&gt;
* User Name - with permission to run scripts in the cli directory&lt;br /&gt;
&lt;br /&gt;
* Script Path - full path to that directory (eg /usr/share/cacti/cli/)&lt;br /&gt;
&lt;br /&gt;
* Host Template ID - for adding new devices&lt;br /&gt;
&lt;br /&gt;
* Graph Tree ID - to which the host will be added&lt;br /&gt;
&lt;br /&gt;
* Description - for new devices.  You can use the tokens $ip_addr, $description and $contact to include the equivalent fields from the broadband service definition or associated customer&lt;br /&gt;
&lt;br /&gt;
* Graph Export Directory - as configured, including connection information if necessary (user@host:/path/to/graph/export/)&lt;br /&gt;
&lt;br /&gt;
* Minimum minutes between graph imports - graphs will be imported from the export directory into Freeside as needed, but not more often than this.  This should be at least as long as the minumum time between graph exports configured in Cacti. Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* Maximum size per graph - in MB.  Individual graphs that exceed this size will be quietly ignored by Freeside.  Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* Delete associated graphs and data sources when unprovisioning - if this is unchecked, only host will be deleted, but graphs and data sources will be preserved.  Note that this deletion process does not use official cacti api, but rather queries the cacti database directly; test before deploying (developed &amp;amp; tested on cacti 0.8.8a)&lt;br /&gt;
&lt;br /&gt;
Basic graphs will automatically be generated for each Graph Template associated with the Host Template, but if you want to add graphs based on associated Data Queries, you will have to specify their inputs explicitly at the bottom of this page.  See [http://www.cacti.net/downloads/docs/html/cli_add_graphs.html cacti add_graphs documentation] for details on these fields.  You can also specify additional Graph Templates here for basic graph generation, just leave the SNMP fields blank.&lt;br /&gt;
&lt;br /&gt;
After adding the export, go to Configuration-&amp;gt;Services-&amp;gt;Service definitions.&lt;br /&gt;
The export you just created will be available for selection when adding or&lt;br /&gt;
editing broadband service definitions; check the box to activate it for &lt;br /&gt;
a given service.  Note that you should only have one cacti export per&lt;br /&gt;
broadband service definition.&lt;br /&gt;
&lt;br /&gt;
When properly configured broadband services are provisioned, they will now&lt;br /&gt;
be added to Cacti using the Host Template you specified.  If you also specified&lt;br /&gt;
a Graph Tree, the created device will also be added to that.  Graphs will be&lt;br /&gt;
generated for each graph template you specified, as well as any you explicitly&lt;br /&gt;
configured.&lt;br /&gt;
&lt;br /&gt;
Once added, a link to the graphs for this host will be available when viewing &lt;br /&gt;
the details of the provisioned service in Freeside.&lt;br /&gt;
&lt;br /&gt;
Devices will be deleted from Cacti when the service is unprovisioned in Freeside, &lt;br /&gt;
and they will be deleted and re-added if the ip address changes.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
&lt;br /&gt;
Currently does not support non-ASCII characters in Description, and apostrophes will be removed&lt;br /&gt;
&lt;br /&gt;
Currently does not support graph-title in graph generation (specify title in template instead)&lt;br /&gt;
&lt;br /&gt;
Currently does not support graphs that require custom input-fields&lt;br /&gt;
&lt;br /&gt;
Currently does not support specifying reindex-method for graphs from Data Queries&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8853</id>
		<title>Freeside:4:Documentation:Cacti</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8853"/>
				<updated>2015-04-30T21:59:48Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: /* Known Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Connecting Cacti To Freeside ==&lt;br /&gt;
&lt;br /&gt;
Copy the freeside_cacti.php script from the bin directory of your Freeside&lt;br /&gt;
installation to the cli directory of your Cacti installation.  Give this file &lt;br /&gt;
the same permissions as the other files in that directory, and create &lt;br /&gt;
(or choose an existing) user with sufficient permission to read these scripts.&lt;br /&gt;
&lt;br /&gt;
In the regular Cacti interface, create a Host Template to be used by &lt;br /&gt;
devices exported by Freeside, and note the template's id number.  Make sure&lt;br /&gt;
the Host Template has Associated Graph Templates and Data Queries for &lt;br /&gt;
any graphs you wish to automatically generate.  Create a Graph Tree for &lt;br /&gt;
new devices to be automatically added to, and note the tree's id number.&lt;br /&gt;
Configure a Graph Export (under Settings) and note the Export Directory.  &lt;br /&gt;
&lt;br /&gt;
In Freeside, go to Configuration-&amp;gt;Services-&amp;gt;Provisioning exports to&lt;br /&gt;
add a new export.  From the Add Export page, select cacti for Export then enter...&lt;br /&gt;
&lt;br /&gt;
* Hostname or IP - of your Cacti server&lt;br /&gt;
&lt;br /&gt;
* User Name - with permission to run scripts in the cli directory&lt;br /&gt;
&lt;br /&gt;
* Script Path - full path to that directory (eg /usr/share/cacti/cli/)&lt;br /&gt;
&lt;br /&gt;
* Host Template ID - for adding new devices&lt;br /&gt;
&lt;br /&gt;
* Graph Tree ID - to which the host will be added&lt;br /&gt;
&lt;br /&gt;
* Description - for new devices.  You can use the tokens $ip_addr, $description and $contact to include the equivalent fields from the broadband service definition or associated customer&lt;br /&gt;
&lt;br /&gt;
* Graph Export Directory - as configured, including connection information if necessary (user@host:/path/to/graph/export/)&lt;br /&gt;
&lt;br /&gt;
* Minimum minutes between graph imports - graphs will be imported from the export directory into Freeside as needed, but not more often than this.  This should be at least as long as the minumum time between graph exports configured in Cacti. Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* Maximum size per graph - in MB.  Individual graphs that exceed this size will be quietly ignored by Freeside.  Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* Delete associated graphs and data sources when unprovisioning - if this is unchecked, only host will be deleted, but graphs and data sources will be preserved.  Note that this deletion process does not use official cacti api, but rather queries the cacti database directly; test before deploying (developed &amp;amp; tested on cacti 0.8.8a)&lt;br /&gt;
&lt;br /&gt;
Basic graphs will automatically be generated for each Graph Template associated with the Host Template, but if you want to add graphs based on associated Data Queries, you will have to specify their inputs explicitly at the bottom of this page.  See [http://www.cacti.net/downloads/docs/html/cli_add_graphs.html cacti add_graphs documentation] for details on these values.  You can also specify additional Graph Templates here for basic graph generation, just leave the SNMP fields blank.&lt;br /&gt;
&lt;br /&gt;
After adding the export, go to Configuration-&amp;gt;Services-&amp;gt;Service definitions.&lt;br /&gt;
The export you just created will be available for selection when adding or&lt;br /&gt;
editing broadband service definitions; check the box to activate it for &lt;br /&gt;
a given service.  Note that you should only have one cacti export per&lt;br /&gt;
broadband service definition.&lt;br /&gt;
&lt;br /&gt;
When properly configured broadband services are provisioned, they will now&lt;br /&gt;
be added to Cacti using the Host Template you specified.  If you also specified&lt;br /&gt;
a Graph Tree, the created device will also be added to that.  Graphs will be&lt;br /&gt;
generated for each graph template you specified, as well as any you explicitly&lt;br /&gt;
configured.&lt;br /&gt;
&lt;br /&gt;
Once added, a link to the graphs for this host will be available when viewing &lt;br /&gt;
the details of the provisioned service in Freeside.&lt;br /&gt;
&lt;br /&gt;
Devices will be deleted from Cacti when the service is unprovisioned in Freeside, &lt;br /&gt;
and they will be deleted and re-added if the ip address changes.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
&lt;br /&gt;
Currently does not support non-ASCII characters in Description, and apostrophes will be removed&lt;br /&gt;
&lt;br /&gt;
Currently does not support graph-title in graph generation (specify title in template instead)&lt;br /&gt;
&lt;br /&gt;
Currently does not support graphs that require custom input-fields&lt;br /&gt;
&lt;br /&gt;
Currently does not support specifying reindex-method for graphs from Data Queries&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8852</id>
		<title>Freeside:4:Documentation:Cacti</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8852"/>
				<updated>2015-04-30T20:57:52Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: /* Connecting Cacti To Freeside */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Connecting Cacti To Freeside ==&lt;br /&gt;
&lt;br /&gt;
Copy the freeside_cacti.php script from the bin directory of your Freeside&lt;br /&gt;
installation to the cli directory of your Cacti installation.  Give this file &lt;br /&gt;
the same permissions as the other files in that directory, and create &lt;br /&gt;
(or choose an existing) user with sufficient permission to read these scripts.&lt;br /&gt;
&lt;br /&gt;
In the regular Cacti interface, create a Host Template to be used by &lt;br /&gt;
devices exported by Freeside, and note the template's id number.  Make sure&lt;br /&gt;
the Host Template has Associated Graph Templates and Data Queries for &lt;br /&gt;
any graphs you wish to automatically generate.  Create a Graph Tree for &lt;br /&gt;
new devices to be automatically added to, and note the tree's id number.&lt;br /&gt;
Configure a Graph Export (under Settings) and note the Export Directory.  &lt;br /&gt;
&lt;br /&gt;
In Freeside, go to Configuration-&amp;gt;Services-&amp;gt;Provisioning exports to&lt;br /&gt;
add a new export.  From the Add Export page, select cacti for Export then enter...&lt;br /&gt;
&lt;br /&gt;
* Hostname or IP - of your Cacti server&lt;br /&gt;
&lt;br /&gt;
* User Name - with permission to run scripts in the cli directory&lt;br /&gt;
&lt;br /&gt;
* Script Path - full path to that directory (eg /usr/share/cacti/cli/)&lt;br /&gt;
&lt;br /&gt;
* Host Template ID - for adding new devices&lt;br /&gt;
&lt;br /&gt;
* Graph Tree ID - to which the host will be added&lt;br /&gt;
&lt;br /&gt;
* Description - for new devices.  You can use the tokens $ip_addr, $description and $contact to include the equivalent fields from the broadband service definition or associated customer&lt;br /&gt;
&lt;br /&gt;
* Graph Export Directory - as configured, including connection information if necessary (user@host:/path/to/graph/export/)&lt;br /&gt;
&lt;br /&gt;
* Minimum minutes between graph imports - graphs will be imported from the export directory into Freeside as needed, but not more often than this.  This should be at least as long as the minumum time between graph exports configured in Cacti. Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* Maximum size per graph - in MB.  Individual graphs that exceed this size will be quietly ignored by Freeside.  Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* Delete associated graphs and data sources when unprovisioning - if this is unchecked, only host will be deleted, but graphs and data sources will be preserved.  Note that this deletion process does not use official cacti api, but rather queries the cacti database directly; test before deploying (developed &amp;amp; tested on cacti 0.8.8a)&lt;br /&gt;
&lt;br /&gt;
Basic graphs will automatically be generated for each Graph Template associated with the Host Template, but if you want to add graphs based on associated Data Queries, you will have to specify their inputs explicitly at the bottom of this page.  See [http://www.cacti.net/downloads/docs/html/cli_add_graphs.html cacti add_graphs documentation] for details on these values.  You can also specify additional Graph Templates here for basic graph generation, just leave the SNMP fields blank.&lt;br /&gt;
&lt;br /&gt;
After adding the export, go to Configuration-&amp;gt;Services-&amp;gt;Service definitions.&lt;br /&gt;
The export you just created will be available for selection when adding or&lt;br /&gt;
editing broadband service definitions; check the box to activate it for &lt;br /&gt;
a given service.  Note that you should only have one cacti export per&lt;br /&gt;
broadband service definition.&lt;br /&gt;
&lt;br /&gt;
When properly configured broadband services are provisioned, they will now&lt;br /&gt;
be added to Cacti using the Host Template you specified.  If you also specified&lt;br /&gt;
a Graph Tree, the created device will also be added to that.  Graphs will be&lt;br /&gt;
generated for each graph template you specified, as well as any you explicitly&lt;br /&gt;
configured.&lt;br /&gt;
&lt;br /&gt;
Once added, a link to the graphs for this host will be available when viewing &lt;br /&gt;
the details of the provisioned service in Freeside.&lt;br /&gt;
&lt;br /&gt;
Devices will be deleted from Cacti when the service is unprovisioned in Freeside, &lt;br /&gt;
and they will be deleted and re-added if the ip address changes.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
&lt;br /&gt;
Currently does not support non-ASCII characters in Description, and apostrophes will be removed&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8851</id>
		<title>Freeside:4:Documentation:Cacti</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8851"/>
				<updated>2015-04-30T20:30:38Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: /* Known Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Connecting Cacti To Freeside ==&lt;br /&gt;
&lt;br /&gt;
Copy the freeside_cacti.php script from the bin directory of your Freeside&lt;br /&gt;
installation to the cli directory of your Cacti installation.  Give this file &lt;br /&gt;
the same permissions as the other files in that directory, and create &lt;br /&gt;
(or choose an existing) user with sufficient permission to read these scripts.&lt;br /&gt;
&lt;br /&gt;
In the regular Cacti interface, create a Host Template to be used by &lt;br /&gt;
devices exported by Freeside, and note the template's id number.  Optionally,&lt;br /&gt;
create a Graph Tree for these devices to be automatically added to, and note&lt;br /&gt;
the tree's id number.  Configure a Graph Export (under Settings) and note &lt;br /&gt;
the Export Directory.&lt;br /&gt;
&lt;br /&gt;
In Freeside, go to Configuration-&amp;gt;Services-&amp;gt;Provisioning exports to&lt;br /&gt;
add a new export.  From the Add Export page, select cacti for Export then enter...&lt;br /&gt;
&lt;br /&gt;
* the Hostname or IP address of your Cacti server&lt;br /&gt;
&lt;br /&gt;
* the User Name with permission to run scripts in the cli directory&lt;br /&gt;
&lt;br /&gt;
* the full Script Path to that directory (eg /usr/share/cacti/cli/)&lt;br /&gt;
&lt;br /&gt;
* the Host Template ID for adding new devices&lt;br /&gt;
&lt;br /&gt;
* the Graph Tree ID for adding new devices (optional)&lt;br /&gt;
&lt;br /&gt;
* the Description for new devices;  you can use the tokens $ip_addr, $description and $contact to include the equivalent fields from the broadband service definition or associated customer&lt;br /&gt;
&lt;br /&gt;
* the Graph Export Directory, including connection information if necessary (user@host:/path/to/graphs/)&lt;br /&gt;
&lt;br /&gt;
* the minimum minutes between graph imports to Freeside (graphs will otherwise be imported into Freeside as needed.)  This should be at least as long as the minumum time between graph exports configured in Cacti. Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* the maximum size per graph, in MB;  individual graphs that exceed this size will be quietly ignored by Freeside.  Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
After adding the export, go to Configuration-&amp;gt;Services-&amp;gt;Service definitions.&lt;br /&gt;
The export you just created will be available for selection when adding or&lt;br /&gt;
editing broadband service definitions; check the box to activate it for &lt;br /&gt;
a given service.  Note that you should only have one cacti export per&lt;br /&gt;
broadband service definition.&lt;br /&gt;
&lt;br /&gt;
When properly configured broadband services are provisioned, they will now&lt;br /&gt;
be added to Cacti using the Host Template you specified.  If you also specified&lt;br /&gt;
a Graph Tree, the created device will also be added to that.&lt;br /&gt;
&lt;br /&gt;
Once added, a link to the graphs for this host will be available when viewing &lt;br /&gt;
the details of the provisioned service in Freeside.&lt;br /&gt;
&lt;br /&gt;
Devices will be deleted from Cacti when the service is unprovisioned in Freeside, &lt;br /&gt;
and they will be deleted and re-added if the ip address changes.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
&lt;br /&gt;
Currently does not support non-ASCII characters in Description, and apostrophes will be removed&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:MagicMail&amp;diff=8842</id>
		<title>Freeside:4:Documentation:MagicMail</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:MagicMail&amp;diff=8842"/>
				<updated>2015-04-21T03:00:54Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: Initial doc for magicmail integration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Connecting MagicMail to Freeside ==&lt;br /&gt;
&lt;br /&gt;
Through the MagicMail admin interface, configure an API Client with client type FREESIDE, and make note of the Client ID and Password.  Configure a system domain for each domain name you will use (freeside does not currently integrate with &amp;quot;hosted&amp;quot; domains in magicmail) and make sure these domains are accessible by the API Client.&lt;br /&gt;
&lt;br /&gt;
In Freeside, go to Configuration-&amp;gt;Services-&amp;gt;Provisioning exports to add a new export. From the Add Export page, select magicmail for Export then enter...&lt;br /&gt;
&lt;br /&gt;
* Hostname or IP Address - of your MagicMail server&lt;br /&gt;
&lt;br /&gt;
* API Client ID&lt;br /&gt;
&lt;br /&gt;
* API Client Password&lt;br /&gt;
&lt;br /&gt;
* Account Prefix - will be appended with customer numbers to create customer account ids&lt;br /&gt;
&lt;br /&gt;
* Package - the package that will be assigned to the account's master user by this export (should be EMAIL for one svc_acct per customer)&lt;br /&gt;
&lt;br /&gt;
* Port - optional, port for API calls to MagicMail server, default 443&lt;br /&gt;
&lt;br /&gt;
* Auto purge user/account on unprovision - if checked, automatically purges deleted accounts/user upon unprovisioning services, immediately freeing up usernames for re-use but making it impossible to retrieve deleted mailboxes&lt;br /&gt;
&lt;br /&gt;
* Enable debug warnings - if checked, prints debug info to the error log for every API request and response &lt;br /&gt;
&lt;br /&gt;
After adding the export, go to Configuration-&amp;gt;Services-&amp;gt;Service definitions. The export you just created will be available for selection when adding or editing svc_acct service definitions; check the box to activate it for a given service.&lt;br /&gt;
&lt;br /&gt;
This export runs in real time during provisioning, meaning a service will not be successfully provisioned until the MagicMail export completes.&lt;br /&gt;
&lt;br /&gt;
Every customer with any services provisioned on this export will have an account created for them in MagicMail when the first service is provisioned.  The account name will be the ''Account Prefix'' plus the customer's number.  Each svc_acct provisioned for a customer will be one user/mailbox/emailaddress on the account.  There is no way to export more than one emailaddress per user/mailbox.&lt;br /&gt;
&lt;br /&gt;
== Multiple Packages Per Customer ==&lt;br /&gt;
&lt;br /&gt;
Though you should only have one magicmail export per service definition, you can use different export definitions on different services to offer a variety of different packages to your customers.  So long as the ''Account Prefix'' is the same on all magicmail export definitions, they will all use the same MagicMail account for each customer.&lt;br /&gt;
&lt;br /&gt;
The master user on the account will be the first service provisioned on the account, and it will be assigned the appropriate packages for all services on that account (additional users will be given the ADDITIONAL NOCOST MAILBOX package, and nothing else.)  If the master user is unprovisioned before other provisioned services, master user status and assigned packages will be transferred to the oldest remaining provisioned service.  Master user packages are synchronized with the freeside customer's currently provisioned services whenever a magicmail export using that ''Account Prefix'' provisions or unprovisions a service.&lt;br /&gt;
&lt;br /&gt;
== Known Issues ==&lt;br /&gt;
&lt;br /&gt;
Currently only works with password encoding types ''Plain text'', ''Unix password (DES encrypted)'', ''Unix password (MD5 digest)'' and ''LDAP (plain text)''.  In freeside, go to Configuration-&amp;gt;Settings and check the value of default-password-encoding.&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation&amp;diff=8841</id>
		<title>Freeside:4:Documentation</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation&amp;diff=8841"/>
				<updated>2015-04-21T02:13:00Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: /* Administrator */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Note =&lt;br /&gt;
&lt;br /&gt;
Documentation specific to git master / 4.x.  For now, refer to this as an add-on to the 3.x documentation.&lt;br /&gt;
&lt;br /&gt;
= Installation and upgrades =&lt;br /&gt;
&lt;br /&gt;
== Backend Installation ==&lt;br /&gt;
&lt;br /&gt;
* New installation&lt;br /&gt;
* Integrated RT installation&lt;br /&gt;
* OS-specific installation guides (source)&lt;br /&gt;
** [[Freeside:4:Documentation:InstallingOnDebian7]]&lt;br /&gt;
&lt;br /&gt;
== Upgrading ==&lt;br /&gt;
&lt;br /&gt;
* [[Freeside:4:Documentation:Upgrading|Upgrading from 3.3 or later to 4.x]]&lt;br /&gt;
&lt;br /&gt;
= Administrator =&lt;br /&gt;
&lt;br /&gt;
* [[Freeside:4:Documentation:Administrator:Multi-currency|Multi-currency]]&lt;br /&gt;
* [[Freeside:4:Documentation:Administrator:Fees|Automated fees]] (under development)&lt;br /&gt;
* [[Freeside:4:Documentation:Cacti|Cacti Integration]]&lt;br /&gt;
* [[Freeside:4:Documentation:MagicMail|MagicMail Integration]]&lt;br /&gt;
&lt;br /&gt;
= Developer =&lt;br /&gt;
&lt;br /&gt;
* [[Freeside:4:Documentation:Developer:Authentication_Plugins|Authentication Plugins]]&lt;br /&gt;
&lt;br /&gt;
= Changelog =&lt;br /&gt;
&lt;br /&gt;
* [[Freeside:4.0:Changelog|4.0 Changelog]]&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8747</id>
		<title>Freeside:4:Documentation:Cacti</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8747"/>
				<updated>2015-04-08T21:51:19Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: /* Connecting Cacti To Freeside */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Connecting Cacti To Freeside ==&lt;br /&gt;
&lt;br /&gt;
Copy the freeside_cacti.php script from the bin directory of your Freeside&lt;br /&gt;
installation to the cli directory of your Cacti installation.  Give this file &lt;br /&gt;
the same permissions as the other files in that directory, and create &lt;br /&gt;
(or choose an existing) user with sufficient permission to read these scripts.&lt;br /&gt;
&lt;br /&gt;
In the regular Cacti interface, create a Host Template to be used by &lt;br /&gt;
devices exported by Freeside, and note the template's id number.  Optionally,&lt;br /&gt;
create a Graph Tree for these devices to be automatically added to, and note&lt;br /&gt;
the tree's id number.  Configure a Graph Export (under Settings) and note &lt;br /&gt;
the Export Directory.&lt;br /&gt;
&lt;br /&gt;
In Freeside, go to Configuration-&amp;gt;Services-&amp;gt;Provisioning exports to&lt;br /&gt;
add a new export.  From the Add Export page, select cacti for Export then enter...&lt;br /&gt;
&lt;br /&gt;
* the Hostname or IP address of your Cacti server&lt;br /&gt;
&lt;br /&gt;
* the User Name with permission to run scripts in the cli directory&lt;br /&gt;
&lt;br /&gt;
* the full Script Path to that directory (eg /usr/share/cacti/cli/)&lt;br /&gt;
&lt;br /&gt;
* the Host Template ID for adding new devices&lt;br /&gt;
&lt;br /&gt;
* the Graph Tree ID for adding new devices (optional)&lt;br /&gt;
&lt;br /&gt;
* the Description for new devices;  you can use the tokens $ip_addr, $description and $contact to include the equivalent fields from the broadband service definition or associated customer&lt;br /&gt;
&lt;br /&gt;
* the Graph Export Directory, including connection information if necessary (user@host:/path/to/graphs/)&lt;br /&gt;
&lt;br /&gt;
* the minimum minutes between graph imports to Freeside (graphs will otherwise be imported into Freeside as needed.)  This should be at least as long as the minumum time between graph exports configured in Cacti. Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* the maximum size per graph, in MB;  individual graphs that exceed this size will be quietly ignored by Freeside.  Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
After adding the export, go to Configuration-&amp;gt;Services-&amp;gt;Service definitions.&lt;br /&gt;
The export you just created will be available for selection when adding or&lt;br /&gt;
editing broadband service definitions; check the box to activate it for &lt;br /&gt;
a given service.  Note that you should only have one cacti export per&lt;br /&gt;
broadband service definition.&lt;br /&gt;
&lt;br /&gt;
When properly configured broadband services are provisioned, they will now&lt;br /&gt;
be added to Cacti using the Host Template you specified.  If you also specified&lt;br /&gt;
a Graph Tree, the created device will also be added to that.&lt;br /&gt;
&lt;br /&gt;
Once added, a link to the graphs for this host will be available when viewing &lt;br /&gt;
the details of the provisioned service in Freeside.&lt;br /&gt;
&lt;br /&gt;
Devices will be deleted from Cacti when the service is unprovisioned in Freeside, &lt;br /&gt;
and they will be deleted and re-added if the ip address changes.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
&lt;br /&gt;
Currently, graphs themselves must still be added in Cacti by hand or some&lt;br /&gt;
other form of automation tailored to your specific graph inputs and data sources.&lt;br /&gt;
&lt;br /&gt;
Currently does not support non-ASCII characters in Description&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8746</id>
		<title>Freeside:4:Documentation:Cacti</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8746"/>
				<updated>2015-04-08T21:40:22Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: /* Connecting Cacti To Freeside */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Connecting Cacti To Freeside ==&lt;br /&gt;
&lt;br /&gt;
Copy the freeside_cacti.php script from the bin directory of your Freeside&lt;br /&gt;
installation to the cli directory of your Cacti installation.  Give this file &lt;br /&gt;
the same permissions as the other files in that directory, and create &lt;br /&gt;
(or choose an existing) user with sufficient permission to read these scripts.&lt;br /&gt;
&lt;br /&gt;
In the regular Cacti interface, create a Host Template to be used by &lt;br /&gt;
devices exported by Freeside, and note the template's id number.  Optionally,&lt;br /&gt;
create a Graph Tree for these devices to be automatically added to, and note&lt;br /&gt;
the tree's id number.  Configure a Graph Export (under Settings) and note &lt;br /&gt;
the Export Directory.&lt;br /&gt;
&lt;br /&gt;
In Freeside, go to Configuration-&amp;gt;Services-&amp;gt;Provisioning exports to&lt;br /&gt;
add a new export.  From the Add Export page, select cacti for Export then enter...&lt;br /&gt;
&lt;br /&gt;
* the Hostname or IP address of your Cacti server&lt;br /&gt;
&lt;br /&gt;
* the User Name with permission to run scripts in the cli directory&lt;br /&gt;
&lt;br /&gt;
* the full Script Path to that directory (eg /usr/share/cacti/cli/)&lt;br /&gt;
&lt;br /&gt;
* the Host Template ID for adding new devices&lt;br /&gt;
&lt;br /&gt;
* the Graph Tree ID for adding new devices (optional)&lt;br /&gt;
&lt;br /&gt;
* the Description for new devices;  you can use the tokens $ip_addr, $description and $contact to include the equivalent fields from the broadband service definition or associated customer&lt;br /&gt;
&lt;br /&gt;
* the Graph Export Directory, including connection information if necessary (user@host:/path/to/graphs/)&lt;br /&gt;
&lt;br /&gt;
* the minimum minutes between graph imports to Freeside (graphs will otherwise be imported into Freeside as needed.)  This should be at least as long as the minumum time between graph exports configured in Cacti. Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* the maximum size per graph, in MB;  individual graphs that exceed this size will be quietly ignored by Freeside.  Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
After adding the export, go to Configuration-&amp;gt;Services-&amp;gt;Service definitions.&lt;br /&gt;
The export you just created will be available for selection when adding or&lt;br /&gt;
editing broadband service definitions; check the box to activate it for &lt;br /&gt;
a given service.  Note that you should only have one cacti export per&lt;br /&gt;
broadband service definition.&lt;br /&gt;
&lt;br /&gt;
When properly configured broadband services are provisioned, they will now&lt;br /&gt;
be added to Cacti using the Host Template you specified.  If you also specified&lt;br /&gt;
a Graph Tree, the created device will also be added to that.&lt;br /&gt;
&lt;br /&gt;
Once added, a link to the graphs for this host will be available when viewing &lt;br /&gt;
the details of the provisioned service in Freeside.&lt;br /&gt;
&lt;br /&gt;
Devices will be deleted from Cacti when the service is unprovisioned in Freeside, &lt;br /&gt;
and they will be deleted and re-added if the ip address changes.&lt;br /&gt;
&lt;br /&gt;
Currently, graphs themselves must still be added in Cacti by hand or some&lt;br /&gt;
other form of automation tailored to your specific graph inputs and data sources.&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation&amp;diff=8745</id>
		<title>Freeside:4:Documentation</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation&amp;diff=8745"/>
				<updated>2015-04-08T21:35:54Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: adding link to cacti integration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Note =&lt;br /&gt;
&lt;br /&gt;
Documentation specific to git master / 4.x.  For now, refer to this as an add-on to the 3.x documentation.&lt;br /&gt;
&lt;br /&gt;
= Installation and upgrades =&lt;br /&gt;
&lt;br /&gt;
== Backend Installation ==&lt;br /&gt;
&lt;br /&gt;
* New installation&lt;br /&gt;
* Integrated RT installation&lt;br /&gt;
* OS-specific installation guides (source)&lt;br /&gt;
** [[Freeside:4:Documentation:InstallingOnDebian7]]&lt;br /&gt;
&lt;br /&gt;
== Upgrading ==&lt;br /&gt;
&lt;br /&gt;
* [[Freeside:4:Documentation:Upgrading|Upgrading from 3.3 or later to 4.x]]&lt;br /&gt;
&lt;br /&gt;
= Administrator =&lt;br /&gt;
&lt;br /&gt;
* [[Freeside:4:Documentation:Administrator:Multi-currency|Multi-currency]]&lt;br /&gt;
* [[Freeside:4:Documentation:Administrator:Fees|Automated fees]] (under development)&lt;br /&gt;
* [[Freeside:4:Documentation:Cacti|Cacti Integration]]&lt;br /&gt;
&lt;br /&gt;
= Developer =&lt;br /&gt;
&lt;br /&gt;
* [[Freeside:4:Documentation:Developer:Authentication_Plugins|Authentication Plugins]]&lt;br /&gt;
&lt;br /&gt;
= Changelog =&lt;br /&gt;
&lt;br /&gt;
* [[Freeside:4.0:Changelog|4.0 Changelog]]&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8744</id>
		<title>Freeside:4:Documentation:Cacti</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8744"/>
				<updated>2015-04-07T02:01:17Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: /* Connecting Cacti To Freeside */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Connecting Cacti To Freeside ==&lt;br /&gt;
&lt;br /&gt;
Copy the freeside_cacti.php script from the bin directory of your Freeside&lt;br /&gt;
installation to the cli directory of your Cacti installation.  Give this file &lt;br /&gt;
the same permissions as the other files in that directory, and create &lt;br /&gt;
(or choose an existing) user with sufficient permission to read these scripts.&lt;br /&gt;
&lt;br /&gt;
In the regular Cacti interface, create a Host Template to be used by &lt;br /&gt;
devices exported by Freeside, and note the template's id number.  Optionally,&lt;br /&gt;
create a Graph Tree for these devices to be automatically added to, and note&lt;br /&gt;
the tree's id number.  Configure a Graph Export (under Settings) and note &lt;br /&gt;
the Export Directory.&lt;br /&gt;
&lt;br /&gt;
In Freeside, go to Configuration-&amp;gt;Services-&amp;gt;Provisioning exports to&lt;br /&gt;
add a new export.  From the Add Export page, select cacti for Export then enter...&lt;br /&gt;
&lt;br /&gt;
* the Hostname or IP address of your Cacti server&lt;br /&gt;
&lt;br /&gt;
* the User Name with permission to run scripts in the cli directory&lt;br /&gt;
&lt;br /&gt;
* the full Script Path to that directory (eg /usr/share/cacti/cli/)&lt;br /&gt;
&lt;br /&gt;
* the Host Template ID for adding new devices&lt;br /&gt;
&lt;br /&gt;
* the Graph Tree ID for adding new devices (optional)&lt;br /&gt;
&lt;br /&gt;
* the Description for new devices;  you can use the tokens $ip_addr and $description to include the equivalent fields from the broadband service definition, or $contact to use the customer's contact name&lt;br /&gt;
&lt;br /&gt;
* the Graph Export Directory, including connection information if necessary (user@host:/path/to/graphs/)&lt;br /&gt;
&lt;br /&gt;
* the minimum minutes between graph imports to Freeside (graphs will otherwise be imported into Freeside as needed.)  This should be at least as long as the minumum time between graph exports configured in Cacti. Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* the maximum size per graph, in MB;  individual graphs that exceed this size will be quietly ignored by Freeside.  Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
After adding the export, go to Configuration-&amp;gt;Services-&amp;gt;Service definitions.&lt;br /&gt;
The export you just created will be available for selection when adding or&lt;br /&gt;
editing broadband service definitions; check the box to activate it for &lt;br /&gt;
a given service.  Note that you should only have one cacti export per&lt;br /&gt;
broadband service definition.&lt;br /&gt;
&lt;br /&gt;
When properly configured broadband services are provisioned, they will now&lt;br /&gt;
be added to Cacti using the Host Template you specified.  If you also specified&lt;br /&gt;
a Graph Tree, the created device will also be added to that.&lt;br /&gt;
&lt;br /&gt;
Once added, a link to the graphs for this host will be available when viewing &lt;br /&gt;
the details of the provisioned service in Freeside.&lt;br /&gt;
&lt;br /&gt;
Devices will be deleted from Cacti when the service is unprovisioned in Freeside, &lt;br /&gt;
and they will be deleted and re-added if the ip address changes.&lt;br /&gt;
&lt;br /&gt;
Currently, graphs themselves must still be added in Cacti by hand or some&lt;br /&gt;
other form of automation tailored to your specific graph inputs and data sources.&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8743</id>
		<title>Freeside:4:Documentation:Cacti</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8743"/>
				<updated>2015-04-07T02:00:35Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: /* Connecting Cacti To Freeside */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Connecting Cacti To Freeside ==&lt;br /&gt;
&lt;br /&gt;
Copy the freeside_cacti.php script from the bin directory of your Freeside&lt;br /&gt;
installation to the cli directory of your Cacti installation.  Give this file &lt;br /&gt;
the same permissions as the other files in that directory, and create &lt;br /&gt;
(or choose an existing) user with sufficient permission to read these scripts.&lt;br /&gt;
&lt;br /&gt;
In the regular Cacti interface, create a Host Template to be used by &lt;br /&gt;
devices exported by Freeside, and note the template's id number.  Optionally,&lt;br /&gt;
create a Graph Tree for these devices to be automatically added to, and note&lt;br /&gt;
the tree's id number.  Configure a Graph Export (under Settings) and note &lt;br /&gt;
the Export Directory.&lt;br /&gt;
&lt;br /&gt;
In Freeside, go to Configuration-&amp;gt;Services-&amp;gt;Provisioning exports to&lt;br /&gt;
add a new export.  From the Add Export page, select cacti for Export then enter...&lt;br /&gt;
&lt;br /&gt;
* the Hostname or IP address of your Cacti server&lt;br /&gt;
&lt;br /&gt;
* the User Name with permission to run scripts in the cli directory&lt;br /&gt;
&lt;br /&gt;
* the full Script Path to that directory (eg /usr/share/cacti/cli/)&lt;br /&gt;
&lt;br /&gt;
* the Host Template ID for adding new devices&lt;br /&gt;
&lt;br /&gt;
* the Graph Tree ID for adding new devices (optional)&lt;br /&gt;
&lt;br /&gt;
* the Description for new devices;  you can use the tokens&lt;br /&gt;
  $ip_addr and $description to include the equivalent fields&lt;br /&gt;
  from the broadband service definition, or $contact to use&lt;br /&gt;
  the customer's contact name&lt;br /&gt;
&lt;br /&gt;
* the Graph Export Directory, including connection information&lt;br /&gt;
  if necessary (user@host:/path/to/graphs/)&lt;br /&gt;
&lt;br /&gt;
* the minimum minutes between graph imports to Freeside (graphs will&lt;br /&gt;
  otherwise be imported into Freeside as needed.)  This should be at least&lt;br /&gt;
  as long as the minumum time between graph exports configured in Cacti.&lt;br /&gt;
  Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* the maximum size per graph, in MB;  individual graphs that exceed this size&lt;br /&gt;
  will be quietly ignored by Freeside.  Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
After adding the export, go to Configuration-&amp;gt;Services-&amp;gt;Service definitions.&lt;br /&gt;
The export you just created will be available for selection when adding or&lt;br /&gt;
editing broadband service definitions; check the box to activate it for &lt;br /&gt;
a given service.  Note that you should only have one cacti export per&lt;br /&gt;
broadband service definition.&lt;br /&gt;
&lt;br /&gt;
When properly configured broadband services are provisioned, they will now&lt;br /&gt;
be added to Cacti using the Host Template you specified.  If you also specified&lt;br /&gt;
a Graph Tree, the created device will also be added to that.&lt;br /&gt;
&lt;br /&gt;
Once added, a link to the graphs for this host will be available when viewing &lt;br /&gt;
the details of the provisioned service in Freeside.&lt;br /&gt;
&lt;br /&gt;
Devices will be deleted from Cacti when the service is unprovisioned in Freeside, &lt;br /&gt;
and they will be deleted and re-added if the ip address changes.&lt;br /&gt;
&lt;br /&gt;
Currently, graphs themselves must still be added in Cacti by hand or some&lt;br /&gt;
other form of automation tailored to your specific graph inputs and data sources.&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8742</id>
		<title>Freeside:4:Documentation:Cacti</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:4:Documentation:Cacti&amp;diff=8742"/>
				<updated>2015-04-07T01:59:55Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: Created page with &amp;quot;= Connecting Cacti To Freeside =  Copy the freeside_cacti.php script from the bin directory of your Freeside installation to the cli directory of your Cacti installation.  Giv...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Connecting Cacti To Freeside =&lt;br /&gt;
&lt;br /&gt;
Copy the freeside_cacti.php script from the bin directory of your Freeside&lt;br /&gt;
installation to the cli directory of your Cacti installation.  Give this file &lt;br /&gt;
the same permissions as the other files in that directory, and create &lt;br /&gt;
(or choose an existing) user with sufficient permission to read these scripts.&lt;br /&gt;
&lt;br /&gt;
In the regular Cacti interface, create a Host Template to be used by &lt;br /&gt;
devices exported by Freeside, and note the template's id number.  Optionally,&lt;br /&gt;
create a Graph Tree for these devices to be automatically added to, and note&lt;br /&gt;
the tree's id number.  Configure a Graph Export (under Settings) and note &lt;br /&gt;
the Export Directory.&lt;br /&gt;
&lt;br /&gt;
In Freeside, go to Configuration-&amp;gt;Services-&amp;gt;Provisioning exports to&lt;br /&gt;
add a new export.  From the Add Export page, select cacti for Export then enter...&lt;br /&gt;
&lt;br /&gt;
* the Hostname or IP address of your Cacti server&lt;br /&gt;
&lt;br /&gt;
* the User Name with permission to run scripts in the cli directory&lt;br /&gt;
&lt;br /&gt;
* the full Script Path to that directory (eg /usr/share/cacti/cli/)&lt;br /&gt;
&lt;br /&gt;
* the Host Template ID for adding new devices&lt;br /&gt;
&lt;br /&gt;
* the Graph Tree ID for adding new devices (optional)&lt;br /&gt;
&lt;br /&gt;
* the Description for new devices;  you can use the tokens&lt;br /&gt;
  $ip_addr and $description to include the equivalent fields&lt;br /&gt;
  from the broadband service definition, or $contact to use&lt;br /&gt;
  the customer's contact name&lt;br /&gt;
&lt;br /&gt;
* the Graph Export Directory, including connection information&lt;br /&gt;
  if necessary (user@host:/path/to/graphs/)&lt;br /&gt;
&lt;br /&gt;
* the minimum minutes between graph imports to Freeside (graphs will&lt;br /&gt;
  otherwise be imported into Freeside as needed.)  This should be at least&lt;br /&gt;
  as long as the minumum time between graph exports configured in Cacti.&lt;br /&gt;
  Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
* the maximum size per graph, in MB;  individual graphs that exceed this size&lt;br /&gt;
  will be quietly ignored by Freeside.  Defaults to 5 if unspecified.&lt;br /&gt;
&lt;br /&gt;
After adding the export, go to Configuration-&amp;gt;Services-&amp;gt;Service definitions.&lt;br /&gt;
The export you just created will be available for selection when adding or&lt;br /&gt;
editing broadband service definitions; check the box to activate it for &lt;br /&gt;
a given service.  Note that you should only have one cacti export per&lt;br /&gt;
broadband service definition.&lt;br /&gt;
&lt;br /&gt;
When properly configured broadband services are provisioned, they will now&lt;br /&gt;
be added to Cacti using the Host Template you specified.  If you also specified&lt;br /&gt;
a Graph Tree, the created device will also be added to that.&lt;br /&gt;
&lt;br /&gt;
Once added, a link to the graphs for this host will be available when viewing &lt;br /&gt;
the details of the provisioned service in Freeside.&lt;br /&gt;
&lt;br /&gt;
Devices will be deleted from Cacti when the service is unprovisioned in Freeside, &lt;br /&gt;
and they will be deleted and re-added if the ip address changes.&lt;br /&gt;
&lt;br /&gt;
Currently, graphs themselves must still be added in Cacti by hand or some&lt;br /&gt;
other form of automation tailored to your specific graph inputs and data sources.&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:3:Documentation:RT_Installation&amp;diff=8207</id>
		<title>Freeside:3:Documentation:RT Installation</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:3:Documentation:RT_Installation&amp;diff=8207"/>
				<updated>2015-01-21T18:31:23Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: Fleshed out Bootstrap RT's permissions, based on a 3.x install&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
These instructions document installation of the integrated internal RT ticketing system.  &lt;br /&gt;
&lt;br /&gt;
There is also support for running this integration against an external RT installation, but it is not (yet) documented.&lt;br /&gt;
&lt;br /&gt;
Documentation contributions are welcome.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* [http://search.cpan.org/dist/Apache-Session Apache::Session]&lt;br /&gt;
* [http://search.cpan.org/dist/HTML-Tree HTML::TreeBuilder]&lt;br /&gt;
* [http://search.cpan.org/dist/HTML-Format HTML-Format] (CPAN: &amp;quot;install HTML::FormatText&amp;quot;)&lt;br /&gt;
* [http://search.cpan.org/dist/Test-Inline Test::Inline]&lt;br /&gt;
* [http://search.cpan.org/dist/Class-ReturnValue Class::ReturnValue]&lt;br /&gt;
* [http://search.cpan.org/dist/DBIx-SearchBuilder DBIx::SearchBuilder]&lt;br /&gt;
* [http://search.cpan.org/dist/Log-Dispatch Log::Dispatch]&lt;br /&gt;
* [http://search.cpan.org/dist/Locale-Maketext-Lexicon Locale::Maketext::Lexicon]&lt;br /&gt;
* [http://search.cpan.org/dist/Locale-Maketext-Fuzzy Locale::Maketext::Fuzzy]&lt;br /&gt;
* [http://search.cpan.org/dist/Text-Wrapper Text::Wrapper]&lt;br /&gt;
* [http://search.cpan.org/dist/Time-modules Time-modules] (CPAN: &amp;quot;install Time::ParseDate&amp;quot;)&lt;br /&gt;
* [http://search.cpan.org/dist/TermReadKey Term::ReadKey]&lt;br /&gt;
* [http://search.cpan.org/dist/Text-Autoformat Text::Autoformat]&lt;br /&gt;
* [http://search.cpan.org/dist/Text-Quoted Text::Quoted]&lt;br /&gt;
* [http://search.cpan.org/dist/Regexp-Common Regexp::Common]&lt;br /&gt;
* [http://search.cpan.org/dist/HTML-Scrubber HTML::Scrubber]&lt;br /&gt;
* [http://search.cpan.org/dist/Tree-Simple Tree::Simple]&lt;br /&gt;
* [http://search.cpan.org/dist/Crypt-SSLeay Crypt::SSLeay]&lt;br /&gt;
* [http://search.cpan.org/dist/GDGraph GD::Graph]&lt;br /&gt;
* [http://search.cpan.org/dist/UNIVERSAL-Require UNIVERSAL::require]&lt;br /&gt;
* [http://search.cpan.org/dist/XML-RSS XML::RSS]&lt;br /&gt;
* [http://search.cpan.org/dist/Calendar-Simple Calendar::Simple]&lt;br /&gt;
* [http://search.cpan.org/dist/GD-Graph GD::Graph]&lt;br /&gt;
* [http://search.cpan.org/dist/GD-Text GD::Text]&lt;br /&gt;
* [http://search.cpan.org/dist/CSS-Squish CSS::Squish]&lt;br /&gt;
* [http://search.cpan.org/dist/HTML-Element-Extended HTML::ElementTable]&lt;br /&gt;
&lt;br /&gt;
Missing prerequisites?  Please add them.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
* Create a new Unix group called 'rt'&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
addgroup rt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Edit the top-level Makefile (within the freeside source directory - NOT rt directory), set RT_ENABLED to 1 and set the RT_DOMAIN, RT_TIMEZONE, and FREESIDE_URL variables.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd freeside-X.X/&lt;br /&gt;
nano Makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;$ make configure-rt&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If your database is not on the local machine you will need to edit /opt/rt3/etc/RT_SiteConfig.pm and set the DatabaseHost value&lt;br /&gt;
* &amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;# make create-rt&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
** ''Authentication errors?''&lt;br /&gt;
*** ''Edit &amp;lt;code&amp;gt;pg_hba.conf&amp;lt;/code&amp;gt;, change &amp;quot;&amp;lt;code&amp;gt;ident sameuser&amp;lt;/code&amp;gt;&amp;quot; auth to &amp;quot;&amp;lt;code&amp;gt;trust&amp;lt;/code&amp;gt;&amp;quot; for the line starting with &amp;quot;&amp;lt;code&amp;gt;local all all&amp;lt;/code&amp;gt;&amp;quot; (Debian 7.x has a METHOD column that is set to &amp;lt;code&amp;gt;peer&amp;lt;/code&amp;gt;, this needs to be set to &amp;lt;code&amp;gt;trust&amp;lt;/code&amp;gt;)''&lt;br /&gt;
*** ''Restart Pg''&lt;br /&gt;
*** ''Revert the change back and restart Pg after this installation step''&lt;br /&gt;
* &amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;make install-rt&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Configure Apache: make sure APACHE_CONF and FREESIDE_DOCUMENT_ROOT are set correctly in the Makefile, then run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make install-apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Restart Apache (httpd) and log into the Freeside web interface using the username and password you created during the first part of the installation.&lt;br /&gt;
&lt;br /&gt;
* Set the '''ticket_system''' configuration value to &amp;lt;code&amp;gt;RT_Internal&amp;lt;/code&amp;gt;.  (You may also wish to set '''ticket_system-default_queueid''' once you have RT configured.)&lt;br /&gt;
&lt;br /&gt;
=== Bootstrap RT's permissions ===&lt;br /&gt;
*Click on &amp;quot;Ticketing Main&amp;quot; on the Freeside main menu to auto-create an RT login for your username&lt;br /&gt;
*From &amp;quot;Billing Main&amp;quot;, go to Configuration &amp;gt; Employees &amp;gt; Employees, click on &amp;quot;Add an employee&amp;quot; and add a temporary SuperUser &amp;quot;root&amp;quot; user.  Note: the user name must be &amp;quot;root&amp;quot; (without the quotes).&lt;br /&gt;
* Log into your Freeside installation as the &amp;quot;root&amp;quot; user you just created, by closing all of your browser windows, using a different browser, or by using &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://root@yourmachone/freeside/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; syntax if your browser supports it.&lt;br /&gt;
* Click on &amp;quot;Ticketing Main&amp;quot; on the Freeside main menu.  Go to Configuration &amp;gt; Ticketing &amp;gt; Ticketing Global, and then &amp;quot;User Rights&amp;quot;.  Enter your normal RT/Freeside login in the box labeled ADD USER, click on the &amp;quot;Rights for Administrators&amp;quot; tab, check the &amp;quot;Do anything and everything&amp;quot; box (SuperUser) and then click &amp;quot;Save Changes&amp;quot;&lt;br /&gt;
* As your regular user, go back to the freeside employee list, click on the &amp;quot;root&amp;quot; user and set it to disabled&lt;br /&gt;
&lt;br /&gt;
== Futher Reading ==&lt;br /&gt;
* Follow the [http://wiki.bestpractical.com/ regular RT documentation] to configure RT, setup the mailgate, etc.&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	<entry>
		<id>https://secure.freeside.biz/mediawiki/index.php?title=Freeside:3:Documentation:RT_Installation&amp;diff=8206</id>
		<title>Freeside:3:Documentation:RT Installation</title>
		<link rel="alternate" type="text/html" href="https://secure.freeside.biz/mediawiki/index.php?title=Freeside:3:Documentation:RT_Installation&amp;diff=8206"/>
				<updated>2015-01-21T18:20:37Z</updated>
		
		<summary type="html">&lt;p&gt;Jonathan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
These instructions document installation of the integrated internal RT ticketing system.  &lt;br /&gt;
&lt;br /&gt;
There is also support for running this integration against an external RT installation, but it is not (yet) documented.&lt;br /&gt;
&lt;br /&gt;
Documentation contributions are welcome.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* [http://search.cpan.org/dist/Apache-Session Apache::Session]&lt;br /&gt;
* [http://search.cpan.org/dist/HTML-Tree HTML::TreeBuilder]&lt;br /&gt;
* [http://search.cpan.org/dist/HTML-Format HTML-Format] (CPAN: &amp;quot;install HTML::FormatText&amp;quot;)&lt;br /&gt;
* [http://search.cpan.org/dist/Test-Inline Test::Inline]&lt;br /&gt;
* [http://search.cpan.org/dist/Class-ReturnValue Class::ReturnValue]&lt;br /&gt;
* [http://search.cpan.org/dist/DBIx-SearchBuilder DBIx::SearchBuilder]&lt;br /&gt;
* [http://search.cpan.org/dist/Log-Dispatch Log::Dispatch]&lt;br /&gt;
* [http://search.cpan.org/dist/Locale-Maketext-Lexicon Locale::Maketext::Lexicon]&lt;br /&gt;
* [http://search.cpan.org/dist/Locale-Maketext-Fuzzy Locale::Maketext::Fuzzy]&lt;br /&gt;
* [http://search.cpan.org/dist/Text-Wrapper Text::Wrapper]&lt;br /&gt;
* [http://search.cpan.org/dist/Time-modules Time-modules] (CPAN: &amp;quot;install Time::ParseDate&amp;quot;)&lt;br /&gt;
* [http://search.cpan.org/dist/TermReadKey Term::ReadKey]&lt;br /&gt;
* [http://search.cpan.org/dist/Text-Autoformat Text::Autoformat]&lt;br /&gt;
* [http://search.cpan.org/dist/Text-Quoted Text::Quoted]&lt;br /&gt;
* [http://search.cpan.org/dist/Regexp-Common Regexp::Common]&lt;br /&gt;
* [http://search.cpan.org/dist/HTML-Scrubber HTML::Scrubber]&lt;br /&gt;
* [http://search.cpan.org/dist/Tree-Simple Tree::Simple]&lt;br /&gt;
* [http://search.cpan.org/dist/Crypt-SSLeay Crypt::SSLeay]&lt;br /&gt;
* [http://search.cpan.org/dist/GDGraph GD::Graph]&lt;br /&gt;
* [http://search.cpan.org/dist/UNIVERSAL-Require UNIVERSAL::require]&lt;br /&gt;
* [http://search.cpan.org/dist/XML-RSS XML::RSS]&lt;br /&gt;
* [http://search.cpan.org/dist/Calendar-Simple Calendar::Simple]&lt;br /&gt;
* [http://search.cpan.org/dist/GD-Graph GD::Graph]&lt;br /&gt;
* [http://search.cpan.org/dist/GD-Text GD::Text]&lt;br /&gt;
* [http://search.cpan.org/dist/CSS-Squish CSS::Squish]&lt;br /&gt;
* [http://search.cpan.org/dist/HTML-Element-Extended HTML::ElementTable]&lt;br /&gt;
&lt;br /&gt;
Missing prerequisites?  Please add them.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
* Create a new Unix group called 'rt'&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
addgroup rt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Edit the top-level Makefile (within the freeside source directory - NOT rt directory), set RT_ENABLED to 1 and set the RT_DOMAIN, RT_TIMEZONE, and FREESIDE_URL variables.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd freeside-X.X/&lt;br /&gt;
nano Makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;$ make configure-rt&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If your database is not on the local machine you will need to edit /opt/rt3/etc/RT_SiteConfig.pm and set the DatabaseHost value&lt;br /&gt;
* &amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;# make create-rt&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
** ''Authentication errors?''&lt;br /&gt;
*** ''Edit &amp;lt;code&amp;gt;pg_hba.conf&amp;lt;/code&amp;gt;, change &amp;quot;&amp;lt;code&amp;gt;ident sameuser&amp;lt;/code&amp;gt;&amp;quot; auth to &amp;quot;&amp;lt;code&amp;gt;trust&amp;lt;/code&amp;gt;&amp;quot; for the line starting with &amp;quot;&amp;lt;code&amp;gt;local all all&amp;lt;/code&amp;gt;&amp;quot; (Debian 7.x has a METHOD column that is set to &amp;lt;code&amp;gt;peer&amp;lt;/code&amp;gt;, this needs to be set to &amp;lt;code&amp;gt;trust&amp;lt;/code&amp;gt;)''&lt;br /&gt;
*** ''Restart Pg''&lt;br /&gt;
*** ''Revert the change back and restart Pg after this installation step''&lt;br /&gt;
* &amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;make install-rt&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Configure Apache: make sure APACHE_CONF and FREESIDE_DOCUMENT_ROOT are set correctly in the Makefile, then run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make install-apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Restart Apache (httpd) and log into the Freeside web interface using the username and password you created during the first part of the installation.&lt;br /&gt;
&lt;br /&gt;
* Set the '''ticket_system''' configuration value to &amp;lt;code&amp;gt;RT_Internal&amp;lt;/code&amp;gt;.  (You may also wish to set '''ticket_system-default_queueid''' once you have RT configured.)&lt;br /&gt;
&lt;br /&gt;
=== Bootstrap RT's permissions ===&lt;br /&gt;
*Click on &amp;quot;Ticketing Main&amp;quot; on the Freeside main menu to auto-create an RT login for your username&lt;br /&gt;
*From &amp;quot;Billing Main&amp;quot;, go to Configuration &amp;gt; Employees &amp;gt; Employees and add a temporary &amp;quot;root&amp;quot; user.  Note: the user name must be &amp;quot;root&amp;quot; (without the quotes).&lt;br /&gt;
* Log into your Freeside installation as the &amp;quot;root&amp;quot; user you just created, by closing all of your browser windows, or by using &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://root@yourmachone/freeside/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; syntax if your browser supports it.&lt;br /&gt;
* Click on &amp;quot;Ticketing Main&amp;quot; on the Freeside main menu.  Go to Configuration &amp;gt; Ticketing &amp;gt; Ticketing Global, and then &amp;quot;User Rights&amp;quot;.  Grant the &amp;quot;SuperUser&amp;quot; right to your normal RT/Freeside login.&lt;br /&gt;
* Go back to the freeside employee list and disable the temporary &amp;quot;root&amp;quot; user.&lt;br /&gt;
&lt;br /&gt;
== Futher Reading ==&lt;br /&gt;
* Follow the [http://wiki.bestpractical.com/ regular RT documentation] to configure RT, setup the mailgate, etc.&lt;/div&gt;</summary>
		<author><name>Jonathan</name></author>	</entry>

	</feed>