aglpt 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #!/usr/bin/perl -w -CSDA
  2. use v5.14;
  3. use strict;
  4. use warnings;
  5. use utf8;
  6. use CGI::Fast qw/header param/;
  7. use CGI::Fast qw/Vars/;
  8. use Data::Dumper;
  9. use Email::Simple;
  10. use Email::Sender::Simple qw/sendmail/;
  11. use File::Slurp qw/append_file/;
  12. use JSON qw/encode_json/;
  13. use YAML::Any qw/Dump LoadFile/;
  14. use Fcntl qw/LOCK_EX LOCK_UN/;
  15. use List::Util qw/sum/;
  16. ##################################################
  17. # Inceput setari
  18. my %events = (
  19. balti => {
  20. date => 'marți, 3 decembrie 2013',
  21. locul => '',
  22. sala => '',
  23. locuri => 15,
  24. link => 'http://ceata.org/evenimente/atelier-de-grafice-%C3%AEn-latex-cu-pgf-tikz-%C3%AEn-b%C4%83l%C8%9Bi.html',
  25. image => '',
  26. }
  27. );
  28. use constant EMAIL_FROM => 'Atelier de grafice în LaTeX cu PGF+TikZ — Fundația Ceata <aglpt@ceata.org>';
  29. use constant ADMIN_EMAIL => 'aglpt@ceata.org';
  30. use constant DATAFILE => 'date.yml';
  31. # Sfarsit setari
  32. ##################################################
  33. open LOCK, '<', DATAFILE;
  34. sub nr_participanti { my $oras = shift; sum 0, map { $_->{numar} } grep { $_->{oras} eq $oras } @_ }
  35. sub append{
  36. flock LOCK, LOCK_EX;
  37. eval {
  38. my $prenume = param('prenume') or die 'Nu ați completat prenumele';
  39. utf8::decode($prenume);
  40. my $nume = param('nume') // '';
  41. utf8::decode($nume);
  42. my $adresa = param('adresa') or die 'Nu ați completat adresa de poștă electronică';
  43. utf8::decode($adresa);
  44. utf8::decode($nume);
  45. my $oras = 'balti';
  46. my $numar = int param('numar') or die 'Nu ați ales numărul de participanți';
  47. die 'Numărul de participanți trebuie să fie între 1 și 5' unless $numar >= 1 && $numar <= 5;
  48. my $captcha = param('captcha') or die 'Nu ați completat ora atelierului.';
  49. die 'Ați completat greșit ora atelierului' unless $captcha == 15;
  50. my $referinta = param('referinta') || param('referinta2');
  51. my $anunturi = param('anunturi') or 0;
  52. my @db = grep { $_->{oras} eq $oras } LoadFile DATAFILE;
  53. die 'Această adresă de poștă electronică este deja folosită' if grep { $_->{adresa} eq $adresa } @db;
  54. my $participanti = nr_participanti $oras, @db;
  55. die 'Nu sunt suficiente locuri libere' if $events{$oras}{locuri} < $participanti + $numar;
  56. my %entry = (
  57. prenume => $prenume,
  58. nume => $nume,
  59. adresa => $adresa,
  60. oras => $oras,
  61. numar => $numar,
  62. referinta => $referinta,
  63. anunturi => defined($anunturi) && $anunturi ? 1 : 0,
  64. );
  65. my $success_email = Email::Simple->create(
  66. header => [
  67. To => "$nume <$adresa>",
  68. Subject => 'Confirmarea de înscriere la: Atelierul de grafice în LaTeX cu PGF+TikZ, din Bălți',
  69. From => EMAIL_FROM,
  70. ],
  71. body => "Aceasta este o confirmare automată de înscriere la atelierul de grafice în LaTeX cu PGF+TikZ, organizat de Fundația Ceata în Bălți marți, 3 decembrie la ora 15:00 în Aula 537 din Blocul 5 al Universității de Stat „Alecu Russo”.\n\n" . Dump \%entry,
  72. );
  73. sendmail $success_email, { to => [$adresa, ADMIN_EMAIL]};
  74. append_file DATAFILE, Dump \%entry;
  75. };
  76. flock LOCK, LOCK_UN;
  77. if ($@) {
  78. my $eroare = $@ =~ s/ at .*//r;
  79. my $error_email = Email::Simple->create(
  80. header => [
  81. To => "Administrator <" . ADMIN_EMAIL . ">",
  82. Subject => 'Eroare de înscriere la: Atelierul de grafice în LaTeX cu PGF+TikZ, din Bălți',
  83. From => EMAIL_FROM,
  84. ],
  85. body => "Eroare: $eroare\n" . Dumper scalar Vars,
  86. );
  87. sendmail $error_email;
  88. print header('text/html; charset=utf-8', '500 Internal Server Error');
  89. print $eroare;
  90. } else {
  91. print header('text/html; charset=utf-8');
  92. print 'Ați fost înscris cu succes';
  93. }
  94. }
  95. sub info{
  96. my $oras = param('oras');
  97. eval {
  98. die 'Eveniment inexistent' unless defined $oras && exists $events{$oras};
  99. my %out = %{$events{$oras}};
  100. my $participanti = nr_participanti $oras, LoadFile DATAFILE;
  101. $out{locuri} = $out{locuri} - $participanti;
  102. print header('application/json; charset=utf-8');
  103. print encode_json \%out;
  104. };
  105. if ($@) {
  106. $@ =~ s/ at .*//;
  107. print header('text/html; charset=utf-8', '500 Internal Server Error');
  108. print $@;
  109. }
  110. }
  111. sub view{
  112. my $oras = param('oras');
  113. unless (exists $events{$oras}) {
  114. print header('text/html; charset=utf-8', '500 Internal Server Error');
  115. print 'Acest eveniment nu există';
  116. return;
  117. }
  118. my @db = grep { $_->{oras} eq $oras } LoadFile DATAFILE;
  119. my $participanti = nr_participanti $oras, @db;
  120. print header('text/html; charset=utf-8');
  121. print "Sunt $participanti participanți înscriși<p>";
  122. # for my $p(@db) {
  123. # print "Nume: $p->{nume}<br>Prenume: $p->{prenume}<br>Adresa: $p->{adresa}<br>Oras: $p->{oras}<br>Numar: $p->{numar}<br>Anunturi: $p->{anunturi}<p>";
  124. # }
  125. }
  126. while (CGI::Fast->new) {
  127. my $op = param 'op' // '';
  128. append if $op eq 'append';
  129. info if $op eq 'info';
  130. view if $op eq 'view';
  131. }
  132. 1;
  133. __END__
  134. =head1 NAME
  135. hgcj - Formular de înscriere la atelierul de grafice în LaTeX cu PGF+TikZ, din Bălți
  136. =head1 AUTHORS
  137. Marius Gavrilescu E<lt>marius@ieval.roE<gt>
  138. Tiberiu C. Turbureanu E<lt>tct@ceata.org<gt>
  139. =head1 COPYRIGHT AND LICENSE
  140. Copyright (C) 2013 Fundația Ceata
  141. This program is free software: you can redistribute it and/or modify
  142. it under the terms of the GNU Affero General Public License as published by
  143. the Free Software Foundation, either version 3 of the License, or
  144. (at your option) any later version.
  145. This program is distributed in the hope that it will be useful,
  146. but WITHOUT ANY WARRANTY; without even the implied warranty of
  147. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  148. GNU Affero General Public License for more details.
  149. You should have received a copy of the GNU Affero General Public License
  150. along with this program. If not, see <http://www.gnu.org/licenses/>.
  151. =cut