+sub process_tower {
+ my ($self, $opt) = @_;
+
+ if (!$opt->{tower_uprate_limit} || !$opt->{tower_downrate_limit}) {
+ $self->{'__saisei_error'} = "Can not export tower, no up or down rates attached to tower";
+ return { error => $self->api_error, };
+ }
+
+ my $existing_tower_ap;
+ my $tower_name = $opt->{tower_name};
+
+ #check if tower has been set up as an access point.
+ $existing_tower_ap = $self->api_get_accesspoint($tower_name) unless $self->{'__saisei_error'};
+
+ # modify the existing accesspoint if changing tower .
+ $self->api_modify_existing_accesspoint (
+ $tower_name,
+ '', # tower does not have a uplink on sectors.
+ $opt->{tower_uprate_limit},
+ $opt->{tower_downrate_limit},
+ ) if $existing_tower_ap->{collection} && $opt->{modify_existing};
+
+ #if tower does not exist as an access point create it.
+ $self->api_create_accesspoint(
+ $tower_name,
+ $opt->{tower_uprate_limit},
+ $opt->{tower_downrate_limit},
+ ) unless $existing_tower_ap->{collection};
+
+ my $accesspoint = $self->api_get_accesspoint($tower_name);
+
+ return { error => $self->api_error, } if $self->api_error;
+ return $accesspoint;
+}
+
+sub process_sector {
+ my ($self, $opt) = @_;
+
+ if (!$opt->{sector_uprate_limit} || !$opt->{sector_downrate_limit}) {
+ $self->{'__saisei_error'} = "Can not export sector, no up or down rates attached to sector";
+ return { error => $self->api_error, };
+ }
+
+ my $existing_sector_ap;
+ my $sector_name = $opt->{sector_name};
+
+ #check if sector has been set up as an access point.
+ $existing_sector_ap = $self->api_get_accesspoint($sector_name);
+
+ # modify the existing accesspoint if changing sector .
+ $self->api_modify_existing_accesspoint (
+ $sector_name,
+ $opt->{tower_name},
+ $opt->{sector_uprate_limit},
+ $opt->{sector_downrate_limit},
+ ) if $existing_sector_ap && $opt->{modify_existing};
+
+ #if sector does not exist as an access point create it.
+ $self->api_create_accesspoint(
+ $sector_name,
+ $opt->{sector_uprate_limit},
+ $opt->{sector_downrate_limit},
+ ) unless $existing_sector_ap;
+
+ # Attach newly created sector to it's tower.
+ $self->api_modify_accesspoint($sector_name, $opt->{tower_name}) unless ($self->{'__saisei_error'} || $existing_sector_ap);
+
+ # set access point to existing one or newly created one.
+ my $accesspoint = $existing_sector_ap ? $existing_sector_ap : $self->api_get_accesspoint($sector_name);
+
+ return { error => $self->api_error, } if $self->api_error;
+ return $accesspoint;
+}
+
+sub process_virtual_ap {
+ my ($self, $opt) = @_;
+
+ my $existing_virtual_ap;
+ my $virtual_name = $opt->{virtual_name};
+
+ #check if virtual_ap has been set up as an access point.
+ $existing_virtual_ap = $self->api_get_accesspoint($virtual_name);
+
+ # modify the existing virtual accesspoint if changing it. this should never happen
+ $self->api_modify_existing_accesspoint (
+ $virtual_name,
+ $opt->{sector_name},
+ $opt->{virtual_uprate_limit},
+ $opt->{virtual_downrate_limit},
+ ) if $existing_virtual_ap && $opt->{modify_existing};
+
+ #if virtual ap does not exist as an access point create it.
+ $self->api_create_accesspoint(
+ $virtual_name,
+ $opt->{virtual_uprate_limit},
+ $opt->{virtual_downrate_limit},
+ ) unless $existing_virtual_ap;
+
+ my $update_sector;
+ if ($existing_virtual_ap && (ref $existing_virtual_ap->{collection}->[0]->{uplink} eq "HASH") && ($existing_virtual_ap->{collection}->[0]->{uplink}->{link}->{name} ne $opt->{sector_name})) {
+ $update_sector = 1;
+ }
+
+ # Attach newly created virtual ap to tower sector ap or if sector has changed.
+ $self->api_modify_accesspoint($virtual_name, $opt->{sector_name}) unless ($self->{'__saisei_error'} || ($existing_virtual_ap && !$update_sector));
+
+ # set access point to existing one or newly created one.
+ my $accesspoint = $existing_virtual_ap ? $existing_virtual_ap : $self->api_get_accesspoint($virtual_name);
+
+ return $accesspoint;
+}
+
+sub export_provisioned_services {
+ my $job = shift;
+ my $param = shift;
+
+ my $part_export = FS::Record::qsearchs('part_export', { 'exportnum' => $param->{export_provisioned_services_exportnum}, } )
+ or die "unknown exportnum $param->{export_provisioned_services_exportnum}";
+ bless $part_export;
+
+ my @svcparts = FS::Record::qsearch({
+ 'table' => 'export_svc',
+ 'addl_from' => 'LEFT JOIN part_svc USING ( svcpart ) ',
+ 'hashref' => { 'exportnum' => $param->{export_provisioned_services_exportnum}, },
+ });
+ my $part_count = scalar @svcparts;
+
+ my $parts = join "', '", map { $_->{Hash}->{svcpart} } @svcparts;
+
+ my @svcs = FS::Record::qsearch({
+ 'table' => 'cust_svc',
+ 'addl_from' => 'LEFT JOIN svc_broadband USING ( svcnum ) ',
+ 'extra_sql' => " WHERE svcpart in ('".$parts."')",
+ }) unless !$parts;
+
+ my $svc_count = scalar @svcs;
+
+ my %status = {};
+ for (my $c=1; $c <=100; $c=$c+1) { $status{int($svc_count * ($c/100))} = $c; }
+
+ my $process_count=0;
+ foreach my $svc (@svcs) {
+ if ($status{$process_count}) { my $s = $status{$process_count}; $job->update_statustext($s); }
+ ## check if service exists as host if not export it.
+ my $host = api_get_host($part_export, $svc->{Hash}->{ip_addr});
+ die $host->{message} if $host->{message};
+ warn "Exporting service ".$svc->{Hash}->{ip_addr}."\n" if ($part_export->option('debug'));
+ my $export_error = _export_insert($part_export,$svc) unless $host->{collection};
+ die $export_error if $export_error;
+ $process_count++;
+ }
+
+ return;
+
+}
+