[freeside-commits] branch master updated. 51d26d73eb99d9f7f45591fa6a4b99c3a3429565

Ivan ivan at 420.am
Thu May 2 01:12:40 PDT 2013


The branch, master has been updated
       via  51d26d73eb99d9f7f45591fa6a4b99c3a3429565 (commit)
      from  78710489c60a996222b4d37552f78f1ff0ec138f (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 51d26d73eb99d9f7f45591fa6a4b99c3a3429565
Author: Ivan Kohler <ivan at freeside.biz>
Date:   Thu May 2 01:10:45 2013 -0700

    detach a package into a new customer, RT#22185

diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index 4f395f2..bbc4f1d 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -1743,6 +1743,7 @@ sub tables_hashref {
         'change_pkgnum',       'int', 'NULL', '', '', '',
         'change_pkgpart',      'int', 'NULL', '', '', '',
         'change_locationnum',  'int', 'NULL', '', '', '',
+        'change_custnum',      'int', 'NULL', '', '', '',
         'main_pkgnum',         'int', 'NULL', '', '', '',
         'pkglinknum',          'int', 'NULL', '', '', '',
         'manual_flag',        'char', 'NULL',  1, '', '', 
diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm
index be3acb9..d8b6e69 100644
--- a/FS/FS/cust_pkg.pm
+++ b/FS/FS/cust_pkg.pm
@@ -862,6 +862,7 @@ sub cancel {
 
   my %hash = $self->hash;
   $date ? ($hash{'expire'} = $date) : ($hash{'cancel'} = $cancel_time);
+  $hash{'change_custnum'} = $options{'change_custnum'};
   my $new = new FS::cust_pkg ( \%hash );
   $error = $new->replace( $self, options => { $self->options } );
   if ( $error ) {
@@ -1703,6 +1704,11 @@ New locationnum, to change the location for this package.
 New FS::cust_location object, to create a new location and assign it
 to this package.
 
+=item cust_main
+
+New FS::cust_main object, to create a new customer and assign the new package
+to it.
+
 =item pkgpart
 
 New pkgpart (see L<FS::part_pkg>).
@@ -1818,12 +1824,25 @@ sub change {
   # 2. (more importantly) changing a package before it's billed
   $hash{'waive_setup'} = $self->waive_setup;
 
+  my $custnum = $self->custnum;
+  if ( $opt->{cust_main} ) {
+    my $cust_main = $opt->{cust_main};
+    unless ( $cust_main->custnum) { 
+      my $error = $cust_main->insert;
+      if ( $error ) {
+        $dbh->rollback if $oldAutoCommit;
+        return "inserting cust_main (transaction rolled back): $error";
+      }
+    }
+    $custnum = $cust_main->custnum;
+  }
+
   # Create the new package.
   my $cust_pkg = new FS::cust_pkg {
-    custnum      => $self->custnum,
-    pkgpart      => ( $opt->{'pkgpart'}     || $self->pkgpart      ),
-    refnum       => ( $opt->{'refnum'}      || $self->refnum       ),
-    locationnum  => ( $opt->{'locationnum'}                        ),
+    custnum        => $custnum,
+    pkgpart        => ( $opt->{'pkgpart'}     || $self->pkgpart      ),
+    refnum         => ( $opt->{'refnum'}      || $self->refnum       ),
+    locationnum    => ( $opt->{'locationnum'}                        ),
     %hash,
   };
   $error = $cust_pkg->insert( 'change' => 1,
@@ -1919,7 +1938,7 @@ sub change {
     my $new = FS::cust_pkg->new({
         pkgpart       => $link->dst_pkgpart,
         pkglinknum    => $link->pkglinknum,
-        custnum       => $self->custnum,
+        custnum       => $custnum,
         main_pkgnum   => $cust_pkg->pkgnum,
         locationnum   => $cust_pkg->locationnum,
         start_date    => $cust_pkg->start_date,
@@ -1960,9 +1979,10 @@ sub change {
   #because the new package will be billed for the same date range.
   #Supplemental packages are also canceled here.
   $error = $self->cancel(
-    quiet         => 1, 
-    unused_credit => $unused_credit,
-    nobill        => $keep_dates
+    quiet          => 1, 
+    unused_credit  => $unused_credit,
+    nobill         => $keep_dates,
+    change_custnum => ( $self->custnum != $custnum ? $custnum : '' ),
   );
   if ($error) {
     $dbh->rollback if $oldAutoCommit;
@@ -2134,6 +2154,18 @@ sub old_cust_pkg {
   qsearchs('cust_pkg', { 'pkgnum' => $self->change_pkgnum } );
 }
 
+=item change_cust_main
+
+Returns the customter this package was detached to, if any.
+
+=cut
+
+sub change_cust_main {
+  my $self = shift;
+  return '' unless $self->change_custnum;
+  qsearchs('cust_main', { 'custnum' => $self->change_custnum } );
+}
+
 =item calc_setup
 
 Calls the I<calc_setup> of the FS::part_pkg object associated with this billing
diff --git a/httemplate/edit/process/detach-cust_pkg.html b/httemplate/edit/process/detach-cust_pkg.html
new file mode 100644
index 0000000..ab87eb5
--- /dev/null
+++ b/httemplate/edit/process/detach-cust_pkg.html
@@ -0,0 +1,47 @@
+% if ($error) {
+%   $cgi->param('error', $error);
+%   $cgi->redirect(popurl(3). 'misc/detach_pkg.html?'. $cgi->query_string );
+% } else {
+
+    <% header(emt("Package detached")) %>
+      <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 $cust_pkg = qsearchs({
+  'table'     => 'cust_pkg',
+  'addl_from' => 'LEFT JOIN cust_main USING ( custnum )',
+  'hashref'   => { 'pkgnum' => scalar($cgi->param('pkgnum')), },
+  'extra_sql' => ' AND '. $curuser->agentnums_sql,
+});
+die 'unknown pkgnum' unless $cust_pkg;
+
+my $cust_location = new FS::cust_location {
+  map { $_ => scalar($cgi->param($_)) } FS::cust_main->location_fields
+};
+
+my $cust_main = new FS::cust_main {
+  ( map { ( $_, scalar($cgi->param($_)) ) } fields('cust_main') ),
+  ( map { ( "ship_$_", '' ) } FS::cust_main->location_fields ),
+  'bill_location' => $cust_location,
+  'ship_location' => $cust_location,
+};
+
+my $pkg_or_error = $cust_pkg->change( {
+  'keep_dates' => 1,
+  'cust_main'  => $cust_main,
+} );
+
+my $error = ref($pkg_or_error) ? '' : $pkg_or_error;
+
+</%init>
diff --git a/httemplate/misc/change_pkg_contact.html b/httemplate/misc/change_pkg_contact.html
index d9da5be..c88140e 100755
--- a/httemplate/misc/change_pkg_contact.html
+++ b/httemplate/misc/change_pkg_contact.html
@@ -9,7 +9,7 @@
 
   <TR>
     <TH ALIGN="right"><% mt('Package') |h %></TH>
-    <TD COLSPAN=7>
+    <TD COLSPAN=7 BGCOLOR="#dddddd">
       <% $curuser->option('show_pkgnum') ? $cust_pkg->pkgnum.': ' : '' %><B><% $part_pkg->pkg |h %></B> - <% $part_pkg->comment |h %>
     </TD>
   </TR>
@@ -17,7 +17,7 @@
 % if ( $cust_pkg->contactnum ) {
     <TR>
       <TH ALIGN="right"><% mt('Current Contact') %></TH>
-      <TD COLSPAN=7>
+      <TD COLSPAN=7 BGCOLOR="#dddddd">
         <% $cust_pkg->contact_obj->line |h %>
       </TD>
     </TR>
diff --git a/httemplate/misc/detach_pkg.html b/httemplate/misc/detach_pkg.html
new file mode 100755
index 0000000..64b3e6e
--- /dev/null
+++ b/httemplate/misc/detach_pkg.html
@@ -0,0 +1,104 @@
+<& /elements/header-popup.html, mt("Detach Package to New Customer") &>
+
+<SCRIPT TYPE="text/javascript" SRC="../elements/order_pkg.js"></SCRIPT>
+
+<& /elements/error.html &>
+
+<FORM NAME="OrderPkgForm" ACTION="<% $p %>edit/process/detach-cust_pkg.html" METHOD=POST>
+<INPUT TYPE="hidden" NAME="pkgnum" VALUE="<% $pkgnum %>">
+% foreach my $f (qw( agentnum refnum )) {
+  <INPUT TYPE="hidden" NAME="<% $f %>" VALUE="<% $cust_main->$f() %>">
+% }
+<INPUT TYPE="hidden" NAME="referral_custnum" VALUE="<% $cust_main->custnum %>">
+% foreach my $f (FS::cust_main->location_fields) {
+  <INPUT TYPE="hidden" NAME="<% $f %>" VALUE="<% $loc->$f() |h %>">
+% }
+
+<% ntable('#cccccc') %>
+
+  <TR>
+    <TH ALIGN="right"><% mt('Package') |h %></TH>
+    <TD COLSPAN=7 BGCOLOR="#dddddd">
+      <% $curuser->option('show_pkgnum') ? $cust_pkg->pkgnum.': ' : '' %><B><% $part_pkg->pkg |h %></B> - <% $part_pkg->comment |h %>
+    </TD>
+  </TR>
+
+% #always should be present for detaching, yes? #if ( $cust_pkg->contactnum ) {
+%   my $cust_contact = $cust_pkg->contact_obj;
+
+    <INPUT TYPE="hidden" NAME="first" VALUE="<% $cust_contact->get('first') |h %>">
+    <INPUT TYPE="hidden" NAME="last"  VALUE="<% $cust_contact->get('last')  |h %>">
+
+    <TR>
+      <TH ALIGN="right"><% mt('Name') %></TH>
+      <TD COLSPAN=7 BGCOLOR="#dddddd">
+        <% $cust_pkg->contact_obj->line |h %>
+      </TD>
+    </TR>
+% #}
+
+  <TR>
+    <TH ALIGN="right" VALIGN="top"><% mt('Address') %></TH>
+    <TD COLSPAN=7 BGCOLOR="#dddddd">
+
+      <% $loc->location_label( 'join_string'     => '<BR>',
+                               'double_space'    => '   ',
+                               'escape_function' => \&encode_entities,
+                               'countrydefault'  => $countrydefault,
+                             )
+      %>
+    </TD>
+  </TR>
+
+</TABLE>
+
+%#XXX payment info
+%#XXX should be sticky on errors...
+<& /edit/cust_main/billing.html, FS::cust_main->new({}),
+                                 invoicing_list => [],
+
+&>
+
+<BR>
+<BR>
+<INPUT NAME    = "submitButton"
+       TYPE    = "submit"
+       VALUE   = "<% mt("Detach package") |h %>"
+>
+
+%#and a cancel button?  or is the popup close sufficient?
+
+</FORM>
+</BODY>
+</HTML>
+
+<%init>
+
+my $conf = new FS::Conf;
+my $countrydefault = $conf->config('countrydefault') || 'US';
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+die "access denied"
+  unless $curuser->access_right('Change customer package');
+
+my $pkgnum = scalar($cgi->param('pkgnum'));
+$pkgnum =~ /^(\d+)$/ or die "illegal pkgnum $pkgnum";
+$pkgnum = $1;
+
+my $cust_pkg =
+  qsearchs({
+    'table'     => 'cust_pkg',
+    'addl_from' => 'LEFT JOIN cust_main USING ( custnum )',
+    'hashref'   => { 'pkgnum' => $pkgnum },
+    'extra_sql' => ' AND '. $curuser->agentnums_sql,
+  }) or die "unknown pkgnum $pkgnum";
+
+my $loc = $cust_pkg->cust_location_or_main;
+
+my $cust_main = $cust_pkg->cust_main
+  or die "can't get cust_main record for custnum ". $cust_pkg->custnum.
+         " ( pkgnum ". cust_pkg->pkgnum. ")";
+
+my $part_pkg = $cust_pkg->part_pkg;
+
+</%init>
diff --git a/httemplate/view/cust_main/packages/contact.html b/httemplate/view/cust_main/packages/contact.html
index 9312991..4e0551b 100644
--- a/httemplate/view/cust_main/packages/contact.html
+++ b/httemplate/view/cust_main/packages/contact.html
@@ -3,6 +3,7 @@
 % if ( $show_link ) {
         <FONT SIZE=-1>
           ( <%pkg_change_contact_link($cust_pkg)%> )
+          ( <%pkg_detach_link($cust_pkg)%> )
         </FONT>
 %    }
 % } elsif ( $show_link ) {
@@ -49,6 +50,19 @@ sub pkg_add_contact_link {
   );
 }
 
+sub pkg_detach_link {
+  my $cust_pkg = shift;
+  #my $pkgpart = $cust_pkg->pkgpart;
+  include( '/elements/popup_link-cust_pkg.html',
+    'action'      => $p. "misc/detach_pkg.html",
+    'label'       => emt('Detach'),
+    'actionlabel' => emt('Detach'),
+    'cust_pkg'    => $cust_pkg,
+    'width'       => 616,
+    'height'      => 676,
+  );
+}
+
 #sub edit_contact_link {
 #  my $contactnum = shift;
 #  include( '/elements/popup_link.html',
diff --git a/httemplate/view/cust_main/packages/status.html b/httemplate/view/cust_main/packages/status.html
index 9d5a88e..24a4dfc 100644
--- a/httemplate/view/cust_main/packages/status.html
+++ b/httemplate/view/cust_main/packages/status.html
@@ -14,6 +14,8 @@
 
     <% pkg_status_row($cust_pkg, emt('Cancelled'), 'cancel', 'color'=>'FF0000', %opt ) %>
 
+    <% pkg_status_row_detached($cust_pkg, %opt) %>
+
     <% pkg_reason_row($cust_pkg, $cpr, color => 'ff0000', %opt) %>
 
 %   unless ( $cust_pkg->get('setup') ) { 
@@ -29,7 +31,7 @@
 
 %   } 
 %
-%   if ( $part_pkg->freq and !$supplemental ) { #?
+%   if ( $part_pkg->freq && !$supplemental && !$cust_pkg->change_custnum ) { #?
 
       <TR>
         <TD COLSPAN=<%$opt{colspan}%>>
@@ -360,6 +362,38 @@ sub pkg_status_row_changed {
   $html;
 }
 
+sub pkg_status_row_detached {
+  my( $cust_pkg, %opt ) = @_;
+
+warn $cust_pkg->pkgnum;
+warn $cust_pkg->change_custnum;
+
+  return '' unless $cust_pkg->change_custnum;
+
+  my $html = '';
+
+  my $cust_main = $cust_pkg->change_cust_main;
+  if ( $cust_main ) {
+
+    my $cust_link = '<A HREF="cust_main.cgi?'.  $cust_pkg->change_custnum. '">'.
+                      encode_entities( $cust_main->name ).
+                    '</A>';
+
+    $html .= pkg_status_row_colspan( $cust_pkg, 
+                                     emt("Detached to customer #[_1]: ",
+                                            $cust_pkg->change_custnum
+                                        ).
+                                       $cust_link,
+                                     '',
+                                     'size'    => '-1',
+                                     'align'   => 'right',
+                                     'colspan' => 4,
+                                   );
+  }
+
+  $html;
+}
+
 sub pkg_status_row_noauto {
   my( $cust_pkg, %opt ) = @_;
   my $part_pkg = $opt{'part_pkg'};

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/Schema.pm                                    |    1 +
 FS/FS/cust_pkg.pm                                  |   48 ++++++++--
 .../{change-cust_pkg.html => detach-cust_pkg.html} |   34 +++---
 httemplate/misc/change_pkg_contact.html            |    4 +-
 httemplate/misc/detach_pkg.html                    |  104 ++++++++++++++++++++
 httemplate/view/cust_main/packages/contact.html    |   14 +++
 httemplate/view/cust_main/packages/status.html     |   36 +++++++-
 7 files changed, 213 insertions(+), 28 deletions(-)
 copy httemplate/edit/process/{change-cust_pkg.html => detach-cust_pkg.html} (52%)
 create mode 100755 httemplate/misc/detach_pkg.html




More information about the freeside-commits mailing list