package GroLUG::C::Iscritto; use strict; use warnings; use base 'Catalyst::Controller'; use DateTime; use DateTime::Duration; use Email::MIME; use Email::MIME::Creator; use Email::Send (); use Encode; sub auto :Private { my ( $self, $c ) = @_; unless ($c->user_exists) { $c->res->redirect($c->uri_for('/login')); return; } return 1; } 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')->message('Campo obbligatorio'); $widget->constraint('Email','email')->message('Indirizzo malformato'); $widget->constraint('Printable','nome')->message('Caratteri non validi nel nome'); $widget->indicator('email'); return wantarray?($widget,$iscritto):$widget; } sub scheda :Local { my ($self,$c,$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)=@_; my ($widget,$iscritto)=$self->widget_for_iscr($c,$id); $widget->action($c->uri_for('edit',$id)); my $result=$c->widget_result($widget->name); 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 cessa :Local { my ($self,$c,$id)=@_; my $iscritto=GroLUG::M::DB->resultset('Iscritto')->find($id); $c->log->info($c->user->id,"cessato iscritto $id"); $iscritto->attivo(0);$iscritto->update(); $c->res->redirect($c->uri_for('scheda',$id)); } sub attiva :Local { my ($self,$c,$id)=@_; my $iscritto=GroLUG::M::DB->resultset('Iscritto')->find($id); $c->log->info($c->user->id,"riattivato iscritto $id"); $iscritto->attivo(1);$iscritto->update(); $c->res->redirect($c->uri_for('scheda',$id)); } 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($c->strdate($pagamento->data_pagamento)); $widget->element('Textfield','data_iscrizione')->label('Data di iscrizione')->value($c->strdate($pagamento->data_iscrizione)); $widget->element('Textfield','data_scadenza')->label('Data di scadenza')->value($c->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')->message('Campo obbligatorio'); $widget->constraint('ISODate','data_scadenza','data_pagamento','data_iscrizione')->message('Data non valida'); $widget->constraint('EuroAmount','prezzo')->message('Prezzo non valido'); $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 { my ($self,$c,$id)=@_; $c->log->info($c->user->id,"avvio rinnovo iscritto $id"); $c->stash->{iscritto}=my $iscritto=GroLUG::M::DB->resultset('Iscritto')->find($id); my $last_pag=$iscritto->pagamenti()->next(); 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->{widget}=$c->widget_result($widget->name); $c->stash->{template}='edit-pagamento.tt2'; } sub pagamento :Local { my ($self,$c,$id)=@_; my ($widget,$pagamento)=$self->widget_for_pag($c,$id); $widget->action($c->uri_for('pagamento',$id)); my $result=$c->widget_result($widget->name); 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); 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); } $c->res->redirect($c->uri_for('scheda',$result->params->{iscr_id})); return; } } $c->stash->{widget}=$result; $c->stash->{template}='edit-pagamento.tt2'; } 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->log->info($c->user->id, 'cancellato pagamento' .($pagamento->id) .' per iscritto ' .($pagamento->iscritto->id)); $c->res->redirect($c->uri_for('scheda',$iscritto->id)); return; } $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"); } } } return; } 1;