show credit balance on invoices, #11564
[freeside.git] / FS / FS / svc_Domain_Mixin.pm
1 package FS::svc_Domain_Mixin;
2
3 use strict;
4 use FS::Conf;
5 use FS::Record qw(qsearch qsearchs);
6 use FS::part_svc;
7 use FS::cust_pkg;
8 use FS::cust_svc;
9 use FS::svc_domain;
10
11 =head1 NAME
12
13 FS::svc_Domain_Mixin - Mixin class for svc_classes with a domsvc field
14
15 =head1 SYNOPSIS
16
17 package FS::svc_table;
18 use base qw( FS::svc_Domain_Mixin FS::svc_Common );
19
20 =head1 DESCRIPTION
21
22 This is a mixin class for svc_ classes that contain a domsvc field linking to
23 a domain (see L<FS::svc_domain>).
24
25 =head1 METHODS
26
27 =over 4
28
29 =item domain [ END_TIMESTAMP [ START_TIMESTAMP ] ]
30
31 Returns the domain associated with this account.
32
33 END_TIMESTAMP and START_TIMESTAMP can optionally be passed when dealing with
34 history records.
35
36 =cut
37
38 sub domain {
39   my $self = shift;
40   #die "svc_acct.domsvc is null for svcnum ". $self->svcnum unless $self->domsvc;
41   return '' unless $self->domsvc;
42   my $svc_domain = $self->svc_domain(@_)
43     or die "no svc_domain.svcnum for domsvc ". $self->domsvc;
44   $svc_domain->domain;
45 }
46
47 =item svc_domain
48
49 Returns the FS::svc_domain record for this account's domain (see
50 L<FS::svc_domain>).
51
52 =cut
53
54 # FS::h_svc_acct has a history-aware svc_domain override
55
56 sub svc_domain {
57   my $self = shift;
58   $self->{'_domsvc'}
59     ? $self->{'_domsvc'}
60     : qsearchs( 'svc_domain', { 'svcnum' => $self->domsvc } );
61 }
62
63 =item domain_select_hash %OPTIONS
64
65 Object or class method.
66
67 Returns a hash SVCNUM => DOMAIN ...  representing the domains this customer
68 may at present purchase.
69
70 Currently available options are: I<pkgnum> and I<svcpart>.
71
72 =cut
73
74 sub domain_select_hash {
75   my ($self, %options) = @_;
76   my %domains = ();
77
78   my $conf = new FS::Conf;
79
80   my $part_svc;
81   my $cust_pkg;
82
83   if (ref($self)) {
84     $part_svc = $self->part_svc;
85     $cust_pkg = $self->cust_svc->cust_pkg
86       if $self->cust_svc;
87   }
88
89   $part_svc = qsearchs('part_svc', { 'svcpart' => $options{svcpart} })
90     if $options{'svcpart'};
91
92   $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $options{pkgnum} })
93     if $options{'pkgnum'};
94
95   if ($part_svc && ( $part_svc->part_svc_column('domsvc')->columnflag eq 'S'
96                   || $part_svc->part_svc_column('domsvc')->columnflag eq 'F')) {
97     %domains = map { $_->svcnum => $_->domain }
98                map { qsearchs('svc_domain', { 'svcnum' => $_ }) }
99                split(',', $part_svc->part_svc_column('domsvc')->columnvalue);
100   }elsif ($cust_pkg && !$conf->exists('svc_acct-alldomains') ) {
101     %domains = map { $_->svcnum => $_->domain }
102                map { qsearchs('svc_domain', { 'svcnum' => $_->svcnum }) }
103                map { qsearch('cust_svc', { 'pkgnum' => $_->pkgnum } ) }
104                qsearch('cust_pkg', { 'custnum' => $cust_pkg->custnum });
105   }else{
106     %domains = map { $_->svcnum => $_->domain } qsearch('svc_domain', {} );
107   }
108
109   if ($part_svc && $part_svc->part_svc_column('domsvc')->columnflag eq 'D') {
110     my $svc_domain = qsearchs('svc_domain',
111       { 'svcnum' => $part_svc->part_svc_column('domsvc')->columnvalue } );
112     if ( $svc_domain ) {
113       $domains{$svc_domain->svcnum}  = $svc_domain->domain;
114     }else{
115       warn "unknown svc_domain.svcnum for part_svc_column domsvc: ".
116            $part_svc->part_svc_column('domsvc')->columnvalue;
117
118     }
119   }
120
121   (%domains);
122 }
123
124 =back
125
126 =head1 BUGS
127
128 =head1 SEE ALSO
129
130 L<FS::svc_Common>, L<FS::Record>
131
132 =cut
133
134 1;