package Ernad::Indat; use strict; use warnings; use Carp qw(confess); use Clone 'clone'; use File::Basename; use List::Util qw(shuffle); use Data::Dumper qw(Dumper); use Ernad::Store; #use File::Basename; #use List::Util qw(shuffle); #use Ernad::Adverts; #use Ernad::Common; #use Ernad::Chungju; #use Ernad::Erimp; #use Ernad::Sort; ## we set this as global states my $issuedate; my $repcode; binmode(STDOUT,':utf8'); ## constructor sub new { my $this=shift; my $class=ref($this) || $this; my $i={}; bless $i, $class; my $params=shift // {}; my $ref_param=ref $params; if(not $ref_param eq 'HASH') { confess "I need a parameter hashref, you gave me a '$ref_param'."; } foreach my $key (keys %{$params}) { $i->{$key}=$params->{$key}; } my $verbose=$i->{'verbose'} // 0; if($params->{'e'}) { $i->{'e'}=$params->{'e'}; } elsif($main::e) { $i->{'e'}=$main::e; } else { confess "I don't see your erimp."; } my $indat_dir=$i->{'e'}->{'dir'}->{'indat'}; $i->{'dir'}->{'indat'}=$indat_dir; my $issues_dir="$indat_dir/issues"; $i->{'dir'}->{'issues'}=$issues_dir; my $reports_dir="$indat_dir/reports"; $i->{'dir'}->{'reports'}=$reports_dir; my $complete_dir="$indat_dir/issues/complete"; $i->{'dir'}->{'complete'}=$complete_dir; my $namf_dir="$indat_dir/namf"; $i->{'dir'}->{'namf'}=$namf_dir; ## not used at this point # my $reports_dir="$indat_dir/reports"; #$i->{'dir'}->{'reports'}=$reports_dir; my $vypot_dir="$indat_dir/vypot"; $i->{'dir'}->{'vypot'}=$vypot_dir; my $blatt_dir=$i->{'e'}->{'dir'}->{'blatt'}; $i->{'whats'}=['complete','in_labor']; $i->{'file'}->{'otria'}="$indat_dir/otria.json"; $i->{'file'}->{'json'}->{'reports'}="$indat_dir/reports.json"; $i->{'file'}->{'xml'}->{'reports'}="$indat_dir/reports.xml"; $i->{'file'}->{'html'}->{'reports'}="$indat_dir/reports.html"; foreach my $what (@{$i->{'whats'}}) { $i->{'file'}->{'json'}->{$what}="$indat_dir/$what.json"; $i->{'file'}->{'xml'}->{$what}="$indat_dir/$what.xml"; $i->{'file'}->{'html'}->{$what}="$blatt_dir/$what.html"; } $i->{'dir'}->{'indat'}=$indat_dir; return $i; } sub first_shoti { my $i=shift; my $in=shift; my @shotis=sort keys %$in; if(not scalar (@shotis)) { return undef; } my $first_shoti=$shotis[0]; return clone($in->{$first_shoti}); } sub first_shoti_d { my $i=shift; my $in=shift; my @shotis=sort keys %$in; if(not scalar (@shotis)) { return undef; } my $first_shoti=$shotis[0]; if(not $in->{$first_shoti}->{'d'}) { return undef; } return clone($in->{$first_shoti}->{'d'}); } sub get_issues { my $i=shift; my $type=shift // 'array'; my $l; if($type eq 'array') { $l=[]; } elsif($type eq 'hash') { $l={}; } else { confess 'My argument has to be "array" (default) or "hash".'; } my $indat_dir=$i->{'dir'}->{'indat'} // confess "I need this here."; my $issues_dir="$indat_dir/namf"; my $count=0; foreach my $file (`ls $issues_dir`) { chomp $file; if(not $file=~m|(\d{4}-\d{2}-\d{2})\.json$|) { next; } $l->[$count++]=$1; } $i->{'issues'}=clone($l); return $l; } sub set_active_reports { my $i=shift; my $issuedate=shift // confess "I need an issuedate here"; my $e=$i->{'e'} // confess "I don't see the erimp."; my $reports_dir=$e->{'dir'}->{'reports'} // confess "I need this"; my $active={}; foreach my $report_dir (glob("$reports_dir/*")) { my $count=0; my $repcode=basename($report_dir); my $source_dir="$reports_dir/$repcode/source"; if(scalar glob("$source_dir/$issuedate"."_*")) { $active->{$repcode}=1; next; } foreach my $dir (glob("$source_dir/*")) { if(not -d $dir) { next; } if(scalar glob("$dir/$issuedate"."_*")) { $active->{$repcode}=1; } } } $i->{'active'}->{$issuedate}=clone($active); } sub list_active_reports { my $i=shift; my $issuedate=shift // confess "I need an issuedate here"; #if($type eq 'array') { # $a=[]; #} #elsif($type eq 'hash') { # $a={}; #} #else { # confess 'My argument has to be "array" (default) or "hash".'; #} if(not $i->{'active'}->{$issuedate}) { $i->set_active_reports($issuedate); } if(not $i->{'active'}->{$issuedate}) { confess "I have no active reports at $issuedate."; } my $count=0; my $a; foreach my $repcode (keys %{$i->{'active'}->{$issuedate}}) { #if($type eq 'array') { $a->[$count++]=$repcode; #} } return $a; } sub compile_all { my $i=shift; my $issuedates=$i->get_issues(); foreach my $issuedate (reverse @$issuedates) { my $ii=Ernad::Indat::Issue->new(); $ii->compile($issuedate); } } sub extract_issues { my $i=shift; my $issuedate=shift // ''; my $issuedates; my $do_load_in_labor=1; if($issuedate) { $issuedates=[$issuedate]; } else { $do_load_in_labor=0; $issuedates=$i->get_issues(); } ## extracted structure my $x; ## load the complete files from disk my $do_save_complete=0; if(-f $i->{'file'}->{'json'}->{'complete'}) { $x->{'complete'}=&Ernad::Store::load($i->{'file'}->{'json'}->{'complete'}); } else { $do_save_complete=1; } if(-f $i->{'file'}->{'json'}->{'in_labor'} and $do_load_in_labor) { $x->{'in_labor'}=&Ernad::Store::load($i->{'file'}->{'json'}->{'in_labor'}); } else { ## we have to do all issuedates; $issuedates=$i->get_issues(); } my $e=$i->{'e'}; foreach my $issuedate (@$issuedates) { if($x->{'complete'}->{'d'}->{$issuedate}) { $e->echo(__LINE__,"$issuedate is known to be complete.",10); next; } my $ii=Ernad::Indat::Issue->new({'issuedate'=>$issuedate}); my $data=$ii->extract($issuedate); if(not $data->{'snorlabo'}) { $x->{'complete'}->{'d'}->{$issuedate}=clone($data); $do_save_complete=1; } else { $x->{'in_labor'}->{'d'}->{$issuedate}=clone($data); } } ## FixMe find out what to do about $x->{'v'}; ## for the moment, we always save in_labor &Ernad::Store::save($x->{'in_labor'},$i->{'file'}->{'json'}->{'in_labor'}); if($do_save_complete or (not -f $i->{'file'}->{'json'}->{'complete'})) { &Ernad::Store::save($x->{'complete'},$i->{'file'}->{'json'}->{'complete'}); } } sub clear { my $i=shift; delete $i->{'i'}; } 1;