my $error = $new->svc_x->export('pkg_change', $new->cust_pkg,
$old->cust_pkg,
);
+
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
return $error if $error;
}
- }
+ } # if pkgnum is changing
#my $error = $new->SUPER::replace($old, @_);
my $error = $new->SUPER::replace($old);
+
+ #trigger a relocate export on location changes
+ if ( $new->cust_pkg->locationnum != $old->cust_pkg->locationnum ) {
+ $error ||= $new->svc_x->export('relocate',
+ $new->cust_pkg->cust_location,
+ $old->cust_pkg->cust_location,
+ );
+ }
+
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
return $error if $error;
my $cust_pkg = $self->cust_pkg;
my $pkg_svc = $self->pkg_svc
- or return "No svcpart ". $self->svcpart.
- " services in pkgpart ". $cust_pkg->pkgpart;
+ || new FS::pkg_svc { 'svcpart' => $self->svcpart,
+ 'pkgpart' => $cust_pkg->pkgpart,
+ 'quantity' => 0,
+ };
+
+ #service add-ons, kinda false laziness/reimplementation of part_pkg->pkg_svc
+ foreach my $part_pkg_link ( $cust_pkg->part_pkg->svc_part_pkg_link ) {
+ my $addon_pkg_svc = qsearchs('pkg_svc', {
+ pkgpart => $part_pkg_link->dst_pkgpart,
+ svcpart => $self->svcpart,
+ });
+ $pkg_svc->quantity( $pkg_svc->quantity + $addon_pkg_svc->quantity )
+ if $addon_pkg_svc;
+ }
+
+ #better error message? UI shouldn't get here
+ return "No svcpart ". $self->svcpart.
+ " services in pkgpart ". $cust_pkg->pkgpart
+ unless $pkg_svc->quantity > 0;
my $num_cust_svc = $cust_pkg->num_cust_svc( $self->svcpart );
- $num_cust_svc
);
+ #better error message? again, UI shouldn't get here
return "Already $num_cust_svc ". $pkg_svc->part_svc->svc.
" services for pkgnum ". $self->pkgnum
if $num_avail <= 0;
(@tickets);
}
+sub API_getinfo {
+ my $self = shift;
+ my $svc_x = $self->svc_x;
+ +{ ( map { $_=>$self->$_ } $self->fields ),
+ ( map { $svc_x=>$svc_x->$_ } $svc_x->fields ),
+ };
+}
=back