diff options
Diffstat (limited to 'GroLUG/lib/GroLUG/C/Iscritto.pm')
-rw-r--r-- | GroLUG/lib/GroLUG/C/Iscritto.pm | 278 |
1 files changed, 237 insertions, 41 deletions
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; |