Commit | Line | Data |
---|---|---|
fb4277ce MG |
1 | #!/usr/bin/perl -w -CSDA |
2 | use v5.14; | |
3 | use strict; | |
4 | use warnings; | |
5 | use utf8; | |
6 | ||
7 | use CGI::Fast qw/header param/; | |
8 | use Email::Simple; | |
9 | use Email::Sender::Simple qw/sendmail/; | |
10 | use File::Slurp qw/append_file/; | |
11 | use JSON qw/encode_json/; | |
12 | use YAML::Any qw/Dump LoadFile/; | |
13 | ||
14 | use Fcntl qw/LOCK_EX LOCK_UN/; | |
15 | use List::Util qw/sum/; | |
16 | ||
17 | ################################################## | |
18 | ||
19 | # Inceput setari | |
20 | my %events = ( | |
fb4277ce | 21 | balti => { |
313b0389 TT |
22 | date => 'duminică, 29 septembrie 2013', |
23 | locul => '', | |
24 | sala => '', | |
25 | locuri => 60, | |
26 | link => '', | |
27 | image => '', | |
fb4277ce MG |
28 | }, |
29 | ||
313b0389 TT |
30 | bucuresti => { |
31 | date => 'sâmbătă, 21 septembrie 2013', | |
32 | locul => '', | |
33 | sala => '', | |
34 | locuri => 60, | |
35 | link => '', | |
36 | image => '', | |
fb4277ce MG |
37 | }, |
38 | ||
39 | chisinau => { | |
313b0389 TT |
40 | date => 'sâmbătă, 28 septembrie 2013', |
41 | locul => '', | |
42 | sala => '', | |
43 | locuri => 60, | |
44 | link => '', | |
45 | image => '', | |
46 | }, | |
47 | ||
48 | cluj => { | |
49 | date => 'sâmbătă, 28 septembrie 2013', | |
50 | locul => '', | |
51 | sala => '', | |
52 | locuri => 60, | |
53 | link => '', | |
54 | image => '', | |
fb4277ce MG |
55 | }, |
56 | ||
57 | constanta => { | |
313b0389 TT |
58 | date => 'sâmbătă, 21 septembrie 2013', |
59 | locul => '', | |
60 | sala => '', | |
61 | locuri => 60, | |
62 | link => '', | |
63 | image => '', | |
fb4277ce | 64 | }, |
313b0389 TT |
65 | |
66 | valcea => { | |
67 | date => 'vineri, 27 septembrie 2013', | |
68 | locul => '', | |
69 | sala => '', | |
70 | locuri => 60, | |
71 | link => '', | |
72 | image => '', | |
73 | } | |
fb4277ce MG |
74 | ); |
75 | ||
165d37a0 TT |
76 | use constant EMAIL_FROM => 'Ziua Libertății Programelor — Fundația Ceata <zlp@ceata.org>'; |
77 | use constant ADMIN_EMAIL => 'Ziua Libertății Programelor — Fundația Ceata <zlp@ceata.org>'; | |
78 | use constant DATAFILE => 'date.yml'; | |
fb4277ce MG |
79 | # Sfarsit setari |
80 | ||
81 | ################################################## | |
82 | ||
83 | open LOCK, '<', DATAFILE; | |
84 | ||
85 | sub nr_participanti { my $event = shift; sum 0, map { $_->{numar} } grep { $_->{event} eq $event } @_ } | |
86 | ||
87 | sub append{ | |
88 | flock LOCK, LOCK_EX; | |
89 | ||
90 | eval { | |
b3b0c5f1 | 91 | my $prenume = param('prenume') or die 'Nu ați completat câmpul pentru „Prenume”'; |
fb4277ce MG |
92 | utf8::decode($prenume); |
93 | my $nume = param('nume') // ''; | |
94 | utf8::decode($nume); | |
b3b0c5f1 | 95 | my $email = param('email') or die 'Nu ați completat câmpul pentru „Adresa de poștă electronică”'; |
fb4277ce | 96 | utf8::decode($email); |
b3b0c5f1 TT |
97 | my $event = param('oras') or die 'Nu ați ales orașul cu evenimentul'; |
98 | die 'Ziua Libertății Programelor nu se ține în orașul ales' unless exists $events{$event}; | |
99 | my $numar = int param('numar') or die 'Nu ați ales numărul de participanți'; | |
100 | die 'Numărul de participanți trebuie să fie între 1 și 5' unless $numar >= 1 && $numar <= 5; | |
101 | my $captcha = param('captcha') or die 'Nu ați completat anul de lansare al proiectului GNU'; | |
102 | die 'Ați completat greșit anul de lansare al proiectului GNU' unless $captcha == 83; | |
fb4277ce MG |
103 | my $spam = param('spam') or 0; |
104 | my @db = grep { $_->{event} eq $event } LoadFile DATAFILE; | |
b3b0c5f1 | 105 | die 'Această adresă de poștă electronică este deja folosită' if grep { $_->{email} eq $email } @db; |
fb4277ce MG |
106 | my $participanti = nr_participanti $event, @db; |
107 | die 'Nu sunt suficiente locuri libere' if $events{$event}{locuri} < $participanti + $numar; | |
108 | ||
109 | my %entry = ( | |
110 | prenume => $prenume, | |
111 | nume => $nume, | |
112 | email => $email, | |
113 | event => $event, | |
114 | numar => $numar, | |
115 | spam => defined($spam) && $spam ? 1 : 0, | |
116 | ); | |
117 | my $success_email = Email::Simple->create( | |
118 | header => [ | |
119 | To => "$nume <$email>", | |
b3b0c5f1 | 120 | Subject => 'Înscriere la Ziua Libertății Programelor', |
fb4277ce MG |
121 | From => EMAIL_FROM, |
122 | ], | |
b3b0c5f1 | 123 | body => "Aceasta este o confirmare de înscriere la Ziua Libertății Programelor\n\n" . Dump \%entry, |
fb4277ce MG |
124 | ); |
125 | sendmail $success_email, { to => [$email, ADMIN_EMAIL]}; | |
126 | append_file DATAFILE, Dump \%entry; | |
127 | }; | |
128 | ||
129 | flock LOCK, LOCK_UN; | |
130 | if ($@) { | |
131 | my $eroare = $@ =~ s/ at .*//r; | |
132 | my $error_email = Email::Simple->create( | |
133 | header => [ | |
134 | To => "Administrator <" . ADMIN_EMAIL . ">", | |
b3b0c5f1 | 135 | Subject => 'Eroare de înscriere la Ziua Libertății Programelor', |
fb4277ce MG |
136 | From => EMAIL_FROM, |
137 | ], | |
138 | body => "Eroare: $eroare", | |
139 | ); | |
140 | sendmail $error_email; | |
141 | print header('text/html; charset=utf-8', '500 Internal Server Error'); | |
142 | print $eroare; | |
143 | } else { | |
144 | print header('text/html; charset=utf-8'); | |
b3b0c5f1 | 145 | print 'Ați fost înscris cu succes'; |
fb4277ce MG |
146 | } |
147 | } | |
148 | ||
149 | sub info{ | |
150 | my $event = param('event'); | |
151 | ||
152 | eval { | |
153 | die 'Eveniment inexistent' unless defined $event && exists $events{$event}; | |
154 | my %out = %{$events{$event}}; | |
155 | my $participanti = nr_participanti $event, LoadFile DATAFILE; | |
156 | $out{locuri} = $out{locuri} - $participanti; | |
157 | print header('application/json; charset=utf-8'); | |
158 | print encode_json \%out; | |
159 | }; | |
160 | ||
161 | if ($@) { | |
162 | $@ =~ s/ at .*//; | |
163 | print header('text/html; charset=utf-8', '500 Internal Server Error'); | |
164 | print $@; | |
165 | } | |
166 | } | |
167 | ||
168 | sub view{ | |
169 | my $event = param('event'); | |
170 | ||
171 | unless (exists $events{$event}) { | |
172 | print header('text/html; charset=utf-8', '500 Internal Server Error'); | |
b3b0c5f1 | 173 | print 'Acest eveniment nu există'; |
fb4277ce MG |
174 | return; |
175 | } | |
176 | ||
177 | my @db = grep { $_->{event} eq $event } LoadFile DATAFILE; | |
178 | my $participanti = nr_participanti $event, @db; | |
179 | print header('text/html; charset=utf-8'); | |
b3b0c5f1 | 180 | print "Sunt $participanti participanți înscriși<p>"; |
fb4277ce MG |
181 | for my $p(@db) { |
182 | print "Nume: $p->{nume}<br>Prenume: $p->{prenume}<br>Email: $p->{email}<br>Event: $p->{event}<br>Numar: $p->{numar}<br>Spam: $p->{spam}<p>"; | |
183 | } | |
184 | } | |
185 | ||
186 | while (CGI::Fast->new) { | |
187 | my $op = param 'op' // ''; | |
188 | append if $op eq 'append'; | |
189 | info if $op eq 'info'; | |
190 | view if $op eq 'view'; | |
191 | } | |
192 | ||
193 | 1; | |
194 | __END__ | |
195 | ||
7df4a8ab MG |
196 | =encoding utf-8 |
197 | ||
fb4277ce MG |
198 | =head1 NAME |
199 | ||
b3b0c5f1 | 200 | zlp - Formular de înscriere la Ziua Libertății Programelor |
fb4277ce MG |
201 | |
202 | =head1 AUTHOR | |
203 | ||
204 | Marius Gavrilescu E<lt>marius@ieval.roE<gt> | |
205 | ||
206 | =head1 COPYRIGHT AND LICENSE | |
207 | ||
b3b0c5f1 | 208 | Copyright (C) 2013 Fundația Ceata |
fb4277ce MG |
209 | |
210 | This program is free software: you can redistribute it and/or modify | |
211 | it under the terms of the GNU Affero General Public License as published by | |
212 | the Free Software Foundation, either version 3 of the License, or | |
213 | (at your option) any later version. | |
214 | ||
215 | This program is distributed in the hope that it will be useful, | |
216 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
217 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
218 | GNU Affero General Public License for more details. | |
219 | ||
220 | You should have received a copy of the GNU Affero General Public License | |
221 | along with this program. If not, see <http://www.gnu.org/licenses/>. | |
222 | ||
223 | ||
224 | =cut |