legacy change history, RT#29311
authorIvan Kohler <ivan@freeside.biz>
Fri, 6 Mar 2015 01:30:26 +0000 (17:30 -0800)
committerIvan Kohler <ivan@freeside.biz>
Fri, 6 Mar 2015 01:30:26 +0000 (17:30 -0800)
FS/FS/Mason.pm
FS/FS/Schema.pm
FS/FS/legacy_cust_history.pm [new file with mode: 0644]
FS/MANIFEST
FS/t/legacy_cust_history.t [new file with mode: 0644]
httemplate/elements/change_history_common.html
httemplate/view/cust_main/change_history.html

index 81671ff..897b781 100644 (file)
@@ -398,6 +398,7 @@ if ( -e $addl_handler_use_file ) {
   use FS::cust_credit_source_bill_pkg;
   use FS::prospect_contact;
   use FS::cust_contact;
+  use FS::legacy_cust_history;
   # Sammath Naur
 
   if ( $FS::Mason::addl_handler_use ) {
index 9c2e9ba..89fc5f7 100644 (file)
@@ -200,6 +200,7 @@ sub dbdef_dist {
     grep {    ! /^(clientapi|access_user)_session/
            && ! /^h_/
            && ! /^log(_context)?$/
+           && ! /^legacy_cust_history$/
            && ( ! /^queue(_arg|_depend|_stat)?$/ || ! $opt->{'queue-no_history'} )
            && ! $tables_hashref_torrus->{$_}
          }
@@ -778,6 +779,31 @@ sub tables_hashref {
                         ],
     },
 
+    'legacy_cust_history' => {
+      'columns' => [
+        'legacyhistorynum', 'serial',     '',        '', '', '',
+        'custnum',             'int',     '',        '', '', '',
+        'history_action',  'varchar',     '',   $char_d, '', '',
+        'history_date',           @date_type,            '', '',
+        'history_usernum',     'int', 'NULL',        '', '', '',
+        'item',            'varchar', 'NULL',   $char_d, '', '',
+        'description',     'varchar', 'NULL', 2*$char_d, '', '',
+        'change_data',        'text', 'NULL',        '', '', '',
+      ],
+      'primary_key'  => 'legacyhistorynum',
+      'unique'       => [],
+      'index'        => [ ['custnum'], ['history_date'], ],
+      'foreign_keys' => [
+                          { columns    => [ 'custnum' ],
+                            table      => 'cust_main',
+                          },
+                          { columns    => [ 'history_usernum' ],
+                            table      => 'access_user',
+                            references => [ 'usernum' ],
+                          },
+                        ],
+    },
+
     'cust_statement' => {
       'columns' => [
         'statementnum', 'serial', '', '', '', '',
diff --git a/FS/FS/legacy_cust_history.pm b/FS/FS/legacy_cust_history.pm
new file mode 100644 (file)
index 0000000..9e14903
--- /dev/null
@@ -0,0 +1,134 @@
+package FS::legacy_cust_history;
+use base qw( FS::Record );
+
+use strict;
+use FS::Record qw( qsearch qsearchs );
+
+=head1 NAME
+
+FS::legacy_cust_history - Object methods for legacy_cust_history records
+
+=head1 SYNOPSIS
+
+  use FS::legacy_cust_history;
+
+  $record = new FS::legacy_cust_history \%hash;
+  $record = new FS::legacy_cust_history { 'column' => 'value' };
+
+  $error = $record->insert;
+
+  $error = $new_record->replace($old_record);
+
+  $error = $record->delete;
+
+  $error = $record->check;
+
+=head1 DESCRIPTION
+
+An FS::legacy_cust_history object represents an item of customer change history
+from a previous billing system.  FS::legacy_cust_history inherits from
+FS::Record.  The following fields are currently supported:
+
+=over 4
+
+=item legacyhistorynum
+
+primary key
+
+=item custnum
+
+Customer (see L<FS::cust_main)
+
+=item history_action
+
+Action, such as add, edit, delete, etc.
+
+=item history_date
+
+Date, as a UNIX timestamp
+
+=item history_usernum
+
+Employee (see L<FS::access_user>)
+
+=item item
+
+The item (i.e. table) which was changed.
+
+=item description
+
+A text description of the change
+
+=item change_data
+
+A text data structure representing the change
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item new HASHREF
+
+Creates a new record.  To add the record to the database, see L<"insert">.
+
+Note that this stores the hash reference, not a distinct copy of the hash it
+points to.  You can ask the object for a copy with the I<hash> method.
+
+=cut
+
+sub table { 'legacy_cust_history'; }
+
+=item insert
+
+Adds this record to the database.  If there is an error, returns the error,
+otherwise returns false.
+
+=item delete
+
+Delete this record from the database.
+
+=item replace OLD_RECORD
+
+Replaces the OLD_RECORD with this one in the database.  If there is an error,
+returns the error, otherwise returns false.
+
+=item check
+
+Checks all fields to make sure this is a valid record.  If there is
+an error, returns the error, otherwise returns false.  Called by the insert
+and replace methods.
+
+=cut
+
+sub check {
+  my $self = shift;
+
+  my $error = 
+    $self->ut_numbern('legacyhistorynum')
+    || $self->ut_foreign_key('custnum', 'cust_main', 'custnum')
+    || $self->ut_text('history_action')
+    || $self->ut_numbern('history_date')
+    || $self->ut_foreign_keyn('history_usernum', 'access_user', 'usernum')
+    || $self->ut_textn('item')
+    || $self->ut_textn('description')
+    || $self->ut_anything('change_data')
+  ;
+  return $error if $error;
+
+  $self->SUPER::check;
+}
+
+=back
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+L<FS::Record>
+
+=cut
+
+1;
+
index 0542dfd..378421c 100644 (file)
@@ -836,3 +836,5 @@ FS/cust_contact.pm
 t/cust_contact.t
 FS/pkg_discount_Mixin.pm
 t/pkg_discount_Mixin.t
+FS/legacy_cust_history.pm
+t/legacy_cust_history.t
diff --git a/FS/t/legacy_cust_history.t b/FS/t/legacy_cust_history.t
new file mode 100644 (file)
index 0000000..ac48aee
--- /dev/null
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::legacy_cust_history;
+$loaded=1;
+print "ok 1\n";
index 2d2c4c0..d941427 100644 (file)
@@ -18,7 +18,7 @@
 % foreach my $item ( @history ) {
 %   my $history_other = '';
 %   my $act  = $item->history_action;
-%   if ( $act =~ /^replace/ ) {
+%   if ( $act =~ /^replace/ && $item->table ne 'legacy_cust_history' ) {
 %     my $pkey = $item->primary_key;
 %     my $date = $item->history_date;
 %     $history_other = qsearchs({
 %   }
 
   <TR>
+
     <TD ALIGN="left" CLASS="grid" BGCOLOR="<% $bgcolor %>">
-%     my $otaker = $item->history_user;
+%     my $otaker;
+%     if ( $item->history_usernum ) {
+%       $access_user{ $item->history_usernum } ||=
+%         qsearchs('access_user', { 'usernum' => $item->history_usernum });
+%       $otaker = $access_user{ $item->history_usernum }->username
+%         if $access_user{ $item->history_usernum };
+%     }
+%     $otaker ||= $item->history_user;
 %     $otaker = '<i>auto billing</i>'          if $otaker eq 'fs_daily';
 %     $otaker = '<i>customer self-service</i>' if $otaker eq 'fs_selfservice';
 %     $otaker = '<i>job queue</i>'             if $otaker eq 'fs_queue';
+%     $otaker = '<i>system bootstrap user</i>' if $otaker eq 'fs_bootstrap';
       <% $otaker %>
     </TD>
+
     <TD ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>">
 %     my $d = time2str('%b %o, %Y', $item->history_date );
 %     $d =~ s/ /&nbsp;/g;
       <% $d %>
     </TD>
+
     <TD ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>">
 %     my $t = time2str('%r', $item->history_date );
 %     $t =~ s/ /&nbsp;/g;
 
     <TD ALIGN="center" CLASS="grid" BGCOLOR="<% $bgcolor %>">
 %       my $label = '';
-%       $label = $item->table;
-%       $label =~ s/^h_//;
-%       $label = $tables{$label};
-% if ( $single_cust ) {
-%     $label = &{ $h_table_labelsub{$item->table} }( $item, $label )
-%       if $h_table_labelsub{$item->table};
-% }
+%       if ( $item->table eq 'legacy_cust_bill' ) {
+%         $label = $item->item;
+%       } else {
+%         $label = $item->table;
+%         $label =~ s/^h_//;
+%         $label = $tables{$label};
+%         $label = &{ $h_table_labelsub{$item->table} }( $item, $label )
+%           if $single_cust && $h_table_labelsub{$item->table};
+%       }
       <% $label %>
     </TD>
+
     <TD ALIGN="left" CLASS="grid" BGCOLOR="<% $bgcolor %>">
-      <% $action{$item->history_action} %>
+      <% $action{$item->history_action} || ucfirst($item->history_action) |h %>
     </TD>
+
     <TD ALIGN="left" CLASS="grid" BGCOLOR="<% $bgcolor %>">
-      <% join(', ',
-           map  { my $value = ( $_ =~ /(^pay(info|cvv)|^ss|_password)$/ ) 
-                                ? 'N/A'
-                                : $item->get($_);
-                  $value = time2str($cust_pkg_date_format, $value)
-                   if $item->table eq 'h_cust_pkg'
-                   && $cust_pkg_date_fields{$_}
-                   && $value;
-
-                  $value = substr($value, 0, 77).'...' if length($value) > 80;
-                  $value = encode_entities($value);
-                  "<I>$_</I>:<B>$value</B>";
-                }
-           grep { $history_other
-                    ? ( $item->get($_) ne $history_other->get($_) )
-                    : ( $item->get($_) =~ /\S/ )
-                }
-           grep { ! /^(history|custnum$)/i }
-                $item->fields
-         )
-      %>
-% if ( $single_cust && $h_table_descripsub{$item->table} ) {
-      <% &{ $h_table_descripsub{$item->table} }( $item ) %>
-% }
+%     if ( $item->table eq 'legacy_cust_bill' ) {
+        <% $item->description |h %>
+%     } else {
+        <% join(', ',
+             map  { my $value = ( $_ =~ /(^pay(info|cvv)|^ss|_password)$/ ) 
+                                  ? 'N/A'
+                                  : $item->get($_);
+                    $value = time2str($cust_pkg_date_format, $value)
+                     if $item->table eq 'h_cust_pkg'
+                     && $cust_pkg_date_fields{$_}
+                     && $value;
+
+                    $value = substr($value, 0, 77).'...' if length($value) > 80;
+                    $value = encode_entities($value);
+                    "<I>$_</I>:<B>$value</B>";
+                  }
+             grep { $history_other
+                      ? ( $item->get($_) ne $history_other->get($_) )
+                      : ( $item->get($_) =~ /\S/ )
+                  }
+             grep { ! /^(history|custnum$)/i }
+                  $item->fields
+           )
+        %>
+%       if ( $single_cust && $h_table_descripsub{$item->table} ) {
+          <% &{ $h_table_descripsub{$item->table} }( $item ) %>
+%       }
+%     }
     </TD>
+
   </TR>
 
 % }
@@ -221,4 +241,6 @@ if ( $curuser->option('history_order') eq 'newest' ) {
   @history = reverse @history;
 }
 
+my %access_user = (); #cache
+
 </%init>
index 217b14e..6c9b670 100644 (file)
@@ -46,6 +46,9 @@ tie my %tables, 'Tie::IxHash',
   'phone_device'      => 'Phone device',
   'cust_pkg_discount' => 'Discount',
   #? it gets provisioned anyway 'phone_avail'         => 'Phone',
+
+  'legacy_history'    => 'Label not used',
+
 ;
 
 my $pkg_join = "JOIN cust_pkg USING ( pkgnum )";