cust_location editing features, RT#10766
authormark <mark>
Tue, 14 Dec 2010 07:29:13 +0000 (07:29 +0000)
committermark <mark>
Tue, 14 Dec 2010 07:29:13 +0000 (07:29 +0000)
12 files changed:
FS/FS/Conf.pm
FS/FS/Schema.pm
FS/FS/cust_location.pm
httemplate/edit/cust_location.cgi [new file with mode: 0755]
httemplate/edit/process/cust_location.cgi [new file with mode: 0644]
httemplate/elements/tr-select-cust_location.html
httemplate/misc/disable-cust_location.cgi [new file with mode: 0755]
httemplate/view/cust_main/locations.html [new file with mode: 0755]
httemplate/view/cust_main/packages.html
httemplate/view/cust_main/packages/location.html
httemplate/view/cust_main/packages/package.html
httemplate/view/cust_main/packages/section.html [new file with mode: 0755]

index a05ad03..072982a 100644 (file)
@@ -2689,6 +2689,13 @@ and customer address. Include units.',
   },
 
   {
   },
 
   {
+    'key'         => 'cust_pkg-group_by_location',
+    'section'     => 'UI',
+    'description' => "Group packages by location.",
+    'type'        => 'checkbox',
+  },
+
+  {
     'key'         => 'cust_pkg-show_fcc_voice_grade_equivalent',
     'section'     => 'UI',
     'description' => "Show a field on package definitions for assigning a DSO equivalency number suitable for use on FCC form 477.",
     'key'         => 'cust_pkg-show_fcc_voice_grade_equivalent',
     'section'     => 'UI',
     'description' => "Show a field on package definitions for assigning a DSO equivalency number suitable for use on FCC form 477.",
index b48e5af..253eb66 100644 (file)
@@ -909,6 +909,7 @@ sub tables_hashref {
         'location_type',     'varchar', 'NULL',      20, '', '',
         'location_number',     'varchar', 'NULL',      20, '', '',
         'location_kind',     'char', 'NULL',      1, '', '',
         'location_type',     'varchar', 'NULL',      20, '', '',
         'location_number',     'varchar', 'NULL',      20, '', '',
         'location_kind',     'char', 'NULL',      1, '', '',
+        'disabled',      'char', 'NULL',   1, '', '', 
       ],
       'primary_key' => 'locationnum',
       'unique'      => [],
       ],
       'primary_key' => 'locationnum',
       'unique'      => [],
index ab80941..60c0181 100644 (file)
@@ -3,6 +3,7 @@ package FS::cust_location;
 use strict;
 use base qw( FS::geocode_Mixin FS::Record );
 use Locale::Country;
 use strict;
 use base qw( FS::geocode_Mixin FS::Record );
 use Locale::Country;
+use FS::UID qw( dbh );
 use FS::Record qw( qsearch ); #qsearchs );
 use FS::prospect_main;
 use FS::cust_main;
 use FS::Record qw( qsearch ); #qsearchs );
 use FS::prospect_main;
 use FS::cust_main;
@@ -74,6 +75,10 @@ Country (see L<FS::cust_main_county>)
 
 Geocode
 
 
 Geocode
 
+=item disabled
+
+Disabled flag; set to 'Y' to disable the location.
+
 =back
 
 =head1 METHODS
 =back
 
 =head1 METHODS
@@ -192,6 +197,70 @@ city, county, state, zip, country, geocode.
 
 =cut
 
 
 =cut
 
+=item move_to HASHREF
+
+Takes a hashref with one or more cust_location fields.  Creates a duplicate 
+of the existing location with all fields set to the values in the hashref.  
+Moves all packages that use the existing location to the new one, then sets 
+the "disabled" flag on the old location.  Returns nothing on success, an 
+error message on error.
+
+=cut
+
+sub move_to {
+  my $old = shift;
+  my $hashref = shift;
+
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+  my $error = '';
+
+  my $new = FS::cust_location->new({
+      $old->location_hash,
+      'custnum'     => $old->custnum,
+      'prospectnum' => $old->prospectnum,
+      %$hashref
+    });
+  $error = $new->insert;
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return "Error creating location: $error";
+  }
+
+  my @pkgs = qsearch('cust_pkg', { 
+      'locationnum' => $old->locationnum,
+      'cancel' => '' 
+    });
+  foreach my $cust_pkg (@pkgs) {
+    $error = $cust_pkg->change(
+      'locationnum' => $new->locationnum,
+      'keep_dates'  => 1
+    );
+    if ( $error and not ref($error) ) {
+      $dbh->rollback if $oldAutoCommit;
+      return "Error moving pkgnum ".$cust_pkg->pkgnum.": $error";
+    }
+  }
+
+  $old->disabled('Y');
+  $error = $old->replace;
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return "Error disabling old location: $error";
+  }
+
+  $dbh->commit if $oldAutoCommit;
+  return;
+}
+
 =back
 
 =head1 BUGS
 =back
 
 =head1 BUGS
