session monitor updates
[freeside.git] / FS / FS / cust_credit.pm
1 package FS::cust_credit;
2
3 use strict;
4 use vars qw( @ISA );
5 use FS::UID qw( getotaker );
6 use FS::Record qw( qsearchs );
7 use FS::cust_main;
8
9 @ISA = qw( FS::Record );
10
11 =head1 NAME
12
13 FS::cust_credit - Object methods for cust_credit records
14
15 =head1 SYNOPSIS
16
17   use FS::cust_credit;
18
19   $record = new FS::cust_credit \%hash;
20   $record = new FS::cust_credit { 'column' => 'value' };
21
22   $error = $record->insert;
23
24   $error = $new_record->replace($old_record);
25
26   $error = $record->delete;
27
28   $error = $record->check;
29
30 =head1 DESCRIPTION
31
32 An FS::cust_credit object represents a credit.  FS::cust_credit inherits from
33 FS::Record.  The following fields are currently supported:
34
35 =over 4
36
37 =item crednum - primary key (assigned automatically for new credits)
38
39 =item custnum - customer (see L<FS::cust_main>)
40
41 =item amount - amount of the credit
42
43 =item credited - how much of this credit that is still outstanding, which is
44 amount minus all refunds (see L<FS::cust_refund>).
45
46 =item _date - specified as a UNIX timestamp; see L<perlfunc/"time">.  Also see
47 L<Time::Local> and L<Date::Parse> for conversion functions.
48
49 =item otaker - order taker (assigned automatically, see L<FS::UID>)
50
51 =item reason - text
52
53 =back
54
55 =head1 METHODS
56
57 =over 4
58
59 =item new HASHREF
60
61 Creates a new credit.  To add the credit to the database, see L<"insert">.
62
63 =cut
64
65 sub table { 'cust_credit'; }
66
67 =item insert
68
69 Adds this credit to the database ("Posts" the credit).  If there is an error,
70 returns the error, otherwise returns false.
71
72 When adding new invoices, credited must be amount (or null, in which case it is
73 automatically set to amount).
74
75 =cut
76
77 sub insert {
78   my $self = shift;
79
80   my $error;
81   return $error if $error = $self->ut_money('credited')
82                          || $self->ut_money('amount');
83
84   $self->credited($self->amount) if $self->credited == 0
85                                  || $self->credited eq '';
86   return "credited != amount!"
87     unless $self->credited == $self->amount;
88
89   $self->SUPER::insert;
90 }
91
92 =item delete
93
94 Currently unimplemented.
95
96 =cut
97
98 sub delete {
99   return "Can't remove credit!"
100 }
101
102 =item replace OLD_RECORD
103
104 Replaces the OLD_RECORD with this one in the database.  If there is an error,
105 returns the error, otherwise returns false.
106
107 Only credited may be changed.  Credited is normally updated by creating and
108 inserting a refund (see L<FS::cust_refund>).
109
110 =cut
111
112 sub replace {
113   my ( $new, $old ) = ( shift, shift );
114
115   return "Can't change custnum!" unless $old->custnum == $new->custnum;
116   #return "Can't change date!" unless $old->_date eq $new->_date;
117   return "Can't change date!" unless $old->_date == $new->_date;
118   return "Can't change amount!" unless $old->amount == $new->amount;
119   return "(New) credited can't be > (new) amount!"
120     if $new->credited > $new->amount;
121
122   $new->SUPER::replace($old);
123 }
124
125 =item check
126
127 Checks all fields to make sure this is a valid credit.  If there is an error,
128 returns the error, otherwise returns false.  Called by the insert and replace
129 methods.
130
131 =cut
132
133 sub check {
134   my $self = shift;
135
136   my $error =
137     $self->ut_numbern('crednum')
138     || $self->ut_number('custnum')
139     || $self->ut_numbern('_date')
140     || $self->ut_money('amount')
141     || $self->ut_money('credited')
142     || $self->ut_textn('reason');
143   ;
144   return $error if $error;
145
146   return "Unknown customer"
147     unless qsearchs( 'cust_main', { 'custnum' => $self->custnum } );
148
149   $self->_date(time) unless $self->_date;
150
151   $self->otaker(getotaker);
152
153   ''; #no error
154 }
155
156 =back
157
158 =head1 VERSION
159
160 $Id: cust_credit.pm,v 1.1 1999-08-04 09:03:53 ivan Exp $
161
162 =head1 BUGS
163
164 The delete method.
165
166 =head1 SEE ALSO
167
168 L<FS::Record>, L<FS::cust_refund>, L<FS::cust_bill>, schema.html from the base
169 documentation.
170
171 =cut
172
173 1;
174