#!/usr/bin/perl use strict; #use warnings; FIXME - Bug 2505 use Carp; BEGIN { # find Koha's Perl modules # test carefully before changing this use FindBin; eval { require "$FindBin::Bin/../kohalib.pl" }; } use C4::Context; use C4::Dates qw/format_date/; use Mail::Sendmail; # comment out if not doing e-mail notices use Getopt::Long; use C4::Circulation; # use C4::Members; # this module will notify only the mail case # Now it's only programmed for ouest provence, you can modify it for yourself # sub function for get all notifications are not sends sub GetNotifys { # my($branch) = @_; my $dbh = C4::Context->dbh; my $sth=$dbh->prepare("SELECT DISTINCT notifys.borrowernumber , borrowers.surname , borrowers.firstname , borrowers.title AS borrower_title , categories.category_type AS categorycode , borrowers.email , borrowers.contacttitle , borrowers.contactname , borrowers.contactfirstname , notifys.notify_level , notifys.method FROM notifys,borrowers,categories WHERE (notifys.borrowernumber=borrowers.borrowernumber) AND (notifys.notify_send_date IS NULL) AND (borrowers.categorycode = categories.categorycode)"); $sth->execute(); my @getnotifys; my $i=0; while (my $data=$sth->fetchrow_hashref){ $getnotifys[$i]=$data; $i++; } $sth->finish; return(@getnotifys); } sub GetBorrowerNotifys{ my ($borrowernumber) = @_; my $dbh = C4::Context->dbh; my @getnotifys2; my $sth2=$dbh->prepare("SELECT notifys.itemnumber,notifys.notify_level,biblio.title ,itemtypes.description, issues.date_due FROM notifys,biblio,items,itemtypes,biblioitems,issues WHERE (items.itemnumber=notifys.itemnumber AND biblio.biblionumber=items.biblionumber) AND (itemtypes.itemtype=biblioitems.itemtype AND biblioitems.biblionumber=biblio.biblionumber) AND (notifys.borrowernumber=issues.borrowernumber AND notifys.itemnumber=issues.itemnumber) AND notifys.borrowernumber=? AND notify_send_date IS NULL"); $sth2->execute($borrowernumber); my $j=0; while (my $data2=$sth2->fetchrow_hashref){ $getnotifys2[$j]=$data2; $j++; } $sth2->finish; return(@getnotifys2); } sub GetOverduerules{ my($category,$notify_level) = @_; my $dbh = C4::Context->dbh; my $sth=$dbh->prepare("SELECT letter".$notify_level.",debarred".$notify_level." FROM overduerules WHERE categorycode=?"); $sth->execute($category); my (@overduerules)=$sth->fetchrow_array; $sth->finish; return(@overduerules); } sub GetLetter{ my($letterid) = @_; my $dbh = C4::Context->dbh; my $sth=$dbh->prepare("SELECT title,content FROM letter WHERE code=?"); $sth->execute($letterid); my (@getletter)=$sth->fetchrow_array; $sth->finish; return(@getletter); } sub UpdateBorrowerDebarred{ my($borrowernumber) = @_; my $dbh = C4::Context->dbh; my $sth=$dbh->prepare("UPDATE borrowers SET debarred='1' WHERE borrowernumber=?"); $sth->execute($borrowernumber); $sth->finish; return 1; } sub UpdateNotifySendDate{ my($borrowernumber,$itemnumber,$notifyLevel) = @_; my $dbh = C4::Context->dbh; my $sth=$dbh->prepare("UPDATE notifys SET notify_send_date=now() WHERE borrowernumber=? AND itemnumber=? AND notify_send_date IS NULL AND notify_level=?"); $sth->execute($borrowernumber,$itemnumber,$notifyLevel); $sth->finish; return 1; } # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # work with get notifys my $smtpserver = 'smtp.yoursmtpserver'; # your smtp server (the server who sent mails) my $from = 'your@librarymailadress'; # all the mails sent to the borrowers will appear coming from here. # initiate file for wrong_mails my $outfile = 'wrong_mails.txt'; open( OUT, ">$outfile" ); binmode(OUT, 'utf8'); my @getnofifys = GetNotifys(); foreach my $num (@getnofifys) { my %notify; # if we have a method mail, we check witch mail letter we launch if ($num->{'method'} eq 'mail'){ my ($letterid,$debarred) = GetOverduerules($num->{'categorycode'},$num->{'notify_level'}); # now, we get the letter associated to letterid my($title,$content) = GetLetter($letterid); my $email = $num->{'email'}; #my $email = 'alaurin@ouestprovence.fr'; my $mailtitle = $title; # the title of the mails # Work with the adult category code if ($num->{'categorycode'} eq 'A') { # now deal with $content $content =~ s/\<\>/$num->{'borrower_title'}/g ; $content =~ s/\<\>/$num->{'surname'}/g ; $content =~ s/\<\>/$num->{'firstname'}/g ; my @getborrowernotify=GetBorrowerNotifys($num->{'borrowernumber'}); my $overdueitems; foreach my $notif(@getborrowernotify){ my $date=format_date($notif->{'date_due'}); if ($notif->{'notify_level'} eq $num->{'notify_level'}){ $overdueitems .= " - ".$notif->{'title'}."" ; $overdueitems .= " ( ".$notif->{'description'}." ) " ; $overdueitems .= "emprunté le :".$date; $overdueitems .= "
"; # FIXME at this time, the program consider the mail is send (in notify_send_date) but with no real check must be improved , we don't know if the mail was really to a real adress, and if there is a problem, we don't know how to return the notification to koha... UpdateNotifySendDate($num->{'borrowernumber'},$notif->{'itemnumber'},$num->{'notify_level'}); } } # if we don't have overdueitem replace content by nonotifys value, deal with it later if ($overdueitems){ $content =~ s/\<\>/$overdueitems/g; } else { $content = 'nonotifys'; } } # Work with the child category code (we add the parents infos) if ($num->{'categorycode'} eq 'C') { $content =~ s/\<\>/$num->{'contacttitle'}/g ; $content =~ s/\<\>/$num->{'contactname'}/g ; $content =~ s/\<\>/$num->{'contactfirstname'}/g ; $content =~ s/\<\>/$num->{'borrower_title'}/g ; $content =~ s/\<\>/$num->{'surname'}/g ; $content =~ s/\<\>/$num->{'firstname'}/g ; my @getborrowernotify=GetBorrowerNotifys($num->{'borrowernumber'}); my $overdueitems; foreach my $notif(@getborrowernotify){ my $date=format_date($notif->{'date_due'}); $overdueitems .= " - ".$notif->{'title'}."" ; $overdueitems .= " ( ".$notif->{'description'}." ) " ; $overdueitems .= "emprunté le :".$date; $overdueitems .= "
"; # FIXME at this time, the program consider the mail is send (in notify_send_date) but with no real check must be improved ... UpdateNotifySendDate($num->{'borrowernumber'},$notif->{'itemnumber'},$num->{'notify_level'}); } if ($overdueitems){ $content =~ s/\<\>/$overdueitems/g; } else { $content = 'nonotifys'; } } # initiate the send mail # decoding mailtitle for lisibility of mailtitle (bug with utf-8 values, so decoding it) utf8::decode($mailtitle); my $mailtext = $content; unshift @{$Mail::Sendmail::mailcfg{'smtp'}} , $smtpserver; # set your own mail server name here my %mail = ( To => $email, From => $from, Subject => $mailtitle, Message => $mailtext, 'content-type' => 'text/html; charset="utf-8"', ); # if we don't have any content for the mail, we don't launch mail, but notify it in a file if ($mailtext ne 'nonotifys') { sendmail(%mail) or carp $Mail::Sendmail::error; } else { print OUT $email ; } # now deal with the debarred mode # if ($debarred eq 1) { # �ajouter : si le lecteur est en mode debarred, ajouter la fonction qui nous permettra cela # UpdateBorrowerDebarred($num->{'borrowernumber'}); # } close(OUT); } }