--- /dev/null
+#!/usr/bin/perl
+
+use strict;
+use FS::Misc::Getopt;
+use FS::part_pkg;
+use FS::Record qw(qsearch dbh);
+
+our %opt;
+getopts('p:'); # pkgpart
+$FS::UID::AutoCommit = 0;
+
+sub usage {
+ die "Usage: part_pkg-clone_fix_options -p pkgpart[,pkgpart...] user\n\n";
+}
+
+my @pkgpart = split(',',$opt{p}) or usage();
+foreach my $base_pkgpart (@pkgpart) {
+ my $base_part_pkg = FS::part_pkg->by_key($base_pkgpart);
+ warn "Base package '".$base_part_pkg->pkg."'\n";
+ my @children = qsearch('part_pkg', { 'family_pkgpart' => $base_pkgpart });
+ next if !@children;
+ my $n_pkg = 0;
+ my $n_upd = 0;
+ my %base_options = $base_part_pkg->options;
+ my %report_classes = map { $_ => $base_options{$_} }
+ grep /^report_option_/, keys %base_options;
+ if (!keys %report_classes) {
+ warn "No report classes.\n";
+ next;
+ }
+
+ foreach my $part_pkg (@children) {
+ my $pkgpart = $part_pkg->pkgpart;
+ next if $pkgpart == $base_pkgpart;
+ $n_pkg++;
+
+ # don't do this if it has report options already
+ my %options = $part_pkg->options;
+ if (grep /^report_option_/, keys %options) {
+ warn "#$pkgpart has report classes; skipped\n";
+ } else {
+ %options = ( %options, %report_classes );
+ my $error = $part_pkg->replace(options => \%options);
+ die "#$pkgpart: $error\n" if $error;
+ $n_upd++;
+ }
+ }
+ warn "Updated $n_upd / $n_pkg child packages.\n";
+}
+
+warn "Finished.\n";
+dbh->commit;
+