+ my($self,$qual) = (shift,shift);
+
+ my %location_hash = $qual->location_hash;
+ return 'No address provided' unless keys %location_hash;
+
+ return 'Location kind is required' unless $location_hash{location_kind};
+
+ my $svctn = $qual->phonenum;
+
+ my $result = $self->ikano_command('PREQUAL',
+ { AddressLine1 => $location_hash{address1},
+ AddressUnitType => $location_hash{location_type},
+ AddressUnitValue => $location_hash{location_number},
+ AddressCity => $location_hash{city},
+ AddressState => $location_hash{state},
+ ZipCode => $location_hash{zip},
+ Country => $location_hash{country},
+ LocationType => $location_hash{location_kind},
+ PhoneNumber => length($svctn) > 1 ? $svctn : "STANDALONE",
+ RequestClientIP => '127.0.0.1',
+ CheckNetworks => $self->option('check_networks'),
+ } );
+ return $result unless ref($result); # error case
+ return 'Invalid prequal response' unless defined $result->{'PrequalId'};
+
+ my $qoptions = {};
+ # lame data structure traversal...
+ # don't spend much time here, just get TermsId and ProductCustomId
+ my $networks = $result->{'Network'};
+ my @networks = defined $networks ? @$networks : ();
+ my $netcount = 0;
+ foreach my $network ( @networks ) {
+ my $productgroups = $network->{'ProductGroup'};
+ my @productgroups = defined $productgroups ? @$productgroups : ();
+ my $pgcount = 0;
+ foreach my $productgroup ( @productgroups ) {
+ my $prefix = "ikano_Network_$netcount"."_ProductGroup_$pgcount"."_";
+ $qoptions->{$prefix."TermsId"} = $productgroup->{'TermsId'};
+ my $products = $productgroup->{'Product'};
+ my @products = defined $products ? @$products : ();
+ my $prodcount = 0;
+ foreach my $product ( @products ) {
+ $qoptions->{$prefix."Product_$prodcount"."_ProductCustomId"} = $product->{'ProductCustomId'};
+ $prodcount++;
+ }
+ $pgcount++;
+ }
+ $netcount++;
+ }
+
+ { 'vendor_qual_id' => $result->{'PrequalId'},
+ 'status' => scalar(@networks) ? 'Q' : 'D',
+ 'options' => $qoptions,
+ };
+}
+
+sub qual_result {
+ my($self,$qual) = (shift,shift);
+
+ my %qual_options = $qual->options;
+ my @externalids = ();
+ my( $optionname, $optionvalue );
+ while (($optionname, $optionvalue) = each %qual_options) {
+ push @externalids, $optionvalue
+ if ( $optionname =~ /^ikano_Network_(\d+)_ProductGroup_(\d+)_Product_(\d+)_ProductCustomId$/
+ && $optionvalue ne '' );
+ }
+
+ my %pkglist = ();
+ my $result = { 'header' => 'Qualifying Packages',
+ 'pkglist' => \%pkglist,
+ };
+
+ my @part_pkgs = qsearch( 'part_pkg', { 'disabled' => '' } );
+ foreach my $part_pkg ( @part_pkgs ) {
+ my %vendor_pkg_ids = $part_pkg->vendor_pkg_ids;
+ my $externalid = $vendor_pkg_ids{$self->exportnum}
+ if defined $vendor_pkg_ids{$self->exportnum};
+ if ( $externalid && grep( $_ eq $externalid, @externalids )) {
+ $pkglist{$part_pkg->pkgpart} = $part_pkg->pkg." - ".$part_pkg->comment;
+ }
+ }
+
+ $result;
+}
+
+sub quals_by_cust_and_pkg {
+ my($self, $custnum, $pkgpart) = (shift,shift,shift);
+
+ die "invalid custnum or pkgpart"
+ unless ($custnum =~ /^\d+$/ && $pkgpart =~ /^\d+$/);
+
+ my $part_pkg = qsearchs('part_pkg', { 'pkgpart' => $pkgpart } );
+ die "no part_pkg found" unless $part_pkg;
+ my %vendor_pkg_ids = $part_pkg->vendor_pkg_ids;
+ my $external_id = $vendor_pkg_ids{$self->exportnum};
+ die "no vendor package id defined on this package" unless $external_id;
+
+ my $extra_sql = "where custnum = $custnum or locationnum in (select "
+ . "locationnum from cust_location where custnum = $custnum)";
+ my @quals = qsearch( { 'table' => 'qual', 'extra_sql' => $extra_sql, } );
+
+ my @filtered_quals;
+ foreach my $qual ( @quals ) {
+ my %qual_options = $qual->options;
+ my( $optionname, $optionvalue );
+ while (($optionname, $optionvalue) = each %qual_options) {
+ push @filtered_quals, $qual
+ if ( $optionname =~ /^ikano_Network_(\d+)_ProductGroup_(\d+)_Product_(\d+)_ProductCustomId$/
+ && $optionvalue eq $external_id );
+ }
+ }
+
+ @filtered_quals;