From 0324d803b8699e757a213e07cbef652bdba1f118 Mon Sep 17 00:00:00 2001 From: "kilian (dks-laptop)" Date: Mon, 27 Jan 2020 08:07:06 +0100 Subject: [PATCH] v20200126 --- backoffice/api/db.cgi | 7 +- backoffice/api/lib/dksdb.pm | 47 ++-- backoffice/api/lib/pdfreport.pm | 1 + backoffice/api/report.cgi | 80 ++++--- backoffice/data/reports/pot/pot_period.conf | 2 +- .../data/reports/pot/staff_department.conf | 12 + .../reports/pot/staff_department.footer.tt | 37 ++++ .../reports/pot/staff_department.header.tt | 20 ++ .../data/reports/pot/staff_department.tt | 126 +++++++++++ .../data/reports/pot/staff_workplan.conf | 2 +- backoffice/js/formsave.js | 18 +- backoffice/tmpl/block/dlgreport.tt | 63 ++++++ backoffice/tmpl/macro/fields.tt | 14 ++ backoffice/tmpl/module/periods/index.tt | 38 ++-- .../tmpl/module/periods/reportperiod.js | 113 ++++++++-- .../tmpl/module/periods/staffworkplan.js | 209 +++++++++--------- backoffice/tmpl/module/staff/staff.js | 14 -- 17 files changed, 591 insertions(+), 212 deletions(-) create mode 100644 backoffice/data/reports/pot/staff_department.conf create mode 100644 backoffice/data/reports/pot/staff_department.footer.tt create mode 100644 backoffice/data/reports/pot/staff_department.header.tt create mode 100644 backoffice/data/reports/pot/staff_department.tt create mode 100644 backoffice/tmpl/block/dlgreport.tt diff --git a/backoffice/api/db.cgi b/backoffice/api/db.cgi index 755864d5..50685ab6 100755 --- a/backoffice/api/db.cgi +++ b/backoffice/api/db.cgi @@ -52,6 +52,7 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ if (exists($p->{filter})){ $sql .= " WHERE ".$p->{filter}.";"; } + $html->{result}->{sql} = $sql; $html->{result}->{sqldata} = $db->dbqueryarray($sql); } elsif (exists($p->{set})){ @@ -94,6 +95,7 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ my $x = $p; delete $x->{sid}; delete $x->{upsert}; + #$html->{result}->{p} = $x; if (keys(%{$idents}) > 0){ my @cntsql = $db->create_cnt_statement($x); #print Dumper(@cntsql); @@ -108,15 +110,18 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ $type = "upd"; } #print Dumper($type); - #print Dumper($x); + print Dumper($x); my @sql = (); if ($type eq "ins"){ + @sql = $db->create_ddl_insert($x); }else { @sql = $db->create_ddl_update($x); } + $html->{result}->{sql} = \@sql; #print Dumper(@sql); if (scalar(@sql) > 0 ){ + #print Dumper($sql[0]); my $rid = $db->dbquerysorted($sql[0]); if (keys(%{$rid}) > 0 ){ $html->{result} = $rid->{0}; diff --git a/backoffice/api/lib/dksdb.pm b/backoffice/api/lib/dksdb.pm index 4c5544a0..3a05754f 100644 --- a/backoffice/api/lib/dksdb.pm +++ b/backoffice/api/lib/dksdb.pm @@ -12,6 +12,7 @@ use Digest::SHA::PurePerl qw(sha256_hex); use DBD::PgPP; use URI::Encode qw(uri_encode uri_decode); use Encode; +use Data::Dumper; use dksconfig qw($sitecfg); use Text::Unidecode; @@ -35,7 +36,7 @@ sub dbquery(){ my $stat = shift; # my $vw_info = shift; my $retdata = undef; - my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return $retdata->{error} = "dbquery Connection Error!".$!; + my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>1,RaiseError=>1,AutoCommit=>1}) or return $retdata->{error} = "dbquery Connection Error!".$!; $stat = encode("utf8", $stat); # open FILE,">>tmp/sql.log"; # print FILE "$stat\n"; @@ -62,7 +63,7 @@ sub dbquerybykey(){ my $stat = shift; #my $retempty = shift; my $retdata =(); - my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return $retdata->{error} = "dbquery Connection Error!".$!; + my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{AutoCommit=>1}) or return $retdata->{error} = "dbquery Connection Error!".$!; # $stat = encode("utf8", $stat); # open FILE,">>sql.log"; @@ -94,7 +95,7 @@ sub dbquerysorted(){ my $stat = shift; # my $vw_info = shift; my $retdata; - my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return $retdata->{error} = "dbquery Connection Error!".$!; + my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{AutoCommit=>1}) or return $retdata->{error} = "dbquery Connection Error!".$!; # $stat = encode("utf8", $stat); # open FILE,">>tmp/sql.log"; # print FILE "\n==\n$stat\n==\n"; @@ -109,7 +110,13 @@ sub dbquerysorted(){ { #$retdata->{$count} = $data; foreach my $k (keys %{$data}){ - $retdata->{$count}->{$k} = decode("utf-8",$data->{$k}); + if ($data->{$k} =~ /^{.*}$/){ + #print Dumper($data->{$k}); + $retdata->{$count}->{$k} = JSON::PP::decode_json($data->{$k}); + } else { + $retdata->{$count}->{$k} = decode("utf-8",$data->{$k}); + + } } $count++; } @@ -125,7 +132,7 @@ sub dbexec(){ my $self = shift; my $stat = shift; my $retdata; - my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return $retdata->{error} = "dbquery Connection Error!".$!; + my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{AutoCommit=>1}) or return $retdata->{error} = "dbquery Connection Error!".$!; # $stat = decode("UTF-8", $stat); # open FILE,">>tmp/sql.log"; # print FILE "\n==\n$stat\n==\n"; @@ -140,12 +147,13 @@ sub dbqueryarray(){ my $self = shift; my $stat = shift; my @retdata = (); - my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{PrintError=>0,RaiseError=>0,AutoCommit=>1}) or return ({"error" => "dbqueryarray Connection Error!".$!}); + my $dbh = DBI->connect($sitecfg->{dsn},$sitecfg->{dbuser},$sitecfg->{dbpassword},{AutoCommit=>1}) or return ({"error" => "dbqueryarray Connection Error!".$!}); #$stat = encode("utf8", $stat); - #open FILE,">>/tmp/sql.log"; - #print "$stat\n"; - # close FILE; - my $sth = $dbh->prepare($stat); + # open FILE,">>tmp/sql.log"; + # print "$stat\n"; + # close FILE; + + my $sth = $dbh->prepare($stat); $sth->execute() or print "dbqueryarray: ".$sth->errstr; my $count = 0; @@ -153,9 +161,16 @@ sub dbqueryarray(){ while(my $data = $sth->fetchrow_hashref()) { my $row = (); + #print Dumper($data); foreach my $k (keys %{$data}){ - $row->{$k} = decode("utf-8",$data->{$k}); + if ($data->{$k} =~ /^{.*}$/){ + #print Dumper($data->{$k}); + $row->{$k} = JSON::PP::decode_json($data->{$k}); + } else { + $row->{$k} = decode("utf-8",$data->{$k}); + } } + #print Dumper($row); push @retdata,$row; } @@ -171,9 +186,9 @@ sub create_ddl_insert(){ my $data = shift; my $fields = (); my @ddl = (); - + #print Dumper($data); foreach my $f (keys(%{$data})){ - if (($f =~ /\_/) && ($f !~ /^ident_/)){ + if (($f =~ /\_/) && ($f !~ /^ident_/) && ($f !~ /\_id$/)){ my $t = substr($f,0,index($f,"_")); my $c = substr($f,length($t)+1); #my ($t,$c) = $f =~ m/(.+)\_(.+)/; @@ -184,11 +199,13 @@ sub create_ddl_insert(){ my $t = substr($f2,0,index($f2,"_")); my $c = substr($f2,length($t)+1); - $fields->{$t}->{$c} = $data->{$f}; + if ($c ne "id"){ + $fields->{$t}->{$c} = $data->{$f}; + } } } - + #print Dumper($fields); foreach my $tb (keys(%{$fields})){ my @sqlcol = (); my @sqlval = (); diff --git a/backoffice/api/lib/pdfreport.pm b/backoffice/api/lib/pdfreport.pm index 7c1b7caf..e2e1ee3f 100644 --- a/backoffice/api/lib/pdfreport.pm +++ b/backoffice/api/lib/pdfreport.pm @@ -5,6 +5,7 @@ use Template; use File::Basename qw/dirname basename/; use Data::Dumper; use File::Copy::Recursive qw(dircopy); + sub new { my $class = shift; my $p = shift; diff --git a/backoffice/api/report.cgi b/backoffice/api/report.cgi index d00a63d7..4808756f 100644 --- a/backoffice/api/report.cgi +++ b/backoffice/api/report.cgi @@ -1,4 +1,4 @@ -#!/Users/kilian/perl5/perlbrew/perls/perl-5.24.1/bin/perl +#!/usr/local/bin/perl use strict; use FindBin qw($RealBin $Bin); # use lib ('CGI/api/lib/perl5'); @@ -9,12 +9,17 @@ use lib ($RealBin.'/lib/perl5'); use lib ($RealBin.'/lib'); use CGI; use CGI::Cookie; +use Encode; # use CGI::Carp qw/fatalsToBrowser/; use File::Basename; use JSON::PP; use MIME::Type::FileName; +use Data::Dumper; +use File::Path qw(make_path); use dksconfig qw/$sitecfg/; use dksdb; +use session; +use pdfreport; # use session; #use sendemail; @@ -26,25 +31,17 @@ foreach my $pe (@params){ $p->{$pe} = $cgi->param($pe); } my $html->{result} = (); -# $p->{sid} = $cgi->cookie($sitecfg->{cookiename}); -# my $se = session->new(); -# my $sess = $se->getsession($p->{sid}); -print $cgi->header(-type=>"application/json", -charset => "utf-8"); -my $dbredirect = {}; -if ($sitecfg->{dbtype} eq "SQLite"){ - if (exists($p->{db})){ - $dbredirect->{dsn} = "DBI:SQLite:dbname=".$sitecfg->{datapath}.'/'.$p->{db}.'.sqlite'; - } +$p->{sid} = $cgi->cookie($sitecfg->{cookiename}); +my $se = session->new(); +my $sess = $se->getsession($p->{sid}); + +if ($sess == undef){ + print $cgi->header(-type=>"application/json", -charset => "utf-8"); + $html->{error} = "No Authorisation"; + print JSON::PP::encode_json($html); + exit(0); } -#$html->{conn} = $dbredirect; -# if ($sess == undef){ -# $html->{error} = "No Authorisation"; -# print JSON::PP::encode_json($html); -# exit(0); -# } -# $html->{p} = $p; -# $html->{sess} =$sess; -#my $datapath = $ENV{"DOCUMENT_ROOT"}.dirname(dirname($scriptpath)).'/data/'; + if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ # my @params = $cgi->param(); @@ -54,8 +51,9 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ if (exists($p->{list})){ #$html->{param} = $p; - my $reppath = $sitecfg->{datapath}.'/'.$p->{app}.'/templates/'.$p->{list}; - #$html->{path} = $reppath; + print $cgi->header(-type=>"application/json", -charset => "utf-8"); + my $reppath = $sitecfg->{docroot}.'/'.$sitecfg->{apidatapath}.'reports/'.$p->{list}; + $html->{path} = $reppath; if (-d $reppath){ #print "OK!"; my @allreps = (); @@ -71,7 +69,7 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ chomp($l); if ($l =~ /^REPORT_NAME/){ my ($k1,$k2,$v) = $l =~ m/^(\w+)_(\w+)=\"(.+)\"$/; - $rep->{label} = $v; + $rep->{label} = decode("utf-8",$v); } } close(RTPL); @@ -83,25 +81,31 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ } } elsif (exists($p->{generate})){ - # my $data = { - # id_invoice => "469", - # dsn => 'DBI:SQLite:dbname='.$dbpath.'/invoicejournal/dksbuchhaltung.sqlite' - # }; - # my $rep = pdfreport->new({tmplpath => $RealBin.'/report', tmp => $RealBin.'/tmp'}); - # my ($result,$file) = $rep->createpdf('ttinvoice',$RealBin.'/output/textinvoice.pdf',$data); - # print "$result: $file\n"; + print $cgi->header(-type=>"application/json", -charset => "utf-8"); + print Dumper($p->{data}); + my $data = JSON::PP::decode_json($p->{data}); + my $reportpath =$sitecfg->{docroot}.$sitecfg->{apidatapath}.'reports/'.dirname($p->{generate}); + my $tmppath = $sitecfg->{docroot}.$sitecfg->{apidatapath}.'tmp/'; + my $output = $sitecfg->{docroot}.$sitecfg->{apidatapath}.'output/'; + print $reportpath."\n".$tmppath."\n".$output."\n".$output.dirname($p->{generate})."\n"; + if (! -d $tmppath) { make_path($tmppath);} + if (! -d $output) { make_path($output);} + if (! -d $output.dirname($p->{generate})){make_path($output.dirname($p->{generate}));} + my $rep = pdfreport->new({tmplpath => $reportpath, tmp => $tmppath}); + my ($result,$file) = $rep->createpdf(basename($p->{generate}),$output.$p->{file},$data); + $html->{result}->{file} = dirname($p->{generate}).'/'.basename($file); } elsif (exists($p->{open})){ - if (exists($p->{file}) && -e ){ - - my $mimetype = MIME::Type::FileName::guess ($sitecfg->{data}.'/'.$p->{file}); - my @stat = stat($sitecfg->{data}.'/'.$p->{file}); + my $file = $sitecfg->{docroot}.'/'.$sitecfg->{apidatapath}.'output/'.$p->{open}; + if (-e $file){ + my $mimetype = MIME::Type::FileName::guess ($file); + my @stat = stat($file); print $cgi->header( -type => $mimetype, - -target => basename($p->{file}), - -attachment => basename($p->{file}) + -target => basename($p->{open}), + -attachment => basename($p->{open}) ); - open(DLD,$sitecfg->{data}.'/'.$p->{file}); + open(DLD,$file); binmode(DLD); local $/ = \1024; while (){ @@ -110,6 +114,10 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ close(DLD); exit(0); } + else { + print $cgi->header(-type=>"application/json", -charset => "utf-8"); + $html->{result}->{file} = $file; + } } } print JSON::PP::encode_json($html); diff --git a/backoffice/data/reports/pot/pot_period.conf b/backoffice/data/reports/pot/pot_period.conf index 9861e2b3..068b1a3c 100644 --- a/backoffice/data/reports/pot/pot_period.conf +++ b/backoffice/data/reports/pot/pot_period.conf @@ -9,4 +9,4 @@ PDF_ENCODING="UTF-8" TEMPLATE_DSN="" TEMPLATE_DBUSER="" TEMPLATE_DBPASSWORD="" -REPORT_NAME="POT - Periode" \ No newline at end of file +REPORT_NAME="POT pour ITM" \ No newline at end of file diff --git a/backoffice/data/reports/pot/staff_department.conf b/backoffice/data/reports/pot/staff_department.conf new file mode 100644 index 00000000..f061bbac --- /dev/null +++ b/backoffice/data/reports/pot/staff_department.conf @@ -0,0 +1,12 @@ +PDF_TOP="40mm" +PDF_BOTTOM="20mm" +PDF_LEFT="20mm" +PDF_RIGHT="10mm" +PDF_SIZE="A4" +PDF_ORIENTATION="Landscape" +PDF_ENGINE="Template::Toolkit" +PDF_ENCODING="UTF-8" +TEMPLATE_DSN="" +TEMPLATE_DBUSER="" +TEMPLATE_DBPASSWORD="" +REPORT_NAME="Plan de travail - Département" \ No newline at end of file diff --git a/backoffice/data/reports/pot/staff_department.footer.tt b/backoffice/data/reports/pot/staff_department.footer.tt new file mode 100644 index 00000000..0f199531 --- /dev/null +++ b/backoffice/data/reports/pot/staff_department.footer.tt @@ -0,0 +1,37 @@ + + + + + + + + + + + + +
SAFFRAN IT Consulting s.à r.l. ist eine Handelsbezeichnung von
DKS, Société à responsabilité limitée, RC B168572 - TVA: LU 2537 5617 - No. Aut: 10024550 / 0
+ IBAN: LU25 0020 1100 2783 8700; BIC: BILLLULL
+ Seite / +
+ \ No newline at end of file diff --git a/backoffice/data/reports/pot/staff_department.header.tt b/backoffice/data/reports/pot/staff_department.header.tt new file mode 100644 index 00000000..8e403506 --- /dev/null +++ b/backoffice/data/reports/pot/staff_department.header.tt @@ -0,0 +1,20 @@ + + + + + + + + + + +
+
+ SAFFRAN IT Consulting S.à r.l.
+ 4, rue Principale
+ L-3770 Tétange

+ Tel: +352 691 504 574
+ info@saffran.lu / www.saffran.lu
+
+
+ diff --git a/backoffice/data/reports/pot/staff_department.tt b/backoffice/data/reports/pot/staff_department.tt new file mode 100644 index 00000000..93f96d04 --- /dev/null +++ b/backoffice/data/reports/pot/staff_department.tt @@ -0,0 +1,126 @@ +[% USE DBI %] +[% USE dksdb = DBI(dsn, dbuser, dbpassword) %] + + + + Invoice + + + + [% qginv = dksdb.prepare("select * from vw_invoiceoutlist WHERE id= ?") %] + [% ginv = qginv.execute(id_invoice) %] + [% inv = ginv.get_all() %] + + + + + + + + + + +
Rechnung
+ [% inv.0.receipient %]
[% inv.0.address %]
[% inv.0.zip %] [% inv.0.city %]
[% inv.0.country %]
+
+ + + + + +
Rechnungs-Nr.[% inv.0.reference %]
Datum[% inv.0.invoicedate %]
Fälligkeit[% inv.0.deadlinedate %]
Kundennummer[% inv.0.ident %]
+
+ [% qbookings = dksdb.prepare("SELECT id, id_invoice, quantity, unit, description, unitamount, netamount, taxamount, taxpercent, totalamount FROM vw_bookingoutlist where id_invoice= ?;") %] + + + + + + + + + + + + [% FOREACH book = qbookings.execute(id_invoice) %] + + + + + + + + [% END %] + + + + + + + + + + + + + +
Produkt / DienstleistungAnz.Einzel-PreisNetto-Summe
[% book.description %][% book.quantity %][% book.unit %][% book.unitamount %] €[% book.netamount %] €
Total Netto + [% inv.0.totalnet %] €
MwSt. (17%) + [% inv.0.totalvat %] €
Gesamt zu bezahlen: + [% inv.0.totalgross %] €
+
Nous vous prions de virer le montant ci-dessus au compte
+ LU25 0020 1100 2783 8700 (BILLLULL)
+ + \ No newline at end of file diff --git a/backoffice/data/reports/pot/staff_workplan.conf b/backoffice/data/reports/pot/staff_workplan.conf index 5de8ad88..a379ec05 100644 --- a/backoffice/data/reports/pot/staff_workplan.conf +++ b/backoffice/data/reports/pot/staff_workplan.conf @@ -9,4 +9,4 @@ PDF_ENCODING="UTF-8" TEMPLATE_DSN="" TEMPLATE_DBUSER="" TEMPLATE_DBPASSWORD="" -REPORT_NAME="POT - Salarié" \ No newline at end of file +REPORT_NAME="Plan de Travail - Salarié" \ No newline at end of file diff --git a/backoffice/js/formsave.js b/backoffice/js/formsave.js index 69efe9f6..06e5c0d3 100644 --- a/backoffice/js/formsave.js +++ b/backoffice/js/formsave.js @@ -57,7 +57,7 @@ function getformcontent(frmid,dataflds){ if (dataflds){ flds = dataflds; } - + //console.log(frm); for (var i = 0; i < frm.elements.length; i++) { var field = frm.elements[i]; //console.log("field:" + field.id + " Name:" + field.getAttribute("name")); @@ -100,9 +100,9 @@ function getformcontent(frmid,dataflds){ } } else { - console.log(field.classList); - console.log("field:" + field.id + " Name:" + field.getAttribute("name")); - console.log("val:" + field.value); + //console.log(field.classList); + //console.log("field:" + field.id + " Name:" + field.getAttribute("name")); + //console.log("val:" + field.value); flds[field.getAttribute("name")] = field.value; } @@ -254,7 +254,8 @@ function fillformbydataclass(dataclass,data,readonly = false){ function fillformbydataclass2(dataclass,choices,data){ //console.log(data); - console.log("fill data class: " + dataclass); + //console.log("fill data class: " + dataclass); + var frm = document.querySelectorAll('.data_'+ dataclass); if (data){ for (var f in frm){ @@ -275,7 +276,7 @@ function fillformbydataclass2(dataclass,choices,data){ frm[f]._flatpickr.setDate(data[frm[f].id]); }else if (frm[f].classList.contains("choices__input")){ if ((data[frm[f].id] != null) && (data[frm[f].id] != '[""]')){ - console.log(frm[f].id); + //console.log(frm[f].id); if (data[frm[f].id].startsWith('["')){ choices[frm[f].id].setValue(JSON.parse(data[frm[f].id])); } @@ -290,10 +291,10 @@ function fillformbydataclass2(dataclass,choices,data){ if (frm[f].tagName == 'SELECT'){ if (frm[f].classList.contains("choices__input")){ if (frm[f].multiple == true){ - console.log("is multiple: " + data[frm[f].id]); + //console.log("is multiple: " + data[frm[f].id]); choices[frm[f].id].setChoiceByValue(JSON.parse(data[frm[f].id])); }else { - console.log("is single: " + frm[f].id + " " + data[frm[f].id]); + //console.log("is single: " + frm[f].id + " " + data[frm[f].id]); choices[frm[f].id].setChoiceByValue(data[frm[f].id]); } } else { @@ -309,6 +310,7 @@ function fillformbydataclass2(dataclass,choices,data){ function fillselectlist(obj,data,vidcol,vvalcol){ var sellist = []; + console.log(obj); obj.clearStore(); if (data){ for (var i in data){ diff --git a/backoffice/tmpl/block/dlgreport.tt b/backoffice/tmpl/block/dlgreport.tt new file mode 100644 index 00000000..74678072 --- /dev/null +++ b/backoffice/tmpl/block/dlgreport.tt @@ -0,0 +1,63 @@ +
+ +
+
+ × +

Selectionner un modèle

+
+
+
+ +
+
+
+ + +
+
+
+ \ No newline at end of file diff --git a/backoffice/tmpl/macro/fields.tt b/backoffice/tmpl/macro/fields.tt index 384031c9..c65c1e45 100644 --- a/backoffice/tmpl/macro/fields.tt +++ b/backoffice/tmpl/macro/fields.tt @@ -22,6 +22,20 @@ [% END -%] +[% MACRO fieldmoneybox(column,table,title,size,state,value,plhold) BLOCK -%] +
+ + + 0 %][% state %][% END %]/> + +
+[% END -%] +[% MACRO fieldnumberbox(column,table,title,size,state,value,plhold,minval,maxval,step) BLOCK -%] +
+ + 0 %][% state %][% END %]/> +
+[% END -%] [% MACRO fieldtagbox(column,table,title,size,state,value) BLOCK -%]
diff --git a/backoffice/tmpl/module/periods/index.tt b/backoffice/tmpl/module/periods/index.tt index 09a53ad6..0467554c 100644 --- a/backoffice/tmpl/module/periods/index.tt +++ b/backoffice/tmpl/module/periods/index.tt @@ -15,6 +15,8 @@ src="[% abspath%]img/icons/plus_white.svg" style="height: 24px;" /> +