RT# 83450 - fixed rateplan export
[freeside.git] / FS / FS / otaker_Mixin.pm
1 package FS::otaker_Mixin;
2
3 use strict;
4 use Carp qw( croak ); #confess );
5 use FS::Record qw( qsearch qsearchs );
6 use FS::access_user;
7 use FS::UID qw( dbh );
8
9 sub otaker {
10   my $self = shift;
11   if ( scalar(@_) ) { #set
12     my $otaker = shift;
13     my $access_user = qsearchs('access_user', { 'username' => $otaker } );
14     if ( !$access_user && $otaker =~ /^(.+), (.+)$/ ) { #same as below..
15       my($lastname, $firstname) = ($1, $2);
16       $otaker = lc($firstname.$lastname);
17       $otaker =~ s/ //g;
18       $access_user =  qsearchs('access_user', { 'first' => $firstname, 
19                                                 'last'  => $lastname  } )
20                    || qsearchs('access_user', { 'username' => $otaker } );
21     }
22     croak "can't set otaker: $otaker not found!" unless $access_user; #confess?
23     $self->usernum( $access_user->usernum );
24     $otaker; #not sure return is used anywhere, but just in case
25   } else { #get
26     if ( $self->usernum ) {
27       # avoid a common failure mode: this should work even when the table 
28       # isn't foreign-keyed to access_user
29       my $access_user = FS::access_user->by_key($self->usernum);
30       if (!$access_user) {
31         croak "otaker called on ".$self->table."#".
32               $self->get($self->primary_key).
33               " but user does not exist";
34       }
35       return $access_user->username;
36     } elsif ( length($self->get('otaker')) ) {
37       $self->get('otaker');
38     } else {
39       '';
40     }
41   }
42 }
43
44 sub _upgrade_otaker {
45   my $class = shift;
46   my $table = $class->table;
47
48   my $limit = ( $table eq 'cust_attachment' ? 10 : 1000 );
49
50   while ( 1 ) {
51     my @records = qsearch({
52                     'table'     => $table,
53                     'hashref'   => {},
54                     'extra_sql' => "WHERE otaker IS NOT NULL LIMIT $limit",
55                   });
56     last unless @records;
57
58     foreach my $record (@records) {
59       eval { $record->otaker($record->otaker) };
60       if ( $@ ) {
61         my $username = $record->otaker;
62         my($lastname, $firstname) = ( 'User', 'Legacy' );
63         if ( $username =~ /^(.+), (.+)$/ ) {
64           ($lastname, $firstname) = ($1, $2);
65           $username = lc($firstname.$lastname);
66           $username =~ s/ //g;
67         }
68         my $access_user = new FS::access_user {
69           'username'  => $username,
70           '_password' => 'CHANGEME',
71           'first'     => $firstname,
72           'last'      => $lastname,
73           'disabled'  => 'Y',
74         };
75         my $error = $access_user->insert;
76         die $error if $error;
77         $record->otaker($record->otaker);
78       }
79       $record->set('otaker', '');
80       my $error = $record->replace;
81       die $error if $error;
82     }
83         
84     if ( $table eq 'cust_attachment' ) {
85         warn "  committing (cust_attachment) \n";
86         dbh->commit or die dbh->errstr;
87     }
88
89   }
90
91 }
92
93 1;