use FS::part_pkg_taxproduct;
use FS::part_pkg_link;
use FS::part_pkg_discount;
+use FS::part_pkg_vendor;
@ISA = qw( FS::m2m_Common FS::option_Common );
$DEBUG = 0;
}
if ( $options{'part_pkg_vendor'} ) {
- my($exportnum,$vendor_pkg_id);
- my %options_part_pkg_vendor = $options{'part_pkg_vendor'};
- while(($exportnum,$vendor_pkg_id) = each %options_part_pkg_vendor){
- my $ppv = new FS::part_pkg_vendor( {
- 'pkgpart' => $self->pkgpart,
- 'exportnum' => $exportnum,
- 'vendor_pkg_id' => $vendor_pkg_id,
- } );
- my $error = $ppv->insert;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return "Error inserting part_pkg_vendor record: $error";
- }
+ while ( my ($exportnum, $vendor_pkg_id) =
+ each %{ $options{part_pkg_vendor} }
+ )
+ {
+ my $ppv = new FS::part_pkg_vendor( {
+ 'pkgpart' => $self->pkgpart,
+ 'exportnum' => $exportnum,
+ 'vendor_pkg_id' => $vendor_pkg_id,
+ } );
+ my $error = $ppv->insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "Error inserting part_pkg_vendor record: $error";
+ }
}
}
if ( $options->{'part_pkg_vendor'} ) {
my($exportnum,$vendor_pkg_id);
while ( ($exportnum,$vendor_pkg_id)
- = each %{$options->{'part_pkg_vendor'}} ) {
- my $replaced = 0;
- foreach my $part_pkg_vendor ( @part_pkg_vendor ) {
- if($exportnum == $part_pkg_vendor->exportnum
- && $vendor_pkg_id ne $part_pkg_vendor->vendor_pkg_id) {
- $part_pkg_vendor->vendor_pkg_id($vendor_pkg_id);
- my $error = $part_pkg_vendor->replace;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return "Error replacing part_pkg_vendor record: $error";
- }
- $replaced = 1;
- last;
- }
- }
- unless ( $replaced ) {
- my $ppv = new FS::part_pkg_vendor( {
- 'pkgpart' => $new->pkgpart,
- 'exportnum' => $exportnum,
- 'vendor_pkg_id' => $vendor_pkg_id,
- } );
- my $error = $ppv->insert;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return "Error inserting part_pkg_vendor record: $error";
- }
- }
- push @current_exportnum, $exportnum;
+ = each %{$options->{'part_pkg_vendor'}} ) {
+ my $noinsert = 0;
+ foreach my $part_pkg_vendor ( @part_pkg_vendor ) {
+ if($exportnum == $part_pkg_vendor->exportnum
+ && $vendor_pkg_id ne $part_pkg_vendor->vendor_pkg_id) {
+ $part_pkg_vendor->vendor_pkg_id($vendor_pkg_id);
+ my $error = $part_pkg_vendor->replace;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "Error replacing part_pkg_vendor record: $error";
+ }
+ $noinsert = 1;
+ last;
+ }
+ elsif($exportnum == $part_pkg_vendor->exportnum
+ && $vendor_pkg_id eq $part_pkg_vendor->vendor_pkg_id) {
+ $noinsert = 1;
+ last;
+ }
+ }
+ unless ( $noinsert ) {
+ my $ppv = new FS::part_pkg_vendor( {
+ 'pkgpart' => $new->pkgpart,
+ 'exportnum' => $exportnum,
+ 'vendor_pkg_id' => $vendor_pkg_id,
+ } );
+ my $error = $ppv->insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "Error inserting part_pkg_vendor record: $error";
+ }
+ }
+ push @current_exportnum, $exportnum;
}
}
foreach my $part_pkg_vendor ( @part_pkg_vendor ) {
unless ( grep($_ eq $part_pkg_vendor->exportnum, @current_exportnum) ) {
- my $error = $part_pkg_vendor->delete;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return "Error deleting part_pkg_vendor record: $error";
- }
+ my $error = $part_pkg_vendor->delete;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "Error deleting part_pkg_vendor record: $error";
+ }
}
}
|| $self->ut_enum('disabled', [ '', 'Y' ] )
|| $self->ut_enum('custom', [ '', 'Y' ] )
|| $self->ut_enum('no_auto', [ '', 'Y' ])
+ || $self->ut_enum('recur_show_zero', [ '', 'Y' ])
#|| $self->ut_moneyn('setup_cost')
#|| $self->ut_moneyn('recur_cost')
|| $self->ut_floatn('setup_cost')
$pre. $self->pkg. ' - '. $self->custom_comment;
}
+sub price_info { # safety, in case a part_pkg hasn't defined price_info
+ '';
+}
+
sub custom_comment {
my $self = shift;
- ( $self->custom ? '(CUSTOM) ' : '' ). $self->comment;
+ ( $self->custom ? '(CUSTOM) ' : '' ). $self->comment . ' ' . $self->price_info;
}
=item pkg_class
die $error if $error;
}
+ my @part_pkg_option = qsearch('part_pkg_option',
+ { 'optionname' => 'unused_credit',
+ 'optionvalue' => 1,
+ });
+ foreach my $old_opt (@part_pkg_option) {
+ my $pkgpart = $old_opt->pkgpart;
+ my $error = $old_opt->delete;
+ die $error if $error;
+
+ foreach (qw(unused_credit_cancel unused_credit_change)) {
+ my $new_opt = new FS::part_pkg_option {
+ 'pkgpart' => $pkgpart,
+ 'optionname' => $_,
+ 'optionvalue' => 1,
+ };
+ $error = $new_opt->insert;
+ die $error if $error;
+ }
+ }
+
+ # migrate use_disposition_taqua and use_disposition to disposition_in
+ @part_pkg_option = qsearch('part_pkg_option',
+ { 'optionname' => { op => 'LIKE',
+ value => 'use_disposition%',
+ },
+ 'optionvalue' => 1,
+ });
+ my %newopts = map { $_->pkgpart => $_ }
+ qsearch('part_pkg_option', { 'optionname' => 'disposition_in', } );
+ foreach my $old_opt (@part_pkg_option) {
+ my $pkgpart = $old_opt->pkgpart;
+ my $newval = $old_opt->optionname eq 'use_disposition_taqua' ? '100'
+ : 'ANSWERED';
+ my $error = $old_opt->delete;
+ die $error if $error;
+
+ if ( exists($newopts{$pkgpart}) ) {
+ my $opt = $newopts{$pkgpart};
+ $opt->optionvalue($opt->optionvalue.",$newval");
+ $error = $opt->replace;
+ die $error if $error;
+ } else {
+ my $new_opt = new FS::part_pkg_option {
+ 'pkgpart' => $pkgpart,
+ 'optionname' => 'disposition_in',
+ 'optionvalue' => $newval,
+ };
+ $error = $new_opt->insert;
+ die $error if $error;
+ $newopts{$pkgpart} = $new_opt;
+ }
+ }
+
}
=item curuser_pkgs_sql
next;
}
warn "got plan info from FS::part_pkg::$mod: $info\n" if $DEBUG;
- if ( exists($info->{'disabled'}) && $info->{'disabled'} ) {
- warn "skipping disabled plan FS::part_pkg::$mod" if $DEBUG;
- next;
- }
+ #if ( exists($info->{'disabled'}) && $info->{'disabled'} ) {
+ # warn "skipping disabled plan FS::part_pkg::$mod" if $DEBUG;
+ # next;
+ #}
$info{$mod} = $info;
+ $info->{'weight'} ||= 0; # quiet warnings
}
}
+# copy one level deep to allow replacement of fields and fieldorder
tie %plans, 'Tie::IxHash',
- map { $_ => $info{$_} }
+ map { my %infohash = %{ $info{$_} };
+ $_ => \%infohash }
sort { $info{$a}->{'weight'} <=> $info{$b}->{'weight'} }
keys %info;
+# inheritance of plan options
+foreach my $name (keys(%info)) {
+ if (exists($info{$name}->{'disabled'}) and $info{$name}->{'disabled'}) {
+ warn "skipping disabled plan FS::part_pkg::$name" if $DEBUG;
+ delete $plans{$name};
+ next;
+ }
+ my $parents = $info{$name}->{'inherit_fields'} || [];
+ my (%fields, %field_exists, @fieldorder);
+ foreach my $parent ($name, @$parents) {
+ if ( !exists($info{$parent}) ) {
+ warn "$name tried to inherit from nonexistent '$parent'\n";
+ next;
+ }
+ %fields = ( # avoid replacing existing fields
+ %{ $info{$parent}->{'fields'} || {} },
+ %fields
+ );
+ foreach (@{ $info{$parent}->{'fieldorder'} || [] }) {
+ # avoid duplicates
+ next if $field_exists{$_};
+ $field_exists{$_} = 1;
+ # allow inheritors to remove inherited fields from the fieldorder
+ push @fieldorder, $_ if !exists($fields{$_}) or
+ !exists($fields{$_}->{'disabled'});
+ }
+ }
+ $plans{$name}->{'fields'} = \%fields;
+ $plans{$name}->{'fieldorder'} = \@fieldorder;
+}
+
sub plan_info {
\%plans;
}