package duty_planner::Controller::Root;
use Moose;
use Data::GUID;
use namespace::autoclean;
use List::MoreUtils qw(onlyidx);
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
BEGIN { extends 'Catalyst::Controller' }
#
# Sets the actions in this controller to be registered with no prefix
# so they function identically to actions created in MyApp.pm
#
__PACKAGE__->config(namespace => '');
=encoding utf-8
=head1 NAME
duty_planner::Controller::Root - Root Controller for duty_planner
=head1 DESCRIPTION
[enter your description here]
=head1 METHODS
=head2 index
The root page (/)
=cut
my $domain = '127.0.0.1:3000';
my @keys = qw(lenom nbtotal nblundi nbmardi nbmercredi nbjeudi nbvendredi nbsamedi nbdimanche);
#dont forget to set filepath at end of file : create folder
#/tmp/duty_planner_files
my $jar_folder =
"/home/urist/Documents/programing/perl/catalyst_t0rtug4/";
sub index :Path :Args(0) {
my ( $self, $c ) = @_;
$c->stash(domain=>$domain);
$c->session;
}
sub serviceform :Local :Args(0){
my ($self,$c) = @_;
my ($service,$jours,$interieur,$delete);
$service = $c->request->param('nom_service');
$jours = $c->request->param('nb_jours_repos');
$interieur = $c->request->param('interieur');
$delete = $c->request->param('delete');
if($service){
if(!$jours || $jours == 0){
$jours = 1;
}
if(!$interieur){
$interieur='false';
}
else{
$interieur='true';
}
$c->session->{service}->{$service}={nb_jours=>$jours,interieur=>$interieur};
}
if($delete){
my @todel = split(/,/,$delete);
print "requesting deletion of @todel\n";
for my $i (0 .. $#todel){
delete($c->session->{service}->{$todel[$i]});
}
}
$c->stash(services=>$c->session->{service});
$c->stash(domain=>$domain);
}
sub medform :Local :Args(0){
my ($self,$c) = @_;
my $nom = $c->request->param('nom_med');
my $last_shift = $c->request->param('dernieregarde');
my $service = $c->request->param('service');
my $delete = $c->request->param('delete');
if($delete){
my @todel = split(/,/,$delete);
for my $i (0 .. $#todel){
delete($c->session->{medecins}->{$todel[$i]});
}
}
if($nom){
$c->session->{medecins}->{$nom}={service=>$service,dernieregarde=>$last_shift};
}
$c->stash(medecins=>$c->session->{medecins});
$c->stash(services=>$c->session->{service});
$c->stash(domain=>$domain);
}
sub ferieform :Local :Args(0){
my ($self,$c) = @_;
my($delete,$nom,$date,$interieur);
$nom = $c->request->param('nom_med');
$date = $c->request->param('date_ferie');
$interieur=$c->request->param('interieur');
$delete=$c->request->param('delete');
print "delete = $delete\n";
if(!$interieur){
$interieur = 'false';
}
else{
$interieur='true';
}
if($nom){
if(!defined($c->session->{feries}->{$date}->{$interieur}) ){#no one is there
my $service = $c->session->{medecins}->{$nom}->{service};
my $intable = $c->session->{service}->{$service}->{interieur};
print("intable for $nom = $intable\n");
if($intable =~/true/ || $interieur =~ /false/ ){
#no contradiction between requested and capability
#be it as in duty our out duty
$c->session->{feries}->{$date}->{$interieur} = $nom;
}
}
}
if($delete){
my @todel = split(/,/,$delete);
for my $i (0 .. $#todel){
my @couple = split(/_/,$todel[$i]);
my $deldate = $couple[0];
my $delint = $couple[1];
delete($c->session->{feries}->{$deldate}->{$delint});
#if I deleted the last entry then delete date
if(($delint =~ /false/ &&
!defined($c->session->{feries}->{$deldate}->{true}))
||($delint =~ /true/ && !defined($c->session->{feries}->{$deldate}->{false}))){
delete($c->session->{feries}->{$deldate});
}
}
}
$c->stash(medecins=>$c->session->{medecins});
$c->stash(services=>$c->session->{service});
$c->stash(ferie=>$c->session->{feries});
$c->stash(domain=>$domain);
}
sub infoform :Local :Args(0){
my ($self,$c) = @_;
my $ddb = $c->request->param('datedebut');
my $ddf = $c->request->param('datefin');
my $delete = $c->request->param('delete');
if($delete){
delete($c->session->{infos});
}
if($ddb && $ddf && !defined($c->session->{infos})){
$c->session->{infos} = [$ddb,$ddf];
}
$c->stash(infos=>$c->session->{infos});
$c->stash(domain=>$domain);
}
sub optionform :Local :Args(0){
my ($self,$c) = @_;
my $delete = $c->request->param('delete');
print "defined delete = ".defined($delete)."\n";
if($c->request->param('lenom')){
for my $i (1 .. $#keys){
print("adding ".$c->request->param($keys[$i])." for $keys[$i]
for name = ".$c->request->param($keys[0])."\n");
$c->session->{options}->{$c->request->param($keys[0])}->[$i-1] =
$c->request->param($keys[$i]);
}
}
elsif(defined($delete)){
my @todel = split(/,/,$delete);
foreach my $nom (@todel){
delete $c->session->{options}->{$nom};
}
}
$c->stash(options=>$c->session->{options});
$c->stash(medecins=>$c->session->{medecins});
$c->stash(domain=>$domain);
}
sub holidaysform :Local :Args(0){
my ($self,$c)=@_;
my $nom = $c->request->param('nom');
my $ddb = $c->request->param('datedebut');
my $ddf= $c->request->param('datefin');
my $delete = $c->request->param('delete');
if($nom){
$c->session->{vacances}->{$nom}->{$ddb} = $ddf;
print "added vacances from $ddb to
".$c->session->{vacances}->{$nom}->{$ddb}." for $nom\n";
}
if($delete){
my @todel = split(/,/,$delete);
for my $i (0 .. $#todel){
my @couple = split(/_/,$todel[$i]);
my $delnom = $couple[0];
my $deldate = $couple[1];
delete($c->session->{vacances}->{$delnom}->{$deldate});
}
}
$c->stash(domain=>$domain);
$c->stash(vacances=>$c->session->{vacances});
$c->stash(medecins=>$c->session->{medecins});
}
sub make_planning :Local :Args(0){
my($self,$c) = @_;
chdir "/tmp/duty_planner_files";
my $filepath = $c->sessionid;
if(! -e $filepath.'_data.xls'){
print "no $filepath data xls\n";
open my $csv,'>',$filepath or die "cant open dest file: $!";
print $csv "\n";
my $medecins = $c->session->{medecins};
for my $med (keys %$medecins){
print
$csv "$med\n$medecins->{$med}->{service}\n$medecins->{$med}->{dernieregarde}\n";
}
print $csv "\n\n";
my $feries = $c->session->{feries};
foreach my $date (keys %$feries){
foreach my $int (keys %{$feries->{date}}){
print $csv "$date\n$feries->{$date}->{$int}\n$int\n";
}
}
print $csv "\n\n";
my $vacances = $c->session->{vacances};
foreach my $nom (keys %$vacances){
foreach my $ddb (keys %{$vacances->{$nom}}){
print $csv "$ddb\n$vacances->{$nom}->{$ddb}\n$nom\n";
}
}
print $csv "\n\n";
print $csv $c->session->{infos}->[0]."\n".$c->session->{infos}->[1]."\n";
print $csv "\n\n";
my $services = $c->session->{service};
foreach my $servname (keys %$services){
print $csv
"$servname\n$services->{$servname}->{interieur}\n$services->{$servname}->{nb_jours}\n";
}
print $csv "\n\n";
my $options = $c->session->{options};
foreach my $opt (keys %$options){
print $csv "$opt\n";
for my $i (0 .. $#keys-1){
print "nom = $opt\n cur key = $keys[$i]\nvalue =
".$options->{$opt}->[$i]."\n and i = $i\n";
my $toprint = $options->{$opt}->[$i];
$toprint = $i< $#keys?$toprint."\n":$toprint;
print $csv $toprint;
}
}
print $csv "";
close $csv;
print "executing java -jar $jar_folder $filepath\n";
my $cmd = "java -jar $jar_folder"."duty_planner.jar $filepath";
`$cmd`;
}
else{
my $wd = `pwd`;
my $cmd = "java -jar $jar_folder"."duty_planner.jar --xls ".$filepath."_data.xls $filepath";
print "executing $cmd from $wd\n";
`$cmd`;
}
my $zip = Archive::Zip->new();
my $file_member = $zip->addFile($filepath."_data.xls","data.xls");
$file_member =
$zip->addFile($c->sessionid."_planning_garde.xls","planning.xls");
unless ( $zip->writeToFileNamed($c->sessionid.'_fichiers.zip') == AZ_OK ) {
die 'write error';
}
my @files = ($c->sessionid, $c->sessionid."_data.xls",
$c->sessionid."_planning_garde.xls");
unlink @files;
my $filename = $c->sessionid.'_fichiers.zip';
open my $fh,'<',$filename;
$c->response->header(
'Content-Disposition' => "attachment;filename=fichiers.zip"
);
$c->response->body($fh);
}
sub fupload :Local :Args(0){
my ($self,$c)=@_;
my $filename = $c->sessionid."_data.xls";
$c->stash(domain=>$domain);
if ( $c->request->parameters->{form_submit} eq 'yes' ) {
for my $field ( $c->req->upload ) {
my $upload = $c->req->upload($field);
my $target="/tmp/duty_planner_files/$filename";
unless ($upload->link_to($target)||$upload->copy_to($target)){
die("Failedtocopy'$filename'to'$target':$!");
}
}
}
}
=head2 default
Standard 404 error page
=cut
sub default :Path {
my ( $self, $c ) = @_;
$c->response->body( 'Page not found' );
$c->response->status(404);
}
=head2 end
Attempt to render a view, if needed.
=cut
sub end : ActionClass('RenderView') {}
=head1 AUTHOR
root
=head1 LICENSE
This library is free software. You can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
__PACKAGE__->meta->make_immutable;
1;