summaryrefslogtreecommitdiff
path: root/GroLUG/lib/GroLUG/C/Iscritto.pm
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 /GroLUG/lib/GroLUG/C/Iscritto.pm
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
Diffstat (limited to 'GroLUG/lib/GroLUG/C/Iscritto.pm')
-rw-r--r--GroLUG/lib/GroLUG/C/Iscritto.pm278
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;