--- /dev/null
+#!/usr/bin/perl -w -CSDA
+use v5.14;
+use strict;
+use warnings;
+use utf8;
+
+use CGI::Fast qw/header param/;
+use Email::Simple;
+use Email::Sender::Simple qw/sendmail/;
+use File::Slurp qw/append_file/;
+use JSON qw/encode_json/;
+use YAML::Any qw/Dump LoadFile/;
+
+use Fcntl qw/LOCK_EX LOCK_UN/;
+use List::Util qw/sum/;
+
+##################################################
+
+# Inceput setari
+my %events = (
+ balti => {
+ date => 'duminică, 29 septembrie 2013',
+ locul => '',
+ sala => '',
+ locuri => 60,
+ link => '',
+ image => '',
+ },
+
+ bucuresti => {
+ date => 'sâmbătă, 21 septembrie 2013',
+ locul => '',
+ sala => '',
+ locuri => 60,
+ link => '',
+ image => '',
+ },
+
+ chisinau => {
+ date => 'sâmbătă, 28 septembrie 2013',
+ locul => '',
+ sala => '',
+ locuri => 60,
+ link => '',
+ image => '',
+ },
+
+ cluj => {
+ date => 'sâmbătă, 28 septembrie 2013',
+ locul => '',
+ sala => '',
+ locuri => 60,
+ link => '',
+ image => '',
+ },
+
+ constanta => {
+ date => 'sâmbătă, 21 septembrie 2013',
+ locul => '',
+ sala => '',
+ locuri => 60,
+ link => '',
+ image => '',
+ },
+
+ valcea => {
+ date => 'vineri, 27 septembrie 2013',
+ locul => '',
+ sala => '',
+ locuri => 60,
+ link => '',
+ image => '',
+ }
+);
+
+use constant EMAIL_FROM => 'Ziua Libertății Programelor — Fundația Ceata <zlp@ceata.org>';
+use constant ADMIN_EMAIL => 'Ziua Libertății Programelor — Fundația Ceata <zlp@ceata.org>';
+use constant DATAFILE => 'date.yml';
+# Sfarsit setari
+
+##################################################
+
+open LOCK, '<', DATAFILE;
+
+sub nr_participanti { my $event = shift; sum 0, map { $_->{numar} } grep { $_->{event} eq $event } @_ }
+
+sub append{
+ flock LOCK, LOCK_EX;
+
+ eval {
+ my $prenume = param('prenume') or die 'Nu ați completat câmpul pentru „Prenume”';
+ utf8::decode($prenume);
+ my $nume = param('nume') // '';
+ utf8::decode($nume);
+ my $email = param('email') or die 'Nu ați completat câmpul pentru „Adresa de poștă electronică”';
+ utf8::decode($email);
+ my $event = param('oras') or die 'Nu ați ales orașul cu evenimentul';
+ die 'Ziua Libertății Programelor nu se ține în orașul ales' unless exists $events{$event};
+ my $numar = int param('numar') or die 'Nu ați ales numărul de participanți';
+ die 'Numărul de participanți trebuie să fie între 1 și 5' unless $numar >= 1 && $numar <= 5;
+ my $captcha = param('captcha') or die 'Nu ați completat anul de lansare al proiectului GNU';
+ die 'Ați completat greșit anul de lansare al proiectului GNU' unless $captcha == 83;
+ my $spam = param('spam') or 0;
+ my @db = grep { $_->{event} eq $event } LoadFile DATAFILE;
+ die 'Această adresă de poștă electronică este deja folosită' if grep { $_->{email} eq $email } @db;
+ my $participanti = nr_participanti $event, @db;
+ die 'Nu sunt suficiente locuri libere' if $events{$event}{locuri} < $participanti + $numar;
+
+ my %entry = (
+ prenume => $prenume,
+ nume => $nume,
+ email => $email,
+ event => $event,
+ numar => $numar,
+ spam => defined($spam) && $spam ? 1 : 0,
+ );
+ my $success_email = Email::Simple->create(
+ header => [
+ To => "$nume <$email>",
+ Subject => 'Înscriere la Ziua Libertății Programelor',
+ From => EMAIL_FROM,
+ ],
+ body => "Aceasta este o confirmare de înscriere la Ziua Libertății Programelor\n\n" . Dump \%entry,
+ );
+ sendmail $success_email, { to => [$email, ADMIN_EMAIL]};
+ append_file DATAFILE, Dump \%entry;
+ };
+
+ flock LOCK, LOCK_UN;
+ if ($@) {
+ my $eroare = $@ =~ s/ at .*//r;
+ my $error_email = Email::Simple->create(
+ header => [
+ To => "Administrator <" . ADMIN_EMAIL . ">",
+ Subject => 'Eroare de înscriere la Ziua Libertății Programelor',
+ From => EMAIL_FROM,
+ ],
+ body => "Eroare: $eroare",
+ );
+ sendmail $error_email;
+ print header('text/html; charset=utf-8', '500 Internal Server Error');
+ print $eroare;
+ } else {
+ print header('text/html; charset=utf-8');
+ print 'Ați fost înscris cu succes';
+ }
+}
+
+sub info{
+ my $event = param('event');
+
+ eval {
+ die 'Eveniment inexistent' unless defined $event && exists $events{$event};
+ my %out = %{$events{$event}};
+ my $participanti = nr_participanti $event, LoadFile DATAFILE;
+ $out{locuri} = $out{locuri} - $participanti;
+ print header('application/json; charset=utf-8');
+ print encode_json \%out;
+ };
+
+ if ($@) {
+ $@ =~ s/ at .*//;
+ print header('text/html; charset=utf-8', '500 Internal Server Error');
+ print $@;
+ }
+}
+
+sub view{
+ my $event = param('event');
+
+ unless (exists $events{$event}) {
+ print header('text/html; charset=utf-8', '500 Internal Server Error');
+ print 'Acest eveniment nu există';
+ return;
+ }
+
+ my @db = grep { $_->{event} eq $event } LoadFile DATAFILE;
+ my $participanti = nr_participanti $event, @db;
+ print header('text/html; charset=utf-8');
+ print "Sunt $participanti participanți înscriși<p>";
+ for my $p(@db) {
+ 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>";
+ }
+}
+
+while (CGI::Fast->new) {
+ my $op = param 'op' // '';
+ append if $op eq 'append';
+ info if $op eq 'info';
+ view if $op eq 'view';
+}
+
+1;
+__END__
+
+=head1 NAME
+
+zlp - Formular de înscriere la Ziua Libertății Programelor
+
+=head1 AUTHOR
+
+Marius Gavrilescu E<lt>marius@ieval.roE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2013 Fundația Ceata
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+=cut