diff --git a/httemplate/edit/cust_location.cgi b/httemplate/edit/cust_location.cgi
new file mode 100755 (executable)
index 0000000..80b27c2
--- /dev/null
@@ -0,0 +1,54 @@
+<% include('/elements/header-popup.html', "Edit Location") %>
+
+<% include('/elements/error.html') %>
+
+<FORM NAME="EditLocationForm" 
+ACTION="<% $p %>edit/process/cust_location.cgi" METHOD=POST>
+<INPUT TYPE="hidden" NAME="locationnum" VALUE="<% $locationnum %>">
+
+<% ntable('#cccccc') %>
+<% include('/elements/location.html',
+            'object'        => $cust_location,
+            'no_asterisks'  => 1,
+            ) %>
+</TABLE>
+
+<BR>
+<SCRIPT TYPE="text/javascript">
+function areyousure() {
+  return confirm('Modify this service location?');
+}
+</SCRIPT>
+<INPUT TYPE="submit" VALUE="Submit" onclick="return areyousure()">
+
+</FORM>
+</BODY>
+</HTML>
+
+<%init>
+
+my $conf = new FS::Conf;
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+# it's the same access right you'd need to do this by editing packages
+die "access denied"
+  unless $curuser->access_right('Change customer package');
+
+my $locationnum = scalar($cgi->param('locationnum'));
+my $cust_location = qsearchs({
+    'select'    => 'cust_location.*',
+    'table'     => 'cust_location',
+    'addl_from' => 'LEFT JOIN cust_main USING ( custnum )',
+    'hashref'   => { 'locationnum' => $locationnum },
+    'extra_sql' => ' AND '. $curuser->agentnums_sql,
+  }) or die "unknown locationnum $locationnum";
+
+die "can't edit disabled locationnum $locationnum" if $cust_location->disabled;
+
+my $cust_main = qsearchs('cust_main', { 'custnum' => $cust_location->custnum })
+  or die "can't get cust_main record for custnum ". $cust_location->custnum;
+
+my @cust_pkgs = qsearch('cust_pkg', { 'locationnum' => $locationnum });
+
+</%init>
diff --git a/httemplate/edit/process/cust_location.cgi b/httemplate/edit/process/cust_location.cgi
new file mode 100644 (file)
index 0000000..790fc8e
--- /dev/null
@@ -0,0 +1,38 @@
+% if ($error) {
+%   $cgi->param('error', Dumper($error));
+%   $cgi->redirect(popurl(3). 'edit/cust_location.cgi?'. $cgi->query_string );
+% } else {
+
+    <% header("Location changed") %>
+      <SCRIPT TYPE="text/javascript">
+        window.top.location.reload();
+      </SCRIPT>
+    </BODY>
+    </HTML>
+
+% }
+<%init>
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+die "access denied"
+  unless $curuser->access_right('Change customer package');
+
+my $locationnum = $cgi->param('locationnum');
+my $cust_location = qsearchs({
+  'select'    => 'cust_location.*',
+  'table'     => 'cust_location',
+  'addl_from' => 'LEFT JOIN cust_main USING ( custnum )',
+  'hashref'   => { 'locationnum' => $locationnum },
+  'extra_sql' => ' AND '. $curuser->agentnums_sql,
+});
+die "unknown locationnum $locationnum" unless $cust_location;
+
+my $new = {
+  map { $_ => scalar($cgi->param($_)) }
+    qw( address1 address2 city county state zip country )
+};
+
+my $error = $cust_location->move_to($new);
+
+</%init>
index 78252ba..fa19405 100644 (file)
@@ -162,6 +162,7 @@ Example:
 %     push @locations, $cust_location
 %       if !$cust_main && $cust_location && $cust_location->locationnum>0;
 %     foreach my $loc ( sort $location_sort @locations ) {
 %     push @locations, $cust_location
 %       if !$cust_main && $cust_location && $cust_location->locationnum>0;
 %     foreach my $loc ( sort $location_sort @locations ) {
+%       next if $loc->disabled;
         <OPTION VALUE="<% $loc->locationnum %>"
                 <% $locationnum == $loc->locationnum ? 'SELECTED' : '' %>
         ><% $loc->line |h %>
         <OPTION VALUE="<% $loc->locationnum %>"
                 <% $locationnum == $loc->locationnum ? 'SELECTED' : '' %>
         ><% $loc->line |h %>
diff --git a/httemplate/misc/disable-cust_location.cgi b/httemplate/misc/disable-cust_location.cgi
new file mode 100755 (executable)
index 0000000..ee7ba1d
--- /dev/null
@@ -0,0 +1,35 @@
+<% header("Location disabled") %>
+  <SCRIPT TYPE="text/javascript">
+    window.top.location.reload();
+  </SCRIPT>
+</BODY>
+</HTML>
+<%init>
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+my $error;
+
+die "access denied"
+  unless $curuser->access_right('Change customer package');
+
+my $locationnum = $cgi->param('locationnum');
+my $cust_location = qsearchs({
+  'select'    => 'cust_location.*',
+  'table'     => 'cust_location',
+  'addl_from' => 'LEFT JOIN cust_main USING ( custnum )',
+  'hashref'   => { 'locationnum' => $locationnum },
+  'extra_sql' => ' AND '. $curuser->agentnums_sql,
+});
+die "unknown locationnum $locationnum" unless $cust_location;
+
+my @pkgs = qsearch('cust_pkg', { 'locationnum' => $locationnum,
+                                 'cancel'      => '' });
+if ( @pkgs ) {
+  $error = "Location $locationnum has active packages"
+}
+else {
+  $cust_location->disabled('Y');
+  $error = $cust_location->replace;
+}
+die $error if $error;
+</%init>
diff --git a/httemplate/view/cust_main/locations.html b/httemplate/view/cust_main/locations.html
new file mode 100755 (executable)
index 0000000..319a927
--- /dev/null
@@ -0,0 +1,87 @@
+<STYLE>
+span.loclabel {
+  padding-left: 4px; 
+  padding-right: 4px; 
+  background-color: #cccccc;
+  border: 1px solid black
+}
+</STYLE>
+% foreach my $locationnum (@sorted) {
+%   my $packages = $packages_in{$locationnum};
+%   my $loc = $locations{$locationnum};
+%   next if $loc->disabled and scalar(@$packages) == 0;
+<% include('/elements/table-grid.html') %>
+<TR><TH COLSPAN=3 ALIGN="left" VALIGN="bottom" 
+STYLE="padding-bottom: 0px; 
+  padding-left: 0px; 
+  border-bottom-style: solid;
+  border-bottom-color: black;
+  border-bottom-width: 1px;">
+<SPAN CLASS="loclabel">
+%   if (! $locationnum) {
+Default service location: 
+%   }
+%   elsif ( $loc->disabled ) {
+<FONT COLOR="#808080"><I>
+%   }
+<% $loc->location_label %></SPAN>
+<SPAN STYLE="float:right;">
+% if ( $locationnum and !$loc->disabled ) {
+<% edit_location_link($locationnum) %>
+% }
+% if ( !$loc->disabled and !$active{$locationnum} ) {
+&nbsp;<% disable_location_link($locationnum) %>
+% }
+</SPAN></TH></TR>
+%   if (@$packages) {
+<% include('packages/section.html', 'packages' => $packages ) %>
+%   }
+</TABLE><BR>
+% } #foreach $locationnum
+<%init>
+my %opt = @_;
+my $cust_main = $opt{'cust_main'};
+my $all_packages = $opt{'packages'};
+
+my %locations = map { $_->locationnum => $_ } qsearch({
+    'table'     => 'cust_location',
+    'hashref'   => { 'custnum' => $cust_main->custnum },
+    'order_by'  => 'ORDER BY country, state, city, address1, locationnum',
+  });
+my @sections = keys %locations;
+$locations{''} = $cust_main;
+my %packages_in = map { $_ => [] } @sections;
+
+my %active = (); # groups with non-canceled packages
+foreach my $cust_pkg ( @$all_packages ) {
+  my $key = $cust_pkg->locationnum;
+  push @{ $packages_in{$key} }, $cust_pkg;
+  $active{$key} = 1 if !$cust_pkg->getfield('cancel');
+}
+
+my @sorted = (
+  '',
+  grep ( { $active{$_} } @sections),
+  grep ( { !$active{$_} } @sections),
+);
+
+sub edit_location_link {
+  my $locationnum = shift;
+  include( '/elements/popup_link.html',
+    'action'      => $p. "edit/cust_location.cgi?locationnum=$locationnum",
+    'label'       => '(Edit location)',
+    'actionlabel' => 'Edit',
+  );
+}
+
+sub disable_location_link {
+  my $locationnum = shift;
+  include( '/elements/popup_link.html',
+    'action'      => $p. "misc/disable-cust_location.cgi?locationnum=$locationnum",
+    'label'       => '(Disable location)',
+    'actionlabel' => 'Disable',
+  );
+}
+
+
+</%init>
index ce34158..383c2a7 100755 (executable)
@@ -75,61 +75,23 @@ Current packages
 
   <TR>
     <TD COLSPAN=2>
 
   <TR>
     <TD COLSPAN=2>
-
-% if ( @$packages ) { 
-
-<% include('/elements/table-grid.html') %>
-% my $bgcolor1 = '#eeeeee';
-%   my $bgcolor2 = '#ffffff';
-%   my $bgcolor = '';
-
-<TR>
-  <TH CLASS="grid" BGCOLOR="#cccccc">Package</TH>
-  <TH CLASS="grid" BGCOLOR="#cccccc">Status</TH>
-% if ( $show_location ) {
-  <TH CLASS="grid" BGCOLOR="#cccccc">Location</TH>
-% }
-  <TH CLASS="grid" BGCOLOR="#cccccc">Services</TH>
-</TR>
-
-% #$FS::cust_pkg::DEBUG = 2;
-% foreach my $cust_pkg (@$packages) {
-%
-%   if ( $bgcolor eq $bgcolor1 ) {
-%     $bgcolor = $bgcolor2;
-%   } else {
-%     $bgcolor = $bgcolor1;
-%   }
-%
-%   my %iopt = (
-%     'bgcolor'  => $bgcolor,
-%     'cust_pkg' => $cust_pkg,
-%     'part_pkg' => $cust_pkg->part_pkg,
-%     %conf_opt,
-%   );
-%
-
-    <!--pkgnum: <% $cust_pkg->pkgnum %>-->
-    <TR>
-      <% include('packages/package.html',  %iopt) %>
-      <% include('packages/status.html',   %iopt) %>
-% if ( $show_location ) {
-      <% include('packages/location.html', %iopt) %>
+% if ( $conf->exists('cust_pkg-group_by_location') and $show_location ) {
+<% include('locations.html',
+    'cust_main'     => $cust_main,
+    'packages'      => $packages,
+) %>
 % }
 % }
-      <% include('packages/services.html', %iopt) %>
-    </TR>
-
-% }
-
+% else {
+% # in this format, put all packages in one section
+<% include('/elements/table-grid.html') %>
+<% include('packages/section.html',
+    'packages'      => $packages,
+    'show_location' => $show_location,
+) %>
 </TABLE>
 </TABLE>
-
-% } else {
-<BR>
-% } 
-
+% }
     </TD>
   </TR>
     </TD>
   </TR>
-</TABLE>
 
 % if ( $cgi->param('fragment') =~ /^cust_pkg(\d+)$/ ) {
   <SCRIPT>
 
 % if ( $cgi->param('fragment') =~ /^cust_pkg(\d+)$/ ) {
   <SCRIPT>
@@ -140,42 +102,22 @@ Current packages
     if ( el ) el.scrollIntoView(true);
   </SCRIPT>
 % }
     if ( el ) el.scrollIntoView(true);
   </SCRIPT>
 % }
-
+</TABLE>
 <%init>
 
 <%init>
 
-my( $cust_main ) = @_;
+my $cust_main = shift;
+my %opt = @_;
 my $conf = new FS::Conf;
 
 my $curuser = $FS::CurrentUser::CurrentUser;
 
 my( $packages, $num_old_packages ) = get_packages($cust_main, $conf);
 
 my $conf = new FS::Conf;
 
 my $curuser = $FS::CurrentUser::CurrentUser;
 
 my( $packages, $num_old_packages ) = get_packages($cust_main, $conf);
 
-my $show_location = $conf->exists('cust_pkg-always_show_location')
-                        || ( grep $_->locationnum, @$packages ); # ? '1' : '0';
 
 
-my $countrydefault = scalar($conf->config('countrydefault')) || 'US';
-my %conf_opt = (
-  #for services.html and status.html
-  'cust_pkg-display_times'    => ($conf->exists('cust_pkg-display_times')
-                                 || $curuser->option('cust_pkg-display_times')), 
-  #for status.html
-  'cust_pkg-show_autosuspend' => $conf->exists('cust_pkg-show_autosuspend'),
-  #for status.html pkg-balances
-  'pkg-balances'              => $conf->exists('pkg-balances'),
-  'money_char'                => ( $conf->config('money_char') || '$' ),
-
-  #for location.html
-  'countrydefault'            => $countrydefault,
-  'statedefault'              => ( scalar($conf->config('statedefault'))
-                                  || ($countrydefault eq 'US' ? 'CA' : '') ),
-  #for services.html
-  'svc_external-skip_manual'  => $conf->exists('svc_external-skip_manual'),
-  'legacy_link'               => $conf->exists('legacy_link'),
-  'svc_broadband-manage_link' => scalar($conf->config('svc_broadband-manage_link')),
-  'maestro-status_test'       => $conf->exists('maestro-status_test'),
-  'cust_pkg-large_pkg_size'   => $conf->config('cust_pkg-large_pkg_size'),
-);
+my $show_location = $conf->exists('cust_pkg-always_show_location') 
+                        || (grep $_->locationnum, @$packages); # ? '1' : '0';
 
 
+my $countrydefault = scalar($conf->config('countrydefault')) || 'US';
 #subroutines
 
 sub get_packages {
 #subroutines
 
 sub get_packages {
index 41155cb..40a7de5 100644 (file)
 % {
   <FONT SIZE=-1>
     (&nbsp;<%pkg_change_location_link($cust_pkg)%>&nbsp;)
 % {
   <FONT SIZE=-1>
     (&nbsp;<%pkg_change_location_link($cust_pkg)%>&nbsp;)
+%   if ( $cust_pkg->locationnum ) {
+&nbsp;(&nbsp;<%edit_location_link($cust_pkg->locationnum)%>&nbsp;)
+%   }
   </FONT>
 % } 
 
 </TD>
 <%init>
 
   </FONT>
 % } 
 
 </TD>
 <%init>
 
+my $conf = new FS::Conf;
 my %opt = @_;
 
 my $bgcolor        = $opt{'bgcolor'};
 my %opt = @_;
 
 my $bgcolor        = $opt{'bgcolor'};
@@ -50,4 +54,13 @@ sub pkg_change_location_link {
   );
 }
 
   );
 }
 
+sub edit_location_link {
+  my $locationnum = shift;
+  include( '/elements/popup_link.html',
+    'action'      => $p. "edit/cust_location.cgi?locationnum=$locationnum",
+    'label'       => 'Edit&nbsp;location',
+    'actionlabel' => 'Edit',
+  );
+}
+
 </%init>
 </%init>
index 3b58f9e..8cae5fd 100644 (file)
 %       }
 
       </TR>
 %       }
 
       </TR>
