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') {
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');
$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') {
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,
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;