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
153
154
155
156
157
158
|
package FS::payby;
use strict;
use vars qw(%hash @EXPORT_OK);
use Tie::IxHash;
=head1 NAME
FS::payby - Object methods for payment type records
=head1 SYNOPSIS
use FS::payby;
#for now...
my @payby = FS::payby->payby;
tie my %payby, 'Tie::IxHash', FS::payby->payby2longname
my @cust_payby = FS::payby->cust_payby;
tie my %payby, 'Tie::IxHash', FS::payby->cust_payby2longname
=head1 DESCRIPTION
Payment types.
=head1 METHODS
=over 4
=item
=cut
tie %hash, 'Tie::IxHash',
'CARD' => {
tinyname => 'card',
shortname => 'Credit card',
longname => 'Credit card (automatic)',
},
'DCRD' => {
tinyname => 'card',
shortname => 'Credit card',
longname => 'Credit card (on-demand)',
cust_pay => 'CARD', #this is a customer type only, payments are CARD...
},
'CHEK' => {
tinyname => 'check',
shortname => 'Electronic check',
longname => 'Electronic check (automatic)',
},
'DCHK' => {
tinyname => 'check',
shortname => 'Electronic check',
longname => 'Electronic check (on-demand)',
cust_pay => 'CHEK', #this is a customer type only, payments are CHEK...
},
'LECB' => {
tinyname => 'phone bill',
shortname => 'Phone bill billing',
longname => 'Phone bill billing',
},
'BILL' => {
tinyname => 'billing',
shortname => 'Billing',
longname => 'Billing',
},
'CASH' => {
tinyname => 'cash',
shortname => 'Cash', # initial payment, then billing
longname => 'Cash',
cust_main => 'BILL', #this is a payment type only, customers go to BILL...
},
'WEST' => {
tinyname => 'western union',
shortname => 'Western Union', # initial payment, then billing
longname => 'Western Union',
cust_main => 'BILL', #this is a payment type only, customers go to BILL...
},
'MCRD' => { #not the same as DCRD
tinyname => 'card',
shortname => 'Manual credit card', # initial payment, then billing
longname => 'Manual credit card',
cust_main => 'BILL', #this is a payment type only, customers go to BILL...
},
'COMP' => {
tinyname => 'comp',
shortname => 'Complimentary',
longname => 'Complimentary',
},
'DCLN' => { # This is only an event.
tinyname => 'declined',
shortname => 'Declined payment',
longname => 'Declined payment',
},
;
sub payby {
keys %hash;
}
sub payby2longname {
my $self = shift;
map { $_ => $hash{$_}->{longname} } $self->payby;
}
sub payby2bop {
{ 'CARD' => 'CC'.
'CHEK' => 'ECHECK',};
}
sub cust_payby {
my $self = shift;
grep { ! exists $hash{$_}->{cust_main} } $self->payby;
}
sub cust_payby2longname {
my $self = shift;
map { $_ => $hash{$_}->{longname} } $self->cust_payby;
}
sub payinfo_check{
my($payby, $payinforef) = @_;
if ($payby eq 'CARD') {
$$payinforef =~ s/\D//g;
if ($$payinforef){
$$payinforef =~ /^(\d{13,16})$/
or return "Illegal (mistyped?) credit card number (payinfo)";
$$payinforef = $1;
validate($$payinforef) or return "Illegal credit card number";
return "Unknown card type" if cardype($$payinforef) eq "Unknown";
} else {
$$payinforef="N/A";
}
} else {
$$payinforef =~ /^([\w \!\@\#\$\%\&\(\)\-\+\;\:\'\"\,\.\?\/\=]*)$/
or return "Illegal text (payinfo)";
$$payinforef = $1;
}
}
=back
=head1 BUGS
This should eventually be an actual database table, and all tables that
currently have a char payby field should have a foreign key into here instead.
=head1 SEE ALSO
=cut
1;
|