default to a session cookie instead of setting an explicit timeout, weird timezone...
[freeside.git] / FS / FS / svc_dsl.pm
index 2fd9570..c07f186 100644 (file)
@@ -1,11 +1,15 @@
 package FS::svc_dsl;
+use base qw(FS::Password_Mixin
+            FS::svc_Common);
 
 use strict;
-use vars qw( @ISA $conf $DEBUG $me );
-use FS::Record qw( qsearch qsearchs );
+use vars qw( $conf $DEBUG $me );
+use FS::UID;
+use FS::Record qw( qsearch qsearchs dbh );
 use FS::svc_Common;
+use FS::dsl_note;
+use FS::qual;
 
-@ISA = qw( FS::svc_Common );
 $DEBUG = 0;
 $me = '[FS::svc_dsl]';
 
@@ -52,15 +56,15 @@ Primary key (assigned automatcially for new DSL))
 
 =item pushed
 
-Time the DSL order was pushed to a vendor, if exporting orders to a vendor/telco
+Time DSL order pushed to vendor/telco, if applicable
 
-=item desired_dd
+=item desired_due_date
 
 Desired Due Date
 
-=item dd
+=item due_date
 
-Due Date (e.g. once order is in Assigned status or similar by the telco)
+Due Date
 
 =item vendor_order_id
 
@@ -87,22 +91,30 @@ End-user last name
 
 End-user company name
 
-=item svctn
+=item phonenum
 
 DSL Telephone Number
 
+=item gateway_access_number
+
+Gateway access number, if different
+
 =item loop_type
 
 Loop-type - vendor/telco-specific
 
-=item lvp
+=item local_voice_provider
 
 Local Voice Provider's name
 
-=item cktnum
+=item circuitnum
 
 Circuit #
 
+=item vpi
+
+=item vci
+
 =item rate_band
 
 Rate Band
@@ -119,11 +131,11 @@ Ikano-specific fields, do not use otherwise
 
 =item username
 
-If outsourced PPPoE/RADIUS, username
+if outsourced PPPoE/RADIUS, username
 
 =item password
 
-If outsourced PPPoE/RADIUS, password
+if outsourced PPPoE/RADIUS, password
 
 =item monitored
 
@@ -131,11 +143,7 @@ Order is monitored (auto-pull/sync), either Y or blank
 
 =item last_pull
 
-Time of last data pull from vendor/telco
-
-=item notes
-
-DSL order notes placed by staff or vendor/telco on the vendor/telco order
+time of last data pull from vendor/telco
 
 
 =back
