summaryrefslogtreecommitdiff
path: root/FS/FS/cust_pkg_reason_fee.pm
blob: 1155c15ea04a936f980c9200e496c2ffd595154e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package FS::cust_pkg_reason_fee;

use strict;
use base qw( FS::Record FS::FeeOrigin_Mixin );
use FS::Record qw( qsearch qsearchs );

=head1 NAME

FS::cust_pkg_reason_fee - Object methods for cust_pkg_reason_fee records

=head1 SYNOPSIS

  use FS::cust_pkg_reason_fee;

  $record = new FS::cust_pkg_reason_fee \%hash;
  $record = new FS::cust_pkg_reason_fee { 'column' => 'value' };

  $error = $record->insert;

  $error = $new_record->replace($old_record);

  $error = $record->delete;

  $error = $record->check;

=head1 DESCRIPTION

An FS::cust_pkg_reason_fee object links a package status change that charged
a fee (an L<FS::cust_pkg_reason> object) to the resulting invoice line item.
FS::cust_pkg_reason_fee inherits from FS::Record and FS::FeeOrigin_Mixin.  
The following fields are currently supported:

=over 4

=item pkgreasonfeenum - primary key

=item pkgreasonnum - key of the cust_pkg_reason object that triggered the fee.

=item billpkgnum - key of the cust_bill_pkg record representing the fee on an
invoice. This can be NULL if the fee is scheduled but hasn't been billed yet.

=item feepart - key of the fee definition (L<FS::part_fee>).

=item nextbill - 'Y' if the fee should be charged on the customer's next bill,
rather than causing a bill to be produced immediately.

=back

=head1 METHODS

=over 4

=item new HASHREF

Creates a new record.  To add the record to the database, see L<"insert">.

=cut

sub table { 'cust_pkg_reason_fee'; }

=item insert

Adds this record to the database.  If there is an error, returns the error,
otherwise returns false.

=item delete

Delete this record from the database.

=item replace OLD_RECORD

Replaces the OLD_RECORD with this one in the database.  If there is an error,
returns the error, otherwise returns false.

=item check

Checks all fields to make sure this is a valid example.  If there is
an error, returns the error, otherwise returns false.  Called by the insert
and replace methods.

=cut

sub check {
  my $self = shift;

  my $error = 
    $self->ut_numbern('pkgreasonfeenum')
    || $self->ut_foreign_key('pkgreasonnum', 'cust_pkg_reason', 'num')
    || $self->ut_foreign_keyn('billpkgnum', 'cust_bill_pkg', 'billpkgnum')
    || $self->ut_foreign_key('feepart', 'part_fee', 'feepart')
    || $self->ut_flag('nextbill')
  ;
  return $error if $error;

  $self->SUPER::check;
}

=back

=head1 CLASS METHODS

=over 4

=item _by_cust CUSTNUM[, PARAMS]

See L<FS::FeeOrigin_Mixin/by_cust>.

=cut

sub _by_cust {
  my $class = shift;
  my $custnum = shift or return;
  my %params = @_;
  $custnum =~ /^\d+$/ or die "bad custnum $custnum";
    
  my $where = ($params{hashref} && keys (%{ $params{hashref} }))
              ? 'AND'
              : 'WHERE';
  qsearch({
    table     => 'cust_pkg_reason_fee',
    addl_from => 'JOIN cust_pkg_reason ON (cust_pkg_reason_fee.pkgreasonnum = cust_pkg_reason.num) ' .
                 'JOIN cust_pkg USING (pkgnum) ',
    extra_sql => "$where cust_pkg.custnum = $custnum",
    %params
  });
}

=back

=head1 METHODS

=over 4

=item cust_pkg

Returns the package that triggered the fee.

=cut

sub cust_pkg {
  my $self = shift;
  $self->cust_pkg_reason->cust_pkg;
}

=head1 SEE ALSO

L<FS::FeeOrigin_Mixin>, L<FS::cust_pkg_reason>, L<part_fee>

=cut

1;