thank you IE8
[freeside.git] / FS / FS / payby.pm
1 package FS::payby;
2
3 use strict;
4 use vars qw(%hash %payby2bop);
5 use Tie::IxHash;
6 use Business::CreditCard;
7
8
9 =head1 NAME
10
11 FS::payby - Object methods for payment type records
12
13 =head1 SYNOPSIS
14
15   use FS::payby;
16
17   #for now...
18
19   my @payby = FS::payby->payby;
20
21   my $bool = FS::payby->can_payby('cust_main', 'CARD');
22
23   tie my %payby, 'Tie::IxHash', FS::payby->payby2longname
24
25   my @cust_payby = FS::payby->cust_payby;
26
27   tie my %payby, 'Tie::IxHash', FS::payby->cust_payby2longname
28
29 =head1 DESCRIPTION
30
31 Payment types.
32
33 =head1 METHODS
34
35 =over 4 
36
37 =item
38
39 =cut
40
41 # paybys can be any/all of:
42 # - a customer payment type (cust_main.payby)
43 # - a payment or refund type (cust_pay.payby, cust_pay_batch.payby, cust_refund.payby)
44 # - an event type (part_bill_event.payby)
45
46 tie %hash, 'Tie::IxHash',
47   'CARD' => {
48     tinyname  => 'card',
49     shortname => 'Credit card',
50     longname  => 'Credit card (automatic)',
51   },
52   'DCRD' => {
53     tinyname  => 'card',
54     shortname => 'Credit card',
55     longname  => 'Credit card (on-demand)',
56     cust_pay  => 'CARD', #this is a customer type only, payments are CARD...
57   },
58   'CHEK' => {
59     tinyname  => 'check',
60     shortname => 'Electronic check',
61     longname  => 'Electronic check (automatic)',
62   },
63   'DCHK' => {
64     tinyname  => 'check',
65     shortname => 'Electronic check',
66     longname  => 'Electronic check (on-demand)',
67     cust_pay  => 'CHEK', #this is a customer type only, payments are CHEK...
68   },
69   'LECB' => {
70     tinyname  => 'phone bill',
71     shortname => 'Phone bill billing',
72     longname  => 'Phone bill billing',
73   },
74   'BILL' => {
75     tinyname  => 'billing',
76     shortname => 'Billing',
77     payname   => 'Check',
78     longname  => 'Billing',
79   },
80   'PREP' => {
81     tinyname  => 'prepaid card',
82     shortname => 'Prepaid card',
83     longname  => 'Prepaid card',
84     cust_main => 'BILL', #this is a payment type only, customers go to BILL...
85   },
86   'CASH' => {
87     tinyname  => 'cash',
88     shortname => 'Cash', # initial payment, then billing
89     longname  => 'Cash',
90     cust_main => 'BILL', #this is a payment type only, customers go to BILL...
91   },
92   'WEST' => {
93     tinyname  => 'western union',
94     shortname => 'Western Union', # initial payment, then billing
95     longname  => 'Western Union',
96     cust_main => 'BILL', #this is a payment type only, customers go to BILL...
97   },
98   'MCRD' => { #not the same as DCRD
99     tinyname  => 'card',
100     shortname => 'Manual credit card', # initial payment, then billing
101     longname  => 'Manual credit card', 
102     cust_main => 'BILL', #this is a payment type only, customers go to BILL...
103   },
104   'COMP' => {
105     tinyname  => 'comp',
106     shortname => 'Complimentary',
107     longname  => 'Complimentary',
108     cust_pay  => '', # (free) is depricated as a payment type in cust_pay
109   },
110   'CBAK' => {
111     tinyname  => 'chargeback',
112     shortname => 'Chargeback',
113     longname  => 'Chargeback',
114     cust_main => '', # not a customer type
115   },
116   'DCLN' => {  # This is only an event.
117     tinyname  => 'declined',
118     shortname => 'Batch declined payment',
119     longname  => 'Batch declined payment',
120
121     #its neither of these..
122     cust_main => '',
123     cust_pay  => '',
124
125   },
126 ;
127
128 sub payby {
129   keys %hash;
130 }
131
132 sub can_payby {
133   my( $self, $table, $payby ) = @_;
134
135   #return "Illegal payby" unless $hash{$payby};
136   return 0 unless $hash{$payby};
137
138   $table = 'cust_pay' if $table =~ /^cust_(pay_pending|pay_batch|pay_void|refund)$/;
139   return 0 if exists( $hash{$payby}->{$table} );
140
141   return 1;
142 }
143
144 sub payby2longname {
145   my $self = shift;
146   map { $_ => $hash{$_}->{longname} } $self->payby;
147 }
148
149 sub shortname {
150   my( $self, $payby ) = @_;
151   $hash{$payby}->{shortname};
152 }
153
154 sub payname {
155   my( $self, $payby ) = @_;
156   #$hash{$payby}->{payname} || $hash{$payby}->{shortname};
157   exists($hash{$payby}->{payname})
158     ? $hash{$payby}->{payname}
159     : $hash{$payby}->{shortname};
160 }
161
162 sub longname {
163   my( $self, $payby ) = @_;
164   $hash{$payby}->{longname};
165 }
166
167 %payby2bop = (
168   'CARD' => 'CC',
169   'CHEK' => 'ECHECK',
170 );
171
172 sub payby2bop {
173   my( $self, $payby ) = @_;
174   $payby2bop{ $self->payby2payment($payby) };
175 }
176
177 sub payby2payment {
178   my( $self, $payby ) = @_;
179   $hash{$payby}{'cust_pay'} || $payby;
180 }
181
182 sub cust_payby {
183   my $self = shift;
184   grep { ! exists $hash{$_}->{cust_main} } $self->payby;
185 }
186
187 sub cust_payby2longname {
188   my $self = shift;
189   map { $_ => $hash{$_}->{longname} } $self->cust_payby;
190 }
191
192 =back
193
194 =head1 BUGS
195
196 This should eventually be an actual database table, and all tables that
197 currently have a char payby field should have a foreign key into here instead.
198
199 =head1 SEE ALSO
200
201 =cut
202
203 1;
204