+%     if ( $curuser->access_right('Change customer package') and 
+%           !$cust_pkg->get('cancel') and
+%           !$opt{'show_location'}) {
+      <TR>
+        <TD><FONT SIZE="-1">
+          (&nbsp;<% pkg_change_location_link($cust_pkg) %>&nbsp;)
+        </FONT></TD>
+      </TR>
+%     }
 %   }
 %   }
-
   </TABLE>
 
 </TD>
   </TABLE>
 
 </TD>
@@ -184,6 +192,10 @@ my $part_pkg = $opt{'part_pkg'};
 
 my $curuser = $FS::CurrentUser::CurrentUser;
 
 
 my $curuser = $FS::CurrentUser::CurrentUser;
 
+my $countrydefault = $opt{'countrydefault'} || 'US';
+my $statedefault   = $opt{'statedefault'}
+                     || ($countrydefault eq 'US' ? 'CA' : '');
+
 #subroutines
 
 #false laziness w/status.html
 #subroutines
 
 #false laziness w/status.html
@@ -204,6 +216,19 @@ sub pkg_change_link {
   );
 }
 
   );
 }
 
+sub pkg_change_location_link {
+  my $cust_pkg = shift;
+  my $pkgpart = $cust_pkg->pkgpart;
+  include( '/elements/popup_link-cust_pkg.html',
+    'action'      => $p. "misc/change_pkg.cgi?locationnum=-1;pkgpart=$pkgpart;".
+                     "address1=;address2=;city=;county=;state=$statedefault;".
+                     "zip=;country=$countrydefault",
+    'label'       => 'Change&nbsp;location',
+    'actionlabel' => 'Change',
+    'cust_pkg'    => $cust_pkg,
+  );
+}
+
 sub pkg_dates_link { pkg_link('edit/REAL_cust_pkg', 'Edit&nbsp;dates', @_ ); }
 
 sub pkg_discount_link {
 sub pkg_dates_link { pkg_link('edit/REAL_cust_pkg', 'Edit&nbsp;dates', @_ ); }
 
 sub pkg_discount_link {
diff --git a/httemplate/view/cust_main/packages/section.html b/httemplate/view/cust_main/packages/section.html
new file mode 100755 (executable)
index 0000000..0795d4e
--- /dev/null
@@ -0,0 +1,95 @@
+% if ( @$packages ) { 
+%   my $bgcolor1 = '#eeeeee';
+%   my $bgcolor2 = '#ffffff';
+%   my $bgcolor = '';
+
+<TR>
+% #my $width = $show_location ? 'WIDTH="25%"' : 'WIDTH="33%"';
+  <TH CLASS="grid" BGCOLOR="#cccccc">Package</TH>
+  <TH CLASS="grid" BGCOLOR="#cccccc">Status</TH>
+%   if ( $show_location ) {
+  <TH CLASS="grid" BGCOLOR="#cccccc">Location</TH>
+% }
+  <TH CLASS="grid" BGCOLOR="#cccccc">Services</TH>
+</TR>
+
+% #$FS::cust_pkg::DEBUG = 2;
+%   foreach my $cust_pkg (@$packages) {
+%
+%     if ( $bgcolor eq $bgcolor1 ) {
+%       $bgcolor = $bgcolor2;
+%     } else {
+%       $bgcolor = $bgcolor1;
+%     }
+%
+%     my %iopt = (
+%       'bgcolor'  => $bgcolor,
+%       'cust_pkg' => $cust_pkg,
+%       'part_pkg' => $cust_pkg->part_pkg,
+%       %conf_opt,
+%     );
+%
+
+  <!--pkgnum: <% $cust_pkg->pkgnum %>-->
+  <TR>
+    <% include('package.html',  %iopt) %>
+    <% include('status.html',   %iopt) %>
+%     if ( $show_location ) {
+    <% include('location.html', %iopt) %>
+%     }
+    <% include('services.html', %iopt) %>
+  </TR>
+
+%   } #foreach $cust_pkg
+%# </TABLE>
+% } #if @$packages
+% else {
+<BR>
+% }
+
+<%init>
+
+my %opt = @_;
+my $conf = new FS::Conf;
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+my $packages = $opt{'packages'};
+my $show_location = $opt{'show_location'};
+
+# Sort order is hardcoded for now, can change this if needed.
+@$packages = sort { 
+  ( $a->getfield('cancel') <=> $b->getfield('cancel') )  or
+  ( $a->getfield('setup')  <=> $b->getfield('setup')  )  or
+  ( $a->getfield('pkgnum') <=> $b->getfield('pkgnum') )
+} @$packages;
+
+my $countrydefault = scalar($conf->config('countrydefault')) || 'US';  
+
+my %conf_opt = (
+  #for services.html and status.html
+  'cust_pkg-display_times'    => $conf->exists('cust_pkg-display_times')
+                                 || $curuser->option('cust_pkg-display_times')),
+  #for status.html
+  'cust_pkg-show_autosuspend' => $conf->exists('cust_pkg-show_autosuspend'),
+  #for status.html pkg-balances
+  'pkg-balances'              => $conf->exists('pkg-balances'),
+  'money_char'                => ( $conf->config('money_char') || '$' ),
+
+  #for location.html
+  'countrydefault'            => $countrydefault,
+  'statedefault'              => ( scalar($conf->config('statedefault'))
+                                  || ($countrydefault eq 'US' ? 'CA' : '') ),
+  #for services.html
+  'svc_external-skip_manual'  => $conf->exists('svc_external-skip_manual'),
+  'legacy_link'               => $conf->exists('legacy_link'),
+  'svc_broadband-manage_link' => scalar($conf->config('svc_broadband-manage_link')),
+  'maestro-status_test'       => $conf->exists('maestro-status_test'),
+  'cust_pkg-large_pkg_size'   => $conf->config('cust_pkg-large_pkg_size'),
+
+  # for packages.html Change location link
+  'show_location'             => $show_location,
+);
+
+
+</%init>