diff options
Diffstat (limited to 'GroLUG/lib')
-rw-r--r-- | GroLUG/lib/Catalyst/Engine/Null.pm | 32 | ||||
-rw-r--r-- | GroLUG/lib/GroLUG.pm | 1 | ||||
-rw-r--r-- | GroLUG/lib/GroLUG/C/Iscritto.pm | 278 | ||||
-rw-r--r-- | GroLUG/lib/GroLUG/M/DB/Pagamento.pm | 4 | ||||
-rw-r--r-- | GroLUG/lib/GroLUG/V/Email.pm | 18 | ||||
-rw-r--r-- | GroLUG/lib/HTML/Widget/Constraint/EuroAmount.pm | 9 | ||||
-rw-r--r-- | GroLUG/lib/HTML/Widget/Constraint/ISODate.pm | 18 |
7 files changed, 317 insertions, 43 deletions
diff --git a/GroLUG/lib/Catalyst/Engine/Null.pm b/GroLUG/lib/Catalyst/Engine/Null.pm new file mode 100644 index 0000000..2b910c2 --- /dev/null +++ b/GroLUG/lib/Catalyst/Engine/Null.pm @@ -0,0 +1,32 @@ +package Catalyst::Engine::Null; + +use strict; +use base 'Catalyst::Engine'; +use Catalyst::Utils; +use NEXT; +use URI; + +sub finalize_body { print STDERR "finalize_body\n"}; +sub finalize_cookies { print STDERR "finalize_cookies\n"}; +sub finalize_error { print STDERR "finalize_error\n"}; +sub finalize_read { print STDERR "finalize_read\n"}; +sub finalize_uploads { print STDERR "finalize_uploads\n"}; + +sub prepare_request { print STDERR "prepare_request\n"}; +sub prepare_query_parameters { print STDERR "prepare_query_parameters\n"}; +sub prepare_read { print STDERR "prepare_read\n"}; +sub prepare_uploads { print STDERR "prepare_uploads\n"}; +sub prepare_path { + print STDERR "prepare_path\n"; + my ($self,$c)=@_; + $c->request->uri(URI->new('/')); + $c->request->base(URI->new('/')); +} + +sub read { print STDERR "read\n"; '' }; +sub read_chunk { print STDERR "read_chunk\n"; '' }; + +sub write { print STDERR "write\n"}; + +1; + diff --git a/GroLUG/lib/GroLUG.pm b/GroLUG/lib/GroLUG.pm index 65a76a5..3f26f8c 100644 --- a/GroLUG/lib/GroLUG.pm +++ b/GroLUG/lib/GroLUG.pm @@ -8,6 +8,7 @@ use Catalyst qw{ Session Session::Store::DBI Session::State::Cookie Authentication Authentication::Store::Htpasswd Authentication::Credential::Password Authorization::Roles + HTML::Widget }; use Catalyst::Log::Log4perl; diff --git a/GroLUG/lib/GroLUG/C/Iscritto.pm b/GroLUG/lib/GroLUG/C/Iscritto.pm index f3b9975..adae5dc 100644 --- a/GroLUG/lib/GroLUG/C/Iscritto.pm +++ b/GroLUG/lib/GroLUG/C/Iscritto.pm @@ -4,6 +4,12 @@ use strict; use warnings; use base 'Catalyst::Controller'; use DateTime; +use DateTime::Duration; +use Data::Dumper; +use Email::MIME; +use Email::MIME::Creator; +use Email::Send (); +use Encode; sub auto :Private { my ( $self, $c ) = @_; @@ -19,50 +25,152 @@ sub iscritti :Global { my ( $self, $c ) = @_; $c->stash->{iscritti}=GroLUG::M::DB->resultset('Iscritto')->search({attivo=>1}); + $c->stash->{mode}='attivi'; $c->stash->{template}='lista-iscritti.tt2'; } +sub cessati :Global { + my ( $self, $c ) = @_; + + $c->stash->{iscritti}=GroLUG::M::DB->resultset('Iscritto')->search({attivo=>0}); + $c->stash->{mode}='cessati'; + $c->stash->{template}='lista-iscritti.tt2'; +} + +sub widget_for_iscr { + my ($self,$c,$id)=@_; + + my $iscritto= defined($id) + ? GroLUG::M::DB->resultset('Iscritto')->find($id) + : GroLUG::M::DB::Iscritto->new(); + my $widget=$c->widget('iscritto'); + $widget->method('post'); + $widget->element('Textfield','nome')->label('Nome')->value($iscritto->nome); + $widget->element('Textfield','email')->label('E-mail')->value($iscritto->email); + $widget->element('Textarea','note')->label('Note')->value($iscritto->note); + $widget->element('Submit','ok')->value('Ok'); + + $widget->filter('TrimEdges','nome','email','note'); + + $widget->constraint('All','nome','email'); + $widget->constraint('Email','email'); + $widget->constraint('Printable','nome'); + + $widget->indicator('email'); + + return wantarray?($widget,$iscritto):$widget; +} + sub scheda :Local { my ($self,$c,$id)=@_; $c->log->info($c->user->id,"scheda iscritto $id"); - $c->stash->{iscritto}=GroLUG::M::DB->resultset('Iscritto')->find($id); - + my $iscritto=GroLUG::M::DB->resultset('Iscritto')->find($id); + $c->stash->{iscritto}=$iscritto; + $c->stash->{pagato}=$self->check_pagato($iscritto); $c->stash->{template}='scheda-iscritto.tt2'; } sub edit :Local { my ($self,$c,$id)=@_; - $c->log->info($c->user->id,"edit iscritto $id"); + my ($widget,$iscritto)=$self->widget_for_iscr($c,$id); + $widget->action($c->uri_for('edit',$id)); + my $result=$c->widget_result($widget->name); - $c->stash->{iscritto}=my $iscritto=GroLUG::M::DB->resultset('Iscritto')->find($id); - - if ($c->req->method eq 'POST') { # ho i dati, li uso - my %data=map {$_ => $c->req->params->{$_}} qw(nome email note); - $iscritto->set_columns(\%data); - $iscritto->update(); - $c->res->redirect($c->uri_for('scheda',$iscritto->id)); - } - else { - $c->stash->{template}='edit-iscritto.tt2'; + if ($c->req->method eq 'POST') { # l'utente ci ha mandato dei dati + my @errors=$result->has_errors(); + if (@errors==0) { + my %data=map {$_ => $result->params->{$_}} qw(nome email note); + if (defined $id) { + $c->log->info($c->user->id,"edit iscritto $id"); + $iscritto->set_columns(\%data); + $iscritto->update(); + } + else { + $c->log->info($c->user->id,'nuovo iscritto'); + # non ha pagato: non รจ attivo + $data{attivo}=0; + $iscritto=GroLUG::M::DB->resultset('Iscritto')->create(\%data); + } + $c->res->redirect($c->uri_for('scheda',$iscritto->id)); + return; + } } + $c->stash->{mode}= (defined $id) ? 'edit' : 'nuovo'; + $c->stash->{widget}=$result; + $c->stash->{template}='edit-iscritto.tt2'; } -sub nuovo :Local { +sub cessa :Local { my ($self,$c,$id)=@_; - $c->log->info($c->user->id,"nuovo iscritto"); + my $iscritto=GroLUG::M::DB->resultset('Iscritto')->find($id); + $iscritto->attivo(0);$iscritto->update(); - if ($c->req->method eq 'POST') { # ho i dati, li uso - my %data=map {$_ => $c->req->params->{$_}} qw(nome email note); - my $iscritto=GroLUG::M::DB->resultset('Iscritto')->create(\%data); - $c->res->redirect('/iscritti'); - } - else { - $c->stash->{template}='nuovo-iscritto.tt2'; + $c->res->redirect($c->uri_for('scheda',$id)); +} + +sub attiva :Local { + my ($self,$c,$id)=@_; + + my $iscritto=GroLUG::M::DB->resultset('Iscritto')->find($id); + $iscritto->attivo(1);$iscritto->update(); + + $c->res->redirect($c->uri_for('scheda',$id)); +} + +sub strdate { + my ($date)=@_; + + return (defined $date ? $date->strftime('%F') : ''); +} + +sub widget_for_pag { + my ($self,$c,$pag,$iscr_id)=@_; + + my $pagamento=defined($pag) + ? ref($pag) + ? $pag + : GroLUG::M::DB->resultset('Pagamento')->find($pag) + : GroLUG::M::DB::Pagamento->new(); + + my $widget=$c->widget('pagamento'); + $widget->method('post'); + $widget->element('Textfield','data_pagamento')->label('Data del pagamento')->value(strdate($pagamento->data_pagamento)); + $widget->element('Textfield','data_iscrizione')->label('Data di iscrizione')->value(strdate($pagamento->data_iscrizione)); + $widget->element('Textfield','data_scadenza')->label('Data di scadenza')->value(strdate($pagamento->data_scadenza)); + $widget->element('Textfield','prezzo')->label('Importo pagato')->value($pagamento->prezzo); + $widget->element('Hidden','iscr_id')->value($iscr_id || (defined $pag ? $pagamento->iscritto->id : '')); + + $widget->element('Submit','ok')->value('Ok'); + + $widget->filter('TrimEdges','data_scadenza','data_pagamento','data_iscrizione','prezzo'); + + $widget->constraint('All','data_scadenza','data_pagamento','data_iscrizione','prezzo'); + $widget->constraint('ISODate','data_scadenza','data_pagamento','data_iscrizione'); + $widget->constraint('EuroAmount','prezzo'); + + $widget->indicator('iscr_id'); + + return wantarray?($widget,$pagamento):$widget; +} + +sub check_pagato { + my ($self,$iscritto)=@_; + + unless (ref $iscritto) { + $iscritto=GroLUG::M::DB->resultset('Iscritto')->find($iscritto); } + + my $pagamento_per_oggi=$iscritto->pagamenti->count({ + data_iscrizione => {'<=',DateTime->today()}, + data_scadenza => {'>=',DateTime->today()}, + }); + + return 1 if $pagamento_per_oggi > 0; + return; } sub rinnova :Local { @@ -72,40 +180,128 @@ sub rinnova :Local { $c->stash->{iscritto}=my $iscritto=GroLUG::M::DB->resultset('Iscritto')->find($id); my $last_pag=$iscritto->pagamenti()->next(); - my $scadenza=($last_pag ? $last_pag->data_scadenza() : DateTime->now()); - - $c->stash->{pagamento}={ - data_pagamento => DateTime->now(), + my $today=DateTime->today();$today->set_time_zone('UTC'); + my $scadenza=($last_pag ? $last_pag->data_scadenza() : $today); + $c->log->debug('creo pagamento nuovo'); + my $pag=GroLUG::M::DB::Pagamento->new({ + iscritto => $iscritto, + data_pagamento => $today, data_iscrizione => $scadenza->clone()->add(days => 1), data_scadenza => $scadenza->clone()->add($c->config->{iscrizione}->{durata}), prezzo => $c->config->{iscrizione}->{prezzo}, - }; + }); + my $widget=$self->widget_for_pag($c,$pag,$id); + $widget->action($c->uri_for('pagamento')); - $c->stash->{template}='nuovo-pagamento.tt2'; + $c->stash->{widget}=$c->widget_result($widget->name); + $c->stash->{template}='edit-pagamento.tt2'; } sub pagamento :Local { - my ($self,$c)=@_; + my ($self,$c,$id)=@_; - my $params=$c->req->parameters; + my ($widget,$pagamento)=$self->widget_for_pag($c,$id); + $widget->action($c->uri_for('pagamento',$id)); + my $result=$c->widget_result($widget->name); - my $iscritto=GroLUG::M::DB->resultset('Iscritto')->find($params->{iscr_id}); + if ($c->req->method eq 'POST') { # l'utente ci ha mandato dei dati + my @errors=$result->has_errors(); + if (@errors==0) { + my %data=map {$_ => $result->params->{$_}} qw(data_pagamento data_iscrizione data_scadenza prezzo); - $c->log->info($c->user->id,'pagamento iscritto '.($iscritto->id)); + if (defined $id) { + $c->log->info($c->user->id, + 'modifica pagamento ' + .($result->params->{pag_id}) + .' per iscritto ' + .($result->params->{iscr_id})); + $pagamento->set_columns(\%data); + $pagamento->update(); + } + else { + $c->log->info($c->user->id, + 'nuovo pagamento per iscritto ' + .($result->params->{iscr_id})); + $data{iscritto}=$result->params->{iscr_id}; + GroLUG::M::DB->resultset('Pagamento')->create(\%data); + } - my %data=map {$_ => $params->{$_}} qw(data_pagamento data_iscrizione data_scadenza prezzo); - $data{iscritto}=$iscritto->id; + $c->res->redirect($c->uri_for('scheda',$result->params->{iscr_id})); + return; + } + } + $c->stash->{widget}=$result; + $c->stash->{template}='edit-pagamento.tt2'; +} - if ($params->{pag_id} eq '') { - GroLUG::M::DB->resultset('Pagamento')->create(\%data); +sub cancella_pag :Local { + my ($self,$c,$id)=@_; + + my $pagamento=GroLUG::M::DB->resultset('Pagamento')->find($id); + my $iscritto=$pagamento->iscritto; + + if ($c->req->method eq 'POST') { + $pagamento->delete(); + $c->res->redirect($c->uri_for('scheda',$iscritto->id)); + return; } - else { - my $pag=GroLUG::M::DB->resultset('Pagamento')->find($params->{pag_id}); - $pag->set_columns(\%data); - $pag->update(); + $c->stash->{iscritto}=$iscritto; + $c->stash->{pagamento}=$pagamento; + $c->stash->{template}='cancella-pagamento.tt2'; +} + +sub send_email :Private { + my ($self,$c)=@_; + + my $iscritti=GroLUG::M::DB->resultset('Iscritto'); + my @scadenze=map { + +{ + anticipo => DateTime::Duration->new($_->{anticipo}), + messaggio => $_->{messaggio}, + } + } @{$c->config->{scadenze}}; + my $today=DateTime->today(); + + while (my $iscritto=$iscritti->next()) { + $c->log->debug('testo '.($iscritto->id)); + next if !$iscritto->attivo or !$iscritto->scadenza; + my $scadenza=$iscritto->scadenza; + + for my $termine (@scadenze) { + if ($today + $termine->{anticipo} == $scadenza) { + $c->stash->{iscritto}=$iscritto; + $c->stash->{template}=$termine->{messaggio}; + $c->forward('GroLUG::V::Email'); + my $body=$c->res->body; + my $subject='message'; + $subject=$1 if $body=~s{^ Subject: \s+ ([^\n]+) \n+}{}smx; + $subject=encode('MIME-Header',decode('utf-8',$subject)); + $c->log->debug("Invio email"); + my $message=Email::MIME->create( + header=>[ + From => $c->config->{'email-from'}, + To => $iscritto->email, + #To => 'dakkar@thenautilus.net', + Subject => $subject, + ], + attributes => { + content_type => 'text/plain', + charset => 'utf-8', + }, + body=>$body, + ); + my ($mailer,@mail_args)=@{$c->config->{email}}; + $c->log->debug("mailer: $mailer, args: @mail_args"); + my $sent=Email::Send->new({ + mailer=>$mailer, + mailer_args=>\@mail_args, + })->send($message); + $c->log->debug("inviato, $sent"); + } + } } - $c->res->redirect($c->uri_for('scheda',$iscritto->id())); + return; } 1; diff --git a/GroLUG/lib/GroLUG/M/DB/Pagamento.pm b/GroLUG/lib/GroLUG/M/DB/Pagamento.pm index 23ee176..7c6f939 100644 --- a/GroLUG/lib/GroLUG/M/DB/Pagamento.pm +++ b/GroLUG/lib/GroLUG/M/DB/Pagamento.pm @@ -12,8 +12,8 @@ for my $col (qw(data_pagamento data_iscrizione data_scadenza)) { __PACKAGE__->inflate_column( $col, { - inflate => sub { DateTime::Format::Pg->parse_datetime(shift) }, - deflate => sub { DateTime::Format::Pg->format_datetime(shift) }, + inflate => sub { DateTime::Format::Pg->parse_date(shift) }, + deflate => sub { DateTime::Format::Pg->format_date(shift) }, }); } diff --git a/GroLUG/lib/GroLUG/V/Email.pm b/GroLUG/lib/GroLUG/V/Email.pm new file mode 100644 index 0000000..5eb4189 --- /dev/null +++ b/GroLUG/lib/GroLUG/V/Email.pm @@ -0,0 +1,18 @@ +package GroLUG::V::Email; + +use strict; +use base 'Catalyst::View::TT'; + +__PACKAGE__->config({ + CATALYST_VAR => 'Catalyst', + INCLUDE_PATH => [ + GroLUG->path_to( 'root', 'src' ), + GroLUG->path_to( 'root', 'lib' ) + ], + PRE_PROCESS => 'config/main', + WRAPPER => 'site/mail-wrapper', + ERROR => 'error.tt2', + TIMER => 0 +}); + +1; diff --git a/GroLUG/lib/HTML/Widget/Constraint/EuroAmount.pm b/GroLUG/lib/HTML/Widget/Constraint/EuroAmount.pm new file mode 100644 index 0000000..7e80265 --- /dev/null +++ b/GroLUG/lib/HTML/Widget/Constraint/EuroAmount.pm @@ -0,0 +1,9 @@ +package HTML::Widget::Constraint::EuroAmount; + +use warnings; +use strict; +use base 'HTML::Widget::Constraint::Regex'; + +sub regex { qr{^\d+(?:\.\d{0,2})?$} }; + +1; diff --git a/GroLUG/lib/HTML/Widget/Constraint/ISODate.pm b/GroLUG/lib/HTML/Widget/Constraint/ISODate.pm new file mode 100644 index 0000000..f5680d2 --- /dev/null +++ b/GroLUG/lib/HTML/Widget/Constraint/ISODate.pm @@ -0,0 +1,18 @@ +package HTML::Widget::Constraint::ISODate; + +use warnings; +use strict; +use base 'HTML::Widget::Constraint'; +use DateTime::Format::Strptime; + +my $format=DateTime::Format::Strptime->new(pattern=>'%F'); + +sub validate { + my ($self,$value)=@_; + + my $val=$format->parse_datetime($value); + + return defined($val); +} + +1; |