per-agent disable_previous_balance, #15863
[freeside.git] / FS / FS / svc_Radius_Mixin.pm
1 package FS::svc_Radius_Mixin;
2
3 use strict;
4 use base qw(FS::m2m_Common FS::svc_Common);
5 use FS::Record qw(qsearch);
6 use FS::radius_group;
7 use FS::radius_usergroup;
8 use Carp qw(confess);
9
10 =head1 NAME
11
12 FS::svc_Radius_Mixin - partial base class for services with RADIUS groups
13
14 =head1 METHODS
15
16 =over 4
17
18 =cut
19
20
21 sub insert {
22   my $self = shift;
23   $self->SUPER::insert(@_)
24   || $self->process_m2m(
25     'link_table' => 'radius_usergroup',
26     'target_table' => 'radius_group',
27     'params' => $self->usergroup,
28   );
29 }
30
31 sub replace  {
32   my $new = shift;
33   my $old = shift;
34   $old = $new->replace_old if !defined($old);
35
36   $old->usergroup; # make sure this is cached for exports
37   $new->process_m2m(
38     'link_table' => 'radius_usergroup',
39     'target_table' => 'radius_group',
40     'params' => $new->usergroup,
41   ) || $new->SUPER::replace($old, @_);
42 }
43
44 sub delete {
45   my $self = shift;
46   $self->SUPER::delete(@_)
47   || $self->process_m2m(
48     'link_table' => 'radius_usergroup',
49     'target_table' => 'radius_group',
50     'params' => [],
51   );
52 }
53
54 sub usergroup {
55   my $self = shift;
56   my $value = shift;
57   if ( defined $value ) {
58     if ( ref $value ) {
59       return $self->set('usergroup', $value);
60     }
61     else {
62       return $self->set('usergroup', [ split(/\s*,\s*/, $value) ]);
63     }
64   }
65   $self->get('usergroup') || 
66     # if no argument is passed and usergroup is not set already, 
67     # fetch this service's group assignments
68   $self->set('usergroup', 
69     [ map { $_->groupnum } 
70         qsearch('radius_usergroup', { svcnum => $self->svcnum }) ]
71   );
72 }
73
74 sub _fieldhandlers {
75   { 
76     'usergroup' => \&usergroup
77   }
78 }
79
80 =item radius_groups METHOD
81
82 Returns a list of RADIUS groups for this service (see L<FS::radius_usergroup>).
83 METHOD is the field to return, and can be any method on L<FS::radius_group>.
84 Useful values for METHOD include 'groupnum', 'groupname', and 
85 'long_description'.  Defaults to 'groupname' for historical reasons.
86
87 =cut
88
89 sub radius_groups {
90   my $self = shift;
91   my $method = shift || 'groupname';
92   my $groups = join(',', @{$self->usergroup}) || return ();
93   my @groups = qsearch({'table' => 'radius_group',
94                         'extra_sql' => "where groupnum in ($groups)"});
95   return map {$_->$method} @groups;
96 }
97
98 =back
99
100 =cut
101
102 1;