SMS - widespread cleanup and moving code away from Cyprus/Turkey-specific implementat...
[koha.git] / C4 / SMS.pm
1 package C4::SMS;
2 #Written by tgarip@neu.edu.tr for SMS message sending and other SMS related services
3
4 use strict;
5 use warnings;
6
7 use LWP::UserAgent;
8 use C4::Context;
9
10 use vars qw($VERSION @ISA @EXPORT);
11
12 BEGIN {
13         require Exporter;
14         @ISA = qw(Exporter);
15         $VERSION = 0.03;
16         @EXPORT = qw(
17                 &get_sms_auth 
18                 &send_sms 
19                 &read_sms
20                 &error_codes
21                 &parse_phone
22                 &parse_message
23                 &write_sms
24                 &mod_sms
25                 &kill_sms
26         );
27 }
28
29 our $user = C4::Context->config('smsuser');
30 our $pwd  = C4::Context->config('smspass');
31 our $uri  = "https://spgw.kktcell.com/smshttpproxy/SmsHttpProxyServlet";
32
33
34 sub get_sms_auth {
35     my $ua = LWP::UserAgent->new;
36         my $commands;
37         my $res=$ua->post($uri,[cmd=>'REGISTER',pUser=>$user,pPwd=>$pwd]);
38         if ($res->is_success){  
39                 $commands=parse_content($res->content);
40         }
41         return($commands,$ua);
42 }
43
44 sub send_sms {
45         my $ua = shift or return undef;
46         my $phone=shift;
47         my $message=shift;
48         my $session=shift;
49         my $res=$ua->post($uri,[cmd=>'SENDSMS',pUser=>$user,pPwd=>$pwd,pSessionId=>$session,pService_Code=>4130,pMsisdn=>$phone,
50                 pContent=>$message]);
51         return parse_content($res->content);
52 }
53
54 sub read_sms {
55         my $ua = shift or return undef;
56         my $session=shift;
57         my $res=$ua->post($uri,[cmd=>'GETSMS',pUser=>$user,pPwd=>$pwd,pSessionId=>$session,pService_Code=>4130]);
58         return parse_content($res->content);
59 }
60
61 sub parse_content {
62         my $content = shift;
63         my %commands;
64         my @attributes = split /&/,$content;
65         foreach my $params(@attributes){
66                 my (@param) = split /=/,$params;
67                 $commands{$param[0]}=$param[1];
68         }
69         return(\%commands);
70 }
71
72 sub error_codes {
73         my $error = shift;
74         ($error==    -1) and return     "Closed session - Retry";
75         ($error==    -2) and return     "Invalid session - Retry";
76         ($error==    -3) and return     "Invalid password";
77         ($error==  -103) and return     "Invalid user";
78         ($error==  -422) and return     "Invalid Parameter";
79         ($error==  -426) and return     "User does not have permission to send message";
80         ($error==  -700) and return     "No permission";
81         ($error==  -801) and return     "Msdisn count differs - warn administartor";
82         ($error==  -803) and return     "Content count differs from XSER count";
83         ($error== -1101) and return     "Insufficient Credit -  Do not retry";
84         ($error== -1104) and return     "Invalid Phone number";
85         ($error==-10001) and return     "Internal system error - Notify provider";
86         ($error== -9005) and return     "No messages to read";
87         if ($error){
88                 warn "Unknown SMS error '$error' occured";
89                 return  "Unknown SMS error '$error' occured";
90         }
91 }
92
93 sub parse_phone {
94         ## checks acceptable phone numbers
95         ## FIXME: accept Telsim when available (542 numbers)
96         my $phone=shift;
97         $phone=~s/^0//g;
98         $phone=~s/ //g;
99         my $length=length($phone);
100         if ($length==10 || $length==12){
101                 my $code=substr($phone,0,3) if $length==10;
102                    $code=substr($phone,0,5) if $length==12;
103                 if ($code=~/533/){
104                         return $phone;
105                 }
106         }
107         return 0;
108 }
109
110 sub parse_message {
111         my $message = shift;
112         $message =~ s/  / /g;
113         my @parsed = split / /, $message;
114         return (@parsed);
115 }
116
117 sub write_sms {
118         my ($userid,$message,$phone)=@_;
119         my $dbh=C4::Context->dbh;
120         my $sth=$dbh->prepare("INSERT into sms_messages(userid,message,user_phone,date_received) values(?,?,?,now())");
121         $sth->execute($userid,$message,$phone);
122         $sth->finish;
123         return $dbh->{'mysql_insertid'};        # FIXME: mysql specific
124 }
125
126 sub mod_sms {
127         my ($smsid,$message)=@_;
128         my $dbh=C4::Context->dbh;
129         my $sth=$dbh->prepare("UPDATE sms_messages set reply=?, date_replied=now() where smsid=?");
130         $sth->execute($message,$smsid);
131 }
132
133 sub kill_sms {
134         #end a session
135         my $ua = shift or return undef;
136         my $session = shift;
137         my $res = $ua->post($uri,[cmd=>'KILLSESSION',pSessionId=>$session]);
138 }
139 1;
140 __END__