summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@luxion>2006-02-13 15:53:39 +0000
committerdakkar <dakkar@luxion>2006-02-13 15:53:39 +0000
commitc58b498f7060665e286b1b7eb978cebeed9e8655 (patch)
tree24a6e00ca314ca57c157c9684c2e582607ed1251
parent r1314@narval: dakkar | 2006-02-10 19:50:50 +0100 (diff)
downloadIscrittiGroLUG-c58b498f7060665e286b1b7eb978cebeed9e8655.tar.gz
IscrittiGroLUG-c58b498f7060665e286b1b7eb978cebeed9e8655.tar.bz2
IscrittiGroLUG-c58b498f7060665e286b1b7eb978cebeed9e8655.zip
merge dalla branch
git-svn-id: svn://luxion/repos/IscrittiGroLUG/trunk@191 fcb26f47-9200-0410-b104-b98ab5b095f3
-rw-r--r--GroLUG/Makefile.PL7
-rw-r--r--GroLUG/grolug.yml15
-rw-r--r--GroLUG/lib/Catalyst/Engine/Null.pm32
-rw-r--r--GroLUG/lib/GroLUG.pm1
-rw-r--r--GroLUG/lib/GroLUG/C/Iscritto.pm278
-rw-r--r--GroLUG/lib/GroLUG/M/DB/Pagamento.pm4
-rw-r--r--GroLUG/lib/GroLUG/V/Email.pm18
-rw-r--r--GroLUG/lib/HTML/Widget/Constraint/EuroAmount.pm9
-rw-r--r--GroLUG/lib/HTML/Widget/Constraint/ISODate.pm18
-rw-r--r--GroLUG/root/lib/site/header8
-rw-r--r--GroLUG/root/lib/site/mail-wrapper4
-rw-r--r--GroLUG/root/src/cancella-pagamento.tt24
-rw-r--r--GroLUG/root/src/due-settimane.tt27
-rw-r--r--GroLUG/root/src/edit-iscritto.tt29
-rw-r--r--GroLUG/root/src/edit-pagamento.tt21
-rw-r--r--GroLUG/root/src/lista-iscritti.tt24
-rw-r--r--GroLUG/root/src/nuovo-iscritto.tt27
-rw-r--r--GroLUG/root/src/nuovo-pagamento.tt29
-rw-r--r--GroLUG/root/src/scaduto.tt27
-rw-r--r--GroLUG/root/src/scheda-iscritto.tt28
-rw-r--r--GroLUG/root/src/un-mese.tt27
-rwxr-xr-xGroLUG/script/grolug_email.pl14
22 files changed, 400 insertions, 71 deletions
diff --git a/GroLUG/Makefile.PL b/GroLUG/Makefile.PL
index 94d0d9e..307e29e 100644
--- a/GroLUG/Makefile.PL
+++ b/GroLUG/Makefile.PL
@@ -9,6 +9,7 @@ requires Catalyst::Plugin::StackTrace => 0;
requires Catalyst::Plugin::ConfigLoader => 0;
requires Catalyst::Plugin::Static::Simple => 0;
requires Catalyst::Plugin::DefaultEnd => 0;
+requires Catalyst::Plugin::HTML::Widget => 0;
requires Catalyst::Plugin::Session => 0;
requires Catalyst::Plugin::Session::Store::DBI => 0;
requires Catalyst::Plugin::Session::State::Cookie => 0;
@@ -20,10 +21,16 @@ requires Catalyst::Log::Log4perl => 0;
requires Log::Log4perl::Appender::DBI => 0;
requires DateTime => 0;
requires DateTime::Format::Pg => 0;
+requires DateTime::Format::Strptime => 0;
requires DBIx::Class => 0;
requires Catalyst::Model::DBIC::Plain => 0;
requires Catalyst::View::TT => 0;
requires Module::Find => 0;
+requires Email::MIME => 0;
+requires Email::MIME::Creator => 0;
+requires Email::Send => 0;
+requires Encode => 0;
+requires Encode::MIME::Header => 0;
catalyst;
diff --git a/GroLUG/grolug.yml b/GroLUG/grolug.yml
index 589c0f8..96ff9ec 100644
--- a/GroLUG/grolug.yml
+++ b/GroLUG/grolug.yml
@@ -1,5 +1,6 @@
---
name: GroLUG
+view: GroLUG::V::TT
stacktrace:
verbose: 1
session:
@@ -10,3 +11,17 @@ iscrizione:
prezzo: 50
durata:
years: 1
+scadenze:
+ - anticipo:
+ months: 1
+ messaggio: un-mese.tt2
+ - anticipo:
+ days: 14
+ messaggio: due-settimane.tt2
+ - anticipo:
+ days: 0
+ messaggio: scaduto.tt2
+email:
+ - SMTP
+ - localhost
+email-from: iscritti@grolug.org
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;
diff --git a/GroLUG/root/lib/site/header b/GroLUG/root/lib/site/header
index 8781856..2c89e2f 100644
--- a/GroLUG/root/lib/site/header
+++ b/GroLUG/root/lib/site/header
@@ -1,4 +1,10 @@
<!-- BEGIN site/header -->
<h1 class="title">[% template.title or site.title %]</h1>
-[% IF Catalyst.user_exists %]<p><a href="[% Catalyst.uri_for('/logout') %]">logout</a></p>[% END %]
+<p>
+ [%- IF Catalyst.user_exists -%]
+ <a href="[% Catalyst.uri_for('/logout') %]">logout</a>
+ [%- END %]
+ <a href="[% Catalyst.uri_for('/iscritti') %]">elenco iscritti</a>
+ <a href="[% Catalyst.uri_for('/cessati') %]">elenco iscritti cessati</a>
+</p>
<!-- END site/header -->
diff --git a/GroLUG/root/lib/site/mail-wrapper b/GroLUG/root/lib/site/mail-wrapper
new file mode 100644
index 0000000..257446b
--- /dev/null
+++ b/GroLUG/root/lib/site/mail-wrapper
@@ -0,0 +1,4 @@
+[% content %]
+
+--
+ Servizio iscrizioni GroLUG
diff --git a/GroLUG/root/src/cancella-pagamento.tt2 b/GroLUG/root/src/cancella-pagamento.tt2
new file mode 100644
index 0000000..0d0a1c1
--- /dev/null
+++ b/GroLUG/root/src/cancella-pagamento.tt2
@@ -0,0 +1,4 @@
+<h1>Cancellazione pagamento</h1>
+<form action="[% Catalyst.uri_for('cancella_pag',pagamento.id) %]" method="post" >
+<p>Confermi? <input type="submit" name="ok" value="Confermo" /></p>
+</form>
diff --git a/GroLUG/root/src/due-settimane.tt2 b/GroLUG/root/src/due-settimane.tt2
new file mode 100644
index 0000000..a436686
--- /dev/null
+++ b/GroLUG/root/src/due-settimane.tt2
@@ -0,0 +1,7 @@
+Subject: La tua iscrizione al GroLUG scade tra due settimane
+
+Salve [% iscritto.nome %],
+
+la tua iscrizione scade tra due settimane.
+
+Rinnovala!
diff --git a/GroLUG/root/src/edit-iscritto.tt2 b/GroLUG/root/src/edit-iscritto.tt2
index e75765d..e26f264 100644
--- a/GroLUG/root/src/edit-iscritto.tt2
+++ b/GroLUG/root/src/edit-iscritto.tt2
@@ -1,7 +1,2 @@
-<h1>Modifica [% iscritto.nome %]</h1>
-<form action="[% Catalyst.uri_for('edit',iscritto.id) %]" method="post">
-<p><label for="nome">nome</label> <input type="text" id="nome" name="nome" value="[% iscritto.nome %]" /></p>
-<p><label for="email">email</label> <input type="text" id="email" name="email" value="[% iscritto.email %]" /></p>
-<p><label for="note">note</label> <input type="text" id="note" name="note" value="[% iscritto.note %]" /></p>
-<p><input type="submit" /></p>
-</form>
+<h1>[% IF mode=='edit' %]Modifica[% ELSE %]Nuovo[% END %] iscritto</h1>
+[% widget %]
diff --git a/GroLUG/root/src/edit-pagamento.tt2 b/GroLUG/root/src/edit-pagamento.tt2
new file mode 100644
index 0000000..1a03775
--- /dev/null
+++ b/GroLUG/root/src/edit-pagamento.tt2
@@ -0,0 +1 @@
+[% widget %]
diff --git a/GroLUG/root/src/lista-iscritti.tt2 b/GroLUG/root/src/lista-iscritti.tt2
index 1f733b6..9618520 100644
--- a/GroLUG/root/src/lista-iscritti.tt2
+++ b/GroLUG/root/src/lista-iscritti.tt2
@@ -1,5 +1,5 @@
-<h1>Lista iscritti</h1>
-<p><a href="[% Catalyst.uri_for('nuovo') %]">Nuovo iscritto</a></p>
+<h1>Lista iscritti [% IF mode=='cessati' %]non attivi[% END %]</h1>
+<p><a href="[% Catalyst.uri_for('edit') %]">Nuovo iscritto</a></p>
<ol>
[% WHILE (iscr = iscritti.next()) %]
<li>
diff --git a/GroLUG/root/src/nuovo-iscritto.tt2 b/GroLUG/root/src/nuovo-iscritto.tt2
deleted file mode 100644
index 91bbfb9..0000000
--- a/GroLUG/root/src/nuovo-iscritto.tt2
+++ /dev/null
@@ -1,7 +0,0 @@
-<h1>Nuovo iscritto</h1>
-<form action="[% Catalyst.uri_for('nuovo') %]" method="post">
-<p><label for="nome">nome</label> <input type="text" id="nome" name="nome" value="[% iscritto.nome %]" /></p>
-<p><label for="email">email</label> <input type="text" id="email" name="email" value="[% iscritto.email %]" /></p>
-<p><label for="note">note</label> <input type="text" id="note" name="note" value="[% iscritto.note %]" /></p>
-<p><input type="submit" /></p>
-</form>
diff --git a/GroLUG/root/src/nuovo-pagamento.tt2 b/GroLUG/root/src/nuovo-pagamento.tt2
deleted file mode 100644
index 743f06f..0000000
--- a/GroLUG/root/src/nuovo-pagamento.tt2
+++ /dev/null
@@ -1,9 +0,0 @@
-<form action="[% Catalyst.uri_for('pagamento') %]" method="post">
-<input type="hidden" name="iscr_id" value="[% iscritto.id %]" />
-<input type="hidden" name="pag_id" value="[% pagamento.id %]" />
-<p><label for="data_pagamento">data_pagamento</label><input type="text" name="data_pagamento" id="data_pagamento" value="[% pagamento.data_pagamento %]" /></p>
-<p><label for="data_iscrizione">data_iscrizione</label><input type="text" name="data_iscrizione" id="data_iscrizione" value="[% pagamento.data_iscrizione %]" /></p>
-<p><label for="data_scadenza">data_scadenza</label><input type="text" name="data_scadenza" id="data_scadenza" value="[% pagamento.data_scadenza %]" /></p>
-<p><label for="prezzo">prezzo</label><input type="text" name="prezzo" id="prezzo" value="[% pagamento.prezzo %]" /></p>
-<p><input type="submit" /></p>
-</form> \ No newline at end of file
diff --git a/GroLUG/root/src/scaduto.tt2 b/GroLUG/root/src/scaduto.tt2
new file mode 100644
index 0000000..1a97312
--- /dev/null
+++ b/GroLUG/root/src/scaduto.tt2
@@ -0,0 +1,7 @@
+Subject: La tua iscrizione al GroLUG è scaduta oggi
+
+Salve [% iscritto.nome %],
+
+la tua iscrizione è scaduta oggi.
+
+Rinnovala!
diff --git a/GroLUG/root/src/scheda-iscritto.tt2 b/GroLUG/root/src/scheda-iscritto.tt2
index 30f0d29..835b22a 100644
--- a/GroLUG/root/src/scheda-iscritto.tt2
+++ b/GroLUG/root/src/scheda-iscritto.tt2
@@ -2,15 +2,19 @@
<p>Operazioni:</p>
<ul>
<li><a href="[% Catalyst.uri_for('edit',iscritto.id) %]">Edit</a></li>
-<li><a href="[% Catalyst.uri_for('rinnova',iscritto.id) %]">Rinnova</a></li>
+<li><a href="[% Catalyst.uri_for('rinnova',iscritto.id) %]">Rinnova</a> [% IF not pagato %](da rinnovare o cessare)[% END %]</li>
+[% IF iscritto.attivo -%]
<li><a href="[% Catalyst.uri_for('cessa',iscritto.id) %]">Cessa</a></li>
+[%- ELSE -%]
+<li><a href="[% Catalyst.uri_for('attiva',iscritto.id) %]">Ri-Attiva</a></li>
+[%- END %]
</ul>
<dl>
<dt>Indirizzo:</dt><dd>[% iscritto.email %]</dd>
<dt>Note:</dt><dd>[% iscritto.note %]</dd>
<dt>Pagamenti:</dt><dd><ol>
[%- FOREACH pag IN iscritto.pagamenti %]
-<li>[% pag.prezzo %] il [% pag.data_pagamento %]</li>
+<li>[% pag.prezzo %] il [% pag.data_pagamento %] <a href="[% Catalyst.uri_for('pagamento',pag.id) %]">edit</a> <a href="[% Catalyst.uri_for('cancella_pag',pag.id) %]">elimina</a></li>
[% END -%]
</ol></dd>
</dl>
diff --git a/GroLUG/root/src/un-mese.tt2 b/GroLUG/root/src/un-mese.tt2
new file mode 100644
index 0000000..e214b86
--- /dev/null
+++ b/GroLUG/root/src/un-mese.tt2
@@ -0,0 +1,7 @@
+Subject: La tua iscrizione al GroLUG scade tra un mese
+
+Salve [% iscritto.nome %],
+
+la tua iscrizione scade tra un mese.
+
+Rinnovala!
diff --git a/GroLUG/script/grolug_email.pl b/GroLUG/script/grolug_email.pl
new file mode 100755
index 0000000..44b5f4b
--- /dev/null
+++ b/GroLUG/script/grolug_email.pl
@@ -0,0 +1,14 @@
+#!/usr/bin/perl
+
+BEGIN {
+ $ENV{CATALYST_ENGINE} ||= 'Null';
+ $ENV{CATALYST_SCRIPT_GEN} = 27;
+}
+use strict;
+use FindBin;
+use lib "$FindBin::Bin/../lib";
+use GroLUG;
+
+my $c=GroLUG->prepare();
+$c->{stats}=(GroLUG->debug) ? Tree::Simple->new() : '';
+$c->forward('/iscritto/send_email');