service dependencies: cust_svc_unprovision_restrict, RT#33685
authorIvan Kohler <ivan@freeside.biz>
Thu, 30 Apr 2015 13:10:11 +0000 (06:10 -0700)
committerIvan Kohler <ivan@freeside.biz>
Thu, 30 Apr 2015 13:10:11 +0000 (06:10 -0700)
FS/FS/cust_svc.pm
FS/FS/svc_Common.pm

index a7aeada..2cf9103 100644 (file)
@@ -456,6 +456,35 @@ sub check {
   $self->SUPER::check;
 }
 
+=item check_part_svc_link_unprovision
+
+Checks service dependency unprovision rules for this service.
+
+If there is an error, returns the error, otherwise returns false.
+
+=cut
+
+sub check_part_svc_link_unprovision {
+  my $self = shift;
+
+  foreach my $part_svc_link ( $self->part_svc_link(
+                                link_type   => 'cust_svc_unprovision_restrict',
+                              )
+  ) {
+    return $part_svc_link->dst_svc. ' must be unprovisioned before '.
+           $part_svc_link->src_svc
+      if qsearchs({
+        'table'    => 'cust_svc',
+        'hashref'  => { 'pkgnum'  => $self->pkgnum,
+                        'svcpart' => $part_svc_link->dst_svcpart,
+                      },
+        'order_by' => 'LIMIT 1',
+      });
+  }
+
+  '';
+}
+
 =item part_svc_link
 
 Returns the service dependencies (see L<FS::part_svc_link>) for the given
index b1f9d14..8d3b535 100644 (file)
@@ -395,7 +395,8 @@ sub delete {
   local $FS::UID::AutoCommit = 0;
   my $dbh = dbh;
 
-  my $error =  $self->predelete_hook_first 
+  my $error =    $self->cust_svc->check_part_svc_link_unprovision
+              || $self->predelete_hook_first 
              || $self->SUPER::delete
               || $self->export('delete', @$export_args)
              || $self->return_inventory