oops
[freeside.git] / FS / FS / payby.pm
1 package FS::payby;
2
3 use strict;
4 use vars qw(%hash @EXPORT_OK);
5 use Tie::IxHash;
6
7
8 =head1 NAME
9
10 FS::payby - Object methods for payment type records
11
12 =head1 SYNOPSIS
13
14   use FS::payby;
15
16   #for now...
17
18   my @payby = FS::payby->payby;
19
20   tie my %payby, 'Tie::IxHash', FS::payby->payby2longname
21
22   my @cust_payby = FS::payby->cust_payby;
23
24   tie my %payby, 'Tie::IxHash', FS::payby->cust_payby2longname
25
26 =head1 DESCRIPTION
27
28 Payment types.
29
30 =head1 METHODS
31
32 =over 4 
33
34 =item
35
36 =cut
37
38 tie %hash, 'Tie::IxHash',
39   'CARD' => {
40     tinyname  => 'card',
41     shortname => 'Credit card',
42     longname  => 'Credit card (automatic)',
43   },
44   'DCRD' => {
45     tinyname  => 'card',
46     shortname => 'Credit card',
47     longname  => 'Credit card (on-demand)',
48     cust_pay  => 'CARD', #this is a customer type only, payments are CARD...
49   },
50   'CHEK' => {
51     tinyname  => 'check',
52     shortname => 'Electronic check',
53     longname  => 'Electronic check (automatic)',
54   },
55   'DCHK' => {
56     tinyname  => 'check',
57     shortname => 'Electronic check',
58     longname  => 'Electronic check (on-demand)',
59     cust_pay  => 'CHEK', #this is a customer type only, payments are CHEK...
60   },
61   'LECB' => {
62     tinyname  => 'phone bill',
63     shortname => 'Phone bill billing',
64     longname  => 'Phone bill billing',
65   },
66   'BILL' => {
67     tinyname  => 'billing',
68     shortname => 'Billing',
69     longname  => 'Billing',
70   },
71   'CASH' => {
72     tinyname  => 'cash',
73     shortname => 'Cash', # initial payment, then billing
74     longname  => 'Cash',
75     cust_main => 'BILL', #this is a payment type only, customers go to BILL...
76   },
77   'WEST' => {
78     tinyname  => 'western union',
79     shortname => 'Western Union', # initial payment, then billing
80     longname  => 'Western Union',
81     cust_main => 'BILL', #this is a payment type only, customers go to BILL...
82   },
83   'MCRD' => { #not the same as DCRD
84     tinyname  => 'card',
85     shortname => 'Manual credit card', # initial payment, then billing
86     longname  => 'Manual credit card', 
87     cust_main => 'BILL', #this is a payment type only, customers go to BILL...
88   },
89   'COMP' => {
90     tinyname  => 'comp',
91     shortname => 'Complimentary',
92     longname  => 'Complimentary',
93   },
94   'DCLN' => {  # This is only an event.
95     tinyname  => 'declined',
96     shortname => 'Declined payment',
97     longname  => 'Declined payment',
98   },
99 ;
100
101 sub payby {
102   keys %hash;
103 }
104
105 sub payby2longname {
106   my $self = shift;
107   map { $_ => $hash{$_}->{longname} } $self->payby;
108 }
109
110 sub payby2bop {
111   { 'CARD' => 'CC'.
112     'CHEK' => 'ECHECK',};
113 }
114
115 sub cust_payby {
116   my $self = shift;
117   grep { ! exists $hash{$_}->{cust_main} } $self->payby;
118 }
119
120 sub cust_payby2longname {
121   my $self = shift;
122   map { $_ => $hash{$_}->{longname} } $self->cust_payby;
123 }
124
125 sub payinfo_check{
126   my($payby, $payinforef) = @_;
127
128   if ($payby eq 'CARD') {
129     $$payinforef =~ s/\D//g;
130     if ($$payinforef){
131       $$payinforef =~ /^(\d{13,16})$/
132         or return "Illegal (mistyped?) credit card number (payinfo)";
133       $$payinforef = $1;
134       validate($$payinforef) or return "Illegal credit card number";
135       return "Unknown card type" if cardype($$payinforef) eq "Unknown";
136     } else {
137       $$payinforef="N/A";
138     }
139   } else {
140     $$payinforef =~ /^([\w \!\@\#\$\%\&\(\)\-\+\;\:\'\"\,\.\?\/\=]*)$/
141     or return "Illegal text (payinfo)";
142     $$payinforef = $1;
143   }
144   '';
145 }
146
147 =back
148
149 =head1 BUGS
150
151 This should eventually be an actual database table, and all tables that
152 currently have a char payby field should have a foreign key into here instead.
153
154 =head1 SEE ALSO
155
156 =cut
157
158 1;
159