Option to ignore old CDRs, RT#81480
[freeside.git] / bin / part_pkg-clone_fix_options
1 #!/usr/bin/perl
2
3 use strict;
4 use FS::Misc::Getopt;
5 use FS::part_pkg;
6 use FS::Record qw(qsearch dbh);
7
8 our %opt;
9 getopts('p:'); # pkgpart
10 $FS::UID::AutoCommit = 0;
11
12 sub usage {
13   die "Usage: part_pkg-clone_fix_options -p pkgpart[,pkgpart...] user\n\n";
14 }
15
16 my @pkgpart = split(',',$opt{p}) or usage();
17 foreach my $base_pkgpart (@pkgpart) {
18   my $base_part_pkg = FS::part_pkg->by_key($base_pkgpart);
19   warn "Base package '".$base_part_pkg->pkg."'\n";
20   my @children = qsearch('part_pkg', { 'family_pkgpart' => $base_pkgpart });
21   next if !@children;
22   my $n_pkg = 0;
23   my $n_upd = 0;
24   my %base_options = $base_part_pkg->options;
25   my %report_classes = map { $_ => $base_options{$_} }
26                        grep /^report_option_/, keys %base_options;
27   if (!keys %report_classes) {
28     warn "No report classes.\n";
29     next;
30   }
31
32   foreach my $part_pkg (@children) {
33     my $pkgpart = $part_pkg->pkgpart;
34     next if $pkgpart == $base_pkgpart;
35     $n_pkg++;
36
37     # don't do this if it has report options already
38     my %options = $part_pkg->options;
39     if (grep /^report_option_/, keys %options) {
40       warn "#$pkgpart has report classes; skipped\n";
41     } else {
42       %options = ( %options, %report_classes );
43       my $error = $part_pkg->replace(options => \%options);
44       die "#$pkgpart: $error\n" if $error;
45       $n_upd++;
46     }
47   }
48   warn "Updated $n_upd / $n_pkg child packages.\n";
49 }
50
51 warn "Finished.\n";
52 dbh->commit;
53