@@ -160,53 +168,56 @@ sub table_info {
     my %dis2 = ( disable_inventory=>1, disable_select=>1 );
 
     {
-       'name' => 'DSL',
-       'sorts' => [ 'svctn' ],
-       'display_weight' => 55,
-       'cancel_weight' => 75,
-       'fields' => {
-           'pushed' => {       label => 'Pushed', 
-                               type => 'disabled' },
-           'desired_dd' => {   label => 'Desired Due Date', %dis2, },
-           'dd' => {           label => 'Due Date', %dis2, },
-           'vendor_order_id' => { label => 'Vendor Order Id', %dis2, },
-           'vendor_qual_id' => { label => 'Vendor Qualification Id', 
-                               type => 'disabled' },
-           'vendor_order_type' => { label => 'Vendor Order Type',
-                                   disable_inventory => 1,
-                               },
-           'vendor_order_status' => { label => 'Vendor Order Status',
-                                   disable_inventory => 1,
-                                   },
-           'first' => {        label => 'First Name', %dis2, },
-           'last' => {         label => 'Last Name', %dis2, },
-           'company' => {      label => 'Company Name', %dis2, },
-           'svctn' => {        label => 'Service Telephone Number', },
-           'loop_type' => {    label => 'Loop Type',
-                                   disable_inventory => 1,
-                       },
-           'lvp' => {          label => 'Local Voice Provider',
-                                   disable_inventory => 1,
-                       },
-           'cktnum' => {       label => 'Circuit #',   },
-           'rate_band' => {    label => 'Rate Band',
-                                   disable_inventory => 1,
-                       },
-           'isp_chg' => {      label => 'ISP Changing?', 
-                               type => 'checkbox', %dis2 },
-           'isp_prev' => {     label => 'Current or Previous ISP',
-                                   disable_inventory => 1,
-                       },
-           'username' => {     label => 'PPPoE Username',
-                               type => 'text',
-                       },
-           'password' => {     label => 'PPPoE Password', %dis2 },
-           'staticips' => {    label => 'Static IPs', %dis1 },
-           'monitored' => {    label => 'Monitored', 
-                               type => 'checkbox', %dis2 },
-           'last_pull' => {    label => 'Last Pull', type => 'disabled' },
-           'notes' => {        label => 'Order Notes', %dis1 },
-       },
+        'name' => 'DSL',
+        'name_plural' => 'DSLs',
+        'lcname_plural' => 'DSLs',
+        'sorts' => [ 'phonenum' ],
+        'display_weight' => 55,
+        'cancel_weight' => 75,
+        'ip_field' => 'staticips',
+        'fields' => {
+            'pushed'                => { label => 'Pushed', 
+                                         type  => 'disabled' },
+            'desired_due_date'      => { label => 'Desired Due Date', %dis2, },
+            'due_date'              => { label => 'Due Date', %dis2, },
+            'vendor_order_id'       => { label => 'Vendor Order ID', %dis2, },
+            'vendor_qual_id'        => { label => 'Vendor Qualification ID', 
+                                         type => 'disabled' },
+            'vendor_order_type'     => { label => 'Vendor Order Type',
+                                         disable_inventory => 1, },
+            'vendor_order_status'   => { label => 'Vendor Order Status',
+                                         disable_inventory => 1, },
+            'first'                 => { label => 'First Name', %dis2, },
+            'last'                  => { label => 'Last Name', %dis2, },
+            'company'               => { label => 'Company Name', %dis2, },
+            'phonenum'              => { label => 'Service Telephone Number', },
+            'gateway_access_number' => { label => 'Gateway Access Number'.
+                                                  ' (if different)', },
+            'loop_type'             => { label => 'Loop Type',
+                                         disable_inventory => 1, },
+            'local_voice_provider'  => { label => 'Local Voice Provider',
+                                         disable_inventory => 1, },
+            'circuitnum'            => { label => 'Circuit #',        },
+            'rate_band'             => { label => 'Rate Band',
+                                         disable_inventory => 1, },
+            'vpi'                   => { label => 'VPI',
+                                         disable_inventory => 1 },
+            'vci'                   => { label => 'VCI',
+                                         disable_inventory => 1 },
+            'isp_chg'               => { label => 'ISP Changing?', 
+                                         type  => 'checkbox',
+                                         %dis2, },
+            'isp_prev'              => { label => 'Current or Previous ISP',
+                                         disable_inventory => 1, },
+            'username'              => { label => 'PPPoE Username',
+                                         type  => 'text', },
+            'password'              => { label => 'PPPoE Password', %dis2 },
+            'staticips'             => { label => 'Static IPs', %dis1 },
+            'monitored'             => { label => 'Monitored', 
+                                         type => 'checkbox', %dis2 },
+            'last_pull'             => { label => 'Last Pull',
+                                         type  => 'disabled' },
+        },
     };
 }
 
@@ -214,12 +225,22 @@ sub table { 'svc_dsl'; }
 
 sub label {
    my $self = shift;
-   return $self->svctn if $self->svctn;
+   return $self->phonenum if $self->phonenum;
    return $self->username if $self->username;
    return $self->vendor_order_id if $self->vendor_order_id;
    return $self->svcnum;
 }
 
+=item notes
+
+Returns the set of FS::dsl_notes associated with this service
+
+=cut 
+sub notes {
+  my $self = shift;
+  qsearch( 'dsl_note', { 'svcnum' => $self->svcnum } );
+}
+
 =item insert
 
 Adds this record to the database.  If there is an error, returns the error,
@@ -227,7 +248,25 @@ otherwise returns false.
 
 =cut
 
-# the insert method can be inherited from FS::Record
+sub insert {
+  my $self = shift;
+  my $dbh = dbh;
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+
+  my $error = $self->SUPER::insert(@_);
+  if ( length($self->password) ) {
+    $error ||= $self->insert_password_history;
+  }
+
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit if $oldAutoCommit;
+  '';
+}
 
 =item delete
 
@@ -244,6 +283,27 @@ returns the error, otherwise returns false.
 
 =cut
 
+sub replace {
+  my $new = shift;
+  my $old = shift || $new->replace_old;
+  my $dbh = dbh;
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+
+  my $error = $new->SUPER::replace($old, @_);
+  if ( $old->password ne $new->password ) {
+    $error ||= $new->insert_password_history;
+  }
+
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit if $oldAutoCommit;
+  '';
+}
+
 # the replace method can be inherited from FS::Record
 
 =item check
@@ -263,20 +323,23 @@ sub check {
   my $error = 
     $self->ut_numbern('svcnum')
     || $self->ut_numbern('pushed')
-    || $self->ut_number('desired_dd')
-    || $self->ut_numbern('dd')
+    || $self->ut_numbern('desired_due_date')
+    || $self->ut_numbern('due_date')
     || $self->ut_textn('vendor_order_id')
     || $self->ut_textn('vendor_qual_id')
-    || $self->ut_alpha('vendor_order_type')
+    || $self->ut_alphan('vendor_order_type')
     || $self->ut_alphan('vendor_order_status')
-    || $self->ut_text('first')
-    || $self->ut_text('last')
+    || $self->ut_textn('first')
+    || $self->ut_textn('last')
     || $self->ut_textn('company')
-    || $self->ut_numbern('svctn')
+    || $self->ut_numbern('phonenum')
+    || $self->ut_numbern('gateway_access_number')
     || $self->ut_alphasn('loop_type')
-    || $self->ut_textn('lvp')
-    || $self->ut_textn('cktnum')
+    || $self->ut_textn('local_voice_provider')
+    || $self->ut_textn('circuitnum')
     || $self->ut_textn('rate_band')
+    || $self->ut_numbern('vpi')
+    || $self->ut_numbern('vci')
     || $self->ut_alphan('isp_chg')
     || $self->ut_textn('isp_prev')
     || $self->ut_textn('username')
@@ -284,13 +347,61 @@ sub check {
     || $self->ut_textn('staticips')
     || $self->ut_enum('monitored',    [ '', 'Y' ])
     || $self->ut_numbern('last_pull')
-    || $self->ut_textn('notes')
   ;
   return $error if $error;
 
+  $self->gateway_access_number('')
+    if $self->phonenum && $self->phonenum eq $self->gateway_access_number;
+
   $self->SUPER::check;
 }
 
+=item gateway_access_or_phonenum
+
+=cut
+
+sub gateway_access_or_phonenum {
+  my $self = shift;
+  $self->gateway_access_number || $self->phonenum;
+}
+
+=item dsl_device
+
+Returns the MAC addresses associated with this DSL service, as FS::dsl_device
+objects.
+
+=cut
+
+sub predelete_hook_first {
+    my $self = shift;
+    my @exports = $self->part_svc->part_export_dsl_pull;
+    return 'More than one DSL-pulling export attached' if scalar(@exports) > 1;
+    if ( scalar(@exports) == 1 ) {
+       my $export = $exports[0];
+       return $export->dsl_pull($self);
+    }
+    '';
+}
+
+sub predelete_hook {
+    my $self = shift;
+    my @notes = $self->notes;
+    foreach my $note ( @notes ) {
+       my $error = $note->delete;
+       return $error if $error;
+    }
+    '';
+}
+
+# password_history compatibility
+
+sub _password {
+  my $self = shift;
+  $self->get('password');
+}
+
+sub _password_encoding { 'plain'; }
+
 =back
 
 =head1 SEE ALSO