From 5c9f1b8fd4f0d3c8b7575495f1fa086762ae1526 Mon Sep 17 00:00:00 2001 From: Kilian Saffran Date: Thu, 27 Feb 2020 17:17:04 +0100 Subject: [PATCH] v20200227 --- .gitignore | 3 + backoffice/api/lib/session.pm | 6 +- .../periode_20191230-20200223_pot_period.pdf | Bin 302716 -> 0 bytes backoffice/data/reports/pot/pot_period.tt | 53 +- backoffice/js/.DS_Store | Bin 6148 -> 0 bytes backoffice/js/request.js | 1 + backoffice/tmp/sql.log | 7 + dev/db/diff_db.sh | 56 +- dev/db/livedbupdate.sql | 121 +- dev/db/potlu_db.demo.columns.live.txt | 22 - dev/db/potlu_db.demo.tables.live.txt | 4 - .../potlu_db.newcompanyschema.pg.schema.sql-e | 1349 ----------------- dev/db/potlu_db.portanova.columns.live.txt | 356 ----- dev/db/potlu_db.portanova.pg.schema.sql | 420 ++--- dev/db/potlu_db.portanova.tables.live.txt | 25 - dev/db/potlu_db.public.columns.live.txt | 110 -- dev/db/potlu_db.public.columns.local.txt | 118 -- dev/db/potlu_db.public.pg.data.sql | 78 +- dev/db/potlu_db.public.pg.full.sql | 355 ++--- dev/db/potlu_db.public.pg.schema.sql | 251 ++- dev/db/potlu_db.public.tables.live.txt | 15 - dev/db/potlu_db.public.tables.local.txt | 14 - dev/db/potlu_db.refschema.columns.local.txt | 356 ----- dev/db/potlu_db.refschema.tables.local.txt | 25 - dev/db/potlu_db.test.columns.live.txt | 356 ----- dev/db/potlu_db.test.tables.live.txt | 25 - dev/db/potlu_db.test2.columns.live.txt | 356 ----- dev/db/potlu_db.test2.tables.live.txt | 25 - dev/db/reinstallschema.sh | 18 + dev/db/update.demo.columns.txt | 100 -- dev/db/update.demo.tables.txt | 10 - dev/db/update.portanova.columns.txt | 0 dev/db/update.portanova.tables.txt | 0 dev/db/update.public.columns.txt | 11 +- dev/db/update.test.columns.txt | 0 dev/db/update.test.tables.txt | 0 dev/db/update.test2.columns.txt | 0 dev/db/update.test2.tables.txt | 0 dev/db/users.sql | 4 + dev/diff_files.sh | 2 +- dev/sourcefiles.local.txt | 19 - dev/sourcefiles.remote.txt | 158 +- 42 files changed, 723 insertions(+), 4106 deletions(-) delete mode 100644 backoffice/data/output/pot/periode_20191230-20200223_pot_period.pdf delete mode 100644 backoffice/js/.DS_Store create mode 100644 backoffice/tmp/sql.log delete mode 100644 dev/db/potlu_db.demo.columns.live.txt delete mode 100644 dev/db/potlu_db.demo.tables.live.txt delete mode 100644 dev/db/potlu_db.newcompanyschema.pg.schema.sql-e delete mode 100644 dev/db/potlu_db.portanova.columns.live.txt delete mode 100644 dev/db/potlu_db.portanova.tables.live.txt delete mode 100644 dev/db/potlu_db.public.columns.live.txt delete mode 100644 dev/db/potlu_db.public.columns.local.txt delete mode 100644 dev/db/potlu_db.public.tables.live.txt delete mode 100644 dev/db/potlu_db.public.tables.local.txt delete mode 100644 dev/db/potlu_db.refschema.columns.local.txt delete mode 100644 dev/db/potlu_db.refschema.tables.local.txt delete mode 100644 dev/db/potlu_db.test.columns.live.txt delete mode 100644 dev/db/potlu_db.test.tables.live.txt delete mode 100644 dev/db/potlu_db.test2.columns.live.txt delete mode 100644 dev/db/potlu_db.test2.tables.live.txt create mode 100644 dev/db/reinstallschema.sh delete mode 100644 dev/db/update.demo.columns.txt delete mode 100644 dev/db/update.demo.tables.txt delete mode 100644 dev/db/update.portanova.columns.txt delete mode 100644 dev/db/update.portanova.tables.txt delete mode 100644 dev/db/update.test.columns.txt delete mode 100644 dev/db/update.test.tables.txt delete mode 100644 dev/db/update.test2.columns.txt delete mode 100644 dev/db/update.test2.tables.txt create mode 100644 dev/db/users.sql diff --git a/.gitignore b/.gitignore index 2ff3f331..7644a2c1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ backoffice/api/lib/perl5 +backoffice/data/output/pot +backoffice/data/tmp + diff --git a/backoffice/api/lib/session.pm b/backoffice/api/lib/session.pm index 0bbd878a..c45b4976 100644 --- a/backoffice/api/lib/session.pm +++ b/backoffice/api/lib/session.pm @@ -23,11 +23,13 @@ sub checklogin(){ my $self = shift; my $login = shift; my $password = shift; + + my $pwd = sha256_hex($password); + my $ret->{messagetype} ='w3-red'; # open FILE,">>tmp/sql.log"; # print FILE "pwd: $password\n"; + # print FILE "pwd: $pwd\n"; # close(FILE); - my $pwd = sha256_hex($password); - my $ret->{messagetype} ='w3-red'; # my $newsid = undef; $login = lc($login); $login =~ s/^\s+//; diff --git a/backoffice/data/output/pot/periode_20191230-20200223_pot_period.pdf b/backoffice/data/output/pot/periode_20191230-20200223_pot_period.pdf deleted file mode 100644 index c8c38f67c1021101656a545d577024ba88466d7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302716 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 z 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 Z-aVfm6|Fq20SgYxsi diff --git a/backoffice/data/reports/pot/pot_period.tt b/backoffice/data/reports/pot/pot_period.tt index 4d773067..931d87ea 100644 --- a/backoffice/data/reports/pot/pot_period.tt +++ b/backoffice/data/reports/pot/pot_period.tt @@ -76,27 +76,46 @@ tfoot { display:table-footer-group } Totaux - [% lastidstaff = 0 %] - [% firstrow = 1 %] - [% weektotals = ""%] + + [% wdk = 0 %] [% FOREACH pw = periodweek.execute(id_reportperiod,wl.weekident) %] - [% IF lastidstaff != pw.id_staff %] - [% IF firstrow == 0 %] - [% weektotals %] - + [% IF wdk == 0 %] + [% pw.surname %]
[% pw.prename %] + [% END %] + [% WHILE pw.daydate != wd.$wdk and wdk < 7 %] +   + [% wdk = wdk + 1 %] + [% END %] + [% #IF pw.daydate == wd.$wdk %] + [% IF wdk < 7 %] + [% IF pw.timestart1%] + + [% pw.timestart1 %]-[% pw.timeend1 %]
+ [% IF pw.timestart2 %][% pw.timestart2 %]-[% pw.timeend2 %]
[% END %] + [% IF pw.timepause %]P: [% pw.timepause %][% END %] + + [% IF pw.workhours %]T: [% pw.workhours %]
[%END %] + [% IF pw.recuperationhours %]R: [% pw.recuperationhours %]
[%END %] + [% IF pw.vacancyhours %]C: [% pw.vacancyhours %]
[%END %] + [% IF pw.vacancyhours %]J: [% pw.dayhours %][%END %] + [% ELSE %] - [% firstrow = 0 %] +   + [% END %] + [% END %] + [% wdk = wdk + 1 %] + [% IF wdk >= 7 %] + + [% IF pw.week_workhours && pw.week_workhours != "00:00" %]T: [% pw.week_workhours %]
[%END %] + [% IF pw.week_recuperationhours && pw.week_recuperationhours != "00:00" %]R: [% pw.week_recuperationhours %]
[%END %] + [% IF pw.week_vacancyhours && pw.week_vacancyhours != "00:00" %]C: [% pw.week_vacancyhours %]
[%END %] + [% IF pw.week_totalhours && pw.week_totalhours != "00:00" %]S: [% pw.week_totalhours %]
[%END %] + [% IF pw.week_diffhours && pw.week_diffhours != "00:00" %]D: [% pw.week_diffhours %][%END %] + [% wdk = 0 %] + [% END %] - - [% pw.surname %]
[% pw.prename %] - [% lastidstaff = pw.id_staff %] - [% END %] - [% pw.timestart1 %]-[% pw.timeend1 %]
[% pw.timestart2 %]-[% pw.timeend2 %]
P: [% pw.timepause %] - T: [% pw.workhours %]
R: [% pw.recuperationhours %]
C: [% pw.vacancyhours %]
J: [% pw.dayhours %] - [% weektotals = "T: ${pw.week_workhours}
R: ${pw.week_recuperationhours}
C: ${pw.week_vacancyhours}
S: ${pw.week_totalhours}
D: ${pw.week_diffhours}" %] [% END %] - [% weektotals %] - +

diff --git a/backoffice/js/.DS_Store b/backoffice/js/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0= 200 && request.status <= 400){ diff --git a/backoffice/tmp/sql.log b/backoffice/tmp/sql.log new file mode 100644 index 00000000..24c582ad --- /dev/null +++ b/backoffice/tmp/sql.log @@ -0,0 +1,7 @@ +pwd: fb1ia1ka +pwd: 0ecf731e2426a8a469f06e9f4a3bcbed6f8071d9d3e3ef7ef5fd9165021e27ec +$VAR1 = { + '0' => { + 'checklogin' => 'B9GPFgP2iJpHQUZYwUy4enrhzxtDZWcqWJ6sPLlX' + } + }; diff --git a/dev/db/diff_db.sh b/dev/db/diff_db.sh index 0a9bab58..f060d709 100644 --- a/dev/db/diff_db.sh +++ b/dev/db/diff_db.sh @@ -38,41 +38,41 @@ diff ${CALLDIR}'/'${DBNAME}'.public.columns.live.txt' ${CALLDIR}'/'${DBNAME}'.pu cat ${CALLDIR}'/update.public.columns.txt' | awk -F"|" '{ print "ALTER TABLE "$1"."$2" ADD COLUMN "$4" "$5";"}' >> ${CALLDIR}'/livedbupdate.sql' -#3. check all userschema tables not installed -DBHOST="localhost" -psql -h ${DBHOST} -U ${DBUSER} -w ${DBNAME} -t -F ";" -c "select tb.table_name,tb.table_type from information_schema.tables tb join information_schema.schemata sc -on (tb.table_schema=sc.schema_name and sc.schema_name in ('"${REFUSERSCHEMA}"')) -order by tb.table_type,tb.table_schema,tb.table_name;" | sort | sed -e 's/\s//g' > ${CALLDIR}'/'${DBNAME}'.refschema.tables.local.txt' +# #3. check all userschema tables not installed +# DBHOST="localhost" +# psql -h ${DBHOST} -U ${DBUSER} -w ${DBNAME} -t -F ";" -c "select tb.table_name,tb.table_type from information_schema.tables tb join information_schema.schemata sc +# on (tb.table_schema=sc.schema_name and sc.schema_name in ('"${REFUSERSCHEMA}"')) +# order by tb.table_type,tb.table_schema,tb.table_name;" | sort | sed -e 's/\s//g' > ${CALLDIR}'/'${DBNAME}'.refschema.tables.local.txt' -#4. check all userschema columns not installed -DBHOST="localhost" -psql -h ${DBHOST} -U ${DBUSER} -w ${DBNAME} -t -F ";" -c "select tb.table_name,tb.table_type, col.column_name,col.data_type from information_schema.tables tb -join information_schema.columns col on (tb.table_schema=col.table_Schema and tb.table_name=col.table_name) -where tb.table_schema='"${REFUSERSCHEMA}"' order by tb.table_name,tb.table_type,col.column_name; " | sort | sed -e 's/\s//g' > ${CALLDIR}'/'${DBNAME}'.refschema.columns.local.txt' +# #4. check all userschema columns not installed +# DBHOST="localhost" +# psql -h ${DBHOST} -U ${DBUSER} -w ${DBNAME} -t -F ";" -c "select tb.table_name,tb.table_type, col.column_name,col.data_type from information_schema.tables tb +# join information_schema.columns col on (tb.table_schema=col.table_Schema and tb.table_name=col.table_name) +# where tb.table_schema='"${REFUSERSCHEMA}"' order by tb.table_name,tb.table_type,col.column_name; " | sort | sed -e 's/\s//g' > ${CALLDIR}'/'${DBNAME}'.refschema.columns.local.txt' #TODO change to LIVE DBHOST="localhost" USCHEMA=(`psql -h ${DBHOST} -U ${DBUSER} -w ${DBNAME} -0 -t -c "select schema_name from information_schema.schemata where schema_owner='${DBUSER}';"`) -for sc in "${USCHEMA[@]}" -do - echo "check schema "$sc - export CSCHEMA=$sc - #tables - psql -h ${DBHOST} -U ${DBUSER} -w ${DBNAME} -t -F ";" -c "select tb.table_name,tb.table_type from information_schema.tables tb join information_schema.schemata sc -on (tb.table_schema=sc.schema_name and sc.schema_name in ('"$sc"')) -order by tb.table_type,tb.table_schema,tb.table_name;" | sort | sed -e 's/\s//g' > ${CALLDIR}'/'${DBNAME}'.'$sc'.tables.live.txt' - - diff ${CALLDIR}'/'${DBNAME}'.'$sc'.tables.live.txt' ${CALLDIR}'/'${DBNAME}'.refschema.tables.local.txt' | grep -e "^>.*|BASETABLE" | sed -e 's/'${REFUSERSCHEMA}'/'$sc'/g' | sed -e 's/>\ //g;' > ${CALLDIR}'/update.'$sc'.tables.txt' - cat ${CALLDIR}'/update.'$sc'.tables.txt' | awk -F"|" '{ print "CREATE TABLE "$CSCHEMA"."$1"();"}' >> ${CALLDIR}'/livedbupdate.sql' - #columns - psql -h ${DBHOST} -U ${DBUSER} -w ${DBNAME} -t -F ";" -c "select tb.table_name,tb.table_type, col.column_name,col.data_type from information_schema.tables tb -join information_schema.columns col on (tb.table_schema=col.table_schema and tb.table_name=col.table_name) -where tb.table_schema='"$sc"' order by tb.table_name,tb.table_type,col.column_name; " | sort | sed -e 's/\s//g' > ${CALLDIR}'/'${DBNAME}'.'$sc'.columns.live.txt' +# for sc in "${USCHEMA[@]}" +# do +# echo "check schema "$sc +# export CSCHEMA=$sc +# #tables +# psql -h ${DBHOST} -U ${DBUSER} -w ${DBNAME} -t -F ";" -c "select tb.table_name,tb.table_type from information_schema.tables tb join information_schema.schemata sc +# on (tb.table_schema=sc.schema_name and sc.schema_name in ('"$sc"')) +# order by tb.table_type,tb.table_schema,tb.table_name;" | sort | sed -e 's/\s//g' > ${CALLDIR}'/'${DBNAME}'.'$sc'.tables.live.txt' + +# diff ${CALLDIR}'/'${DBNAME}'.'$sc'.tables.live.txt' ${CALLDIR}'/'${DBNAME}'.refschema.tables.local.txt' | grep -e "^>.*|BASETABLE" | sed -e 's/'${REFUSERSCHEMA}'/'$sc'/g' | sed -e 's/>\ //g;' > ${CALLDIR}'/update.'$sc'.tables.txt' +# cat ${CALLDIR}'/update.'$sc'.tables.txt' | awk -F"|" '{ print "CREATE TABLE "$CSCHEMA"."$1"();"}' >> ${CALLDIR}'/livedbupdate.sql' +# #columns +# psql -h ${DBHOST} -U ${DBUSER} -w ${DBNAME} -t -F ";" -c "select tb.table_name,tb.table_type, col.column_name,col.data_type from information_schema.tables tb +# join information_schema.columns col on (tb.table_schema=col.table_schema and tb.table_name=col.table_name) +# where tb.table_schema='"$sc"' order by tb.table_name,tb.table_type,col.column_name; " | sort | sed -e 's/\s//g' > ${CALLDIR}'/'${DBNAME}'.'$sc'.columns.live.txt' - diff ${CALLDIR}'/'${DBNAME}'.'$sc'.columns.live.txt' ${CALLDIR}'/'${DBNAME}'.refschema.columns.local.txt' | grep -e "^>.*|BASETABLE|" | sed -e 's/'${REFUSERSCHEMA}'/'$sc'/g' | sed -e 's/>\ //g;' > ${CALLDIR}'/update.'$sc'.columns.txt' - cat ${CALLDIR}'/update.'$sc'.columns.txt' | awk -F"|" '{ print "ALTER TABLE "$CSCHEMA"."$1" ADD COLUMN "$3" "$4";"}' >> ${CALLDIR}'/livedbupdate.sql' -done +# diff ${CALLDIR}'/'${DBNAME}'.'$sc'.columns.live.txt' ${CALLDIR}'/'${DBNAME}'.refschema.columns.local.txt' | grep -e "^>.*|BASETABLE|" | sed -e 's/'${REFUSERSCHEMA}'/'$sc'/g' | sed -e 's/>\ //g;' > ${CALLDIR}'/update.'$sc'.columns.txt' +# cat ${CALLDIR}'/update.'$sc'.columns.txt' | awk -F"|" '{ print "ALTER TABLE "$CSCHEMA"."$1" ADD COLUMN "$3" "$4";"}' >> ${CALLDIR}'/livedbupdate.sql' +# done export CSCHEMA= #views to reinstall # for cc in "${BTCOL[@]}" diff --git a/dev/db/livedbupdate.sql b/dev/db/livedbupdate.sql index fa3080ea..2230fba2 100644 --- a/dev/db/livedbupdate.sql +++ b/dev/db/livedbupdate.sql @@ -1,117 +1,6 @@ -ALTER TABLE public.users ADD COLUMN id_company integer; -ALTER TABLE public.users ADD COLUMN id_usergroups json; -ALTER TABLE public.users ADD COLUMN job text; -ALTER TABLE public.users ADD COLUMN phone text; -ALTER TABLE public.users ADD COLUMN prename text; -ALTER TABLE public.users ADD COLUMN surname text; -CREATE TABLE reportperiod|BASETABLE.reportperiod(); -CREATE TABLE sites|BASETABLE.sites(); -CREATE TABLE staffcontract|BASETABLE.staffcontract(); -CREATE TABLE staffgroups|BASETABLE.staffgroups(); -CREATE TABLE stafftimetracks|BASETABLE.stafftimetracks(); -CREATE TABLE staffvacancy|BASETABLE.staffvacancy(); -CREATE TABLE staffvacancyyear|BASETABLE.staffvacancyyear(); -CREATE TABLE staffworkplan|BASETABLE.staffworkplan(); -CREATE TABLE workplans|BASETABLE.workplans(); -CREATE TABLE worktypes|BASETABLE.worktypes(); -ALTER TABLE reportperiod|BASETABLE|enddate|date.reportperiod ADD COLUMN enddate date; -ALTER TABLE reportperiod|BASETABLE|id|integer.reportperiod ADD COLUMN id integer; -ALTER TABLE reportperiod|BASETABLE|periodname|text.reportperiod ADD COLUMN periodname text; -ALTER TABLE reportperiod|BASETABLE|startdate|date.reportperiod ADD COLUMN startdate date; -ALTER TABLE sites|BASETABLE|address|text.sites ADD COLUMN address text; -ALTER TABLE sites|BASETABLE|city|text.sites ADD COLUMN city text; -ALTER TABLE sites|BASETABLE|country|text.sites ADD COLUMN country text; -ALTER TABLE sites|BASETABLE|created|timestampwithouttimezone.sites ADD COLUMN created timestampwithouttimezone; -ALTER TABLE sites|BASETABLE|id|integer.sites ADD COLUMN id integer; -ALTER TABLE sites|BASETABLE|id_timetracker|integer.sites ADD COLUMN id_timetracker integer; -ALTER TABLE sites|BASETABLE|modified|timestampwithouttimezone.sites ADD COLUMN modified timestampwithouttimezone; -ALTER TABLE sites|BASETABLE|sitename|text.sites ADD COLUMN sitename text; -ALTER TABLE sites|BASETABLE|timeclockhost|text.sites ADD COLUMN timeclockhost text; -ALTER TABLE sites|BASETABLE|zip|text.sites ADD COLUMN zip text; -ALTER TABLE staff|BASETABLE|birthdate|date.staff ADD COLUMN birthdate date; -ALTER TABLE staff|BASETABLE|entrydate|date.staff ADD COLUMN entrydate date; -ALTER TABLE staff|BASETABLE|job|text.staff ADD COLUMN job text; -ALTER TABLE staff|BASETABLE|leavedate|date.staff ADD COLUMN leavedate date; -ALTER TABLE staff|BASETABLE|staffnumber|text.staff ADD COLUMN staffnumber text; -ALTER TABLE staffcontract|BASETABLE|id|integer.staffcontract ADD COLUMN id integer; -ALTER TABLE staffcontract|BASETABLE|id_staffgroup|integer.staffcontract ADD COLUMN id_staffgroup integer; -ALTER TABLE staffcontract|BASETABLE|id_staff|integer.staffcontract ADD COLUMN id_staff integer; -ALTER TABLE staffcontract|BASETABLE|monthhours|numeric.staffcontract ADD COLUMN monthhours numeric; -ALTER TABLE staffcontract|BASETABLE|startdate|date.staffcontract ADD COLUMN startdate date; -ALTER TABLE staffcontract|BASETABLE|weekhours|numeric.staffcontract ADD COLUMN weekhours numeric; -ALTER TABLE staffgroups|BASETABLE|groupcolor|text.staffgroups ADD COLUMN groupcolor text; -ALTER TABLE staffgroups|BASETABLE|groupname|text.staffgroups ADD COLUMN groupname text; -ALTER TABLE staffgroups|BASETABLE|id|integer.staffgroups ADD COLUMN id integer; -ALTER TABLE stafftimetracks|BASETABLE|created|timestampwithouttimezone.stafftimetracks ADD COLUMN created timestampwithouttimezone; -ALTER TABLE stafftimetracks|BASETABLE|id|bigint.stafftimetracks ADD COLUMN id bigint; -ALTER TABLE stafftimetracks|BASETABLE|id_staff|integer.stafftimetracks ADD COLUMN id_staff integer; -ALTER TABLE stafftimetracks|BASETABLE|modified|timestampwithouttimezone.stafftimetracks ADD COLUMN modified timestampwithouttimezone; -ALTER TABLE stafftimetracks|BASETABLE|stamp_in|timestampwithouttimezone.stafftimetracks ADD COLUMN stamp_in timestampwithouttimezone; -ALTER TABLE stafftimetracks|BASETABLE|stamp_out|timestampwithouttimezone.stafftimetracks ADD COLUMN stamp_out timestampwithouttimezone; -ALTER TABLE stafftimetracks|BASETABLE|tracktype|text.stafftimetracks ADD COLUMN tracktype text; -ALTER TABLE staffvacancy|BASETABLE|dayhours|timewithouttimezone.staffvacancy ADD COLUMN dayhours timewithouttimezone; -ALTER TABLE staffvacancy|BASETABLE|enddate|date.staffvacancy ADD COLUMN enddate date; -ALTER TABLE staffvacancy|BASETABLE|id|integer.staffvacancy ADD COLUMN id integer; -ALTER TABLE staffvacancy|BASETABLE|id_staff|integer.staffvacancy ADD COLUMN id_staff integer; -ALTER TABLE staffvacancy|BASETABLE|note|text.staffvacancy ADD COLUMN note text; -ALTER TABLE staffvacancy|BASETABLE|startdate|date.staffvacancy ADD COLUMN startdate date; -ALTER TABLE staffvacancy|BASETABLE|vacancytype|text.staffvacancy ADD COLUMN vacancytype text; -ALTER TABLE staffvacancy|BASETABLE|validated|boolean.staffvacancy ADD COLUMN validated boolean; -ALTER TABLE staffvacancyyear|BASETABLE|days|numeric.staffvacancyyear ADD COLUMN days numeric; -ALTER TABLE staffvacancyyear|BASETABLE|hours|numeric.staffvacancyyear ADD COLUMN hours numeric; -ALTER TABLE staffvacancyyear|BASETABLE|id|integer.staffvacancyyear ADD COLUMN id integer; -ALTER TABLE staffvacancyyear|BASETABLE|id_staff|integer.staffvacancyyear ADD COLUMN id_staff integer; -ALTER TABLE staffvacancyyear|BASETABLE|vyear|integer.staffvacancyyear ADD COLUMN vyear integer; -ALTER TABLE staffworkplan|BASETABLE|daydate|date.staffworkplan ADD COLUMN daydate date; -ALTER TABLE staffworkplan|BASETABLE|id|bigint.staffworkplan ADD COLUMN id bigint; -ALTER TABLE staffworkplan|BASETABLE|id_staff|integer.staffworkplan ADD COLUMN id_staff integer; -ALTER TABLE staffworkplan|BASETABLE|timeend1|timewithouttimezone.staffworkplan ADD COLUMN timeend1 timewithouttimezone; -ALTER TABLE staffworkplan|BASETABLE|timeend2|timewithouttimezone.staffworkplan ADD COLUMN timeend2 timewithouttimezone; -ALTER TABLE staffworkplan|BASETABLE|timepause|timewithouttimezone.staffworkplan ADD COLUMN timepause timewithouttimezone; -ALTER TABLE staffworkplan|BASETABLE|timestart1|timewithouttimezone.staffworkplan ADD COLUMN timestart1 timewithouttimezone; -ALTER TABLE staffworkplan|BASETABLE|timestart2|timewithouttimezone.staffworkplan ADD COLUMN timestart2 timewithouttimezone; -ALTER TABLE staffworkplan|BASETABLE|vacancyhours|timewithouttimezone.staffworkplan ADD COLUMN vacancyhours timewithouttimezone; -ALTER TABLE staffworkplan|BASETABLE|vacancytype|text.staffworkplan ADD COLUMN vacancytype text; -ALTER TABLE workplans|BASETABLE|fri_timeend1|timewithouttimezone.workplans ADD COLUMN fri_timeend1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|fri_timeend2|timewithouttimezone.workplans ADD COLUMN fri_timeend2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|fri_timepause|timewithouttimezone.workplans ADD COLUMN fri_timepause timewithouttimezone; -ALTER TABLE workplans|BASETABLE|fri_timestart1|timewithouttimezone.workplans ADD COLUMN fri_timestart1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|fri_timestart2|timewithouttimezone.workplans ADD COLUMN fri_timestart2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|id|integer.workplans ADD COLUMN id integer; -ALTER TABLE workplans|BASETABLE|mon_timeend1|timewithouttimezone.workplans ADD COLUMN mon_timeend1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|mon_timeend2|timewithouttimezone.workplans ADD COLUMN mon_timeend2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|mon_timepause|timewithouttimezone.workplans ADD COLUMN mon_timepause timewithouttimezone; -ALTER TABLE workplans|BASETABLE|mon_timestart1|timewithouttimezone.workplans ADD COLUMN mon_timestart1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|mon_timestart2|timewithouttimezone.workplans ADD COLUMN mon_timestart2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|sat_timeend1|timewithouttimezone.workplans ADD COLUMN sat_timeend1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|sat_timeend2|timewithouttimezone.workplans ADD COLUMN sat_timeend2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|sat_timepause|timewithouttimezone.workplans ADD COLUMN sat_timepause timewithouttimezone; -ALTER TABLE workplans|BASETABLE|sat_timestart1|timewithouttimezone.workplans ADD COLUMN sat_timestart1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|sat_timestart2|timewithouttimezone.workplans ADD COLUMN sat_timestart2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|sun_timeend1|timewithouttimezone.workplans ADD COLUMN sun_timeend1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|sun_timeend2|timewithouttimezone.workplans ADD COLUMN sun_timeend2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|sun_timepause|timewithouttimezone.workplans ADD COLUMN sun_timepause timewithouttimezone; -ALTER TABLE workplans|BASETABLE|sun_timestart1|timewithouttimezone.workplans ADD COLUMN sun_timestart1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|sun_timestart2|timewithouttimezone.workplans ADD COLUMN sun_timestart2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|thu_timeend1|timewithouttimezone.workplans ADD COLUMN thu_timeend1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|thu_timeend2|timewithouttimezone.workplans ADD COLUMN thu_timeend2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|thu_timepause|timewithouttimezone.workplans ADD COLUMN thu_timepause timewithouttimezone; -ALTER TABLE workplans|BASETABLE|thu_timestart1|timewithouttimezone.workplans ADD COLUMN thu_timestart1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|thu_timestart2|timewithouttimezone.workplans ADD COLUMN thu_timestart2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|tue_timeend1|timewithouttimezone.workplans ADD COLUMN tue_timeend1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|tue_timeend2|timewithouttimezone.workplans ADD COLUMN tue_timeend2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|tue_timepause|timewithouttimezone.workplans ADD COLUMN tue_timepause timewithouttimezone; -ALTER TABLE workplans|BASETABLE|tue_timestart1|timewithouttimezone.workplans ADD COLUMN tue_timestart1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|tue_timestart2|timewithouttimezone.workplans ADD COLUMN tue_timestart2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|wed_timeend1|timewithouttimezone.workplans ADD COLUMN wed_timeend1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|wed_timeend2|timewithouttimezone.workplans ADD COLUMN wed_timeend2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|wed_timepause|timewithouttimezone.workplans ADD COLUMN wed_timepause timewithouttimezone; -ALTER TABLE workplans|BASETABLE|wed_timestart1|timewithouttimezone.workplans ADD COLUMN wed_timestart1 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|wed_timestart2|timewithouttimezone.workplans ADD COLUMN wed_timestart2 timewithouttimezone; -ALTER TABLE workplans|BASETABLE|workplan|text.workplans ADD COLUMN workplan text; -ALTER TABLE worktypes|BASETABLE|id|integer.worktypes ADD COLUMN id integer; -ALTER TABLE worktypes|BASETABLE|isfreetime|boolean.worktypes ADD COLUMN isfreetime boolean; -ALTER TABLE worktypes|BASETABLE|isworktime|boolean.worktypes ADD COLUMN isworktime boolean; -ALTER TABLE worktypes|BASETABLE|typecolor|text.worktypes ADD COLUMN typecolor text; -ALTER TABLE worktypes|BASETABLE|worktype|text.worktypes ADD COLUMN worktype text; +ALTER TABLE public.apps ADD COLUMN id_usergroups json; +ALTER TABLE public.companies ADD COLUMN reportperiodlength integer; +ALTER TABLE public.companies ADD COLUMN reportperiodstart date; +ALTER TABLE public.companies ADD COLUMN reportperiodunit text; +ALTER TABLE public.users ADD COLUMN id_usergroup integer; diff --git a/dev/db/potlu_db.demo.columns.live.txt b/dev/db/potlu_db.demo.columns.live.txt deleted file mode 100644 index 2c71c0cf..00000000 --- a/dev/db/potlu_db.demo.columns.live.txt +++ /dev/null @@ -1,22 +0,0 @@ - -staff|BASETABLE|fingerprint|text -staff|BASETABLE|id|integer -staff|BASETABLE|id_user|integer -staff|BASETABLE|pincde|text -staff|BASETABLE|prename|text -staff|BASETABLE|staffident|text -staff|BASETABLE|stations|json -staff|BASETABLE|surname|text -stations|BASETABLE|address|text -stations|BASETABLE|city|text -stations|BASETABLE|country|text -stations|BASETABLE|hostname|text -stations|BASETABLE|id|integer -stations|BASETABLE|installdate|date -stations|BASETABLE|isactive|boolean -stations|BASETABLE|plz|text -stations|BASETABLE|station|text -timetrackuser|BASETABLE|id|bigint -timetrackuser|BASETABLE|id_staff|integer -timetrackuser|BASETABLE|stamp_in|timestampwithouttimezone -timetrackuser|BASETABLE|stamp_out|timestampwithouttimezone diff --git a/dev/db/potlu_db.demo.tables.live.txt b/dev/db/potlu_db.demo.tables.live.txt deleted file mode 100644 index 94dbf2b8..00000000 --- a/dev/db/potlu_db.demo.tables.live.txt +++ /dev/null @@ -1,4 +0,0 @@ - -staff|BASETABLE -stations|BASETABLE -timetrackuser|BASETABLE diff --git a/dev/db/potlu_db.newcompanyschema.pg.schema.sql-e b/dev/db/potlu_db.newcompanyschema.pg.schema.sql-e deleted file mode 100644 index 28b37cf1..00000000 --- a/dev/db/potlu_db.newcompanyschema.pg.schema.sql-e +++ /dev/null @@ -1,1349 +0,0 @@ - - - - -CREATE SCHEMA %%NEWSCHEMA%%; - - - - - -CREATE TABLE %%NEWSCHEMA%%.defaultweekworkplan ( - id integer NOT NULL, - id_staff integer, - startdate date, - mon json, - tue json, - wed json, - thu json, - fri json, - sat json, - sun json -); - - - -CREATE SEQUENCE %%NEWSCHEMA%%.defaultweekworkplan_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - - -ALTER SEQUENCE %%NEWSCHEMA%%.defaultweekworkplan_id_seq OWNED BY %%NEWSCHEMA%%.defaultweekworkplan.id; - - - -CREATE TABLE %%NEWSCHEMA%%.defaultworkplan ( - id bigint NOT NULL, - id_staff integer, - daydate date, - plannedtimes json, - vacancytimes json, - presencetimes json -); - - - -CREATE SEQUENCE %%NEWSCHEMA%%.defaultworkplan_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - - -ALTER SEQUENCE %%NEWSCHEMA%%.defaultworkplan_id_seq OWNED BY %%NEWSCHEMA%%.defaultworkplan.id; - - - -CREATE TABLE %%NEWSCHEMA%%.reportperiod ( - id integer NOT NULL, - periodname text, - startdate date, - enddate date -); - - - -CREATE SEQUENCE %%NEWSCHEMA%%.reportperiod_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - - -ALTER SEQUENCE %%NEWSCHEMA%%.reportperiod_id_seq OWNED BY %%NEWSCHEMA%%.reportperiod.id; - - - -CREATE TABLE %%NEWSCHEMA%%.sites ( - id integer NOT NULL, - sitename text, - address text, - zip text, - city text, - country text, - id_timetracker integer, - created timestamp without time zone DEFAULT now(), - modified timestamp without time zone DEFAULT now(), - timeclockhost text -); - - - -CREATE SEQUENCE %%NEWSCHEMA%%.sites_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - - -ALTER SEQUENCE %%NEWSCHEMA%%.sites_id_seq OWNED BY %%NEWSCHEMA%%.sites.id; - - - -CREATE TABLE %%NEWSCHEMA%%.staff ( - id integer NOT NULL, - staffnumber text, - surname text, - prename text, - job text, - birthdate date, - entrydate date, - leavedate date -); - - - -CREATE SEQUENCE %%NEWSCHEMA%%.staff_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - - -ALTER SEQUENCE %%NEWSCHEMA%%.staff_id_seq OWNED BY %%NEWSCHEMA%%.staff.id; - - - -CREATE TABLE %%NEWSCHEMA%%.staffgroups ( - id integer NOT NULL, - groupname text, - groupcolor text -); - - - -CREATE SEQUENCE %%NEWSCHEMA%%.staffgroups_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - - -ALTER SEQUENCE %%NEWSCHEMA%%.staffgroups_id_seq OWNED BY %%NEWSCHEMA%%.staffgroups.id; - - - -CREATE TABLE %%NEWSCHEMA%%.staffperiodbase ( - id integer NOT NULL, - id_staff integer, - startdate date, - monthhours numeric, - weekhours numeric -); - - - -CREATE SEQUENCE %%NEWSCHEMA%%.staffperiodbase_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - - -ALTER SEQUENCE %%NEWSCHEMA%%.staffperiodbase_id_seq OWNED BY %%NEWSCHEMA%%.staffperiodbase.id; - - - -CREATE TABLE %%NEWSCHEMA%%.stafftimetracks ( - id bigint NOT NULL, - id_staff integer, - stamp_in timestamp without time zone, - stamp_out timestamp without time zone, - tracktype text, - created timestamp without time zone DEFAULT now(), - modified timestamp without time zone DEFAULT now() -); - - - -CREATE SEQUENCE %%NEWSCHEMA%%.stafftimetracks_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - - -ALTER SEQUENCE %%NEWSCHEMA%%.stafftimetracks_id_seq OWNED BY %%NEWSCHEMA%%.stafftimetracks.id; - - - -CREATE TABLE %%NEWSCHEMA%%.staffvacancy ( - id integer NOT NULL, - id_staff integer, - startdate date, - enddate date, - vacancytype text, - dayhours time without time zone, - note text, - validated boolean -); - - - -CREATE SEQUENCE %%NEWSCHEMA%%.staffvacancy_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - - -ALTER SEQUENCE %%NEWSCHEMA%%.staffvacancy_id_seq OWNED BY %%NEWSCHEMA%%.staffvacancy.id; - - - -CREATE TABLE %%NEWSCHEMA%%.staffvacancyyear ( - id integer NOT NULL, - id_staff integer, - vyear integer, - hours numeric, - days numeric -); - - - -CREATE SEQUENCE %%NEWSCHEMA%%.staffvacancyyear_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - - -ALTER SEQUENCE %%NEWSCHEMA%%.staffvacancyyear_id_seq OWNED BY %%NEWSCHEMA%%.staffvacancyyear.id; - - - -CREATE TABLE %%NEWSCHEMA%%.staffworkplan ( - id bigint NOT NULL, - id_staff integer, - daydate date, - timestart1 time without time zone, - timeend1 time without time zone, - timestart2 time without time zone, - timeend2 time without time zone, - timepause time without time zone, - vacancyhours time without time zone, - vacancytype text -); - - - -CREATE SEQUENCE %%NEWSCHEMA%%.staffworkplan_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - - -ALTER SEQUENCE %%NEWSCHEMA%%.staffworkplan_id_seq OWNED BY %%NEWSCHEMA%%.staffworkplan.id; - - - -CREATE VIEW %%NEWSCHEMA%%.vw_reportperiodlist AS - SELECT reportperiod.id, - reportperiod.periodname, - reportperiod.startdate, - reportperiod.enddate - FROM %%NEWSCHEMA%%.reportperiod; - - - -CREATE VIEW %%NEWSCHEMA%%.vw_stafflist AS - SELECT staff.id, - staff.staffnumber, - staff.surname, - staff.prename, - staff.job, - staff.birthdate, - staff.entrydate, - staff.leavedate, - ((staff.surname || ' '::text) || staff.prename) AS dspname - FROM %%NEWSCHEMA%%.staff; - - - -CREATE VIEW %%NEWSCHEMA%%.vw_staffplanned_dayweektotals AS - SELECT stw2.calweek, - stw2.caldate AS dates, - stw2.id_staff, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS mon_id, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS mon_start1, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS mon_end1, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS mon_start2, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS mon_end2, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS mon_pause, - to_char(max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS mon_timetotal, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS tue_id, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS tue_start1, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS tue_end1, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS tue_start2, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS tue_end2, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS tue_pause, - to_char(max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS tue_timetotal, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS wed_id, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS wed_start1, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS wed_end1, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS wed_start2, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS wed_end2, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS wed_pause, - to_char(max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS wed_timetotal, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS thu_id, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS thu_start1, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS thu_end1, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS thu_start2, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS thu_end2, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS thu_pause, - to_char(max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS thu_timetotal, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS fri_id, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS fri_start1, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS fri_end1, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS fri_start2, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS fri_end2, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS fri_pause, - to_char(max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS fri_timetotal, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS sat_id, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sat_start1, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sat_end1, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sat_start2, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sat_end2, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sat_pause, - to_char(max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS sat_timetotal, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS sun_id, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sun_start1, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sun_end1, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sun_start2, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sun_end2, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sun_pause, - to_char(max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS sun_timetotal, - to_char(sum(((stw2.time1 + stw2.time2) - (stw2.timepause)::interval)), 'HH24:MI'::text) AS week_timetotal - FROM ( SELECT staffworkplan.daydate, - date_part('week'::text, staffworkplan.daydate) AS calweek, - (date_trunc('week'::text, (staffworkplan.daydate)::timestamp with time zone))::date AS caldate, - date_part('isodow'::text, staffworkplan.daydate) AS isodow, - staffworkplan.id, - staffworkplan.id_staff, - staffworkplan.timestart1, - staffworkplan.timeend1, - CASE - WHEN (staffworkplan.timestart1 > staffworkplan.timeend1) THEN ('24:00:00'::time without time zone - ((staffworkplan.timestart1 - staffworkplan.timeend1))::time without time zone) - ELSE (staffworkplan.timeend1 - staffworkplan.timestart1) - END AS time1, - staffworkplan.timestart2, - staffworkplan.timeend2, - CASE - WHEN (staffworkplan.timestart2 > staffworkplan.timeend2) THEN ('24:00:00'::time without time zone - ((staffworkplan.timestart2 - staffworkplan.timeend2))::time without time zone) - ELSE (staffworkplan.timeend2 - staffworkplan.timestart2) - END AS time2, - staffworkplan.timepause - FROM %%NEWSCHEMA%%.staffworkplan) stw2 - GROUP BY stw2.calweek, stw2.caldate, stw2.id_staff; - - - -CREATE VIEW %%NEWSCHEMA%%.vw_staffworkplan_weekly AS - SELECT stw2.calweek, - to_char((stw2.caldate)::timestamp with time zone, 'YYYY'::text) AS calyear, - stw2.caldate AS weekbegin, - public.getdateslist(stw2.caldate, 7) AS dates, - stw2.id_staff, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS mon_id, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS mon_start1, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS mon_end1, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS mon_start2, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS mon_end2, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS mon_pause, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN to_char((stw2.vacancyhours)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS mon_vacancyhours, - max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN stw2.vacancytype - ELSE NULL::text - END) AS mon_vacancytype, - to_char(max( - CASE - WHEN (stw2.isodow = (1)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS mon_timetotal, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS tue_id, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS tue_start1, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS tue_end1, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS tue_start2, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS tue_end2, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS tue_pause, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN to_char((stw2.vacancyhours)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS tue_vacancyhours, - max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN stw2.vacancytype - ELSE NULL::text - END) AS tue_vacancytype, - to_char(max( - CASE - WHEN (stw2.isodow = (2)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS tue_timetotal, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS wed_id, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS wed_start1, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS wed_end1, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS wed_start2, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS wed_end2, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS wed_pause, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN to_char((stw2.vacancyhours)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS wed_vacancyhours, - max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN stw2.vacancytype - ELSE NULL::text - END) AS wed_vacancytype, - to_char(max( - CASE - WHEN (stw2.isodow = (3)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS wed_timetotal, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS thu_id, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS thu_start1, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS thu_end1, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS thu_start2, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS thu_end2, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS thu_pause, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN to_char((stw2.vacancyhours)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS thu_vacancyhours, - max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN stw2.vacancytype - ELSE NULL::text - END) AS thu_vacancytype, - to_char(max( - CASE - WHEN (stw2.isodow = (4)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS thu_timetotal, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS fri_id, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS fri_start1, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS fri_end1, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS fri_start2, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS fri_end2, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS fri_pause, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN to_char((stw2.vacancyhours)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS fri_vacancyhours, - max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN stw2.vacancytype - ELSE NULL::text - END) AS fri_vacancytype, - to_char(max( - CASE - WHEN (stw2.isodow = (5)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS fri_timetotal, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS sat_id, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sat_start1, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sat_end1, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sat_start2, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sat_end2, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sat_pause, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN to_char((stw2.vacancyhours)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sat_vacancyhours, - max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN stw2.vacancytype - ELSE NULL::text - END) AS sat_vacancytype, - to_char(max( - CASE - WHEN (stw2.isodow = (6)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS sat_timetotal, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN stw2.id - ELSE NULL::bigint - END) AS sun_id, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN to_char((stw2.timestart1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sun_start1, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN to_char((stw2.timeend1)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sun_end1, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN to_char((stw2.timestart2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sun_start2, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN to_char((stw2.timeend2)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sun_end2, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN to_char((stw2.timepause)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sun_pause, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN to_char((stw2.vacancyhours)::interval, 'HH24:MI'::text) - ELSE NULL::text - END) AS sun_vacancyhours, - max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN stw2.vacancytype - ELSE NULL::text - END) AS sun_vacancytype, - to_char(max( - CASE - WHEN (stw2.isodow = (7)::double precision) THEN ((stw2.time1 + stw2.time2) - (stw2.timepause)::interval) - ELSE NULL::interval - END), 'HH24:MI'::text) AS sun_timetotal, - to_char(sum(((stw2.time1 + stw2.time2) - (stw2.timepause)::interval)), 'HH24:MI'::text) AS week_timetotal - FROM ( SELECT staffworkplan.daydate, - date_part('week'::text, staffworkplan.daydate) AS calweek, - (date_trunc('week'::text, (staffworkplan.daydate)::timestamp with time zone))::date AS caldate, - date_part('isodow'::text, staffworkplan.daydate) AS isodow, - staffworkplan.id, - staffworkplan.id_staff, - staffworkplan.timestart1, - staffworkplan.timeend1, - staffworkplan.vacancyhours, - staffworkplan.vacancytype, - CASE - WHEN (staffworkplan.timestart1 > staffworkplan.timeend1) THEN ('24:00:00'::time without time zone - ((staffworkplan.timestart1 - staffworkplan.timeend1))::time without time zone) - ELSE (staffworkplan.timeend1 - staffworkplan.timestart1) - END AS time1, - staffworkplan.timestart2, - staffworkplan.timeend2, - CASE - WHEN (staffworkplan.timestart2 > staffworkplan.timeend2) THEN ('24:00:00'::time without time zone - ((staffworkplan.timestart2 - staffworkplan.timeend2))::time without time zone) - ELSE (staffworkplan.timeend2 - staffworkplan.timestart2) - END AS time2, - staffworkplan.timepause - FROM %%NEWSCHEMA%%.staffworkplan) stw2 - GROUP BY stw2.calweek, stw2.caldate, stw2.id_staff; - - - -CREATE VIEW %%NEWSCHEMA%%.vw_staffworkplanlist AS - SELECT st.id AS id_staff, - ((st.surname || ' '::text) || st.prename) AS staffname, - (((((('Semaine '::text || sp_dwt.calweek) || '
('::text) || to_char((sp_dwt.weekbegin)::timestamp with time zone, 'DD.MM.YYYY'::text)) || ' - '::text) || to_char((date((sp_dwt.weekbegin + '7 days'::interval)))::timestamp with time zone, 'DD.MM.YYYY'::text)) || ')'::text) AS calweek, - sp_dwt.week_timetotal, - sp_dwt.weekbegin AS weekstart, - date((sp_dwt.weekbegin + '7 days'::interval)) AS weekend, - to_char((((((( - CASE - WHEN (sp_dwt.mon_vacancytype = 'ill'::text) THEN COALESCE((sp_dwt.mon_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END + - CASE - WHEN (sp_dwt.tue_vacancytype = 'ill'::text) THEN COALESCE((sp_dwt.tue_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END) + - CASE - WHEN (sp_dwt.wed_vacancytype = 'ill'::text) THEN COALESCE((sp_dwt.wed_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END) + - CASE - WHEN (sp_dwt.thu_vacancytype = 'ill'::text) THEN COALESCE((sp_dwt.thu_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END) + - CASE - WHEN (sp_dwt.fri_vacancytype = 'ill'::text) THEN COALESCE((sp_dwt.fri_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END) + - CASE - WHEN (sp_dwt.sat_vacancytype = 'ill'::text) THEN COALESCE((sp_dwt.sat_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END) + - CASE - WHEN (sp_dwt.sun_vacancytype = 'ill'::text) THEN COALESCE((sp_dwt.sun_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END), 'HH24:MI'::text) AS weekvacancy_times_ill, - to_char((((((( - CASE - WHEN (sp_dwt.mon_vacancytype <> 'ill'::text) THEN COALESCE((sp_dwt.mon_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END + - CASE - WHEN (sp_dwt.tue_vacancytype <> 'ill'::text) THEN COALESCE((sp_dwt.tue_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END) + - CASE - WHEN (sp_dwt.wed_vacancytype <> 'ill'::text) THEN COALESCE((sp_dwt.wed_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END) + - CASE - WHEN (sp_dwt.thu_vacancytype <> 'ill'::text) THEN COALESCE((sp_dwt.thu_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END) + - CASE - WHEN (sp_dwt.fri_vacancytype <> 'ill'::text) THEN COALESCE((sp_dwt.fri_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END) + - CASE - WHEN (sp_dwt.sat_vacancytype <> 'ill'::text) THEN COALESCE((sp_dwt.sat_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END) + - CASE - WHEN (sp_dwt.sun_vacancytype <> 'ill'::text) THEN COALESCE((sp_dwt.sun_vacancyhours)::interval, '00:00:00'::interval) - ELSE '00:00:00'::interval - END), 'HH24:MI'::text) AS weekvacancy_times, - (((((( - CASE - WHEN (sp_dwt.mon_vacancytype = 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.mon_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.mon_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END + - CASE - WHEN (sp_dwt.tue_vacancytype = 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.tue_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.tue_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END) + - CASE - WHEN (sp_dwt.wed_vacancytype = 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.wed_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.wed_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END) + - CASE - WHEN (sp_dwt.thu_vacancytype = 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.thu_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.thu_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END) + - CASE - WHEN (sp_dwt.fri_vacancytype = 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.fri_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.fri_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END) + - CASE - WHEN (sp_dwt.sat_vacancytype = 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.sat_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.sat_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END) + - CASE - WHEN (sp_dwt.sun_vacancytype = 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.sun_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.sun_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END) AS weekvacancy_minutes_ill, - (((((( - CASE - WHEN (sp_dwt.mon_vacancytype <> 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.mon_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.mon_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END + - CASE - WHEN (sp_dwt.tue_vacancytype <> 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.tue_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.tue_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END) + - CASE - WHEN (sp_dwt.wed_vacancytype <> 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.wed_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.wed_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END) + - CASE - WHEN (sp_dwt.thu_vacancytype <> 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.thu_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.thu_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END) + - CASE - WHEN (sp_dwt.fri_vacancytype <> 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.fri_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.fri_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END) + - CASE - WHEN (sp_dwt.sat_vacancytype <> 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.sat_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.sat_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END) + - CASE - WHEN (sp_dwt.sun_vacancytype <> 'ill'::text) THEN COALESCE(((to_number("left"(sp_dwt.sun_vacancyhours, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.sun_vacancyhours, 2), '99'::text)), (0)::numeric) - ELSE (0)::numeric - END) AS weekvacancy_minutes, - ((to_number("left"(sp_dwt.week_timetotal, 2), '99'::text) * (60)::numeric) + to_number("right"(sp_dwt.week_timetotal, 2), '99'::text)) AS weekminutes, - sp_dwt.mon_id, - sp_dwt.weekbegin AS mon_date, - ((COALESCE(((to_char((sp_dwt.mon_start1)::interval, 'HH24:MI'::text) || ' - '::text) || to_char((sp_dwt.mon_end1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((sp_dwt.mon_start2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((sp_dwt.mon_end2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE(((('
Congé '::text || sp_dwt.mon_vacancytype) || ': '::text) || to_char((sp_dwt.mon_vacancyhours)::interval, 'HH24:MI'::text)), ''::text)) AS dspmontimes, - sp_dwt.mon_timetotal, - sp_dwt.tue_id, - date((sp_dwt.weekbegin + '1 day'::interval)) AS tue_date, - ((COALESCE(((to_char((sp_dwt.tue_start1)::interval, 'HH24:MI'::text) || ' - '::text) || to_char((sp_dwt.tue_end1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((sp_dwt.tue_start2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((sp_dwt.tue_end2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE(((('
Congé '::text || sp_dwt.tue_vacancytype) || ': '::text) || to_char((sp_dwt.tue_vacancyhours)::interval, 'HH24:MI'::text)), ''::text)) AS dsptuetimes, - sp_dwt.tue_timetotal, - sp_dwt.wed_id, - date((sp_dwt.weekbegin + '2 days'::interval)) AS wed_date, - ((COALESCE(((to_char((sp_dwt.wed_start1)::interval, 'HH24:MI'::text) || ' - '::text) || to_char((sp_dwt.wed_end1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((sp_dwt.wed_start2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((sp_dwt.wed_end2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE(((('
Congé '::text || sp_dwt.wed_vacancytype) || ': '::text) || to_char((sp_dwt.wed_vacancyhours)::interval, 'HH24:MI'::text)), ''::text)) AS dspwedtimes, - sp_dwt.wed_timetotal, - sp_dwt.thu_id, - date((sp_dwt.weekbegin + '3 days'::interval)) AS thu_date, - ((COALESCE(((to_char((sp_dwt.thu_start1)::interval, 'HH24:MI'::text) || ' - '::text) || to_char((sp_dwt.thu_end1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((sp_dwt.thu_start2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((sp_dwt.thu_end2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE(((('
Congé '::text || sp_dwt.thu_vacancytype) || ': '::text) || to_char((sp_dwt.thu_vacancyhours)::interval, 'HH24:MI'::text)), ''::text)) AS dspthutimes, - sp_dwt.thu_timetotal, - sp_dwt.fri_id, - date((sp_dwt.weekbegin + '4 days'::interval)) AS fri_date, - ((COALESCE(((to_char((sp_dwt.fri_start1)::interval, 'HH24:MI'::text) || ' -'::text) || to_char((sp_dwt.fri_end1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((sp_dwt.fri_start2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((sp_dwt.fri_end2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE(((('
Congé '::text || sp_dwt.fri_vacancytype) || ': '::text) || to_char((sp_dwt.fri_vacancyhours)::interval, 'HH24:MI'::text)), ''::text)) AS dspfritimes, - sp_dwt.fri_timetotal, - sp_dwt.sat_id, - date((sp_dwt.weekbegin + '5 days'::interval)) AS sat_date, - ((COALESCE(((to_char((sp_dwt.sat_start1)::interval, 'HH24:MI'::text) || ' - '::text) || to_char((sp_dwt.sat_end1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((sp_dwt.sat_start2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((sp_dwt.sat_end2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE(((('
Congé '::text || sp_dwt.sat_vacancytype) || ': '::text) || to_char((sp_dwt.sat_vacancyhours)::interval, 'HH24:MI'::text)), ''::text)) AS dspsattimes, - sp_dwt.sat_timetotal, - sp_dwt.sun_id, - date((sp_dwt.weekbegin + '6 days'::interval)) AS sun_date, - ((COALESCE(((to_char((sp_dwt.sun_start1)::interval, 'HH24:MI'::text) || ' - '::text) || to_char((sp_dwt.sun_end1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((sp_dwt.sun_start2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((sp_dwt.sun_end2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE(((('
Congé '::text || sp_dwt.sun_vacancytype) || ': '::text) || to_char((sp_dwt.sun_vacancyhours)::interval, 'HH24:MI'::text)), ''::text)) AS dspsuntimes, - sp_dwt.sun_timetotal - FROM (%%NEWSCHEMA%%.vw_staffworkplan_weekly sp_dwt - LEFT JOIN %%NEWSCHEMA%%.staff st ON ((sp_dwt.id_staff = st.id))) - ORDER BY sp_dwt.calweek; - - - -CREATE TABLE %%NEWSCHEMA%%.workplans ( - id integer NOT NULL, - workplan text, - mon_timestart1 time without time zone, - mon_timeend1 time without time zone, - mon_timestart2 time without time zone, - mon_timeend2 time without time zone, - mon_timepause time without time zone, - tue_timestart1 time without time zone, - tue_timeend1 time without time zone, - tue_timestart2 time without time zone, - tue_timeend2 time without time zone, - tue_timepause time without time zone, - wed_timestart1 time without time zone, - wed_timeend1 time without time zone, - wed_timestart2 time without time zone, - wed_timeend2 time without time zone, - wed_timepause time without time zone, - thu_timestart1 time without time zone, - thu_timeend1 time without time zone, - thu_timestart2 time without time zone, - thu_timeend2 time without time zone, - thu_timepause time without time zone, - fri_timestart1 time without time zone, - fri_timeend1 time without time zone, - fri_timestart2 time without time zone, - fri_timeend2 time without time zone, - fri_timepause time without time zone, - sat_timestart1 time without time zone, - sat_timeend1 time without time zone, - sat_timestart2 time without time zone, - sat_timeend2 time without time zone, - sat_timepause time without time zone, - sun_timestart1 time without time zone, - sun_timeend1 time without time zone, - sun_timestart2 time without time zone, - sun_timeend2 time without time zone, - sun_timepause time without time zone -); - - - -CREATE VIEW %%NEWSCHEMA%%.vw_workplanlist AS - SELECT workplans.id, - workplans.workplan - FROM %%NEWSCHEMA%%.workplans; - - - -CREATE VIEW %%NEWSCHEMA%%.vw_workplans AS - SELECT workplans.id, - workplans.workplan, - ((COALESCE(((to_char((workplans.mon_timestart1)::interval, 'HH24:MI'::text) || ' - '::text) || to_char((workplans.mon_timeend1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((workplans.mon_timestart2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((workplans.mon_timeend2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE((('
'::text || 'Pause: '::text) || to_char((workplans.mon_timepause)::interval, 'HH24:MI'::text)), ''::text)) AS dspmontimes, - ((COALESCE(((to_char((workplans.tue_timestart1)::interval, 'HH24:MI'::text) || ' - '::text) || to_char((workplans.tue_timeend1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((workplans.tue_timestart2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((workplans.tue_timeend2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE((('
'::text || 'Pause: '::text) || to_char((workplans.tue_timepause)::interval, 'HH24:MI'::text)), ''::text)) AS dsptuetimes, - ((COALESCE(((to_char((workplans.wed_timestart1)::interval, 'HH24:MI'::text) || ' - '::text) || to_char((workplans.wed_timeend1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((workplans.wed_timestart2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((workplans.wed_timeend2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE((('
'::text || 'Pause: '::text) || to_char((workplans.wed_timepause)::interval, 'HH24:MI'::text)), ''::text)) AS dspwedtimes, - ((COALESCE(((to_char((workplans.thu_timestart1)::interval, 'HH24:MI'::text) || ' - '::text) || to_char((workplans.thu_timeend1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((workplans.thu_timestart2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((workplans.thu_timeend2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE((('
'::text || 'Pause: '::text) || to_char((workplans.thu_timepause)::interval, 'HH24:MI'::text)), ''::text)) AS dspthutimes, - ((COALESCE(((to_char((workplans.fri_timestart1)::interval, 'HH24:MI'::text) || ' -'::text) || to_char((workplans.fri_timeend1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((workplans.fri_timestart2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((workplans.fri_timeend2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE((('
'::text || 'Pause: '::text) || to_char((workplans.fri_timepause)::interval, 'HH24:MI'::text)), ''::text)) AS dspfritimes, - ((COALESCE(((to_char((workplans.sat_timestart1)::interval, 'HH24:MI'::text) || ' - '::text) || to_char((workplans.sat_timeend1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((workplans.sat_timestart2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((workplans.sat_timeend2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE((('
'::text || 'Pause: '::text) || to_char((workplans.sat_timepause)::interval, 'HH24:MI'::text)), ''::text)) AS dspsattimes, - ((COALESCE(((to_char((workplans.sun_timestart1)::interval, 'HH24:MI'::text) || ' - '::text) || to_char((workplans.sun_timeend1)::interval, 'HH24:MI'::text)), ''::text) || COALESCE(((('
'::text || to_char((workplans.sun_timestart2)::interval, 'HH24:MI'::text)) || ' - '::text) || to_char((workplans.sun_timeend2)::interval, 'HH24:MI'::text)), ''::text)) || COALESCE((('
'::text || 'Pause: '::text) || to_char((workplans.sun_timepause)::interval, 'HH24:MI'::text)), ''::text)) AS dspsuntimes - FROM %%NEWSCHEMA%%.workplans; - - - -CREATE VIEW %%NEWSCHEMA%%.vw_workplansdata AS - SELECT workplans.id, - workplans.workplan, - to_char((workplans.mon_timestart1)::interval, 'HH24:MI'::text) AS mon_timestart1, - to_char((workplans.mon_timeend1)::interval, 'HH24:MI'::text) AS mon_timeend1, - to_char((workplans.mon_timestart2)::interval, 'HH24:MI'::text) AS mon_timestart2, - to_char((workplans.mon_timeend2)::interval, 'HH24:MI'::text) AS mon_timeend2, - to_char((workplans.mon_timepause)::interval, 'HH24:MI'::text) AS mon_timepause, - to_char((workplans.tue_timestart1)::interval, 'HH24:MI'::text) AS tue_timestart1, - to_char((workplans.tue_timeend1)::interval, 'HH24:MI'::text) AS tue_timeend1, - to_char((workplans.tue_timestart2)::interval, 'HH24:MI'::text) AS tue_timestart2, - to_char((workplans.tue_timeend2)::interval, 'HH24:MI'::text) AS tue_timeend2, - to_char((workplans.tue_timepause)::interval, 'HH24:MI'::text) AS tue_timepause, - to_char((workplans.wed_timestart1)::interval, 'HH24:MI'::text) AS wed_timestart1, - to_char((workplans.wed_timeend1)::interval, 'HH24:MI'::text) AS wed_timeend1, - to_char((workplans.wed_timestart2)::interval, 'HH24:MI'::text) AS wed_timestart2, - to_char((workplans.wed_timeend2)::interval, 'HH24:MI'::text) AS wed_timeend2, - to_char((workplans.wed_timepause)::interval, 'HH24:MI'::text) AS wed_timepause, - to_char((workplans.thu_timestart1)::interval, 'HH24:MI'::text) AS thu_timestart1, - to_char((workplans.thu_timeend1)::interval, 'HH24:MI'::text) AS thu_timeend1, - to_char((workplans.thu_timestart2)::interval, 'HH24:MI'::text) AS thu_timestart2, - to_char((workplans.thu_timeend2)::interval, 'HH24:MI'::text) AS thu_timeend2, - to_char((workplans.thu_timepause)::interval, 'HH24:MI'::text) AS thu_timepause, - to_char((workplans.fri_timestart1)::interval, 'HH24:MI'::text) AS fri_timestart1, - to_char((workplans.fri_timeend1)::interval, 'HH24:MI'::text) AS fri_timeend1, - to_char((workplans.fri_timestart2)::interval, 'HH24:MI'::text) AS fri_timestart2, - to_char((workplans.fri_timeend2)::interval, 'HH24:MI'::text) AS fri_timeend2, - to_char((workplans.fri_timepause)::interval, 'HH24:MI'::text) AS fri_timepause, - to_char((workplans.sat_timestart1)::interval, 'HH24:MI'::text) AS sat_timestart1, - to_char((workplans.sat_timeend1)::interval, 'HH24:MI'::text) AS sat_timeend1, - to_char((workplans.sat_timestart2)::interval, 'HH24:MI'::text) AS sat_timestart2, - to_char((workplans.sat_timeend2)::interval, 'HH24:MI'::text) AS sat_timeend2, - to_char((workplans.sat_timepause)::interval, 'HH24:MI'::text) AS sat_timepause, - to_char((workplans.sun_timestart1)::interval, 'HH24:MI'::text) AS sun_timestart1, - to_char((workplans.sun_timeend1)::interval, 'HH24:MI'::text) AS sun_timeend1, - to_char((workplans.sun_timestart2)::interval, 'HH24:MI'::text) AS sun_timestart2, - to_char((workplans.sun_timeend2)::interval, 'HH24:MI'::text) AS sun_timeend2, - to_char((workplans.sun_timepause)::interval, 'HH24:MI'::text) AS sun_timepause - FROM %%NEWSCHEMA%%.workplans; - - - -CREATE SEQUENCE %%NEWSCHEMA%%.workplans_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - - -ALTER SEQUENCE %%NEWSCHEMA%%.workplans_id_seq OWNED BY %%NEWSCHEMA%%.workplans.id; - - - -CREATE TABLE %%NEWSCHEMA%%.worktypes ( - id integer NOT NULL, - worktype text, - isworktime boolean, - isfreetime boolean, - typecolor text -); - - - -CREATE SEQUENCE %%NEWSCHEMA%%.worktypes_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - - -ALTER SEQUENCE %%NEWSCHEMA%%.worktypes_id_seq OWNED BY %%NEWSCHEMA%%.worktypes.id; - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.defaultweekworkplan ALTER COLUMN id SET DEFAULT nextval('%%NEWSCHEMA%%.defaultweekworkplan_id_seq'::regclass); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.defaultworkplan ALTER COLUMN id SET DEFAULT nextval('%%NEWSCHEMA%%.defaultworkplan_id_seq'::regclass); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.reportperiod ALTER COLUMN id SET DEFAULT nextval('%%NEWSCHEMA%%.reportperiod_id_seq'::regclass); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.sites ALTER COLUMN id SET DEFAULT nextval('%%NEWSCHEMA%%.sites_id_seq'::regclass); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.staff ALTER COLUMN id SET DEFAULT nextval('%%NEWSCHEMA%%.staff_id_seq'::regclass); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.staffgroups ALTER COLUMN id SET DEFAULT nextval('%%NEWSCHEMA%%.staffgroups_id_seq'::regclass); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.staffperiodbase ALTER COLUMN id SET DEFAULT nextval('%%NEWSCHEMA%%.staffperiodbase_id_seq'::regclass); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.stafftimetracks ALTER COLUMN id SET DEFAULT nextval('%%NEWSCHEMA%%.stafftimetracks_id_seq'::regclass); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.staffvacancy ALTER COLUMN id SET DEFAULT nextval('%%NEWSCHEMA%%.staffvacancy_id_seq'::regclass); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.staffvacancyyear ALTER COLUMN id SET DEFAULT nextval('%%NEWSCHEMA%%.staffvacancyyear_id_seq'::regclass); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.staffworkplan ALTER COLUMN id SET DEFAULT nextval('%%NEWSCHEMA%%.staffworkplan_id_seq'::regclass); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.workplans ALTER COLUMN id SET DEFAULT nextval('%%NEWSCHEMA%%.workplans_id_seq'::regclass); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.worktypes ALTER COLUMN id SET DEFAULT nextval('%%NEWSCHEMA%%.worktypes_id_seq'::regclass); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.defaultweekworkplan - ADD CONSTRAINT defaultweekworkplan_pkey PRIMARY KEY (id); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.defaultworkplan - ADD CONSTRAINT defaultworkplan_pkey PRIMARY KEY (id); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.reportperiod - ADD CONSTRAINT reportperiod_pkey PRIMARY KEY (id); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.sites - ADD CONSTRAINT sites_pkey PRIMARY KEY (id); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.staff - ADD CONSTRAINT staff_pkey PRIMARY KEY (id); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.staffgroups - ADD CONSTRAINT staffgroups_pkey PRIMARY KEY (id); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.staffperiodbase - ADD CONSTRAINT staffperiodbase_pkey PRIMARY KEY (id); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.stafftimetracks - ADD CONSTRAINT stafftimetracks_pkey PRIMARY KEY (id); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.staffvacancy - ADD CONSTRAINT staffvacancy_pkey PRIMARY KEY (id); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.staffvacancyyear - ADD CONSTRAINT staffvacancyyear_pkey PRIMARY KEY (id); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.staffworkplan - ADD CONSTRAINT staffworkplan_pkey PRIMARY KEY (id); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.workplans - ADD CONSTRAINT workplans_pkey PRIMARY KEY (id); - - - -ALTER TABLE ONLY %%NEWSCHEMA%%.worktypes - ADD CONSTRAINT worktypes_pkey PRIMARY KEY (id); - - - -CREATE TRIGGER trg_upd_%%NEWSCHEMA%%_weekhours BEFORE UPDATE OF weekhours ON %%NEWSCHEMA%%.staffperiodbase FOR EACH ROW EXECUTE PROCEDURE public.trg_update_monthhours(); - - - diff --git a/dev/db/potlu_db.portanova.columns.live.txt b/dev/db/potlu_db.portanova.columns.live.txt deleted file mode 100644 index 4be0aaac..00000000 --- a/dev/db/potlu_db.portanova.columns.live.txt +++ /dev/null @@ -1,356 +0,0 @@ - -reportperiod|BASETABLE|enddate|date -reportperiod|BASETABLE|id|integer -reportperiod|BASETABLE|periodname|text -reportperiod|BASETABLE|startdate|date -sites|BASETABLE|address|text -sites|BASETABLE|city|text -sites|BASETABLE|country|text -sites|BASETABLE|created|timestampwithouttimezone -sites|BASETABLE|id|integer -sites|BASETABLE|id_timetracker|integer -sites|BASETABLE|modified|timestampwithouttimezone -sites|BASETABLE|sitename|text -sites|BASETABLE|timeclockhost|text -sites|BASETABLE|zip|text -staff|BASETABLE|birthdate|date -staff|BASETABLE|entrydate|date -staff|BASETABLE|id|integer -staff|BASETABLE|job|text -staff|BASETABLE|leavedate|date -staff|BASETABLE|prename|text -staff|BASETABLE|staffnumber|text -staff|BASETABLE|surname|text -staffcontract|BASETABLE|id|integer -staffcontract|BASETABLE|id_staffgroup|integer -staffcontract|BASETABLE|id_staff|integer -staffcontract|BASETABLE|monthhours|numeric -staffcontract|BASETABLE|startdate|date -staffcontract|BASETABLE|weekhours|numeric -staffgroups|BASETABLE|groupcolor|text -staffgroups|BASETABLE|groupname|text -staffgroups|BASETABLE|id|integer -stafftimetracks|BASETABLE|created|timestampwithouttimezone -stafftimetracks|BASETABLE|id|bigint -stafftimetracks|BASETABLE|id_staff|integer -stafftimetracks|BASETABLE|modified|timestampwithouttimezone -stafftimetracks|BASETABLE|stamp_in|timestampwithouttimezone -stafftimetracks|BASETABLE|stamp_out|timestampwithouttimezone -stafftimetracks|BASETABLE|tracktype|text -staffvacancy|BASETABLE|dayhours|timewithouttimezone -staffvacancy|BASETABLE|enddate|date -staffvacancy|BASETABLE|id|integer -staffvacancy|BASETABLE|id_staff|integer -staffvacancy|BASETABLE|note|text -staffvacancy|BASETABLE|startdate|date -staffvacancy|BASETABLE|vacancytype|text -staffvacancy|BASETABLE|validated|boolean -staffvacancyyear|BASETABLE|days|numeric -staffvacancyyear|BASETABLE|hours|numeric -staffvacancyyear|BASETABLE|id|integer -staffvacancyyear|BASETABLE|id_staff|integer -staffvacancyyear|BASETABLE|vyear|integer -staffworkplan|BASETABLE|daydate|date -staffworkplan|BASETABLE|id|bigint -staffworkplan|BASETABLE|id_staff|integer -staffworkplan|BASETABLE|timeend1|timewithouttimezone -staffworkplan|BASETABLE|timeend2|timewithouttimezone -staffworkplan|BASETABLE|timepause|timewithouttimezone -staffworkplan|BASETABLE|timestart1|timewithouttimezone -staffworkplan|BASETABLE|timestart2|timewithouttimezone -staffworkplan|BASETABLE|vacancyhours|timewithouttimezone -staffworkplan|BASETABLE|vacancytype|text -vw_reportperiodlist|VIEW|enddate|date -vw_reportperiodlist|VIEW|id|integer -vw_reportperiodlist|VIEW|periodname|text -vw_reportperiodlist|VIEW|startdate|date -vw_staffcontractdata|VIEW|id|integer -vw_staffcontractdata|VIEW|id_staffgroup|integer -vw_staffcontractdata|VIEW|id_staff|integer -vw_staffcontractdata|VIEW|monthhours|numeric -vw_staffcontractdata|VIEW|startdate|date -vw_staffcontractdata|VIEW|weekhours|numeric -vw_staffcontractlist|VIEW|groupcolor|text -vw_staffcontractlist|VIEW|groupname|text -vw_staffcontractlist|VIEW|id|integer -vw_staffcontractlist|VIEW|id_staffgroup|integer -vw_staffcontractlist|VIEW|id_staff|integer -vw_staffcontractlist|VIEW|monthhours|numeric -vw_staffcontractlist|VIEW|startdate|date -vw_staffcontractlist|VIEW|weekhours|numeric -vw_staffdata|VIEW|birthdate|date -vw_staffdata|VIEW|entrydate|date -vw_staffdata|VIEW|id|integer -vw_staffdata|VIEW|job|text -vw_staffdata|VIEW|leavedate|date -vw_staffdata|VIEW|prename|text -vw_staffdata|VIEW|staffnumber|text -vw_staffdata|VIEW|surname|text -vw_staffgroupsdata|VIEW|groupcolor|text -vw_staffgroupsdata|VIEW|groupname|text -vw_staffgroupsdata|VIEW|id|integer -vw_staffgroupslist|VIEW|groupcolor|text -vw_staffgroupslist|VIEW|groupname|text -vw_staffgroupslist|VIEW|id|integer -vw_stafflist|VIEW|birthdate|date -vw_stafflist|VIEW|dspname|text -vw_stafflist|VIEW|entrydate|date -vw_stafflist|VIEW|id|integer -vw_stafflist|VIEW|job|text -vw_stafflist|VIEW|leavedate|date -vw_stafflist|VIEW|prename|text -vw_stafflist|VIEW|staffnumber|text -vw_stafflist|VIEW|surname|text -vw_staffplanned_dayweektotals|VIEW|calweek|doubleprecision -vw_staffplanned_dayweektotals|VIEW|dates|date -vw_staffplanned_dayweektotals|VIEW|fri_end1|text -vw_staffplanned_dayweektotals|VIEW|fri_end2|text -vw_staffplanned_dayweektotals|VIEW|fri_id|bigint -vw_staffplanned_dayweektotals|VIEW|fri_pause|text -vw_staffplanned_dayweektotals|VIEW|fri_start1|text -vw_staffplanned_dayweektotals|VIEW|fri_start2|text -vw_staffplanned_dayweektotals|VIEW|fri_timetotal|text -vw_staffplanned_dayweektotals|VIEW|id_staff|integer -vw_staffplanned_dayweektotals|VIEW|mon_end1|text -vw_staffplanned_dayweektotals|VIEW|mon_end2|text -vw_staffplanned_dayweektotals|VIEW|mon_id|bigint -vw_staffplanned_dayweektotals|VIEW|mon_pause|text -vw_staffplanned_dayweektotals|VIEW|mon_start1|text -vw_staffplanned_dayweektotals|VIEW|mon_start2|text -vw_staffplanned_dayweektotals|VIEW|mon_timetotal|text -vw_staffplanned_dayweektotals|VIEW|sat_end1|text -vw_staffplanned_dayweektotals|VIEW|sat_end2|text -vw_staffplanned_dayweektotals|VIEW|sat_id|bigint -vw_staffplanned_dayweektotals|VIEW|sat_pause|text -vw_staffplanned_dayweektotals|VIEW|sat_start1|text -vw_staffplanned_dayweektotals|VIEW|sat_start2|text -vw_staffplanned_dayweektotals|VIEW|sat_timetotal|text -vw_staffplanned_dayweektotals|VIEW|sun_end1|text -vw_staffplanned_dayweektotals|VIEW|sun_end2|text -vw_staffplanned_dayweektotals|VIEW|sun_id|bigint -vw_staffplanned_dayweektotals|VIEW|sun_pause|text -vw_staffplanned_dayweektotals|VIEW|sun_start1|text -vw_staffplanned_dayweektotals|VIEW|sun_start2|text -vw_staffplanned_dayweektotals|VIEW|sun_timetotal|text -vw_staffplanned_dayweektotals|VIEW|thu_end1|text -vw_staffplanned_dayweektotals|VIEW|thu_end2|text -vw_staffplanned_dayweektotals|VIEW|thu_id|bigint -vw_staffplanned_dayweektotals|VIEW|thu_pause|text -vw_staffplanned_dayweektotals|VIEW|thu_start1|text -vw_staffplanned_dayweektotals|VIEW|thu_start2|text -vw_staffplanned_dayweektotals|VIEW|thu_timetotal|text -vw_staffplanned_dayweektotals|VIEW|tue_end1|text -vw_staffplanned_dayweektotals|VIEW|tue_end2|text -vw_staffplanned_dayweektotals|VIEW|tue_id|bigint -vw_staffplanned_dayweektotals|VIEW|tue_pause|text -vw_staffplanned_dayweektotals|VIEW|tue_start1|text -vw_staffplanned_dayweektotals|VIEW|tue_start2|text -vw_staffplanned_dayweektotals|VIEW|tue_timetotal|text -vw_staffplanned_dayweektotals|VIEW|wed_end1|text -vw_staffplanned_dayweektotals|VIEW|wed_end2|text -vw_staffplanned_dayweektotals|VIEW|wed_id|bigint -vw_staffplanned_dayweektotals|VIEW|wed_pause|text -vw_staffplanned_dayweektotals|VIEW|wed_start1|text -vw_staffplanned_dayweektotals|VIEW|wed_start2|text -vw_staffplanned_dayweektotals|VIEW|wed_timetotal|text -vw_staffplanned_dayweektotals|VIEW|week_timetotal|text -vw_staffworkplanlist|VIEW|calweek|integer -vw_staffworkplanlist|VIEW|calyear|text -vw_staffworkplanlist|VIEW|dspcalweek|text -vw_staffworkplanlist|VIEW|dspfritimes|text -vw_staffworkplanlist|VIEW|dspmontimes|text -vw_staffworkplanlist|VIEW|dspsattimes|text -vw_staffworkplanlist|VIEW|dspsuntimes|text -vw_staffworkplanlist|VIEW|dspthutimes|text -vw_staffworkplanlist|VIEW|dsptuetimes|text -vw_staffworkplanlist|VIEW|dspwedtimes|text -vw_staffworkplanlist|VIEW|fri_date|date -vw_staffworkplanlist|VIEW|fri_id|bigint -vw_staffworkplanlist|VIEW|fri_timetotal|text -vw_staffworkplanlist|VIEW|id_staff|integer -vw_staffworkplanlist|VIEW|mon_date|date -vw_staffworkplanlist|VIEW|mon_id|bigint -vw_staffworkplanlist|VIEW|mon_timetotal|text -vw_staffworkplanlist|VIEW|sat_date|date -vw_staffworkplanlist|VIEW|sat_id|bigint -vw_staffworkplanlist|VIEW|sat_timetotal|text -vw_staffworkplanlist|VIEW|staffname|text -vw_staffworkplanlist|VIEW|sun_date|date -vw_staffworkplanlist|VIEW|sun_id|bigint -vw_staffworkplanlist|VIEW|sun_timetotal|text -vw_staffworkplanlist|VIEW|thu_date|date -vw_staffworkplanlist|VIEW|thu_id|bigint -vw_staffworkplanlist|VIEW|thu_timetotal|text -vw_staffworkplanlist|VIEW|tue_date|date -vw_staffworkplanlist|VIEW|tue_id|bigint -vw_staffworkplanlist|VIEW|tue_timetotal|text -vw_staffworkplanlist|VIEW|wed_date|date -vw_staffworkplanlist|VIEW|wed_id|bigint -vw_staffworkplanlist|VIEW|wed_timetotal|text -vw_staffworkplanlist|VIEW|weekend|date -vw_staffworkplanlist|VIEW|weekminutes|numeric -vw_staffworkplanlist|VIEW|weekstart|date -vw_staffworkplanlist|VIEW|week_timetotal|text -vw_staffworkplanlist|VIEW|weekvacancy_minutes_ill|numeric -vw_staffworkplanlist|VIEW|weekvacancy_minutes|numeric -vw_staffworkplanlist|VIEW|weekvacancy_times_ill|text -vw_staffworkplanlist|VIEW|weekvacancy_times|text -vw_staffworkplan_weekly|VIEW|calweek|doubleprecision -vw_staffworkplan_weekly|VIEW|calyear|text -vw_staffworkplan_weekly|VIEW|dates|text -vw_staffworkplan_weekly|VIEW|fri_id|bigint -vw_staffworkplan_weekly|VIEW|fri_timeend1|text -vw_staffworkplan_weekly|VIEW|fri_timeend2|text -vw_staffworkplan_weekly|VIEW|fri_timepause|text -vw_staffworkplan_weekly|VIEW|fri_timestart1|text -vw_staffworkplan_weekly|VIEW|fri_timestart2|text -vw_staffworkplan_weekly|VIEW|fri_timetotal|text -vw_staffworkplan_weekly|VIEW|fri_vacancyhours|text -vw_staffworkplan_weekly|VIEW|fri_vacancytype|text -vw_staffworkplan_weekly|VIEW|id_staff|integer -vw_staffworkplan_weekly|VIEW|mon_id|bigint -vw_staffworkplan_weekly|VIEW|mon_timeend1|text -vw_staffworkplan_weekly|VIEW|mon_timeend2|text -vw_staffworkplan_weekly|VIEW|mon_timepause|text -vw_staffworkplan_weekly|VIEW|mon_timestart1|text -vw_staffworkplan_weekly|VIEW|mon_timestart2|text -vw_staffworkplan_weekly|VIEW|mon_timetotal|text -vw_staffworkplan_weekly|VIEW|mon_vacancyhours|text -vw_staffworkplan_weekly|VIEW|mon_vacancytype|text -vw_staffworkplan_weekly|VIEW|sat_id|bigint -vw_staffworkplan_weekly|VIEW|sat_timeend1|text -vw_staffworkplan_weekly|VIEW|sat_timeend2|text -vw_staffworkplan_weekly|VIEW|sat_timepause|text -vw_staffworkplan_weekly|VIEW|sat_timestart1|text -vw_staffworkplan_weekly|VIEW|sat_timestart2|text -vw_staffworkplan_weekly|VIEW|sat_timetotal|text -vw_staffworkplan_weekly|VIEW|sat_vacancyhours|text -vw_staffworkplan_weekly|VIEW|sat_vacancytype|text -vw_staffworkplan_weekly|VIEW|sun_id|bigint -vw_staffworkplan_weekly|VIEW|sun_timeend1|text -vw_staffworkplan_weekly|VIEW|sun_timeend2|text -vw_staffworkplan_weekly|VIEW|sun_timepause|text -vw_staffworkplan_weekly|VIEW|sun_timestart1|text -vw_staffworkplan_weekly|VIEW|sun_timestart2|text -vw_staffworkplan_weekly|VIEW|sun_timetotal|text -vw_staffworkplan_weekly|VIEW|sun_vacancyhours|text -vw_staffworkplan_weekly|VIEW|sun_vacancytype|text -vw_staffworkplan_weekly|VIEW|thu_id|bigint -vw_staffworkplan_weekly|VIEW|thu_timeend1|text -vw_staffworkplan_weekly|VIEW|thu_timeend2|text -vw_staffworkplan_weekly|VIEW|thu_timepause|text -vw_staffworkplan_weekly|VIEW|thu_timestart1|text -vw_staffworkplan_weekly|VIEW|thu_timestart2|text -vw_staffworkplan_weekly|VIEW|thu_timetotal|text -vw_staffworkplan_weekly|VIEW|thu_vacancyhours|text -vw_staffworkplan_weekly|VIEW|thu_vacancytype|text -vw_staffworkplan_weekly|VIEW|tue_id|bigint -vw_staffworkplan_weekly|VIEW|tue_timeend1|text -vw_staffworkplan_weekly|VIEW|tue_timeend2|text -vw_staffworkplan_weekly|VIEW|tue_timepause|text -vw_staffworkplan_weekly|VIEW|tue_timestart1|text -vw_staffworkplan_weekly|VIEW|tue_timestart2|text -vw_staffworkplan_weekly|VIEW|tue_timetotal|text -vw_staffworkplan_weekly|VIEW|tue_vacancyhours|text -vw_staffworkplan_weekly|VIEW|tue_vacancytype|text -vw_staffworkplan_weekly|VIEW|wed_id|bigint -vw_staffworkplan_weekly|VIEW|wed_timeend1|text -vw_staffworkplan_weekly|VIEW|wed_timeend2|text -vw_staffworkplan_weekly|VIEW|wed_timepause|text -vw_staffworkplan_weekly|VIEW|wed_timestart1|text -vw_staffworkplan_weekly|VIEW|wed_timestart2|text -vw_staffworkplan_weekly|VIEW|wed_timetotal|text -vw_staffworkplan_weekly|VIEW|wed_vacancyhours|text -vw_staffworkplan_weekly|VIEW|wed_vacancytype|text -vw_staffworkplan_weekly|VIEW|weekbegin|date -vw_staffworkplan_weekly|VIEW|week_timetotal|text -vw_workplanlist|VIEW|id|integer -vw_workplanlist|VIEW|workplan|text -vw_workplansdata|VIEW|fri_timeend1|text -vw_workplansdata|VIEW|fri_timeend2|text -vw_workplansdata|VIEW|fri_timepause|text -vw_workplansdata|VIEW|fri_timestart1|text -vw_workplansdata|VIEW|fri_timestart2|text -vw_workplansdata|VIEW|id|integer -vw_workplansdata|VIEW|mon_timeend1|text -vw_workplansdata|VIEW|mon_timeend2|text -vw_workplansdata|VIEW|mon_timepause|text -vw_workplansdata|VIEW|mon_timestart1|text -vw_workplansdata|VIEW|mon_timestart2|text -vw_workplansdata|VIEW|sat_timeend1|text -vw_workplansdata|VIEW|sat_timeend2|text -vw_workplansdata|VIEW|sat_timepause|text -vw_workplansdata|VIEW|sat_timestart1|text -vw_workplansdata|VIEW|sat_timestart2|text -vw_workplansdata|VIEW|sun_timeend1|text -vw_workplansdata|VIEW|sun_timeend2|text -vw_workplansdata|VIEW|sun_timepause|text -vw_workplansdata|VIEW|sun_timestart1|text -vw_workplansdata|VIEW|sun_timestart2|text -vw_workplansdata|VIEW|thu_timeend1|text -vw_workplansdata|VIEW|thu_timeend2|text -vw_workplansdata|VIEW|thu_timepause|text -vw_workplansdata|VIEW|thu_timestart1|text -vw_workplansdata|VIEW|thu_timestart2|text -vw_workplansdata|VIEW|tue_timeend1|text -vw_workplansdata|VIEW|tue_timeend2|text -vw_workplansdata|VIEW|tue_timepause|text -vw_workplansdata|VIEW|tue_timestart1|text -vw_workplansdata|VIEW|tue_timestart2|text -vw_workplansdata|VIEW|wed_timeend1|text -vw_workplansdata|VIEW|wed_timeend2|text -vw_workplansdata|VIEW|wed_timepause|text -vw_workplansdata|VIEW|wed_timestart1|text -vw_workplansdata|VIEW|wed_timestart2|text -vw_workplansdata|VIEW|workplan|text -vw_workplans|VIEW|dspfritimes|text -vw_workplans|VIEW|dspmontimes|text -vw_workplans|VIEW|dspsattimes|text -vw_workplans|VIEW|dspsuntimes|text -vw_workplans|VIEW|dspthutimes|text -vw_workplans|VIEW|dsptuetimes|text -vw_workplans|VIEW|dspwedtimes|text -vw_workplans|VIEW|id|integer -vw_workplans|VIEW|workplan|text -workplans|BASETABLE|fri_timeend1|timewithouttimezone -workplans|BASETABLE|fri_timeend2|timewithouttimezone -workplans|BASETABLE|fri_timepause|timewithouttimezone -workplans|BASETABLE|fri_timestart1|timewithouttimezone -workplans|BASETABLE|fri_timestart2|timewithouttimezone -workplans|BASETABLE|id|integer -workplans|BASETABLE|mon_timeend1|timewithouttimezone -workplans|BASETABLE|mon_timeend2|timewithouttimezone -workplans|BASETABLE|mon_timepause|timewithouttimezone -workplans|BASETABLE|mon_timestart1|timewithouttimezone -workplans|BASETABLE|mon_timestart2|timewithouttimezone -workplans|BASETABLE|sat_timeend1|timewithouttimezone -workplans|BASETABLE|sat_timeend2|timewithouttimezone -workplans|BASETABLE|sat_timepause|timewithouttimezone -workplans|BASETABLE|sat_timestart1|timewithouttimezone -workplans|BASETABLE|sat_timestart2|timewithouttimezone -workplans|BASETABLE|sun_timeend1|timewithouttimezone -workplans|BASETABLE|sun_timeend2|timewithouttimezone -workplans|BASETABLE|sun_timepause|timewithouttimezone -workplans|BASETABLE|sun_timestart1|timewithouttimezone -workplans|BASETABLE|sun_timestart2|timewithouttimezone -workplans|BASETABLE|thu_timeend1|timewithouttimezone -workplans|BASETABLE|thu_timeend2|timewithouttimezone -workplans|BASETABLE|thu_timepause|timewithouttimezone -workplans|BASETABLE|thu_timestart1|timewithouttimezone -workplans|BASETABLE|thu_timestart2|timewithouttimezone -workplans|BASETABLE|tue_timeend1|timewithouttimezone -workplans|BASETABLE|tue_timeend2|timewithouttimezone -workplans|BASETABLE|tue_timepause|timewithouttimezone -workplans|BASETABLE|tue_timestart1|timewithouttimezone -workplans|BASETABLE|tue_timestart2|timewithouttimezone -workplans|BASETABLE|wed_timeend1|timewithouttimezone -workplans|BASETABLE|wed_timeend2|timewithouttimezone -workplans|BASETABLE|wed_timepause|timewithouttimezone -workplans|BASETABLE|wed_timestart1|timewithouttimezone -workplans|BASETABLE|wed_timestart2|timewithouttimezone -workplans|BASETABLE|workplan|text -worktypes|BASETABLE|id|integer -worktypes|BASETABLE|isfreetime|boolean -worktypes|BASETABLE|isworktime|boolean -worktypes|BASETABLE|typecolor|text -worktypes|BASETABLE|worktype|text diff --git a/dev/db/potlu_db.portanova.pg.schema.sql b/dev/db/potlu_db.portanova.pg.schema.sql index 6bf7a558..c9390ab6 100644 --- a/dev/db/potlu_db.portanova.pg.schema.sql +++ b/dev/db/potlu_db.portanova.pg.schema.sql @@ -29,26 +29,26 @@ CREATE SCHEMA portanova; CREATE FUNCTION portanova.add_reportperiod() RETURNS integer LANGUAGE plpgsql - AS $$ -declare - rpstart date; - rpend date; - rplength int4; - rpparentid int4; - rpunit text; - r_stgrps record; - rpsql text; - newperiodid int4; -begin + AS $$ +declare + rpstart date; + rpend date; + rplength int4; + rpparentid int4; + rpunit text; + r_stgrps record; + rpsql text; + newperiodid int4; +begin select reportperiodunit,reportperiodlength,reportperiodstart into rpunit,rplength,rpstart from public.companies where schemata='portanova'; - select case when max(enddate) is null then rpstart else date(max(enddate) + interval '1 day') end into rpstart from portanova.reportperiod; - execute 'select date(date(''' || rpstart || ''') + interval ''' || rplength || ' ' || rpunit || 's'' - interval ''1 day'' );' into rpend; - select max(id) into rpparentid from portanova.reportperiod; + select case when max(enddate) is null then rpstart else date(max(enddate) + interval '1 day') end into rpstart from portanova.reportperiod; + execute 'select date(date(''' || rpstart || ''') + interval ''' || rplength || ' ' || rpunit || 's'' - interval ''1 day'' );' into rpend; + select max(id) into rpparentid from portanova.reportperiod; --raise notice 'ADD NEW PERIOD: %->%',rpstart,rpend; - INSERT INTO portanova.reportperiod (startdate, enddate, id_parentreportperiod) VALUES(rpstart,rpend,rpparentid) returning id into newperiodid; - perform portanova.update_all_staff_in_period(newperiodid); - return newperiodid; -end; + INSERT INTO portanova.reportperiod (startdate, enddate, id_parentreportperiod) VALUES(rpstart,rpend,rpparentid) returning id into newperiodid; + perform portanova.update_all_staff_in_period(newperiodid); + return newperiodid; +end; $$; @@ -58,20 +58,20 @@ $$; CREATE FUNCTION portanova.getperiod_staffcontract(pid integer) RETURNS TABLE(id integer, id_staff integer, startdate date, enddate date, weekhours interval, weekdays integer, id_workplan integer, defaultfreedays json) LANGUAGE plpgsql - AS $$ - declare - pstart date; - pend date; - begin - select prd.startdate as prdstart,prd.enddate as prdend into pstart,pend from portanova.reportperiod prd where prd.id=pid; - return QUERY -select sc.id,sc.id_staff, -case when sc.startdate < pstart then pstart else sc.startdate end as startdate, -case when sc.enddate is null then pend when sc.enddate > pend then pend else sc.enddate end as enddate, -sc.weekhours,sc.weekdays,sc.id_workplan,sc.defaultfreedays -from portanova.staffcontract sc where sc.startdate<= pend and (sc.enddate is null or sc.enddate >= pstart) -order by sc.id_staff,sc.startdate,sc.enddate; -END; + AS $$ + declare + pstart date; + pend date; + begin + select prd.startdate as prdstart,prd.enddate as prdend into pstart,pend from portanova.reportperiod prd where prd.id=pid; + return QUERY +select sc.id,sc.id_staff, +case when sc.startdate < pstart then pstart else sc.startdate end as startdate, +case when sc.enddate is null then pend when sc.enddate > pend then pend else sc.enddate end as enddate, +sc.weekhours,sc.weekdays,sc.id_workplan,sc.defaultfreedays +from portanova.staffcontract sc where sc.startdate<= pend and (sc.enddate is null or sc.enddate >= pstart) +order by sc.id_staff,sc.startdate,sc.enddate; +END; $$; @@ -81,14 +81,14 @@ $$; CREATE FUNCTION portanova.getperiod_staffcontract(pstart date, pend date) RETURNS TABLE(id integer, id_staff integer, startdate date, enddate date, weekhours interval, weekdays integer, id_workplan integer) LANGUAGE plpgsql - AS $$ - BEGIN - return QUERY -select id,id_staff,case when startdate < pstart then pstart else startdate end as startdate,case when enddate is null then pend when enddate > pend then pend else enddate end as enddate, -weekdays, -id_workplan, -weekhours from portanova.staffcontract where startdate<= pend and (enddate is null or enddate >= pstart) order by id_staff,startdate,enddate; -END; + AS $$ + BEGIN + return QUERY +select id,id_staff,case when startdate < pstart then pstart else startdate end as startdate,case when enddate is null then pend when enddate > pend then pend else enddate end as enddate, +weekdays, +id_workplan, +weekhours from portanova.staffcontract where startdate<= pend and (enddate is null or enddate >= pstart) order by id_staff,startdate,enddate; +END; $$; @@ -98,20 +98,20 @@ $$; CREATE FUNCTION portanova.onchange_reportperiod(pid_period integer) RETURNS boolean LANGUAGE plpgsql - AS $$ -declare - prdstart date; - prdend date; - strec record; -begin - select startdate,enddate into prdstart,prdend from portanova.reportperiod where id=pid_period; - for strec in select id_staff,startdate,enddate from portanova.staffcontract where startdate <= prdend and (enddate is null or enddate >= prdstart) group by id_staff + AS $$ +declare + prdstart date; + prdend date; + strec record; +begin + select startdate,enddate into prdstart,prdend from portanova.reportperiod where id=pid_period; + for strec in select id_staff,startdate,enddate from portanova.staffcontract where startdate <= prdend and (enddate is null or enddate >= prdstart) group by id_staff loop - --raise notice 'Start Update period % staffworkplan for % from % to %',pid_period,strec.id_staff,strec.startdate,strec.enddate; - perform portanova.update_staffworkplan(pid_period,strec.id_staff); - end loop; - return true; -end; + --raise notice 'Start Update period % staffworkplan for % from % to %',pid_period,strec.id_staff,strec.startdate,strec.enddate; + perform portanova.update_staffworkplan(pid_period,strec.id_staff); + end loop; + return true; +end; $$; @@ -121,16 +121,16 @@ $$; CREATE FUNCTION portanova.refresh_periods() RETURNS boolean LANGUAGE plpgsql - AS $$ - declare - prds record; - begin - for prds in select id from portanova.reportperiod order by startdate,enddate - loop - perform portanova.update_all_staff_in_period(prds.id); - end loop; - RETURN true; - END; + AS $$ + declare + prds record; + begin + for prds in select id from portanova.reportperiod order by startdate,enddate + loop + perform portanova.update_all_staff_in_period(prds.id); + end loop; + RETURN true; + END; $$; @@ -140,52 +140,52 @@ $$; CREATE FUNCTION portanova.set_periodday_sums(pid_periodday bigint) RETURNS bigint LANGUAGE plpgsql - AS $$ -declare - stw record; - dt1 interval := '00:00:00'::interval; - dt2 interval := '00:00:00'::interval; - dp interval := '00:00:00'::interval; - cworkhours interval := '00:00:00'::interval; - cvacancyhours interval := '00:00:00'::interval; - crecuperationhours interval := '00:00:00'::interval; - cdayhours interval := '00:00:00'::interval; - cinterruptionhours interval := '00:00:00'::interval; -begin - - select * into stw from portanova.staffreportperioddays where id=pid_periodday; - if stw.timestart1 is not null and stw.timeend1 is not null then - dt1 := stw.timeend1-stw.timestart1; - end if; - if stw.timestart2 is not null and stw.timeend2 is not null then - dt2 := stw.timeend2-stw.timestart2; - end if; - if stw.timepause is not null then - dp := stw.timepause; - end if; - cworkhours := (dt1+dt2)-dp; - if (dt1 > '00:00:00'::interval and dt2 > '00:00:00'::interval) then - cinterruptionhours := stw.timestart2 -stw.timeend1; - end if; - if stw.vacancyhours is not null then - if stw.vacancyhours <= stw.contracthours then - cvacancyhours := stw.vacancyhours; - else - cvacancyhours := stw.contracthours; - end if; - end if; - if stw.recuperationhours is not null then - if stw.recuperationhours <= stw.contracthours then - crecuperationhours := stw.recuperationhours; - else - crecuperationhours := stw.contracthours; - end if; - end if; - cdayhours := cworkhours+cvacancyhours+crecuperationhours; - - update portanova.staffreportperioddays set workhours=cworkhours,interruptionhours=cinterruptionhours,dayhours=cdayhours,vacancyhours=cvacancyhours,recuperationhours=crecuperationhours where id=pid_periodday; - return pid_periodday; -end; + AS $$ +declare + stw record; + dt1 interval := '00:00:00'::interval; + dt2 interval := '00:00:00'::interval; + dp interval := '00:00:00'::interval; + cworkhours interval := '00:00:00'::interval; + cvacancyhours interval := '00:00:00'::interval; + crecuperationhours interval := '00:00:00'::interval; + cdayhours interval := '00:00:00'::interval; + cinterruptionhours interval := '00:00:00'::interval; +begin + + select * into stw from portanova.staffreportperioddays where id=pid_periodday; + if stw.timestart1 is not null and stw.timeend1 is not null then + dt1 := stw.timeend1-stw.timestart1; + end if; + if stw.timestart2 is not null and stw.timeend2 is not null then + dt2 := stw.timeend2-stw.timestart2; + end if; + if stw.timepause is not null then + dp := stw.timepause; + end if; + cworkhours := (dt1+dt2)-dp; + if (dt1 > '00:00:00'::interval and dt2 > '00:00:00'::interval) then + cinterruptionhours := stw.timestart2 -stw.timeend1; + end if; + if stw.vacancyhours is not null then + if stw.vacancyhours <= stw.contracthours then + cvacancyhours := stw.vacancyhours; + else + cvacancyhours := stw.contracthours; + end if; + end if; + if stw.recuperationhours is not null then + if stw.recuperationhours <= stw.contracthours then + crecuperationhours := stw.recuperationhours; + else + crecuperationhours := stw.contracthours; + end if; + end if; + cdayhours := cworkhours+cvacancyhours+crecuperationhours; + + update portanova.staffreportperioddays set workhours=cworkhours,interruptionhours=cinterruptionhours,dayhours=cdayhours,vacancyhours=cvacancyhours,recuperationhours=crecuperationhours where id=pid_periodday; + return pid_periodday; +end; $$; @@ -195,31 +195,31 @@ $$; CREATE FUNCTION portanova.set_staffperiod_sums(pid_period integer, pid_staff integer) RETURNS boolean LANGUAGE plpgsql - AS $$ - declare - weekrec record; - BEGIN - for weekrec in select id_staff,id_reportperiod, -sum(contracthours) as contracthours, -sum(workhours) as workhours, -sum(vacancyhours) as vacancyhours, -sum(recuperationhours) as recuperationhours, -sum(diffhours) as hoursdiff, -sum(totalhours) as totalhours -from portanova.staffreportperiodweeks where id_staff=pid_staff and id_reportperiod=pid_period group by id_reportperiod,id_staff - loop - update portanova.staffreportperiod set contracthours=weekrec.contracthours, - workhours=weekrec.workhours, - vacancyhours=weekrec.vacancyhours, - recuperationhours=weekrec.recuperationhours, - hoursdiff=weekrec.hoursdiff, - totalhours=weekrec.totalhours - where id_staff=pid_staff and id_reportperiod=pid_period; - end loop; - --set periodstaffdata (based on periodweeks) - --set nextperiodsdata(based on) - return true; - END; + AS $$ + declare + weekrec record; + BEGIN + for weekrec in select id_staff,id_reportperiod, +sum(contracthours) as contracthours, +sum(workhours) as workhours, +sum(vacancyhours) as vacancyhours, +sum(recuperationhours) as recuperationhours, +sum(diffhours) as hoursdiff, +sum(totalhours) as totalhours +from portanova.staffreportperiodweeks where id_staff=pid_staff and id_reportperiod=pid_period group by id_reportperiod,id_staff + loop + update portanova.staffreportperiod set contracthours=weekrec.contracthours, + workhours=weekrec.workhours, + vacancyhours=weekrec.vacancyhours, + recuperationhours=weekrec.recuperationhours, + hoursdiff=weekrec.hoursdiff, + totalhours=weekrec.totalhours + where id_staff=pid_staff and id_reportperiod=pid_period; + end loop; + --set periodstaffdata (based on periodweeks) + --set nextperiodsdata(based on) + return true; + END; $$; @@ -382,17 +382,17 @@ $$; CREATE FUNCTION portanova.update_all_staff_in_period(pid_period integer) RETURNS boolean LANGUAGE plpgsql - AS $$ - declare - staffrec record; - staffreportid int4; - BEGIN - for staffrec in select id_staff from portanova.getperiod_staffcontract(pid_period) group by id_staff - loop - perform portanova.update_staff_in_period(pid_period,staffrec.id_staff); - end loop; - return true; - END; + AS $$ + declare + staffrec record; + staffreportid int4; + BEGIN + for staffrec in select id_staff from portanova.getperiod_staffcontract(pid_period) group by id_staff + loop + perform portanova.update_staff_in_period(pid_period,staffrec.id_staff); + end loop; + return true; + END; $$; @@ -402,17 +402,17 @@ $$; CREATE FUNCTION portanova.update_staff_in_period(pid_period integer, pid_staff integer) RETURNS boolean LANGUAGE plpgsql - AS $$ - declare - staffreportid int4; - BEGIN - insert into portanova.staffreportperiod (id_reportperiod,id_staff) values (pid_period,pid_staff) - on conflict on constraint uniq_staffreportperiod_cal do nothing returning id into staffreportid; + AS $$ + declare + staffreportid int4; + BEGIN + insert into portanova.staffreportperiod (id_reportperiod,id_staff) values (pid_period,pid_staff) + on conflict on constraint uniq_staffreportperiod_cal do nothing returning id into staffreportid; perform portanova.set_stafftoperioddays(pid_period,pid_staff); perform portanova.set_stafftoperiodweeks(pid_period,pid_staff); - perform portanova.set_staffperiod_sums(pid_period,pid_staff); - return true; - END; + perform portanova.set_staffperiod_sums(pid_period,pid_staff); + return true; + END; $$; @@ -444,21 +444,21 @@ $$; CREATE FUNCTION portanova.update_staffweeksums(pid_staffworkplan bigint) RETURNS void LANGUAGE plpgsql - AS $$ -declare - wkpl_record record; - wkpltt time without time zone := '00:00:00'::interval; -begin - select - case WHEN timestart1 > timeend1 THEN '24:00:00'::time without time zone - (timestart1 - timeend1)::time without time zone ELSE timeend1 - timestart1 END AS time1, - CASE WHEN timestart2 > timeend2 THEN '24:00:00'::time without time zone - (timestart2 - timeend2)::time without time zone ELSE timeend2 - timestart2 END AS time2, - timepause - into wkpl_record - from portanova.staffworkplan where id= pid_staffworkplan; - - wkpltt := wkpl_record.time1 + wkpl_record.time2 - wkpl_record.timepause::interval; - update portanova.staffworkplan set totaltime=wkpltt where id=pid_staffworkplan; -end; + AS $$ +declare + wkpl_record record; + wkpltt time without time zone := '00:00:00'::interval; +begin + select + case WHEN timestart1 > timeend1 THEN '24:00:00'::time without time zone - (timestart1 - timeend1)::time without time zone ELSE timeend1 - timestart1 END AS time1, + CASE WHEN timestart2 > timeend2 THEN '24:00:00'::time without time zone - (timestart2 - timeend2)::time without time zone ELSE timeend2 - timestart2 END AS time2, + timepause + into wkpl_record + from portanova.staffworkplan where id= pid_staffworkplan; + + wkpltt := wkpl_record.time1 + wkpl_record.time2 - wkpl_record.timepause::interval; + update portanova.staffworkplan set totaltime=wkpltt where id=pid_staffworkplan; +end; $$; @@ -559,20 +559,20 @@ $$; CREATE FUNCTION portanova.zzold_onchange_reportperiod(pid_period integer) RETURNS boolean LANGUAGE plpgsql - AS $$ -declare - prdstart date; - prdend date; - strec record; -begin - select startdate,enddate into prdstart,prdend from portanova.reportperiod where id=pid_period; - for strec in select id_staff,startdate,enddate from portanova.staffcontract where startdate <= prdend and (enddate is null or enddate >= prdstart) group by id_staff + AS $$ +declare + prdstart date; + prdend date; + strec record; +begin + select startdate,enddate into prdstart,prdend from portanova.reportperiod where id=pid_period; + for strec in select id_staff,startdate,enddate from portanova.staffcontract where startdate <= prdend and (enddate is null or enddate >= prdstart) group by id_staff loop - raise notice 'Start Update period % staffworkplan for % from % to %',pid_period,strec.id_staff,strec.startdate,strec.enddate; - perform portanova.update_staffworkplan(pid_period,strec.id_staff); - end loop; - return true; -end; + raise notice 'Start Update period % staffworkplan for % from % to %',pid_period,strec.id_staff,strec.startdate,strec.enddate; + perform portanova.update_staffworkplan(pid_period,strec.id_staff); + end loop; + return true; +end; $$; @@ -582,24 +582,24 @@ $$; CREATE FUNCTION portanova.zzold_set_staffperiod(pid_period integer) RETURNS boolean LANGUAGE plpgsql - AS $$ - declare - periodstart date; - periodend date; - staffrec record; - staffreportid int4; - BEGIN - select startdate,enddate into periodstart,periodend from portanova.reportperiod where id= pid_period; - for staffrec in select id_staff from portanova.staffcontract where (enddate >= periodstart or (enddate is null and startdate <= periodend)) group by id_staff - loop - insert into portanova.staffreportperiod (id_reportperiod,id_staff) values (pid_period,staffrec.id_staff) - on conflict on constraint uniq_staffreportperiod_cal do nothing returning id into staffreportid; + AS $$ + declare + periodstart date; + periodend date; + staffrec record; + staffreportid int4; + BEGIN + select startdate,enddate into periodstart,periodend from portanova.reportperiod where id= pid_period; + for staffrec in select id_staff from portanova.staffcontract where (enddate >= periodstart or (enddate is null and startdate <= periodend)) group by id_staff + loop + insert into portanova.staffreportperiod (id_reportperiod,id_staff) values (pid_period,staffrec.id_staff) + on conflict on constraint uniq_staffreportperiod_cal do nothing returning id into staffreportid; raise notice 'staffreport ID: %',staffreportid; perform portanova.set_staffperioddays(pid_period,staffrec.id_staff); - perform portanova.set_staffperiodweeks(pid_period,staffrec.id_staff); - end loop; - return true; - END; + perform portanova.set_staffperiodweeks(pid_period,staffrec.id_staff); + end loop; + return true; + END; $$; @@ -625,7 +625,7 @@ CREATE TABLE portanova.reportperiod ( -- CREATE SEQUENCE portanova.reportperiod_id_seq - AS integer + START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -667,7 +667,7 @@ CREATE TABLE portanova.staff ( -- CREATE SEQUENCE portanova.staff_id_seq - AS integer + START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -717,7 +717,7 @@ CREATE TABLE portanova.staffgroups ( -- CREATE SEQUENCE portanova.staffgroups_id_seq - AS integer + START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -737,7 +737,7 @@ ALTER SEQUENCE portanova.staffgroups_id_seq OWNED BY portanova.staffgroups.id; -- CREATE SEQUENCE portanova.staffperiodbase_id_seq - AS integer + START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -776,7 +776,7 @@ CREATE TABLE portanova.staffreportperiod ( -- CREATE SEQUENCE portanova.staffreportperiod_id_seq - AS integer + START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -863,7 +863,7 @@ CREATE TABLE portanova.staffvacancy ( -- CREATE SEQUENCE portanova.staffvacancy_id_seq - AS integer + START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -883,7 +883,7 @@ ALTER SEQUENCE portanova.staffvacancy_id_seq OWNED BY portanova.staffvacancy.id; -- CREATE SEQUENCE portanova.staffweeksums_id_seq - AS integer + START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -933,7 +933,7 @@ CREATE TABLE portanova.vacancydays ( -- CREATE SEQUENCE portanova.vacancydays_id_seq - AS integer + START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -1356,7 +1356,7 @@ CREATE VIEW portanova.vw_worktimeslist AS -- CREATE SEQUENCE portanova.workplandays_id_seq - AS integer + START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -1376,7 +1376,7 @@ ALTER SEQUENCE portanova.workplandays_id_seq OWNED BY portanova.workplandays.id; -- CREATE SEQUENCE portanova.workplans_id_seq - AS integer + START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -1396,7 +1396,7 @@ ALTER SEQUENCE portanova.workplans_id_seq OWNED BY portanova.workplans.id; -- CREATE SEQUENCE portanova.worktimes_id_seq - AS integer + START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -1416,7 +1416,7 @@ ALTER SEQUENCE portanova.worktimes_id_seq OWNED BY portanova.worktimes.id; -- CREATE SEQUENCE portanova.worktypes_id_seq - AS integer + START WITH 1 INCREMENT BY 1 NO MINVALUE diff --git a/dev/db/potlu_db.portanova.tables.live.txt b/dev/db/potlu_db.portanova.tables.live.txt deleted file mode 100644 index 3a72c19e..00000000 --- a/dev/db/potlu_db.portanova.tables.live.txt +++ /dev/null @@ -1,25 +0,0 @@ - -reportperiod|BASETABLE -sites|BASETABLE -staff|BASETABLE -staffcontract|BASETABLE -staffgroups|BASETABLE -stafftimetracks|BASETABLE -staffvacancy|BASETABLE -staffvacancyyear|BASETABLE -staffworkplan|BASETABLE -vw_reportperiodlist|VIEW -vw_staffcontractdata|VIEW -vw_staffcontractlist|VIEW -vw_staffdata|VIEW -vw_staffgroupsdata|VIEW -vw_staffgroupslist|VIEW -vw_stafflist|VIEW -vw_staffplanned_dayweektotals|VIEW -vw_staffworkplanlist|VIEW -vw_staffworkplan_weekly|VIEW -vw_workplanlist|VIEW -vw_workplansdata|VIEW -vw_workplans|VIEW -workplans|BASETABLE -worktypes|BASETABLE diff --git a/dev/db/potlu_db.public.columns.live.txt b/dev/db/potlu_db.public.columns.live.txt deleted file mode 100644 index 70377329..00000000 --- a/dev/db/potlu_db.public.columns.live.txt +++ /dev/null @@ -1,110 +0,0 @@ - -public|apps|BASETABLE|app|text -public|apps|BASETABLE|description|text -public|apps|BASETABLE|icon|text -public|apps|BASETABLE|id|integer -public|apps|BASETABLE|id_usergroup|integer -public|apps|BASETABLE|menutype|text -public|apps|BASETABLE|name|text -public|apps|BASETABLE|sort|integer -public|companies|BASETABLE|address|text -public|companies|BASETABLE|city|text -public|companies|BASETABLE|company|text -public|companies|BASETABLE|comregister|text -public|companies|BASETABLE|country|text -public|companies|BASETABLE|email|text -public|companies|BASETABLE|id|integer -public|companies|BASETABLE|schemata2|json -public|companies|BASETABLE|schemata|text -public|companies|BASETABLE|socialtype|text -public|companies|BASETABLE|tradetype|text -public|companies|BASETABLE|validated|boolean -public|companies|BASETABLE|vatnumber|text -public|companies|BASETABLE|vatvalidated|boolean -public|companies|BASETABLE|zip|text -public|maillayouts|BASETABLE|id|integer -public|maillayouts|BASETABLE|layoutname|text -public|maillayouts|BASETABLE|mailtemplate|text -public|mailtemplates|BASETABLE|emaildatasql|text -public|mailtemplates|BASETABLE|emailtext|text -public|mailtemplates|BASETABLE|id|integer -public|mailtemplates|BASETABLE|id_maillayout|integer -public|mailtemplates|BASETABLE|mailfrom|text -public|mailtemplates|BASETABLE|mailsubject|text -public|mailtemplates|BASETABLE|templatename|text -public|members|BASETABLE|id_company|integer -public|members|BASETABLE|id|integer -public|members|BASETABLE|id_user|bigint -public|members|BASETABLE|job|text -public|members|BASETABLE|phone|text -public|members|BASETABLE|prename|text -public|members|BASETABLE|surname|text -public|sessions|BASETABLE|created|timestampwithouttimezone -public|sessions|BASETABLE|id|bigint -public|sessions|BASETABLE|idsession|text -public|sessions|BASETABLE|id_user|bigint -public|sessions|BASETABLE|remote_addr|text -public|sessions|BASETABLE|user_agent|text -public|usergroups|BASETABLE|groupname|text -public|usergroups|BASETABLE|id|integer -public|usergroups|BASETABLE|isdefault|boolean -public|usergroups|BASETABLE|usergroup|text -public|useringroups|BASETABLE|id_group|bigint -public|useringroups|BASETABLE|id|integer -public|useringroups|BASETABLE|id_user|bigint -public|users|BASETABLE|blocked|boolean -public|users|BASETABLE|created|timestampwithouttimezone -public|users|BASETABLE|id|integer -public|users|BASETABLE|regcode|text -public|users|BASETABLE|schemaaccess|json -public|users|BASETABLE|username|text -public|users|BASETABLE|userpassword|text -public|users|BASETABLE|vcode|text -public|vw_companiesdata|VIEW|address|text -public|vw_companiesdata|VIEW|city|text -public|vw_companiesdata|VIEW|company|text -public|vw_companiesdata|VIEW|comregister|text -public|vw_companiesdata|VIEW|country|text -public|vw_companiesdata|VIEW|email|text -public|vw_companiesdata|VIEW|id|integer -public|vw_companiesdata|VIEW|schemata2|json -public|vw_companiesdata|VIEW|schemata|text -public|vw_companiesdata|VIEW|socialtype|text -public|vw_companiesdata|VIEW|tradetype|text -public|vw_companiesdata|VIEW|validated|boolean -public|vw_companiesdata|VIEW|vatnumber|text -public|vw_companiesdata|VIEW|vatvalidated|boolean -public|vw_companiesdata|VIEW|zip|text -public|vw_companieslist|VIEW|address|text -public|vw_companieslist|VIEW|city|text -public|vw_companieslist|VIEW|company|text -public|vw_companieslist|VIEW|comregister|text -public|vw_companieslist|VIEW|country|text -public|vw_companieslist|VIEW|email|text -public|vw_companieslist|VIEW|id|integer -public|vw_companieslist|VIEW|schemata2|json -public|vw_companieslist|VIEW|schemata|text -public|vw_companieslist|VIEW|socialtype|text -public|vw_companieslist|VIEW|tradetype|text -public|vw_companieslist|VIEW|validated|boolean -public|vw_companieslist|VIEW|vatnumber|text -public|vw_companieslist|VIEW|vatvalidated|boolean -public|vw_companieslist|VIEW|zip|text -public|vw_memberdata|VIEW|id_company|integer -public|vw_memberdata|VIEW|id|integer -public|vw_memberdata|VIEW|id_user|bigint -public|vw_memberdata|VIEW|job|text -public|vw_memberdata|VIEW|phone|text -public|vw_memberdata|VIEW|prename|text -public|vw_memberdata|VIEW|surname|text -public|vw_userdata|VIEW|id|integer -public|vw_userdata|VIEW|username|text -public|vw_userlist|VIEW|blocked|boolean -public|vw_userlist|VIEW|company|text -public|vw_userlist|VIEW|group_ids|text -public|vw_userlist|VIEW|id_company|integer -public|vw_userlist|VIEW|id|integer -public|vw_userlist|VIEW|id_member|integer -public|vw_userlist|VIEW|prename|text -public|vw_userlist|VIEW|surname|text -public|vw_userlist|VIEW|username|text diff --git a/dev/db/potlu_db.public.columns.local.txt b/dev/db/potlu_db.public.columns.local.txt deleted file mode 100644 index a50977dc..00000000 --- a/dev/db/potlu_db.public.columns.local.txt +++ /dev/null @@ -1,118 +0,0 @@ - -public|apps|BASETABLE|app|text -public|apps|BASETABLE|description|text -public|apps|BASETABLE|icon|text -public|apps|BASETABLE|id|integer -public|apps|BASETABLE|id_usergroup|integer -public|apps|BASETABLE|menutype|text -public|apps|BASETABLE|name|text -public|apps|BASETABLE|sort|integer -public|companies|BASETABLE|address|text -public|companies|BASETABLE|city|text -public|companies|BASETABLE|company|text -public|companies|BASETABLE|comregister|text -public|companies|BASETABLE|country|text -public|companies|BASETABLE|email|text -public|companies|BASETABLE|id|integer -public|companies|BASETABLE|schemata2|json -public|companies|BASETABLE|schemata|text -public|companies|BASETABLE|socialtype|text -public|companies|BASETABLE|tradetype|text -public|companies|BASETABLE|validated|boolean -public|companies|BASETABLE|vatnumber|text -public|companies|BASETABLE|vatvalidated|boolean -public|companies|BASETABLE|zip|text -public|maillayouts|BASETABLE|id|integer -public|maillayouts|BASETABLE|layoutname|text -public|maillayouts|BASETABLE|mailtemplate|text -public|mailtemplates|BASETABLE|emaildatasql|text -public|mailtemplates|BASETABLE|emailtext|text -public|mailtemplates|BASETABLE|id|integer -public|mailtemplates|BASETABLE|id_maillayout|integer -public|mailtemplates|BASETABLE|mailfrom|text -public|mailtemplates|BASETABLE|mailsubject|text -public|mailtemplates|BASETABLE|templatename|text -public|sessions|BASETABLE|created|timestampwithouttimezone -public|sessions|BASETABLE|id|bigint -public|sessions|BASETABLE|idsession|text -public|sessions|BASETABLE|id_user|bigint -public|sessions|BASETABLE|remote_addr|text -public|sessions|BASETABLE|user_agent|text -public|usergroups|BASETABLE|groupname|text -public|usergroups|BASETABLE|id|integer -public|usergroups|BASETABLE|isdefault|boolean -public|usergroups|BASETABLE|usergroup|text -public|users|BASETABLE|blocked|boolean -public|users|BASETABLE|created|timestampwithouttimezone -public|users|BASETABLE|id_company|integer -public|users|BASETABLE|id|integer -public|users|BASETABLE|id_usergroups|json -public|users|BASETABLE|job|text -public|users|BASETABLE|phone|text -public|users|BASETABLE|prename|text -public|users|BASETABLE|regcode|text -public|users|BASETABLE|schemaaccess|json -public|users|BASETABLE|surname|text -public|users|BASETABLE|username|text -public|users|BASETABLE|userpassword|text -public|users|BASETABLE|vcode|text -public|vw_companiesdata|VIEW|address|text -public|vw_companiesdata|VIEW|city|text -public|vw_companiesdata|VIEW|company|text -public|vw_companiesdata|VIEW|comregister|text -public|vw_companiesdata|VIEW|country|text -public|vw_companiesdata|VIEW|email|text -public|vw_companiesdata|VIEW|id|integer -public|vw_companiesdata|VIEW|schemata2|json -public|vw_companiesdata|VIEW|schemata|text -public|vw_companiesdata|VIEW|socialtype|text -public|vw_companiesdata|VIEW|tradetype|text -public|vw_companiesdata|VIEW|validated|boolean -public|vw_companiesdata|VIEW|vatnumber|text -public|vw_companiesdata|VIEW|vatvalidated|boolean -public|vw_companiesdata|VIEW|zip|text -public|vw_companieslist|VIEW|address|text -public|vw_companieslist|VIEW|city|text -public|vw_companieslist|VIEW|company|text -public|vw_companieslist|VIEW|comregister|text -public|vw_companieslist|VIEW|country|text -public|vw_companieslist|VIEW|email|text -public|vw_companieslist|VIEW|id|integer -public|vw_companieslist|VIEW|schemata2|json -public|vw_companieslist|VIEW|schemata|text -public|vw_companieslist|VIEW|socialtype|text -public|vw_companieslist|VIEW|tradetype|text -public|vw_companieslist|VIEW|validated|boolean -public|vw_companieslist|VIEW|vatnumber|text -public|vw_companieslist|VIEW|vatvalidated|boolean -public|vw_companieslist|VIEW|zip|text -public|vw_schemata|VIEW|schemaname|charactervarying -public|vw_usergroupslist|VIEW|groupname|text -public|vw_usergroupslist|VIEW|id|integer -public|vw_usergroupslist|VIEW|isdefault|boolean -public|vw_usergroupslist|VIEW|usergroup|text -public|vw_usersdata|VIEW|blocked|boolean -public|vw_usersdata|VIEW|created|timestampwithouttimezone -public|vw_usersdata|VIEW|id_company|integer -public|vw_usersdata|VIEW|id|integer -public|vw_usersdata|VIEW|id_usergroups|json -public|vw_usersdata|VIEW|job|text -public|vw_usersdata|VIEW|phone|text -public|vw_usersdata|VIEW|prename|text -public|vw_usersdata|VIEW|regcode|text -public|vw_usersdata|VIEW|schemaaccess|json -public|vw_usersdata|VIEW|surname|text -public|vw_usersdata|VIEW|username|text -public|vw_usersdata|VIEW|userpassword|text -public|vw_usersdata|VIEW|vcode|text -public|vw_userslist|VIEW|blocked|boolean -public|vw_userslist|VIEW|company|text -public|vw_userslist|VIEW|id_company|integer -public|vw_userslist|VIEW|id|integer -public|vw_userslist|VIEW|job|text -public|vw_userslist|VIEW|phone|text -public|vw_userslist|VIEW|prename|text -public|vw_userslist|VIEW|schemaaccess|text -public|vw_userslist|VIEW|surname|text -public|vw_userslist|VIEW|usergroups|text -public|vw_userslist|VIEW|username|text diff --git a/dev/db/potlu_db.public.pg.data.sql b/dev/db/potlu_db.public.pg.data.sql index ce23147e..229ae399 100644 --- a/dev/db/potlu_db.public.pg.data.sql +++ b/dev/db/potlu_db.public.pg.data.sql @@ -22,30 +22,32 @@ SET row_security = off; INSERT INTO public.usergroups (id, usergroup, isdefault, groupname) VALUES (1, 'superadmin', NULL, 'SuperAdmin'); INSERT INTO public.usergroups (id, usergroup, isdefault, groupname) VALUES (2, 'admin', NULL, 'Admin'); -INSERT INTO public.usergroups (id, usergroup, isdefault, groupname) VALUES (4, 'site', NULL, 'Site'); INSERT INTO public.usergroups (id, usergroup, isdefault, groupname) VALUES (5, 'user', true, 'Utilisateur'); INSERT INTO public.usergroups (id, usergroup, isdefault, groupname) VALUES (3, 'manager', NULL, 'Gérant'); +INSERT INTO public.usergroups (id, usergroup, isdefault, groupname) VALUES (4, 'teamleader', NULL, 'Responsable'); -- -- Data for Name: apps; Type: TABLE DATA; Schema: public; Owner: - -- -INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype) VALUES (8, 'timetrackers', 'Pointeuses', 'Pointeuses', NULL, 'cube.svg', 7, 'schema'); -INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype) VALUES (10, 'sites', 'Sites', 'Sites', NULL, 'cube.svg', 6, 'schema'); -INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype) VALUES (4, 'profile', 'Profil', 'mes coordonnées', 5, 'user.svg', 9, 'global'); -INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype) VALUES (5, 'users', 'Utilisateurs', 'utilisateurs', 2, 'group.svg', 11, 'global'); -INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype) VALUES (7, 'staff', 'Employé(e)s', 'employé(e)s', 3, 'group.svg', 4, 'schema'); -INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype) VALUES (9, 'planning', 'Planning', 'POT', 3, 'poticon.svg', 5, 'schema'); -INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype) VALUES (6, 'companies', 'Entreprise', 'entreprise', 2, 'cube.svg', 10, 'global'); -INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype) VALUES (11, 'workplans', 'Plans de travail', 'plans (modèles)', 3, 'calendar.svg', 8, 'schema'); +INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype, id_usergroups) VALUES (10, 'sites', 'Sites', 'Sites', NULL, 'cube.svg', 6, 'schema', NULL); +INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype, id_usergroups) VALUES (8, 'timetrackers', 'Pointeuses', 'Pointeuses', NULL, 'cube.svg', 7, 'schema', NULL); +INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype, id_usergroups) VALUES (5, 'users', 'Utilisateurs', 'utilisateurs', 2, 'group.svg', 11, 'global', '["2","3","4","5"]'); +INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype, id_usergroups) VALUES (6, 'companies', 'Entreprise', 'entreprise', 2, 'cube.svg', 10, 'global', '["2","3"]'); +INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype, id_usergroups) VALUES (7, 'staff', 'Salairiés', 'Salariés', 3, 'group.svg', 4, 'schema', '["2","3"]'); +INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype, id_usergroups) VALUES (11, 'workplans', 'Plans de travail', 'POT (modèles)', 3, 'calendar.svg', 8, 'schema', '["2","3","4"]'); +INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype, id_usergroups) VALUES (4, 'profile', 'Profil', 'Profil', 5, 'user.svg', 9, 'global', '["2","3","4","5"]'); +INSERT INTO public.apps (id, app, description, name, id_usergroup, icon, sort, menutype, id_usergroups) VALUES (9, 'periods', 'Planning', 'Période(s) de référence', 3, 'poticon.svg', 5, 'schema', '["2","3","4"]'); -- -- Data for Name: companies; Type: TABLE DATA; Schema: public; Owner: - -- -INSERT INTO public.companies (id, company, address, zip, city, country, tradetype, comregister, vatnumber, schemata, validated, schemata2, email, socialtype, vatvalidated) VALUES (1, 'DKS', '8b, rue du Moulin', '6914', 'Roodt-sur-Syre', 'Luxemburg', NULL, NULL, NULL, 'portanova', NULL, NULL, 'support@dks.lu', 's.à r.l.', NULL); +INSERT INTO public.companies (id, company, address, zip, city, country, tradetype, comregister, vatnumber, schemata, validated, schemata2, email, socialtype, vatvalidated, reportperiodunit, reportperiodlength, reportperiodstart) VALUES (25, 'test', '4, rue Principale', '3770', 'Tétange', 'Luxemburg', NULL, NULL, NULL, 'test', NULL, NULL, 'kilian@saffran.lu', 's.à r.l.', NULL, NULL, NULL, NULL); +INSERT INTO public.companies (id, company, address, zip, city, country, tradetype, comregister, vatnumber, schemata, validated, schemata2, email, socialtype, vatvalidated, reportperiodunit, reportperiodlength, reportperiodstart) VALUES (26, 'TEST2', '8b, rue du Moulin', '6914', 'Roodt-sur-Syre', 'Luxemburg', NULL, NULL, NULL, 'test2', NULL, NULL, 'support@dks.lu', NULL, NULL, NULL, NULL, NULL); +INSERT INTO public.companies (id, company, address, zip, city, country, tradetype, comregister, vatnumber, schemata, validated, schemata2, email, socialtype, vatvalidated, reportperiodunit, reportperiodlength, reportperiodstart) VALUES (1, 'Portanova', 'rue de la faïencerie', NULL, 'Luxembourg', 'Luxemburg', NULL, NULL, NULL, 'portanova', NULL, NULL, 'support@dks.lu', 's.à r.l.', NULL, 'week', 8, '2019-12-30'); -- @@ -156,39 +158,41 @@ pot.lu Support-Team
-- Data for Name: users; Type: TABLE DATA; Schema: public; Owner: - -- -INSERT INTO public.users (id, userpassword, created, blocked, username, regcode, vcode, schemaaccess, id_usergroups, surname, prename, phone, job, id_company) VALUES (2, 'f7252754a4cb7391d966316351b3501bce81fee9bc0b71807ddf61281a27821e', '2019-12-20 11:03:08.757357', NULL, 'kilian@saffran.lu', NULL, NULL, '["portanova"]', '["5"]', 'Saffran', 'Kilian', '691504574', NULL, 1); -INSERT INTO public.users (id, userpassword, created, blocked, username, regcode, vcode, schemaaccess, id_usergroups, surname, prename, phone, job, id_company) VALUES (1, '228c27a646f18ce069bc2b8ef091a03c46cd51557e5b5ac90abc05c4f635b3ba', '2019-10-10 17:12:11.934747', NULL, 'kilian.saffran@gmail.com', NULL, '6tgfkew', '["portanova"]', '["2","5","3"]', 'Saffran', 'Kilian', '+352691504574', 'Gérant', 1); +INSERT INTO public.users (id, userpassword, created, blocked, username, regcode, vcode, schemaaccess, id_usergroups, surname, prename, phone, job, id_company, id_usergroup) VALUES (1, '0ecf731e2426a8a469f06e9f4a3bcbed6f8071d9d3e3ef7ef5fd9165021e27ec', '2019-10-10 17:12:11.934747', NULL, 'kilian.saffran@gmail.com', NULL, '6tgfkew', '["test","portanova"]', '["2","5","3","4"]', 'Saffran', 'Kilian', '+352691504574', 'Gérant', 1, 2); +INSERT INTO public.users (id, userpassword, created, blocked, username, regcode, vcode, schemaaccess, id_usergroups, surname, prename, phone, job, id_company, id_usergroup) VALUES (2, 'f7252754a4cb7391d966316351b3501bce81fee9bc0b71807ddf61281a27821e', '2019-12-20 11:03:08.757357', NULL, 'kilian@saffran.lu', NULL, NULL, '["portanova"]', '["5"]', 'Saffran', 'Kilian', '691504574', NULL, 1, 5); +INSERT INTO public.users (id, userpassword, created, blocked, username, regcode, vcode, schemaaccess, id_usergroups, surname, prename, phone, job, id_company, id_usergroup) VALUES (4, 'ad3d14273d47ed24f6d62e3f8c64032e946d9e9d5965364a81e15d12a69cf2ce', '2019-12-29 16:53:19.68549', NULL, 'ksaffran@dks.lu', NULL, NULL, '["portanova"]', '["3","5"]', 'Saffran', 'Kilian', NULL, NULL, 1, 3); -- -- Data for Name: sessions; Type: TABLE DATA; Schema: public; Owner: - -- +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (228, 'yQVWb3gmfQZbXhdgiexW1O2suUpzBlL02xM3qTgw', 1, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36', '2001:7e8:cc73:de00:a812:ebc7:72cb:2146', '2020-01-09 06:41:48.639525'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (229, 'OE2TqV8VRjYZmkSXr7qjQW4TVR8zvjJ9OCT4nRP5', 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', '::1', '2020-01-09 10:37:54.604655'); INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (111, 'uWpnqxhEFJt2MZxMoLSz4ZAZoc3ZJnu3aKhq8oVD', 1, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', '2001:7e8:cc73:de00:213c:73ba:ffa7:842b', '2019-12-05 19:16:43.969105'); INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (112, 'mUmGFzD4kPLyhHfJO9TDOGfCtsVAEefRYrotRRo1', 1, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', '2001:7e8:cc73:de00:7946:65e2:f587:8b74', '2019-12-06 07:02:23.094765'); INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (113, 'HaDg0Eh9nIk7lftrHDtQpaKiLWL66VoEWRKMmSLz', 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', '::1', '2019-12-09 11:33:13.202044'); INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (114, 'aSli1lR9B0ETjICf7IFjVxhphLd8dhRdZ2mRd4RE', 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362', '::1', '2019-12-10 15:55:53.526432'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (175, 'NjxbJc50MGk8kV9dH2G33mhWV5e4PTns3KuCMptp', 1, 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Mobile Safari/537.36', '::1', '2020-01-02 09:36:12.19675'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (176, 'd62Z9Se8i1QM2Zhx6JZz8TWz9eXvIlXMiPBhyGgG', 1, 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1', '::1', '2020-01-02 09:36:47.868479'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (232, 'EPjQ6DLhLgmxsW0euSnHhxOmC2iMrKlWpvCmYetA', 1, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36', '192.168.178.23', '2020-01-10 08:38:40.58899'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (178, 'yC6li3gqsuF9nPacybvBUPwzz3SoIyx71ui9nppF', 1, 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', '::1', '2020-01-02 09:49:11.956938'); INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (122, 'Sp2D9CvtdjQHaxLPkEXgqSMSveIJwQde56I5y3oC', 1, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', '2001:7e8:cc73:de00:d970:312a:d5d:db83', '2019-12-12 07:06:51.913155'); INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (124, 'NUTU0TkWd81oxH4ig52WCA3HzccA3bmHW5sMPCyT', 1, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36', '::1', '2019-12-15 11:44:06.485589'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (198, 'dC237zuzY7HYOGvbFem5LeVuQ3XFRxSU0LOXa8nZ', 1, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36', '2001:7e8:cc73:de00:24c6:9f1e:3054:64dd', '2020-01-08 08:36:54.781554'); INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (93, '5P7159lXg8xY83Iu7eZC3hj3Oi6x29jXOhPKg0yn', 1, 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36', '::1', '2019-12-04 14:58:48.993651'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (258, 's7C63JpbiZV34B1obie1a6JUnUaSJXl1VNYPndQv', 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36', '::1', '2020-01-16 09:02:49.520835'); INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (98, '9UisAitYaoxdqtBaWUI37R04CiBlFxcp0STuCOZRU', 1, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', '::1', '2019-12-05 07:34:07.997426'); INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (99, 'v6wZ65qozoWn5P32q4wg16224TcOAM1VJnLFj1UJ', 1, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', '192.168.178.23', '2019-12-05 07:35:01.756219'); INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (160, 'pMEnznbOdbCeLbtKUwxgVbn2PNVzrF0HhvVHIWmL', 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36', '::1', '2019-12-20 12:48:16.464228'); -INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (161, 'fvhUhEhy8bRQnrZd1I0oVdAwntMj86Xdr5Yzz6Yy', 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', '::1', '2019-12-22 09:58:14.675553'); - - --- --- Data for Name: zzold_members; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO public.zzold_members (id, surname, prename, phone, id_user, id_company, job) VALUES (1, 'Saffran', 'Kilian', NULL, 1, 1, NULL); - - --- --- Data for Name: zzold_useringroups; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO public.zzold_useringroups (id, id_user, id_group) VALUES (1, 1, 1); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (162, 'RRiSGkElRtLTCs3lkdYpQNZDnxKJ2wOJdXrJ7WVO', 1, '192.168.178.23', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', '2019-12-24 10:59:50.644045'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (163, 'BlvRAYUeX78wr2OhPvWU5TrsNAmsooAQzWy0Ki4x', 1, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', '2001:7e8:cc73:de00:f4f8:d2a7:1c8:2664', '2019-12-24 11:00:44.808971'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (279, 'U9ksV3dLzsxjylgOx5WK5lPitIiU8nrSmBb8veJU', 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 Edg/79.0.309.71', '::1', '2020-02-04 08:32:56.845626'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (281, 'zdaOUZfTtPkLpOQYYPGqzViSKLTgtMWTPXxAMCj6', 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36', '::1', '2020-02-05 10:18:52.389333'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (283, 'qCTq7PB9Ml539u6mdEoTGensJglVwc8MER3CxvC9', 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36', '::1', '2020-02-10 09:03:25.356532'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (286, 'WeNOQHFuxR7KfY1DAK8nkMgCAc7JQ6EDaihRQNcd', 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36', '::1', '2020-02-14 18:56:34.030027'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (299, 'UgTmbOQeAFpuAAPqP7CGP22KXtsWMglxn4JoIqt9', 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36', '::1', '2020-02-24 11:53:27.013773'); +INSERT INTO public.sessions (id, idsession, id_user, user_agent, remote_addr, created) VALUES (301, '0947l9NXchB8bZJx7UKHuBpazWGacjx2is0trEgu', 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36', '::1', '2020-02-26 11:26:44.355966'); -- @@ -202,7 +206,7 @@ SELECT pg_catalog.setval('public.apps_id_seq', 11, true); -- Name: companies_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - -- -SELECT pg_catalog.setval('public.companies_id_seq', 24, true); +SELECT pg_catalog.setval('public.companies_id_seq', 26, true); -- @@ -219,18 +223,11 @@ SELECT pg_catalog.setval('public.maillayouts_id_seq', 1, true); SELECT pg_catalog.setval('public.mailtemplates_id_seq', 7, true); --- --- Name: members_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('public.members_id_seq', 1, false); - - -- -- Name: sessions_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - -- -SELECT pg_catalog.setval('public.sessions_id_seq', 161, true); +SELECT pg_catalog.setval('public.sessions_id_seq', 301, true); -- @@ -240,18 +237,11 @@ SELECT pg_catalog.setval('public.sessions_id_seq', 161, true); SELECT pg_catalog.setval('public.usergroups_id_seq', 4, true); --- --- Name: useringroups_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('public.useringroups_id_seq', 1, true); - - -- -- Name: users_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - -- -SELECT pg_catalog.setval('public.users_id_seq', 2, true); +SELECT pg_catalog.setval('public.users_id_seq', 4, true); -- diff --git a/dev/db/potlu_db.public.pg.full.sql b/dev/db/potlu_db.public.pg.full.sql index c3750ed6..32f6bec5 100644 --- a/dev/db/potlu_db.public.pg.full.sql +++ b/dev/db/potlu_db.public.pg.full.sql @@ -109,17 +109,16 @@ ALTER FUNCTION public.getmondays(vyear integer) OWNER TO potlu_user; -- Name: getsession(text, text, text); Type: FUNCTION; Schema: public; Owner: potlu_user -- -CREATE FUNCTION public.getsession(vidsession text, vremoteaddr text, vuseragent text) RETURNS TABLE(idsession text, id integer, username text, usergroups text, userschemata text) +CREATE FUNCTION public.getsession(vidsession text, vremoteaddr text, vuseragent text) RETURNS TABLE(idsession text, id integer, username text, usergroup text) LANGUAGE plpgsql - AS $$ - BEGIN - return QUERY select se.idsession,us.id,us.username,string_agg(distinct(ugrp.usergroup),',') as usergroups,json_array_elements_text(us.schemaaccess) as userschemata from sessions se + AS $$ + BEGIN + return QUERY select se.idsession,us.id,us.username,ugrp.usergroup from sessions se join users us on (us.id=se.id_user) -left join (SELECT users.id,json_array_elements_text(users.id_usergroups) AS id_usergroup FROM users) ugs on (us.id=ugs.id) -left join usergroups ugrp on (ugrp.id=ugs.id) +left join usergroups ugrp on (ugrp.id=us.id_usergroup) where se.idsession= vidsession and se.remote_addr= vremoteaddr and se.user_agent= vuseragent and -us.blocked is null group by se.id,us.id; - END; +us.blocked is null group by se.id,us.id,ugrp.id; + END; $$; @@ -159,6 +158,25 @@ $$; ALTER FUNCTION public.getweeks(vyear integer) OWNER TO potlu_user; +-- +-- Name: getweeksbydaterange(date, date); Type: FUNCTION; Schema: public; Owner: potlu_user +-- + +CREATE FUNCTION public.getweeksbydaterange(datefrom date, dateto date) RETURNS TABLE(calyear integer, calweek integer, weekstart date, weekend date) + LANGUAGE plpgsql + AS $$ + BEGIN + return QUERY select date_part('isoyear',daydate)::int as calyear,date_part('week',daydate)::int4 as calweek,date(date_trunc('week',daydate)) as weekstart , date(date_trunc('week',daydate) + interval '6 days') as weekend +from +(select datefrom + s*'1 day'::interval as daydate from +(select * from generate_series(0,dateto - datefrom )s)x ) d group by calyear,calweek,weekstart,weekend order by weekstart,weekend; + + END; +$$; + + +ALTER FUNCTION public.getweeksbydaterange(datefrom date, dateto date) OWNER TO potlu_user; + -- -- Name: random_string(integer); Type: FUNCTION; Schema: public; Owner: potlu_user -- @@ -178,6 +196,31 @@ $$; ALTER FUNCTION public.random_string(vlength integer) OWNER TO potlu_user; +-- +-- Name: staffworplan_contracthours(text, integer); Type: FUNCTION; Schema: public; Owner: potlu_user +-- + +CREATE FUNCTION public.staffworplan_contracthours(vschemaname text, vcontractid integer) RETURNS void + LANGUAGE plpgsql + AS $$ +declare + cur_contracthours TEXT; + cur_startdate date; + cur_enddate date; + cur_id_staff int4; + BEGIN + execute 'select startdate,enddate,id_staff,to_char(to_timestamp((round(weekhours/weekdays,3)) * 60), ''MI:SS:00'') from ' || vschemaname || '.staffcontract where id=' || vcontractid || ';' into cur_startdate,cur_enddate,cur_id_staff,cur_contracthours; + if cur_enddate is null then + execute 'update ' || vschemaname || '.staffworkplan SET contracthours='''|| cur_contracthours || ''' WHERE id_staff=' || cur_id_staff || ' and daydate>=date(''' || to_char(cur_startdate,'YYYY-MM-DD') || ''');'; + else + execute 'update ' || vschemaname || '.staffworkplan SET contracthours='''|| cur_contracthours || ''' WHERE id_staff=' || cur_id_staff || ' and daydate between date(''' || to_char(cur_startdate,'YYYY-MM-DD') || ''') and date(''' || to_char(cur_enddate,'YYYY-MM-DD') || ''');'; + end if; + END; +$$; + + +ALTER FUNCTION public.staffworplan_contracthours(vschemaname text, vcontractid integer) OWNER TO potlu_user; + -- -- Name: trg_update_basemonthhours(); Type: FUNCTION; Schema: public; Owner: potlu_user -- @@ -246,6 +289,31 @@ $$; ALTER FUNCTION public.trg_update_monthlyhours() OWNER TO potlu_user; +-- +-- Name: weekvacancy(text, double precision, integer); Type: FUNCTION; Schema: public; Owner: potlu_user +-- + +CREATE FUNCTION public.weekvacancy(vschema text, vcalweek double precision, vidstaff integer) RETURNS text + LANGUAGE plpgsql + AS $$ + declare + vret text; + xsql text; + begin + xsql := 'select ''{"vacancy":{'' || string_agg(''"'' || id_vacancytype || ''":'' || row_to_json(weekvacancy),'','') || ''}}'' from ( +select vk.id_vacancytype,sum(vk.vacancyhours) as vacancyhours,vt.vacancyname,vt.color,vt.isworktime from portanova.staffworkplan vk + +join ' || vschema || '.vacancytypes vt on (vt.id=vk.id_vacancytype) +where date_part(''week'', daydate)= ' || vcalweek || ' and id_staff= ' || vidstaff || ' group by vk.id_vacancytype,vt.vacancyname,vt.color,vt.isworktime) weekvacancy;'; + --raise notice '%s',xsql; + execute xsql into vret; +return vret; +END; +$$; + + +ALTER FUNCTION public.weekvacancy(vschema text, vcalweek double precision, vidstaff integer) OWNER TO potlu_user; + SET default_tablespace = ''; SET default_with_oids = false; @@ -262,7 +330,8 @@ CREATE TABLE public.apps ( id_usergroup integer, icon text, sort integer, - menutype text + menutype text, + id_usergroups json ); @@ -309,7 +378,10 @@ CREATE TABLE public.companies ( schemata2 json, email text, socialtype text, - vatvalidated boolean + vatvalidated boolean, + reportperiodunit text, + reportperiodlength integer, + reportperiodstart date ); @@ -411,45 +483,6 @@ ALTER TABLE public.mailtemplates_id_seq OWNER TO potlu_user; ALTER SEQUENCE public.mailtemplates_id_seq OWNED BY public.mailtemplates.id; --- --- Name: zzold_members; Type: TABLE; Schema: public; Owner: potlu_user --- - -CREATE TABLE public.zzold_members ( - id integer NOT NULL, - surname text, - prename text, - phone text, - id_user bigint, - id_company integer, - job text -); - - -ALTER TABLE public.zzold_members OWNER TO potlu_user; - --- --- Name: members_id_seq; Type: SEQUENCE; Schema: public; Owner: potlu_user --- - -CREATE SEQUENCE public.members_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - -ALTER TABLE public.members_id_seq OWNER TO potlu_user; - --- --- Name: members_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: potlu_user --- - -ALTER SEQUENCE public.members_id_seq OWNED BY public.zzold_members.id; - - -- -- Name: sessions; Type: TABLE; Schema: public; Owner: potlu_user -- @@ -523,41 +556,6 @@ ALTER TABLE public.usergroups_id_seq OWNER TO potlu_user; ALTER SEQUENCE public.usergroups_id_seq OWNED BY public.usergroups.id; --- --- Name: zzold_useringroups; Type: TABLE; Schema: public; Owner: potlu_user --- - -CREATE TABLE public.zzold_useringroups ( - id integer NOT NULL, - id_user bigint, - id_group bigint -); - - -ALTER TABLE public.zzold_useringroups OWNER TO potlu_user; - --- --- Name: useringroups_id_seq; Type: SEQUENCE; Schema: public; Owner: potlu_user --- - -CREATE SEQUENCE public.useringroups_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - -ALTER TABLE public.useringroups_id_seq OWNER TO potlu_user; - --- --- Name: useringroups_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: potlu_user --- - -ALTER SEQUENCE public.useringroups_id_seq OWNED BY public.zzold_useringroups.id; - - -- -- Name: users; Type: TABLE; Schema: public; Owner: potlu_user -- @@ -576,7 +574,8 @@ CREATE TABLE public.users ( prename text, phone text, job text, - id_company integer + id_company integer, + id_usergroup integer ); @@ -623,7 +622,10 @@ CREATE VIEW public.vw_companiesdata AS companies.schemata2, companies.email, companies.socialtype, - companies.vatvalidated + companies.vatvalidated, + companies.reportperiodlength, + companies.reportperiodstart, + companies.reportperiodunit FROM public.companies; @@ -648,7 +650,10 @@ CREATE VIEW public.vw_companieslist AS companies.schemata2, companies.email, companies.socialtype, - companies.vatvalidated + companies.vatvalidated, + companies.reportperiodlength, + companies.reportperiodstart, + companies.reportperiodunit FROM public.companies; @@ -659,9 +664,11 @@ ALTER TABLE public.vw_companieslist OWNER TO potlu_user; -- CREATE VIEW public.vw_schemata AS - SELECT schemata.schema_name AS schemaname - FROM information_schema.schemata - WHERE ((schemata.schema_owner)::text = 'potlu_user'::text); + SELECT sct.schema_name AS schemaname, + cp.company + FROM (information_schema.schemata sct + JOIN public.companies cp ON (((sct.schema_name)::text = cp.schemata))) + WHERE (((sct.schema_owner)::text = 'potlu_user'::text) AND ((sct.schema_name)::text <> 'public'::text)); ALTER TABLE public.vw_schemata OWNER TO potlu_user; @@ -680,6 +687,18 @@ CREATE VIEW public.vw_usergroupslist AS ALTER TABLE public.vw_usergroupslist OWNER TO potlu_user; +-- +-- Name: vw_userschemaaccess; Type: VIEW; Schema: public; Owner: potlu_user +-- + +CREATE VIEW public.vw_userschemaaccess AS + SELECT users.id, + json_array_elements_text(users.schemaaccess) AS schemaaccess + FROM public.users; + + +ALTER TABLE public.vw_userschemaaccess OWNER TO potlu_user; + -- -- Name: vw_usersdata; Type: VIEW; Schema: public; Owner: potlu_user -- @@ -693,7 +712,7 @@ CREATE VIEW public.vw_usersdata AS users.regcode, users.vcode, users.schemaaccess, - users.id_usergroups, + users.id_usergroup, users.surname, users.prename, users.phone, @@ -720,7 +739,8 @@ SELECT NULL::text AS job, NULL::integer AS id_company, NULL::text AS company, - NULL::text AS usergroups; + NULL::text AS groupname, + NULL::integer AS id_usergroup; ALTER TABLE public.vw_userslist OWNER TO potlu_user; @@ -774,33 +794,19 @@ ALTER TABLE ONLY public.usergroups ALTER COLUMN id SET DEFAULT nextval('public.u ALTER TABLE ONLY public.users ALTER COLUMN id SET DEFAULT nextval('public.users_id_seq'::regclass); --- --- Name: zzold_members id; Type: DEFAULT; Schema: public; Owner: potlu_user --- - -ALTER TABLE ONLY public.zzold_members ALTER COLUMN id SET DEFAULT nextval('public.members_id_seq'::regclass); - - --- --- Name: zzold_useringroups id; Type: DEFAULT; Schema: public; Owner: potlu_user --- - -ALTER TABLE ONLY public.zzold_useringroups ALTER COLUMN id SET DEFAULT nextval('public.useringroups_id_seq'::regclass); - - -- -- Data for Name: apps; Type: TABLE DATA; Schema: public; Owner: potlu_user -- -COPY public.apps (id, app, description, name, id_usergroup, icon, sort, menutype) FROM stdin; -8 timetrackers Pointeuses Pointeuses \N cube.svg 7 schema -10 sites Sites Sites \N cube.svg 6 schema -4 profile Profil mes coordonnées 5 user.svg 9 global -5 users Utilisateurs utilisateurs 2 group.svg 11 global -7 staff Employé(e)s employé(e)s 3 group.svg 4 schema -9 planning Planning POT 3 poticon.svg 5 schema -6 companies Entreprise entreprise 2 cube.svg 10 global -11 workplans Plans de travail plans (modèles) 3 calendar.svg 8 schema +COPY public.apps (id, app, description, name, id_usergroup, icon, sort, menutype, id_usergroups) FROM stdin; +10 sites Sites Sites \N cube.svg 6 schema \N +8 timetrackers Pointeuses Pointeuses \N cube.svg 7 schema \N +5 users Utilisateurs utilisateurs 2 group.svg 11 global ["2","3","4","5"] +6 companies Entreprise entreprise 2 cube.svg 10 global ["2","3"] +7 staff Salairiés Salariés 3 group.svg 4 schema ["2","3"] +11 workplans Plans de travail POT (modèles) 3 calendar.svg 8 schema ["2","3","4"] +4 profile Profil Profil 5 user.svg 9 global ["2","3","4","5"] +9 periods Planning Période(s) de référence 3 poticon.svg 5 schema ["2","3","4"] \. @@ -808,8 +814,10 @@ COPY public.apps (id, app, description, name, id_usergroup, icon, sort, menutype -- Data for Name: companies; Type: TABLE DATA; Schema: public; Owner: potlu_user -- -COPY public.companies (id, company, address, zip, city, country, tradetype, comregister, vatnumber, schemata, validated, schemata2, email, socialtype, vatvalidated) FROM stdin; -1 DKS 8b, rue du Moulin 6914 Roodt-sur-Syre Luxemburg \N \N \N portanova \N \N support@dks.lu s.à r.l. \N +COPY public.companies (id, company, address, zip, city, country, tradetype, comregister, vatnumber, schemata, validated, schemata2, email, socialtype, vatvalidated, reportperiodunit, reportperiodlength, reportperiodstart) FROM stdin; +25 test 4, rue Principale 3770 Tétange Luxemburg \N \N \N test \N \N kilian@saffran.lu s.à r.l. \N \N \N \N +26 TEST2 8b, rue du Moulin 6914 Roodt-sur-Syre Luxemburg \N \N \N test2 \N \N support@dks.lu \N \N \N \N \N +1 Portanova rue de la faïencerie \N Luxembourg Luxemburg \N \N \N portanova \N \N support@dks.lu s.à r.l. \N week 8 2019-12-30 \. @@ -842,17 +850,32 @@ COPY public.mailtemplates (id, templatename, emailtext, emaildatasql, mailfrom, -- COPY public.sessions (id, idsession, id_user, user_agent, remote_addr, created) FROM stdin; +228 yQVWb3gmfQZbXhdgiexW1O2suUpzBlL02xM3qTgw 1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36 2001:7e8:cc73:de00:a812:ebc7:72cb:2146 2020-01-09 06:41:48.639525 +229 OE2TqV8VRjYZmkSXr7qjQW4TVR8zvjJ9OCT4nRP5 1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 ::1 2020-01-09 10:37:54.604655 111 uWpnqxhEFJt2MZxMoLSz4ZAZoc3ZJnu3aKhq8oVD 1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 2001:7e8:cc73:de00:213c:73ba:ffa7:842b 2019-12-05 19:16:43.969105 112 mUmGFzD4kPLyhHfJO9TDOGfCtsVAEefRYrotRRo1 1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 2001:7e8:cc73:de00:7946:65e2:f587:8b74 2019-12-06 07:02:23.094765 113 HaDg0Eh9nIk7lftrHDtQpaKiLWL66VoEWRKMmSLz 1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 ::1 2019-12-09 11:33:13.202044 114 aSli1lR9B0ETjICf7IFjVxhphLd8dhRdZ2mRd4RE 1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362 ::1 2019-12-10 15:55:53.526432 +175 NjxbJc50MGk8kV9dH2G33mhWV5e4PTns3KuCMptp 1 Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Mobile Safari/537.36 ::1 2020-01-02 09:36:12.19675 +176 d62Z9Se8i1QM2Zhx6JZz8TWz9eXvIlXMiPBhyGgG 1 Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1 ::1 2020-01-02 09:36:47.868479 +232 EPjQ6DLhLgmxsW0euSnHhxOmC2iMrKlWpvCmYetA 1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36 192.168.178.23 2020-01-10 08:38:40.58899 +178 yC6li3gqsuF9nPacybvBUPwzz3SoIyx71ui9nppF 1 Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 ::1 2020-01-02 09:49:11.956938 122 Sp2D9CvtdjQHaxLPkEXgqSMSveIJwQde56I5y3oC 1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 2001:7e8:cc73:de00:d970:312a:d5d:db83 2019-12-12 07:06:51.913155 124 NUTU0TkWd81oxH4ig52WCA3HzccA3bmHW5sMPCyT 1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36 ::1 2019-12-15 11:44:06.485589 +198 dC237zuzY7HYOGvbFem5LeVuQ3XFRxSU0LOXa8nZ 1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36 2001:7e8:cc73:de00:24c6:9f1e:3054:64dd 2020-01-08 08:36:54.781554 93 5P7159lXg8xY83Iu7eZC3hj3Oi6x29jXOhPKg0yn 1 Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36 ::1 2019-12-04 14:58:48.993651 +258 s7C63JpbiZV34B1obie1a6JUnUaSJXl1VNYPndQv 1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36 ::1 2020-01-16 09:02:49.520835 98 9UisAitYaoxdqtBaWUI37R04CiBlFxcp0STuCOZRU 1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 ::1 2019-12-05 07:34:07.997426 99 v6wZ65qozoWn5P32q4wg16224TcOAM1VJnLFj1UJ 1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 192.168.178.23 2019-12-05 07:35:01.756219 160 pMEnznbOdbCeLbtKUwxgVbn2PNVzrF0HhvVHIWmL 1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36 ::1 2019-12-20 12:48:16.464228 -161 fvhUhEhy8bRQnrZd1I0oVdAwntMj86Xdr5Yzz6Yy 1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 ::1 2019-12-22 09:58:14.675553 +162 RRiSGkElRtLTCs3lkdYpQNZDnxKJ2wOJdXrJ7WVO 1 192.168.178.23 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 2019-12-24 10:59:50.644045 +163 BlvRAYUeX78wr2OhPvWU5TrsNAmsooAQzWy0Ki4x 1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 2001:7e8:cc73:de00:f4f8:d2a7:1c8:2664 2019-12-24 11:00:44.808971 +279 U9ksV3dLzsxjylgOx5WK5lPitIiU8nrSmBb8veJU 1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 Edg/79.0.309.71 ::1 2020-02-04 08:32:56.845626 +281 zdaOUZfTtPkLpOQYYPGqzViSKLTgtMWTPXxAMCj6 1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 ::1 2020-02-05 10:18:52.389333 +283 qCTq7PB9Ml539u6mdEoTGensJglVwc8MER3CxvC9 1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 ::1 2020-02-10 09:03:25.356532 +286 WeNOQHFuxR7KfY1DAK8nkMgCAc7JQ6EDaihRQNcd 1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36 ::1 2020-02-14 18:56:34.030027 +299 UgTmbOQeAFpuAAPqP7CGP22KXtsWMglxn4JoIqt9 1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36 ::1 2020-02-24 11:53:27.013773 +301 0947l9NXchB8bZJx7UKHuBpazWGacjx2is0trEgu 1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36 ::1 2020-02-26 11:26:44.355966 \. @@ -863,9 +886,9 @@ COPY public.sessions (id, idsession, id_user, user_agent, remote_addr, created) COPY public.usergroups (id, usergroup, isdefault, groupname) FROM stdin; 1 superadmin \N SuperAdmin 2 admin \N Admin -4 site \N Site 5 user t Utilisateur 3 manager \N Gérant +4 teamleader \N Responsable \. @@ -873,27 +896,10 @@ COPY public.usergroups (id, usergroup, isdefault, groupname) FROM stdin; -- Data for Name: users; Type: TABLE DATA; Schema: public; Owner: potlu_user -- -COPY public.users (id, userpassword, created, blocked, username, regcode, vcode, schemaaccess, id_usergroups, surname, prename, phone, job, id_company) FROM stdin; -2 f7252754a4cb7391d966316351b3501bce81fee9bc0b71807ddf61281a27821e 2019-12-20 11:03:08.757357 \N kilian@saffran.lu \N \N ["portanova"] ["5"] Saffran Kilian 691504574 \N 1 -1 228c27a646f18ce069bc2b8ef091a03c46cd51557e5b5ac90abc05c4f635b3ba 2019-10-10 17:12:11.934747 \N kilian.saffran@gmail.com \N 6tgfkew ["portanova"] ["2","5","3"] Saffran Kilian +352691504574 Gérant 1 -\. - - --- --- Data for Name: zzold_members; Type: TABLE DATA; Schema: public; Owner: potlu_user --- - -COPY public.zzold_members (id, surname, prename, phone, id_user, id_company, job) FROM stdin; -1 Saffran Kilian \N 1 1 \N -\. - - --- --- Data for Name: zzold_useringroups; Type: TABLE DATA; Schema: public; Owner: potlu_user --- - -COPY public.zzold_useringroups (id, id_user, id_group) FROM stdin; -1 1 1 +COPY public.users (id, userpassword, created, blocked, username, regcode, vcode, schemaaccess, id_usergroups, surname, prename, phone, job, id_company, id_usergroup) FROM stdin; +1 0ecf731e2426a8a469f06e9f4a3bcbed6f8071d9d3e3ef7ef5fd9165021e27ec 2019-10-10 17:12:11.934747 \N kilian.saffran@gmail.com \N 6tgfkew ["test","portanova"] ["2","5","3","4"] Saffran Kilian +352691504574 Gérant 1 2 +2 f7252754a4cb7391d966316351b3501bce81fee9bc0b71807ddf61281a27821e 2019-12-20 11:03:08.757357 \N kilian@saffran.lu \N \N ["portanova"] ["5"] Saffran Kilian 691504574 \N 1 5 +4 ad3d14273d47ed24f6d62e3f8c64032e946d9e9d5965364a81e15d12a69cf2ce 2019-12-29 16:53:19.68549 \N ksaffran@dks.lu \N \N ["portanova"] ["3","5"] Saffran Kilian \N \N 1 3 \. @@ -908,7 +914,7 @@ SELECT pg_catalog.setval('public.apps_id_seq', 11, true); -- Name: companies_id_seq; Type: SEQUENCE SET; Schema: public; Owner: potlu_user -- -SELECT pg_catalog.setval('public.companies_id_seq', 24, true); +SELECT pg_catalog.setval('public.companies_id_seq', 26, true); -- @@ -925,18 +931,11 @@ SELECT pg_catalog.setval('public.maillayouts_id_seq', 1, true); SELECT pg_catalog.setval('public.mailtemplates_id_seq', 7, true); --- --- Name: members_id_seq; Type: SEQUENCE SET; Schema: public; Owner: potlu_user --- - -SELECT pg_catalog.setval('public.members_id_seq', 1, false); - - -- -- Name: sessions_id_seq; Type: SEQUENCE SET; Schema: public; Owner: potlu_user -- -SELECT pg_catalog.setval('public.sessions_id_seq', 161, true); +SELECT pg_catalog.setval('public.sessions_id_seq', 301, true); -- @@ -946,18 +945,11 @@ SELECT pg_catalog.setval('public.sessions_id_seq', 161, true); SELECT pg_catalog.setval('public.usergroups_id_seq', 4, true); --- --- Name: useringroups_id_seq; Type: SEQUENCE SET; Schema: public; Owner: potlu_user --- - -SELECT pg_catalog.setval('public.useringroups_id_seq', 1, true); - - -- -- Name: users_id_seq; Type: SEQUENCE SET; Schema: public; Owner: potlu_user -- -SELECT pg_catalog.setval('public.users_id_seq', 2, true); +SELECT pg_catalog.setval('public.users_id_seq', 4, true); -- @@ -992,14 +984,6 @@ ALTER TABLE ONLY public.mailtemplates ADD CONSTRAINT mailtemplates_pkey PRIMARY KEY (id); --- --- Name: zzold_members members_pkey; Type: CONSTRAINT; Schema: public; Owner: potlu_user --- - -ALTER TABLE ONLY public.zzold_members - ADD CONSTRAINT members_pkey PRIMARY KEY (id); - - -- -- Name: users uniq_username; Type: CONSTRAINT; Schema: public; Owner: potlu_user -- @@ -1016,14 +1000,6 @@ ALTER TABLE ONLY public.usergroups ADD CONSTRAINT usergroups_pkey PRIMARY KEY (id); --- --- Name: zzold_useringroups useringroups_pkey; Type: CONSTRAINT; Schema: public; Owner: potlu_user --- - -ALTER TABLE ONLY public.zzold_useringroups - ADD CONSTRAINT useringroups_pkey PRIMARY KEY (id); - - -- -- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: potlu_user -- @@ -1048,21 +1024,22 @@ CREATE OR REPLACE VIEW public.vw_userslist AS SELECT us.id, us.blocked, us.username, - json_array_elements_text(us.schemaaccess) AS schemaaccess, + string_agg(DISTINCT uga.schemaccess, ','::text) AS schemaaccess, us.surname, us.prename, us.phone, us.job, us.id_company, co.company, - string_agg(ugrp.groupname, ','::text) AS usergroups + ugrp.groupname, + us.id_usergroup FROM (((public.users us LEFT JOIN public.companies co ON ((us.id_company = co.id))) LEFT JOIN ( SELECT users.id AS id_user, - (json_array_elements_text(users.id_usergroups))::integer AS id_usergroup - FROM public.users) ugs ON ((ugs.id_user = us.id))) - LEFT JOIN public.usergroups ugrp ON ((ugrp.id = ugs.id_usergroup))) - GROUP BY us.id, co.id; + json_array_elements_text(users.schemaaccess) AS schemaccess + FROM public.users) uga ON ((uga.id_user = us.id))) + LEFT JOIN public.usergroups ugrp ON ((ugrp.id = us.id_usergroup))) + GROUP BY us.id, co.id, ugrp.id; -- @@ -1082,27 +1059,19 @@ ALTER TABLE ONLY public.mailtemplates -- --- Name: zzold_members members_users_fkey; Type: FK CONSTRAINT; Schema: public; Owner: potlu_user +-- Name: users users_fk; Type: FK CONSTRAINT; Schema: public; Owner: potlu_user -- -ALTER TABLE ONLY public.zzold_members - ADD CONSTRAINT members_users_fkey FOREIGN KEY (id_user) REFERENCES public.users(id); - - --- --- Name: zzold_useringroups useringroups_idgroup_fkey; Type: FK CONSTRAINT; Schema: public; Owner: potlu_user --- - -ALTER TABLE ONLY public.zzold_useringroups - ADD CONSTRAINT useringroups_idgroup_fkey FOREIGN KEY (id_group) REFERENCES public.usergroups(id); +ALTER TABLE ONLY public.users + ADD CONSTRAINT users_fk FOREIGN KEY (id_company) REFERENCES public.companies(id); -- --- Name: zzold_useringroups useringroups_iduser_fkey; Type: FK CONSTRAINT; Schema: public; Owner: potlu_user +-- Name: users users_fk_1; Type: FK CONSTRAINT; Schema: public; Owner: potlu_user -- -ALTER TABLE ONLY public.zzold_useringroups - ADD CONSTRAINT useringroups_iduser_fkey FOREIGN KEY (id_user) REFERENCES public.users(id); +ALTER TABLE ONLY public.users + ADD CONSTRAINT users_fk_1 FOREIGN KEY (id_usergroup) REFERENCES public.usergroups(id); -- diff --git a/dev/db/potlu_db.public.pg.schema.sql b/dev/db/potlu_db.public.pg.schema.sql index d36ecb5d..ca32120b 100644 --- a/dev/db/potlu_db.public.pg.schema.sql +++ b/dev/db/potlu_db.public.pg.schema.sql @@ -99,17 +99,16 @@ $$; -- Name: getsession(text, text, text); Type: FUNCTION; Schema: public; Owner: - -- -CREATE FUNCTION public.getsession(vidsession text, vremoteaddr text, vuseragent text) RETURNS TABLE(idsession text, id integer, username text, usergroups text, userschemata text) +CREATE FUNCTION public.getsession(vidsession text, vremoteaddr text, vuseragent text) RETURNS TABLE(idsession text, id integer, username text, usergroup text) LANGUAGE plpgsql - AS $$ - BEGIN - return QUERY select se.idsession,us.id,us.username,string_agg(distinct(ugrp.usergroup),',') as usergroups,json_array_elements_text(us.schemaaccess) as userschemata from sessions se + AS $$ + BEGIN + return QUERY select se.idsession,us.id,us.username,ugrp.usergroup from sessions se join users us on (us.id=se.id_user) -left join (SELECT users.id,json_array_elements_text(users.id_usergroups) AS id_usergroup FROM users) ugs on (us.id=ugs.id) -left join usergroups ugrp on (ugrp.id=ugs.id) +left join usergroups ugrp on (ugrp.id=us.id_usergroup) where se.idsession= vidsession and se.remote_addr= vremoteaddr and se.user_agent= vuseragent and -us.blocked is null group by se.id,us.id; - END; +us.blocked is null group by se.id,us.id,ugrp.id; + END; $$; @@ -143,6 +142,23 @@ CREATE FUNCTION public.getweeks(vyear integer) RETURNS TABLE(cw integer, mondays $$; +-- +-- Name: getweeksbydaterange(date, date); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.getweeksbydaterange(datefrom date, dateto date) RETURNS TABLE(calyear integer, calweek integer, weekstart date, weekend date) + LANGUAGE plpgsql + AS $$ + BEGIN + return QUERY select date_part('isoyear',daydate)::int as calyear,date_part('week',daydate)::int4 as calweek,date(date_trunc('week',daydate)) as weekstart , date(date_trunc('week',daydate) + interval '6 days') as weekend +from +(select datefrom + s*'1 day'::interval as daydate from +(select * from generate_series(0,dateto - datefrom )s)x ) d group by calyear,calweek,weekstart,weekend order by weekstart,weekend; + + END; +$$; + + -- -- Name: random_string(integer); Type: FUNCTION; Schema: public; Owner: - -- @@ -160,6 +176,29 @@ end; $$; +-- +-- Name: staffworplan_contracthours(text, integer); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.staffworplan_contracthours(vschemaname text, vcontractid integer) RETURNS void + LANGUAGE plpgsql + AS $$ +declare + cur_contracthours TEXT; + cur_startdate date; + cur_enddate date; + cur_id_staff int4; + BEGIN + execute 'select startdate,enddate,id_staff,to_char(to_timestamp((round(weekhours/weekdays,3)) * 60), ''MI:SS:00'') from ' || vschemaname || '.staffcontract where id=' || vcontractid || ';' into cur_startdate,cur_enddate,cur_id_staff,cur_contracthours; + if cur_enddate is null then + execute 'update ' || vschemaname || '.staffworkplan SET contracthours='''|| cur_contracthours || ''' WHERE id_staff=' || cur_id_staff || ' and daydate>=date(''' || to_char(cur_startdate,'YYYY-MM-DD') || ''');'; + else + execute 'update ' || vschemaname || '.staffworkplan SET contracthours='''|| cur_contracthours || ''' WHERE id_staff=' || cur_id_staff || ' and daydate between date(''' || to_char(cur_startdate,'YYYY-MM-DD') || ''') and date(''' || to_char(cur_enddate,'YYYY-MM-DD') || ''');'; + end if; + END; +$$; + + -- -- Name: trg_update_basemonthhours(); Type: FUNCTION; Schema: public; Owner: - -- @@ -220,6 +259,29 @@ CREATE FUNCTION public.trg_update_monthlyhours() RETURNS trigger $$; +-- +-- Name: weekvacancy(text, double precision, integer); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.weekvacancy(vschema text, vcalweek double precision, vidstaff integer) RETURNS text + LANGUAGE plpgsql + AS $$ + declare + vret text; + xsql text; + begin + xsql := 'select ''{"vacancy":{'' || string_agg(''"'' || id_vacancytype || ''":'' || row_to_json(weekvacancy),'','') || ''}}'' from ( +select vk.id_vacancytype,sum(vk.vacancyhours) as vacancyhours,vt.vacancyname,vt.color,vt.isworktime from portanova.staffworkplan vk + +join ' || vschema || '.vacancytypes vt on (vt.id=vk.id_vacancytype) +where date_part(''week'', daydate)= ' || vcalweek || ' and id_staff= ' || vidstaff || ' group by vk.id_vacancytype,vt.vacancyname,vt.color,vt.isworktime) weekvacancy;'; + --raise notice '%s',xsql; + execute xsql into vret; +return vret; +END; +$$; + + SET default_tablespace = ''; SET default_with_oids = false; @@ -236,7 +298,8 @@ CREATE TABLE public.apps ( id_usergroup integer, icon text, sort integer, - menutype text + menutype text, + id_usergroups json ); @@ -279,7 +342,10 @@ CREATE TABLE public.companies ( schemata2 json, email text, socialtype text, - vatvalidated boolean + vatvalidated boolean, + reportperiodunit text, + reportperiodlength integer, + reportperiodstart date ); @@ -369,41 +435,6 @@ CREATE SEQUENCE public.mailtemplates_id_seq ALTER SEQUENCE public.mailtemplates_id_seq OWNED BY public.mailtemplates.id; --- --- Name: zzold_members; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.zzold_members ( - id integer NOT NULL, - surname text, - prename text, - phone text, - id_user bigint, - id_company integer, - job text -); - - --- --- Name: members_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.members_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: members_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.members_id_seq OWNED BY public.zzold_members.id; - - -- -- Name: sessions; Type: TABLE; Schema: public; Owner: - -- @@ -469,37 +500,6 @@ CREATE SEQUENCE public.usergroups_id_seq ALTER SEQUENCE public.usergroups_id_seq OWNED BY public.usergroups.id; --- --- Name: zzold_useringroups; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE public.zzold_useringroups ( - id integer NOT NULL, - id_user bigint, - id_group bigint -); - - --- --- Name: useringroups_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.useringroups_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: useringroups_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.useringroups_id_seq OWNED BY public.zzold_useringroups.id; - - -- -- Name: users; Type: TABLE; Schema: public; Owner: - -- @@ -518,7 +518,8 @@ CREATE TABLE public.users ( prename text, phone text, job text, - id_company integer + id_company integer, + id_usergroup integer ); @@ -561,7 +562,10 @@ CREATE VIEW public.vw_companiesdata AS companies.schemata2, companies.email, companies.socialtype, - companies.vatvalidated + companies.vatvalidated, + companies.reportperiodlength, + companies.reportperiodstart, + companies.reportperiodunit FROM public.companies; @@ -584,7 +588,10 @@ CREATE VIEW public.vw_companieslist AS companies.schemata2, companies.email, companies.socialtype, - companies.vatvalidated + companies.vatvalidated, + companies.reportperiodlength, + companies.reportperiodstart, + companies.reportperiodunit FROM public.companies; @@ -593,9 +600,11 @@ CREATE VIEW public.vw_companieslist AS -- CREATE VIEW public.vw_schemata AS - SELECT schemata.schema_name AS schemaname - FROM information_schema.schemata - WHERE ((schemata.schema_owner)::text = 'potlu_user'::text); + SELECT sct.schema_name AS schemaname, + cp.company + FROM (information_schema.schemata sct + JOIN public.companies cp ON (((sct.schema_name)::text = cp.schemata))) + WHERE (((sct.schema_owner)::text = 'potlu_user'::text) AND ((sct.schema_name)::text <> 'public'::text)); -- @@ -610,6 +619,16 @@ CREATE VIEW public.vw_usergroupslist AS FROM public.usergroups; +-- +-- Name: vw_userschemaaccess; Type: VIEW; Schema: public; Owner: - +-- + +CREATE VIEW public.vw_userschemaaccess AS + SELECT users.id, + json_array_elements_text(users.schemaaccess) AS schemaaccess + FROM public.users; + + -- -- Name: vw_usersdata; Type: VIEW; Schema: public; Owner: - -- @@ -623,7 +642,7 @@ CREATE VIEW public.vw_usersdata AS users.regcode, users.vcode, users.schemaaccess, - users.id_usergroups, + users.id_usergroup, users.surname, users.prename, users.phone, @@ -648,7 +667,8 @@ SELECT NULL::text AS job, NULL::integer AS id_company, NULL::text AS company, - NULL::text AS usergroups; + NULL::text AS groupname, + NULL::integer AS id_usergroup; -- @@ -700,20 +720,6 @@ ALTER TABLE ONLY public.usergroups ALTER COLUMN id SET DEFAULT nextval('public.u ALTER TABLE ONLY public.users ALTER COLUMN id SET DEFAULT nextval('public.users_id_seq'::regclass); --- --- Name: zzold_members id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.zzold_members ALTER COLUMN id SET DEFAULT nextval('public.members_id_seq'::regclass); - - --- --- Name: zzold_useringroups id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.zzold_useringroups ALTER COLUMN id SET DEFAULT nextval('public.useringroups_id_seq'::regclass); - - -- -- Name: apps apps_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -746,14 +752,6 @@ ALTER TABLE ONLY public.mailtemplates ADD CONSTRAINT mailtemplates_pkey PRIMARY KEY (id); --- --- Name: zzold_members members_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.zzold_members - ADD CONSTRAINT members_pkey PRIMARY KEY (id); - - -- -- Name: users uniq_username; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -770,14 +768,6 @@ ALTER TABLE ONLY public.usergroups ADD CONSTRAINT usergroups_pkey PRIMARY KEY (id); --- --- Name: zzold_useringroups useringroups_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.zzold_useringroups - ADD CONSTRAINT useringroups_pkey PRIMARY KEY (id); - - -- -- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -802,21 +792,22 @@ CREATE OR REPLACE VIEW public.vw_userslist AS SELECT us.id, us.blocked, us.username, - json_array_elements_text(us.schemaaccess) AS schemaaccess, + string_agg(DISTINCT uga.schemaccess, ','::text) AS schemaaccess, us.surname, us.prename, us.phone, us.job, us.id_company, co.company, - string_agg(ugrp.groupname, ','::text) AS usergroups + ugrp.groupname, + us.id_usergroup FROM (((public.users us LEFT JOIN public.companies co ON ((us.id_company = co.id))) LEFT JOIN ( SELECT users.id AS id_user, - (json_array_elements_text(users.id_usergroups))::integer AS id_usergroup - FROM public.users) ugs ON ((ugs.id_user = us.id))) - LEFT JOIN public.usergroups ugrp ON ((ugrp.id = ugs.id_usergroup))) - GROUP BY us.id, co.id; + json_array_elements_text(users.schemaaccess) AS schemaccess + FROM public.users) uga ON ((uga.id_user = us.id))) + LEFT JOIN public.usergroups ugrp ON ((ugrp.id = us.id_usergroup))) + GROUP BY us.id, co.id, ugrp.id; -- @@ -836,27 +827,19 @@ ALTER TABLE ONLY public.mailtemplates -- --- Name: zzold_members members_users_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- Name: users users_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- -ALTER TABLE ONLY public.zzold_members - ADD CONSTRAINT members_users_fkey FOREIGN KEY (id_user) REFERENCES public.users(id); - - --- --- Name: zzold_useringroups useringroups_idgroup_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.zzold_useringroups - ADD CONSTRAINT useringroups_idgroup_fkey FOREIGN KEY (id_group) REFERENCES public.usergroups(id); +ALTER TABLE ONLY public.users + ADD CONSTRAINT users_fk FOREIGN KEY (id_company) REFERENCES public.companies(id); -- --- Name: zzold_useringroups useringroups_iduser_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- Name: users users_fk_1; Type: FK CONSTRAINT; Schema: public; Owner: - -- -ALTER TABLE ONLY public.zzold_useringroups - ADD CONSTRAINT useringroups_iduser_fkey FOREIGN KEY (id_user) REFERENCES public.users(id); +ALTER TABLE ONLY public.users + ADD CONSTRAINT users_fk_1 FOREIGN KEY (id_usergroup) REFERENCES public.usergroups(id); -- diff --git a/dev/db/potlu_db.public.tables.live.txt b/dev/db/potlu_db.public.tables.live.txt deleted file mode 100644 index c9844f6f..00000000 --- a/dev/db/potlu_db.public.tables.live.txt +++ /dev/null @@ -1,15 +0,0 @@ - -public|apps|BASETABLE -public|companies|BASETABLE -public|maillayouts|BASETABLE -public|mailtemplates|BASETABLE -public|members|BASETABLE -public|sessions|BASETABLE -public|usergroups|BASETABLE -public|useringroups|BASETABLE -public|users|BASETABLE -public|vw_companiesdata|VIEW -public|vw_companieslist|VIEW -public|vw_memberdata|VIEW -public|vw_userdata|VIEW -public|vw_userlist|VIEW diff --git a/dev/db/potlu_db.public.tables.local.txt b/dev/db/potlu_db.public.tables.local.txt deleted file mode 100644 index 3182c7e7..00000000 --- a/dev/db/potlu_db.public.tables.local.txt +++ /dev/null @@ -1,14 +0,0 @@ - -public|apps|BASETABLE -public|companies|BASETABLE -public|maillayouts|BASETABLE -public|mailtemplates|BASETABLE -public|sessions|BASETABLE -public|usergroups|BASETABLE -public|users|BASETABLE -public|vw_companiesdata|VIEW -public|vw_companieslist|VIEW -public|vw_schemata|VIEW -public|vw_usergroupslist|VIEW -public|vw_usersdata|VIEW -public|vw_userslist|VIEW diff --git a/dev/db/potlu_db.refschema.columns.local.txt b/dev/db/potlu_db.refschema.columns.local.txt deleted file mode 100644 index 4be0aaac..00000000 --- a/dev/db/potlu_db.refschema.columns.local.txt +++ /dev/null @@ -1,356 +0,0 @@ - -reportperiod|BASETABLE|enddate|date -reportperiod|BASETABLE|id|integer -reportperiod|BASETABLE|periodname|text -reportperiod|BASETABLE|startdate|date -sites|BASETABLE|address|text -sites|BASETABLE|city|text -sites|BASETABLE|country|text -sites|BASETABLE|created|timestampwithouttimezone -sites|BASETABLE|id|integer -sites|BASETABLE|id_timetracker|integer -sites|BASETABLE|modified|timestampwithouttimezone -sites|BASETABLE|sitename|text -sites|BASETABLE|timeclockhost|text -sites|BASETABLE|zip|text -staff|BASETABLE|birthdate|date -staff|BASETABLE|entrydate|date -staff|BASETABLE|id|integer -staff|BASETABLE|job|text -staff|BASETABLE|leavedate|date -staff|BASETABLE|prename|text -staff|BASETABLE|staffnumber|text -staff|BASETABLE|surname|text -staffcontract|BASETABLE|id|integer -staffcontract|BASETABLE|id_staffgroup|integer -staffcontract|BASETABLE|id_staff|integer -staffcontract|BASETABLE|monthhours|numeric -staffcontract|BASETABLE|startdate|date -staffcontract|BASETABLE|weekhours|numeric -staffgroups|BASETABLE|groupcolor|text -staffgroups|BASETABLE|groupname|text -staffgroups|BASETABLE|id|integer -stafftimetracks|BASETABLE|created|timestampwithouttimezone -stafftimetracks|BASETABLE|id|bigint -stafftimetracks|BASETABLE|id_staff|integer -stafftimetracks|BASETABLE|modified|timestampwithouttimezone -stafftimetracks|BASETABLE|stamp_in|timestampwithouttimezone -stafftimetracks|BASETABLE|stamp_out|timestampwithouttimezone -stafftimetracks|BASETABLE|tracktype|text -staffvacancy|BASETABLE|dayhours|timewithouttimezone -staffvacancy|BASETABLE|enddate|date -staffvacancy|BASETABLE|id|integer -staffvacancy|BASETABLE|id_staff|integer -staffvacancy|BASETABLE|note|text -staffvacancy|BASETABLE|startdate|date -staffvacancy|BASETABLE|vacancytype|text -staffvacancy|BASETABLE|validated|boolean -staffvacancyyear|BASETABLE|days|numeric -staffvacancyyear|BASETABLE|hours|numeric -staffvacancyyear|BASETABLE|id|integer -staffvacancyyear|BASETABLE|id_staff|integer -staffvacancyyear|BASETABLE|vyear|integer -staffworkplan|BASETABLE|daydate|date -staffworkplan|BASETABLE|id|bigint -staffworkplan|BASETABLE|id_staff|integer -staffworkplan|BASETABLE|timeend1|timewithouttimezone -staffworkplan|BASETABLE|timeend2|timewithouttimezone -staffworkplan|BASETABLE|timepause|timewithouttimezone -staffworkplan|BASETABLE|timestart1|timewithouttimezone -staffworkplan|BASETABLE|timestart2|timewithouttimezone -staffworkplan|BASETABLE|vacancyhours|timewithouttimezone -staffworkplan|BASETABLE|vacancytype|text -vw_reportperiodlist|VIEW|enddate|date -vw_reportperiodlist|VIEW|id|integer -vw_reportperiodlist|VIEW|periodname|text -vw_reportperiodlist|VIEW|startdate|date -vw_staffcontractdata|VIEW|id|integer -vw_staffcontractdata|VIEW|id_staffgroup|integer -vw_staffcontractdata|VIEW|id_staff|integer -vw_staffcontractdata|VIEW|monthhours|numeric -vw_staffcontractdata|VIEW|startdate|date -vw_staffcontractdata|VIEW|weekhours|numeric -vw_staffcontractlist|VIEW|groupcolor|text -vw_staffcontractlist|VIEW|groupname|text -vw_staffcontractlist|VIEW|id|integer -vw_staffcontractlist|VIEW|id_staffgroup|integer -vw_staffcontractlist|VIEW|id_staff|integer -vw_staffcontractlist|VIEW|monthhours|numeric -vw_staffcontractlist|VIEW|startdate|date -vw_staffcontractlist|VIEW|weekhours|numeric -vw_staffdata|VIEW|birthdate|date -vw_staffdata|VIEW|entrydate|date -vw_staffdata|VIEW|id|integer -vw_staffdata|VIEW|job|text -vw_staffdata|VIEW|leavedate|date -vw_staffdata|VIEW|prename|text -vw_staffdata|VIEW|staffnumber|text -vw_staffdata|VIEW|surname|text -vw_staffgroupsdata|VIEW|groupcolor|text -vw_staffgroupsdata|VIEW|groupname|text -vw_staffgroupsdata|VIEW|id|integer -vw_staffgroupslist|VIEW|groupcolor|text -vw_staffgroupslist|VIEW|groupname|text -vw_staffgroupslist|VIEW|id|integer -vw_stafflist|VIEW|birthdate|date -vw_stafflist|VIEW|dspname|text -vw_stafflist|VIEW|entrydate|date -vw_stafflist|VIEW|id|integer -vw_stafflist|VIEW|job|text -vw_stafflist|VIEW|leavedate|date -vw_stafflist|VIEW|prename|text -vw_stafflist|VIEW|staffnumber|text -vw_stafflist|VIEW|surname|text -vw_staffplanned_dayweektotals|VIEW|calweek|doubleprecision -vw_staffplanned_dayweektotals|VIEW|dates|date -vw_staffplanned_dayweektotals|VIEW|fri_end1|text -vw_staffplanned_dayweektotals|VIEW|fri_end2|text -vw_staffplanned_dayweektotals|VIEW|fri_id|bigint -vw_staffplanned_dayweektotals|VIEW|fri_pause|text -vw_staffplanned_dayweektotals|VIEW|fri_start1|text -vw_staffplanned_dayweektotals|VIEW|fri_start2|text -vw_staffplanned_dayweektotals|VIEW|fri_timetotal|text -vw_staffplanned_dayweektotals|VIEW|id_staff|integer -vw_staffplanned_dayweektotals|VIEW|mon_end1|text -vw_staffplanned_dayweektotals|VIEW|mon_end2|text -vw_staffplanned_dayweektotals|VIEW|mon_id|bigint -vw_staffplanned_dayweektotals|VIEW|mon_pause|text -vw_staffplanned_dayweektotals|VIEW|mon_start1|text -vw_staffplanned_dayweektotals|VIEW|mon_start2|text -vw_staffplanned_dayweektotals|VIEW|mon_timetotal|text -vw_staffplanned_dayweektotals|VIEW|sat_end1|text -vw_staffplanned_dayweektotals|VIEW|sat_end2|text -vw_staffplanned_dayweektotals|VIEW|sat_id|bigint -vw_staffplanned_dayweektotals|VIEW|sat_pause|text -vw_staffplanned_dayweektotals|VIEW|sat_start1|text -vw_staffplanned_dayweektotals|VIEW|sat_start2|text -vw_staffplanned_dayweektotals|VIEW|sat_timetotal|text -vw_staffplanned_dayweektotals|VIEW|sun_end1|text -vw_staffplanned_dayweektotals|VIEW|sun_end2|text -vw_staffplanned_dayweektotals|VIEW|sun_id|bigint -vw_staffplanned_dayweektotals|VIEW|sun_pause|text -vw_staffplanned_dayweektotals|VIEW|sun_start1|text -vw_staffplanned_dayweektotals|VIEW|sun_start2|text -vw_staffplanned_dayweektotals|VIEW|sun_timetotal|text -vw_staffplanned_dayweektotals|VIEW|thu_end1|text -vw_staffplanned_dayweektotals|VIEW|thu_end2|text -vw_staffplanned_dayweektotals|VIEW|thu_id|bigint -vw_staffplanned_dayweektotals|VIEW|thu_pause|text -vw_staffplanned_dayweektotals|VIEW|thu_start1|text -vw_staffplanned_dayweektotals|VIEW|thu_start2|text -vw_staffplanned_dayweektotals|VIEW|thu_timetotal|text -vw_staffplanned_dayweektotals|VIEW|tue_end1|text -vw_staffplanned_dayweektotals|VIEW|tue_end2|text -vw_staffplanned_dayweektotals|VIEW|tue_id|bigint -vw_staffplanned_dayweektotals|VIEW|tue_pause|text -vw_staffplanned_dayweektotals|VIEW|tue_start1|text -vw_staffplanned_dayweektotals|VIEW|tue_start2|text -vw_staffplanned_dayweektotals|VIEW|tue_timetotal|text -vw_staffplanned_dayweektotals|VIEW|wed_end1|text -vw_staffplanned_dayweektotals|VIEW|wed_end2|text -vw_staffplanned_dayweektotals|VIEW|wed_id|bigint -vw_staffplanned_dayweektotals|VIEW|wed_pause|text -vw_staffplanned_dayweektotals|VIEW|wed_start1|text -vw_staffplanned_dayweektotals|VIEW|wed_start2|text -vw_staffplanned_dayweektotals|VIEW|wed_timetotal|text -vw_staffplanned_dayweektotals|VIEW|week_timetotal|text -vw_staffworkplanlist|VIEW|calweek|integer -vw_staffworkplanlist|VIEW|calyear|text -vw_staffworkplanlist|VIEW|dspcalweek|text -vw_staffworkplanlist|VIEW|dspfritimes|text -vw_staffworkplanlist|VIEW|dspmontimes|text -vw_staffworkplanlist|VIEW|dspsattimes|text -vw_staffworkplanlist|VIEW|dspsuntimes|text -vw_staffworkplanlist|VIEW|dspthutimes|text -vw_staffworkplanlist|VIEW|dsptuetimes|text -vw_staffworkplanlist|VIEW|dspwedtimes|text -vw_staffworkplanlist|VIEW|fri_date|date -vw_staffworkplanlist|VIEW|fri_id|bigint -vw_staffworkplanlist|VIEW|fri_timetotal|text -vw_staffworkplanlist|VIEW|id_staff|integer -vw_staffworkplanlist|VIEW|mon_date|date -vw_staffworkplanlist|VIEW|mon_id|bigint -vw_staffworkplanlist|VIEW|mon_timetotal|text -vw_staffworkplanlist|VIEW|sat_date|date -vw_staffworkplanlist|VIEW|sat_id|bigint -vw_staffworkplanlist|VIEW|sat_timetotal|text -vw_staffworkplanlist|VIEW|staffname|text -vw_staffworkplanlist|VIEW|sun_date|date -vw_staffworkplanlist|VIEW|sun_id|bigint -vw_staffworkplanlist|VIEW|sun_timetotal|text -vw_staffworkplanlist|VIEW|thu_date|date -vw_staffworkplanlist|VIEW|thu_id|bigint -vw_staffworkplanlist|VIEW|thu_timetotal|text -vw_staffworkplanlist|VIEW|tue_date|date -vw_staffworkplanlist|VIEW|tue_id|bigint -vw_staffworkplanlist|VIEW|tue_timetotal|text -vw_staffworkplanlist|VIEW|wed_date|date -vw_staffworkplanlist|VIEW|wed_id|bigint -vw_staffworkplanlist|VIEW|wed_timetotal|text -vw_staffworkplanlist|VIEW|weekend|date -vw_staffworkplanlist|VIEW|weekminutes|numeric -vw_staffworkplanlist|VIEW|weekstart|date -vw_staffworkplanlist|VIEW|week_timetotal|text -vw_staffworkplanlist|VIEW|weekvacancy_minutes_ill|numeric -vw_staffworkplanlist|VIEW|weekvacancy_minutes|numeric -vw_staffworkplanlist|VIEW|weekvacancy_times_ill|text -vw_staffworkplanlist|VIEW|weekvacancy_times|text -vw_staffworkplan_weekly|VIEW|calweek|doubleprecision -vw_staffworkplan_weekly|VIEW|calyear|text -vw_staffworkplan_weekly|VIEW|dates|text -vw_staffworkplan_weekly|VIEW|fri_id|bigint -vw_staffworkplan_weekly|VIEW|fri_timeend1|text -vw_staffworkplan_weekly|VIEW|fri_timeend2|text -vw_staffworkplan_weekly|VIEW|fri_timepause|text -vw_staffworkplan_weekly|VIEW|fri_timestart1|text -vw_staffworkplan_weekly|VIEW|fri_timestart2|text -vw_staffworkplan_weekly|VIEW|fri_timetotal|text -vw_staffworkplan_weekly|VIEW|fri_vacancyhours|text -vw_staffworkplan_weekly|VIEW|fri_vacancytype|text -vw_staffworkplan_weekly|VIEW|id_staff|integer -vw_staffworkplan_weekly|VIEW|mon_id|bigint -vw_staffworkplan_weekly|VIEW|mon_timeend1|text -vw_staffworkplan_weekly|VIEW|mon_timeend2|text -vw_staffworkplan_weekly|VIEW|mon_timepause|text -vw_staffworkplan_weekly|VIEW|mon_timestart1|text -vw_staffworkplan_weekly|VIEW|mon_timestart2|text -vw_staffworkplan_weekly|VIEW|mon_timetotal|text -vw_staffworkplan_weekly|VIEW|mon_vacancyhours|text -vw_staffworkplan_weekly|VIEW|mon_vacancytype|text -vw_staffworkplan_weekly|VIEW|sat_id|bigint -vw_staffworkplan_weekly|VIEW|sat_timeend1|text -vw_staffworkplan_weekly|VIEW|sat_timeend2|text -vw_staffworkplan_weekly|VIEW|sat_timepause|text -vw_staffworkplan_weekly|VIEW|sat_timestart1|text -vw_staffworkplan_weekly|VIEW|sat_timestart2|text -vw_staffworkplan_weekly|VIEW|sat_timetotal|text -vw_staffworkplan_weekly|VIEW|sat_vacancyhours|text -vw_staffworkplan_weekly|VIEW|sat_vacancytype|text -vw_staffworkplan_weekly|VIEW|sun_id|bigint -vw_staffworkplan_weekly|VIEW|sun_timeend1|text -vw_staffworkplan_weekly|VIEW|sun_timeend2|text -vw_staffworkplan_weekly|VIEW|sun_timepause|text -vw_staffworkplan_weekly|VIEW|sun_timestart1|text -vw_staffworkplan_weekly|VIEW|sun_timestart2|text -vw_staffworkplan_weekly|VIEW|sun_timetotal|text -vw_staffworkplan_weekly|VIEW|sun_vacancyhours|text -vw_staffworkplan_weekly|VIEW|sun_vacancytype|text -vw_staffworkplan_weekly|VIEW|thu_id|bigint -vw_staffworkplan_weekly|VIEW|thu_timeend1|text -vw_staffworkplan_weekly|VIEW|thu_timeend2|text -vw_staffworkplan_weekly|VIEW|thu_timepause|text -vw_staffworkplan_weekly|VIEW|thu_timestart1|text -vw_staffworkplan_weekly|VIEW|thu_timestart2|text -vw_staffworkplan_weekly|VIEW|thu_timetotal|text -vw_staffworkplan_weekly|VIEW|thu_vacancyhours|text -vw_staffworkplan_weekly|VIEW|thu_vacancytype|text -vw_staffworkplan_weekly|VIEW|tue_id|bigint -vw_staffworkplan_weekly|VIEW|tue_timeend1|text -vw_staffworkplan_weekly|VIEW|tue_timeend2|text -vw_staffworkplan_weekly|VIEW|tue_timepause|text -vw_staffworkplan_weekly|VIEW|tue_timestart1|text -vw_staffworkplan_weekly|VIEW|tue_timestart2|text -vw_staffworkplan_weekly|VIEW|tue_timetotal|text -vw_staffworkplan_weekly|VIEW|tue_vacancyhours|text -vw_staffworkplan_weekly|VIEW|tue_vacancytype|text -vw_staffworkplan_weekly|VIEW|wed_id|bigint -vw_staffworkplan_weekly|VIEW|wed_timeend1|text -vw_staffworkplan_weekly|VIEW|wed_timeend2|text -vw_staffworkplan_weekly|VIEW|wed_timepause|text -vw_staffworkplan_weekly|VIEW|wed_timestart1|text -vw_staffworkplan_weekly|VIEW|wed_timestart2|text -vw_staffworkplan_weekly|VIEW|wed_timetotal|text -vw_staffworkplan_weekly|VIEW|wed_vacancyhours|text -vw_staffworkplan_weekly|VIEW|wed_vacancytype|text -vw_staffworkplan_weekly|VIEW|weekbegin|date -vw_staffworkplan_weekly|VIEW|week_timetotal|text -vw_workplanlist|VIEW|id|integer -vw_workplanlist|VIEW|workplan|text -vw_workplansdata|VIEW|fri_timeend1|text -vw_workplansdata|VIEW|fri_timeend2|text -vw_workplansdata|VIEW|fri_timepause|text -vw_workplansdata|VIEW|fri_timestart1|text -vw_workplansdata|VIEW|fri_timestart2|text -vw_workplansdata|VIEW|id|integer -vw_workplansdata|VIEW|mon_timeend1|text -vw_workplansdata|VIEW|mon_timeend2|text -vw_workplansdata|VIEW|mon_timepause|text -vw_workplansdata|VIEW|mon_timestart1|text -vw_workplansdata|VIEW|mon_timestart2|text -vw_workplansdata|VIEW|sat_timeend1|text -vw_workplansdata|VIEW|sat_timeend2|text -vw_workplansdata|VIEW|sat_timepause|text -vw_workplansdata|VIEW|sat_timestart1|text -vw_workplansdata|VIEW|sat_timestart2|text -vw_workplansdata|VIEW|sun_timeend1|text -vw_workplansdata|VIEW|sun_timeend2|text -vw_workplansdata|VIEW|sun_timepause|text -vw_workplansdata|VIEW|sun_timestart1|text -vw_workplansdata|VIEW|sun_timestart2|text -vw_workplansdata|VIEW|thu_timeend1|text -vw_workplansdata|VIEW|thu_timeend2|text -vw_workplansdata|VIEW|thu_timepause|text -vw_workplansdata|VIEW|thu_timestart1|text -vw_workplansdata|VIEW|thu_timestart2|text -vw_workplansdata|VIEW|tue_timeend1|text -vw_workplansdata|VIEW|tue_timeend2|text -vw_workplansdata|VIEW|tue_timepause|text -vw_workplansdata|VIEW|tue_timestart1|text -vw_workplansdata|VIEW|tue_timestart2|text -vw_workplansdata|VIEW|wed_timeend1|text -vw_workplansdata|VIEW|wed_timeend2|text -vw_workplansdata|VIEW|wed_timepause|text -vw_workplansdata|VIEW|wed_timestart1|text -vw_workplansdata|VIEW|wed_timestart2|text -vw_workplansdata|VIEW|workplan|text -vw_workplans|VIEW|dspfritimes|text -vw_workplans|VIEW|dspmontimes|text -vw_workplans|VIEW|dspsattimes|text -vw_workplans|VIEW|dspsuntimes|text -vw_workplans|VIEW|dspthutimes|text -vw_workplans|VIEW|dsptuetimes|text -vw_workplans|VIEW|dspwedtimes|text -vw_workplans|VIEW|id|integer -vw_workplans|VIEW|workplan|text -workplans|BASETABLE|fri_timeend1|timewithouttimezone -workplans|BASETABLE|fri_timeend2|timewithouttimezone -workplans|BASETABLE|fri_timepause|timewithouttimezone -workplans|BASETABLE|fri_timestart1|timewithouttimezone -workplans|BASETABLE|fri_timestart2|timewithouttimezone -workplans|BASETABLE|id|integer -workplans|BASETABLE|mon_timeend1|timewithouttimezone -workplans|BASETABLE|mon_timeend2|timewithouttimezone -workplans|BASETABLE|mon_timepause|timewithouttimezone -workplans|BASETABLE|mon_timestart1|timewithouttimezone -workplans|BASETABLE|mon_timestart2|timewithouttimezone -workplans|BASETABLE|sat_timeend1|timewithouttimezone -workplans|BASETABLE|sat_timeend2|timewithouttimezone -workplans|BASETABLE|sat_timepause|timewithouttimezone -workplans|BASETABLE|sat_timestart1|timewithouttimezone -workplans|BASETABLE|sat_timestart2|timewithouttimezone -workplans|BASETABLE|sun_timeend1|timewithouttimezone -workplans|BASETABLE|sun_timeend2|timewithouttimezone -workplans|BASETABLE|sun_timepause|timewithouttimezone -workplans|BASETABLE|sun_timestart1|timewithouttimezone -workplans|BASETABLE|sun_timestart2|timewithouttimezone -workplans|BASETABLE|thu_timeend1|timewithouttimezone -workplans|BASETABLE|thu_timeend2|timewithouttimezone -workplans|BASETABLE|thu_timepause|timewithouttimezone -workplans|BASETABLE|thu_timestart1|timewithouttimezone -workplans|BASETABLE|thu_timestart2|timewithouttimezone -workplans|BASETABLE|tue_timeend1|timewithouttimezone -workplans|BASETABLE|tue_timeend2|timewithouttimezone -workplans|BASETABLE|tue_timepause|timewithouttimezone -workplans|BASETABLE|tue_timestart1|timewithouttimezone -workplans|BASETABLE|tue_timestart2|timewithouttimezone -workplans|BASETABLE|wed_timeend1|timewithouttimezone -workplans|BASETABLE|wed_timeend2|timewithouttimezone -workplans|BASETABLE|wed_timepause|timewithouttimezone -workplans|BASETABLE|wed_timestart1|timewithouttimezone -workplans|BASETABLE|wed_timestart2|timewithouttimezone -workplans|BASETABLE|workplan|text -worktypes|BASETABLE|id|integer -worktypes|BASETABLE|isfreetime|boolean -worktypes|BASETABLE|isworktime|boolean -worktypes|BASETABLE|typecolor|text -worktypes|BASETABLE|worktype|text diff --git a/dev/db/potlu_db.refschema.tables.local.txt b/dev/db/potlu_db.refschema.tables.local.txt deleted file mode 100644 index 3a72c19e..00000000 --- a/dev/db/potlu_db.refschema.tables.local.txt +++ /dev/null @@ -1,25 +0,0 @@ - -reportperiod|BASETABLE -sites|BASETABLE -staff|BASETABLE -staffcontract|BASETABLE -staffgroups|BASETABLE -stafftimetracks|BASETABLE -staffvacancy|BASETABLE -staffvacancyyear|BASETABLE -staffworkplan|BASETABLE -vw_reportperiodlist|VIEW -vw_staffcontractdata|VIEW -vw_staffcontractlist|VIEW -vw_staffdata|VIEW -vw_staffgroupsdata|VIEW -vw_staffgroupslist|VIEW -vw_stafflist|VIEW -vw_staffplanned_dayweektotals|VIEW -vw_staffworkplanlist|VIEW -vw_staffworkplan_weekly|VIEW -vw_workplanlist|VIEW -vw_workplansdata|VIEW -vw_workplans|VIEW -workplans|BASETABLE -worktypes|BASETABLE diff --git a/dev/db/potlu_db.test.columns.live.txt b/dev/db/potlu_db.test.columns.live.txt deleted file mode 100644 index 4be0aaac..00000000 --- a/dev/db/potlu_db.test.columns.live.txt +++ /dev/null @@ -1,356 +0,0 @@ - -reportperiod|BASETABLE|enddate|date -reportperiod|BASETABLE|id|integer -reportperiod|BASETABLE|periodname|text -reportperiod|BASETABLE|startdate|date -sites|BASETABLE|address|text -sites|BASETABLE|city|text -sites|BASETABLE|country|text -sites|BASETABLE|created|timestampwithouttimezone -sites|BASETABLE|id|integer -sites|BASETABLE|id_timetracker|integer -sites|BASETABLE|modified|timestampwithouttimezone -sites|BASETABLE|sitename|text -sites|BASETABLE|timeclockhost|text -sites|BASETABLE|zip|text -staff|BASETABLE|birthdate|date -staff|BASETABLE|entrydate|date -staff|BASETABLE|id|integer -staff|BASETABLE|job|text -staff|BASETABLE|leavedate|date -staff|BASETABLE|prename|text -staff|BASETABLE|staffnumber|text -staff|BASETABLE|surname|text -staffcontract|BASETABLE|id|integer -staffcontract|BASETABLE|id_staffgroup|integer -staffcontract|BASETABLE|id_staff|integer -staffcontract|BASETABLE|monthhours|numeric -staffcontract|BASETABLE|startdate|date -staffcontract|BASETABLE|weekhours|numeric -staffgroups|BASETABLE|groupcolor|text -staffgroups|BASETABLE|groupname|text -staffgroups|BASETABLE|id|integer -stafftimetracks|BASETABLE|created|timestampwithouttimezone -stafftimetracks|BASETABLE|id|bigint -stafftimetracks|BASETABLE|id_staff|integer -stafftimetracks|BASETABLE|modified|timestampwithouttimezone -stafftimetracks|BASETABLE|stamp_in|timestampwithouttimezone -stafftimetracks|BASETABLE|stamp_out|timestampwithouttimezone -stafftimetracks|BASETABLE|tracktype|text -staffvacancy|BASETABLE|dayhours|timewithouttimezone -staffvacancy|BASETABLE|enddate|date -staffvacancy|BASETABLE|id|integer -staffvacancy|BASETABLE|id_staff|integer -staffvacancy|BASETABLE|note|text -staffvacancy|BASETABLE|startdate|date -staffvacancy|BASETABLE|vacancytype|text -staffvacancy|BASETABLE|validated|boolean -staffvacancyyear|BASETABLE|days|numeric -staffvacancyyear|BASETABLE|hours|numeric -staffvacancyyear|BASETABLE|id|integer -staffvacancyyear|BASETABLE|id_staff|integer -staffvacancyyear|BASETABLE|vyear|integer -staffworkplan|BASETABLE|daydate|date -staffworkplan|BASETABLE|id|bigint -staffworkplan|BASETABLE|id_staff|integer -staffworkplan|BASETABLE|timeend1|timewithouttimezone -staffworkplan|BASETABLE|timeend2|timewithouttimezone -staffworkplan|BASETABLE|timepause|timewithouttimezone -staffworkplan|BASETABLE|timestart1|timewithouttimezone -staffworkplan|BASETABLE|timestart2|timewithouttimezone -staffworkplan|BASETABLE|vacancyhours|timewithouttimezone -staffworkplan|BASETABLE|vacancytype|text -vw_reportperiodlist|VIEW|enddate|date -vw_reportperiodlist|VIEW|id|integer -vw_reportperiodlist|VIEW|periodname|text -vw_reportperiodlist|VIEW|startdate|date -vw_staffcontractdata|VIEW|id|integer -vw_staffcontractdata|VIEW|id_staffgroup|integer -vw_staffcontractdata|VIEW|id_staff|integer -vw_staffcontractdata|VIEW|monthhours|numeric -vw_staffcontractdata|VIEW|startdate|date -vw_staffcontractdata|VIEW|weekhours|numeric -vw_staffcontractlist|VIEW|groupcolor|text -vw_staffcontractlist|VIEW|groupname|text -vw_staffcontractlist|VIEW|id|integer -vw_staffcontractlist|VIEW|id_staffgroup|integer -vw_staffcontractlist|VIEW|id_staff|integer -vw_staffcontractlist|VIEW|monthhours|numeric -vw_staffcontractlist|VIEW|startdate|date -vw_staffcontractlist|VIEW|weekhours|numeric -vw_staffdata|VIEW|birthdate|date -vw_staffdata|VIEW|entrydate|date -vw_staffdata|VIEW|id|integer -vw_staffdata|VIEW|job|text -vw_staffdata|VIEW|leavedate|date -vw_staffdata|VIEW|prename|text -vw_staffdata|VIEW|staffnumber|text -vw_staffdata|VIEW|surname|text -vw_staffgroupsdata|VIEW|groupcolor|text -vw_staffgroupsdata|VIEW|groupname|text -vw_staffgroupsdata|VIEW|id|integer -vw_staffgroupslist|VIEW|groupcolor|text -vw_staffgroupslist|VIEW|groupname|text -vw_staffgroupslist|VIEW|id|integer -vw_stafflist|VIEW|birthdate|date -vw_stafflist|VIEW|dspname|text -vw_stafflist|VIEW|entrydate|date -vw_stafflist|VIEW|id|integer -vw_stafflist|VIEW|job|text -vw_stafflist|VIEW|leavedate|date -vw_stafflist|VIEW|prename|text -vw_stafflist|VIEW|staffnumber|text -vw_stafflist|VIEW|surname|text -vw_staffplanned_dayweektotals|VIEW|calweek|doubleprecision -vw_staffplanned_dayweektotals|VIEW|dates|date -vw_staffplanned_dayweektotals|VIEW|fri_end1|text -vw_staffplanned_dayweektotals|VIEW|fri_end2|text -vw_staffplanned_dayweektotals|VIEW|fri_id|bigint -vw_staffplanned_dayweektotals|VIEW|fri_pause|text -vw_staffplanned_dayweektotals|VIEW|fri_start1|text -vw_staffplanned_dayweektotals|VIEW|fri_start2|text -vw_staffplanned_dayweektotals|VIEW|fri_timetotal|text -vw_staffplanned_dayweektotals|VIEW|id_staff|integer -vw_staffplanned_dayweektotals|VIEW|mon_end1|text -vw_staffplanned_dayweektotals|VIEW|mon_end2|text -vw_staffplanned_dayweektotals|VIEW|mon_id|bigint -vw_staffplanned_dayweektotals|VIEW|mon_pause|text -vw_staffplanned_dayweektotals|VIEW|mon_start1|text -vw_staffplanned_dayweektotals|VIEW|mon_start2|text -vw_staffplanned_dayweektotals|VIEW|mon_timetotal|text -vw_staffplanned_dayweektotals|VIEW|sat_end1|text -vw_staffplanned_dayweektotals|VIEW|sat_end2|text -vw_staffplanned_dayweektotals|VIEW|sat_id|bigint -vw_staffplanned_dayweektotals|VIEW|sat_pause|text -vw_staffplanned_dayweektotals|VIEW|sat_start1|text -vw_staffplanned_dayweektotals|VIEW|sat_start2|text -vw_staffplanned_dayweektotals|VIEW|sat_timetotal|text -vw_staffplanned_dayweektotals|VIEW|sun_end1|text -vw_staffplanned_dayweektotals|VIEW|sun_end2|text -vw_staffplanned_dayweektotals|VIEW|sun_id|bigint -vw_staffplanned_dayweektotals|VIEW|sun_pause|text -vw_staffplanned_dayweektotals|VIEW|sun_start1|text -vw_staffplanned_dayweektotals|VIEW|sun_start2|text -vw_staffplanned_dayweektotals|VIEW|sun_timetotal|text -vw_staffplanned_dayweektotals|VIEW|thu_end1|text -vw_staffplanned_dayweektotals|VIEW|thu_end2|text -vw_staffplanned_dayweektotals|VIEW|thu_id|bigint -vw_staffplanned_dayweektotals|VIEW|thu_pause|text -vw_staffplanned_dayweektotals|VIEW|thu_start1|text -vw_staffplanned_dayweektotals|VIEW|thu_start2|text -vw_staffplanned_dayweektotals|VIEW|thu_timetotal|text -vw_staffplanned_dayweektotals|VIEW|tue_end1|text -vw_staffplanned_dayweektotals|VIEW|tue_end2|text -vw_staffplanned_dayweektotals|VIEW|tue_id|bigint -vw_staffplanned_dayweektotals|VIEW|tue_pause|text -vw_staffplanned_dayweektotals|VIEW|tue_start1|text -vw_staffplanned_dayweektotals|VIEW|tue_start2|text -vw_staffplanned_dayweektotals|VIEW|tue_timetotal|text -vw_staffplanned_dayweektotals|VIEW|wed_end1|text -vw_staffplanned_dayweektotals|VIEW|wed_end2|text -vw_staffplanned_dayweektotals|VIEW|wed_id|bigint -vw_staffplanned_dayweektotals|VIEW|wed_pause|text -vw_staffplanned_dayweektotals|VIEW|wed_start1|text -vw_staffplanned_dayweektotals|VIEW|wed_start2|text -vw_staffplanned_dayweektotals|VIEW|wed_timetotal|text -vw_staffplanned_dayweektotals|VIEW|week_timetotal|text -vw_staffworkplanlist|VIEW|calweek|integer -vw_staffworkplanlist|VIEW|calyear|text -vw_staffworkplanlist|VIEW|dspcalweek|text -vw_staffworkplanlist|VIEW|dspfritimes|text -vw_staffworkplanlist|VIEW|dspmontimes|text -vw_staffworkplanlist|VIEW|dspsattimes|text -vw_staffworkplanlist|VIEW|dspsuntimes|text -vw_staffworkplanlist|VIEW|dspthutimes|text -vw_staffworkplanlist|VIEW|dsptuetimes|text -vw_staffworkplanlist|VIEW|dspwedtimes|text -vw_staffworkplanlist|VIEW|fri_date|date -vw_staffworkplanlist|VIEW|fri_id|bigint -vw_staffworkplanlist|VIEW|fri_timetotal|text -vw_staffworkplanlist|VIEW|id_staff|integer -vw_staffworkplanlist|VIEW|mon_date|date -vw_staffworkplanlist|VIEW|mon_id|bigint -vw_staffworkplanlist|VIEW|mon_timetotal|text -vw_staffworkplanlist|VIEW|sat_date|date -vw_staffworkplanlist|VIEW|sat_id|bigint -vw_staffworkplanlist|VIEW|sat_timetotal|text -vw_staffworkplanlist|VIEW|staffname|text -vw_staffworkplanlist|VIEW|sun_date|date -vw_staffworkplanlist|VIEW|sun_id|bigint -vw_staffworkplanlist|VIEW|sun_timetotal|text -vw_staffworkplanlist|VIEW|thu_date|date -vw_staffworkplanlist|VIEW|thu_id|bigint -vw_staffworkplanlist|VIEW|thu_timetotal|text -vw_staffworkplanlist|VIEW|tue_date|date -vw_staffworkplanlist|VIEW|tue_id|bigint -vw_staffworkplanlist|VIEW|tue_timetotal|text -vw_staffworkplanlist|VIEW|wed_date|date -vw_staffworkplanlist|VIEW|wed_id|bigint -vw_staffworkplanlist|VIEW|wed_timetotal|text -vw_staffworkplanlist|VIEW|weekend|date -vw_staffworkplanlist|VIEW|weekminutes|numeric -vw_staffworkplanlist|VIEW|weekstart|date -vw_staffworkplanlist|VIEW|week_timetotal|text -vw_staffworkplanlist|VIEW|weekvacancy_minutes_ill|numeric -vw_staffworkplanlist|VIEW|weekvacancy_minutes|numeric -vw_staffworkplanlist|VIEW|weekvacancy_times_ill|text -vw_staffworkplanlist|VIEW|weekvacancy_times|text -vw_staffworkplan_weekly|VIEW|calweek|doubleprecision -vw_staffworkplan_weekly|VIEW|calyear|text -vw_staffworkplan_weekly|VIEW|dates|text -vw_staffworkplan_weekly|VIEW|fri_id|bigint -vw_staffworkplan_weekly|VIEW|fri_timeend1|text -vw_staffworkplan_weekly|VIEW|fri_timeend2|text -vw_staffworkplan_weekly|VIEW|fri_timepause|text -vw_staffworkplan_weekly|VIEW|fri_timestart1|text -vw_staffworkplan_weekly|VIEW|fri_timestart2|text -vw_staffworkplan_weekly|VIEW|fri_timetotal|text -vw_staffworkplan_weekly|VIEW|fri_vacancyhours|text -vw_staffworkplan_weekly|VIEW|fri_vacancytype|text -vw_staffworkplan_weekly|VIEW|id_staff|integer -vw_staffworkplan_weekly|VIEW|mon_id|bigint -vw_staffworkplan_weekly|VIEW|mon_timeend1|text -vw_staffworkplan_weekly|VIEW|mon_timeend2|text -vw_staffworkplan_weekly|VIEW|mon_timepause|text -vw_staffworkplan_weekly|VIEW|mon_timestart1|text -vw_staffworkplan_weekly|VIEW|mon_timestart2|text -vw_staffworkplan_weekly|VIEW|mon_timetotal|text -vw_staffworkplan_weekly|VIEW|mon_vacancyhours|text -vw_staffworkplan_weekly|VIEW|mon_vacancytype|text -vw_staffworkplan_weekly|VIEW|sat_id|bigint -vw_staffworkplan_weekly|VIEW|sat_timeend1|text -vw_staffworkplan_weekly|VIEW|sat_timeend2|text -vw_staffworkplan_weekly|VIEW|sat_timepause|text -vw_staffworkplan_weekly|VIEW|sat_timestart1|text -vw_staffworkplan_weekly|VIEW|sat_timestart2|text -vw_staffworkplan_weekly|VIEW|sat_timetotal|text -vw_staffworkplan_weekly|VIEW|sat_vacancyhours|text -vw_staffworkplan_weekly|VIEW|sat_vacancytype|text -vw_staffworkplan_weekly|VIEW|sun_id|bigint -vw_staffworkplan_weekly|VIEW|sun_timeend1|text -vw_staffworkplan_weekly|VIEW|sun_timeend2|text -vw_staffworkplan_weekly|VIEW|sun_timepause|text -vw_staffworkplan_weekly|VIEW|sun_timestart1|text -vw_staffworkplan_weekly|VIEW|sun_timestart2|text -vw_staffworkplan_weekly|VIEW|sun_timetotal|text -vw_staffworkplan_weekly|VIEW|sun_vacancyhours|text -vw_staffworkplan_weekly|VIEW|sun_vacancytype|text -vw_staffworkplan_weekly|VIEW|thu_id|bigint -vw_staffworkplan_weekly|VIEW|thu_timeend1|text -vw_staffworkplan_weekly|VIEW|thu_timeend2|text -vw_staffworkplan_weekly|VIEW|thu_timepause|text -vw_staffworkplan_weekly|VIEW|thu_timestart1|text -vw_staffworkplan_weekly|VIEW|thu_timestart2|text -vw_staffworkplan_weekly|VIEW|thu_timetotal|text -vw_staffworkplan_weekly|VIEW|thu_vacancyhours|text -vw_staffworkplan_weekly|VIEW|thu_vacancytype|text -vw_staffworkplan_weekly|VIEW|tue_id|bigint -vw_staffworkplan_weekly|VIEW|tue_timeend1|text -vw_staffworkplan_weekly|VIEW|tue_timeend2|text -vw_staffworkplan_weekly|VIEW|tue_timepause|text -vw_staffworkplan_weekly|VIEW|tue_timestart1|text -vw_staffworkplan_weekly|VIEW|tue_timestart2|text -vw_staffworkplan_weekly|VIEW|tue_timetotal|text -vw_staffworkplan_weekly|VIEW|tue_vacancyhours|text -vw_staffworkplan_weekly|VIEW|tue_vacancytype|text -vw_staffworkplan_weekly|VIEW|wed_id|bigint -vw_staffworkplan_weekly|VIEW|wed_timeend1|text -vw_staffworkplan_weekly|VIEW|wed_timeend2|text -vw_staffworkplan_weekly|VIEW|wed_timepause|text -vw_staffworkplan_weekly|VIEW|wed_timestart1|text -vw_staffworkplan_weekly|VIEW|wed_timestart2|text -vw_staffworkplan_weekly|VIEW|wed_timetotal|text -vw_staffworkplan_weekly|VIEW|wed_vacancyhours|text -vw_staffworkplan_weekly|VIEW|wed_vacancytype|text -vw_staffworkplan_weekly|VIEW|weekbegin|date -vw_staffworkplan_weekly|VIEW|week_timetotal|text -vw_workplanlist|VIEW|id|integer -vw_workplanlist|VIEW|workplan|text -vw_workplansdata|VIEW|fri_timeend1|text -vw_workplansdata|VIEW|fri_timeend2|text -vw_workplansdata|VIEW|fri_timepause|text -vw_workplansdata|VIEW|fri_timestart1|text -vw_workplansdata|VIEW|fri_timestart2|text -vw_workplansdata|VIEW|id|integer -vw_workplansdata|VIEW|mon_timeend1|text -vw_workplansdata|VIEW|mon_timeend2|text -vw_workplansdata|VIEW|mon_timepause|text -vw_workplansdata|VIEW|mon_timestart1|text -vw_workplansdata|VIEW|mon_timestart2|text -vw_workplansdata|VIEW|sat_timeend1|text -vw_workplansdata|VIEW|sat_timeend2|text -vw_workplansdata|VIEW|sat_timepause|text -vw_workplansdata|VIEW|sat_timestart1|text -vw_workplansdata|VIEW|sat_timestart2|text -vw_workplansdata|VIEW|sun_timeend1|text -vw_workplansdata|VIEW|sun_timeend2|text -vw_workplansdata|VIEW|sun_timepause|text -vw_workplansdata|VIEW|sun_timestart1|text -vw_workplansdata|VIEW|sun_timestart2|text -vw_workplansdata|VIEW|thu_timeend1|text -vw_workplansdata|VIEW|thu_timeend2|text -vw_workplansdata|VIEW|thu_timepause|text -vw_workplansdata|VIEW|thu_timestart1|text -vw_workplansdata|VIEW|thu_timestart2|text -vw_workplansdata|VIEW|tue_timeend1|text -vw_workplansdata|VIEW|tue_timeend2|text -vw_workplansdata|VIEW|tue_timepause|text -vw_workplansdata|VIEW|tue_timestart1|text -vw_workplansdata|VIEW|tue_timestart2|text -vw_workplansdata|VIEW|wed_timeend1|text -vw_workplansdata|VIEW|wed_timeend2|text -vw_workplansdata|VIEW|wed_timepause|text -vw_workplansdata|VIEW|wed_timestart1|text -vw_workplansdata|VIEW|wed_timestart2|text -vw_workplansdata|VIEW|workplan|text -vw_workplans|VIEW|dspfritimes|text -vw_workplans|VIEW|dspmontimes|text -vw_workplans|VIEW|dspsattimes|text -vw_workplans|VIEW|dspsuntimes|text -vw_workplans|VIEW|dspthutimes|text -vw_workplans|VIEW|dsptuetimes|text -vw_workplans|VIEW|dspwedtimes|text -vw_workplans|VIEW|id|integer -vw_workplans|VIEW|workplan|text -workplans|BASETABLE|fri_timeend1|timewithouttimezone -workplans|BASETABLE|fri_timeend2|timewithouttimezone -workplans|BASETABLE|fri_timepause|timewithouttimezone -workplans|BASETABLE|fri_timestart1|timewithouttimezone -workplans|BASETABLE|fri_timestart2|timewithouttimezone -workplans|BASETABLE|id|integer -workplans|BASETABLE|mon_timeend1|timewithouttimezone -workplans|BASETABLE|mon_timeend2|timewithouttimezone -workplans|BASETABLE|mon_timepause|timewithouttimezone -workplans|BASETABLE|mon_timestart1|timewithouttimezone -workplans|BASETABLE|mon_timestart2|timewithouttimezone -workplans|BASETABLE|sat_timeend1|timewithouttimezone -workplans|BASETABLE|sat_timeend2|timewithouttimezone -workplans|BASETABLE|sat_timepause|timewithouttimezone -workplans|BASETABLE|sat_timestart1|timewithouttimezone -workplans|BASETABLE|sat_timestart2|timewithouttimezone -workplans|BASETABLE|sun_timeend1|timewithouttimezone -workplans|BASETABLE|sun_timeend2|timewithouttimezone -workplans|BASETABLE|sun_timepause|timewithouttimezone -workplans|BASETABLE|sun_timestart1|timewithouttimezone -workplans|BASETABLE|sun_timestart2|timewithouttimezone -workplans|BASETABLE|thu_timeend1|timewithouttimezone -workplans|BASETABLE|thu_timeend2|timewithouttimezone -workplans|BASETABLE|thu_timepause|timewithouttimezone -workplans|BASETABLE|thu_timestart1|timewithouttimezone -workplans|BASETABLE|thu_timestart2|timewithouttimezone -workplans|BASETABLE|tue_timeend1|timewithouttimezone -workplans|BASETABLE|tue_timeend2|timewithouttimezone -workplans|BASETABLE|tue_timepause|timewithouttimezone -workplans|BASETABLE|tue_timestart1|timewithouttimezone -workplans|BASETABLE|tue_timestart2|timewithouttimezone -workplans|BASETABLE|wed_timeend1|timewithouttimezone -workplans|BASETABLE|wed_timeend2|timewithouttimezone -workplans|BASETABLE|wed_timepause|timewithouttimezone -workplans|BASETABLE|wed_timestart1|timewithouttimezone -workplans|BASETABLE|wed_timestart2|timewithouttimezone -workplans|BASETABLE|workplan|text -worktypes|BASETABLE|id|integer -worktypes|BASETABLE|isfreetime|boolean -worktypes|BASETABLE|isworktime|boolean -worktypes|BASETABLE|typecolor|text -worktypes|BASETABLE|worktype|text diff --git a/dev/db/potlu_db.test.tables.live.txt b/dev/db/potlu_db.test.tables.live.txt deleted file mode 100644 index 3a72c19e..00000000 --- a/dev/db/potlu_db.test.tables.live.txt +++ /dev/null @@ -1,25 +0,0 @@ - -reportperiod|BASETABLE -sites|BASETABLE -staff|BASETABLE -staffcontract|BASETABLE -staffgroups|BASETABLE -stafftimetracks|BASETABLE -staffvacancy|BASETABLE -staffvacancyyear|BASETABLE -staffworkplan|BASETABLE -vw_reportperiodlist|VIEW -vw_staffcontractdata|VIEW -vw_staffcontractlist|VIEW -vw_staffdata|VIEW -vw_staffgroupsdata|VIEW -vw_staffgroupslist|VIEW -vw_stafflist|VIEW -vw_staffplanned_dayweektotals|VIEW -vw_staffworkplanlist|VIEW -vw_staffworkplan_weekly|VIEW -vw_workplanlist|VIEW -vw_workplansdata|VIEW -vw_workplans|VIEW -workplans|BASETABLE -worktypes|BASETABLE diff --git a/dev/db/potlu_db.test2.columns.live.txt b/dev/db/potlu_db.test2.columns.live.txt deleted file mode 100644 index 4be0aaac..00000000 --- a/dev/db/potlu_db.test2.columns.live.txt +++ /dev/null @@ -1,356 +0,0 @@ - -reportperiod|BASETABLE|enddate|date -reportperiod|BASETABLE|id|integer -reportperiod|BASETABLE|periodname|text -reportperiod|BASETABLE|startdate|date -sites|BASETABLE|address|text -sites|BASETABLE|city|text -sites|BASETABLE|country|text -sites|BASETABLE|created|timestampwithouttimezone -sites|BASETABLE|id|integer -sites|BASETABLE|id_timetracker|integer -sites|BASETABLE|modified|timestampwithouttimezone -sites|BASETABLE|sitename|text -sites|BASETABLE|timeclockhost|text -sites|BASETABLE|zip|text -staff|BASETABLE|birthdate|date -staff|BASETABLE|entrydate|date -staff|BASETABLE|id|integer -staff|BASETABLE|job|text -staff|BASETABLE|leavedate|date -staff|BASETABLE|prename|text -staff|BASETABLE|staffnumber|text -staff|BASETABLE|surname|text -staffcontract|BASETABLE|id|integer -staffcontract|BASETABLE|id_staffgroup|integer -staffcontract|BASETABLE|id_staff|integer -staffcontract|BASETABLE|monthhours|numeric -staffcontract|BASETABLE|startdate|date -staffcontract|BASETABLE|weekhours|numeric -staffgroups|BASETABLE|groupcolor|text -staffgroups|BASETABLE|groupname|text -staffgroups|BASETABLE|id|integer -stafftimetracks|BASETABLE|created|timestampwithouttimezone -stafftimetracks|BASETABLE|id|bigint -stafftimetracks|BASETABLE|id_staff|integer -stafftimetracks|BASETABLE|modified|timestampwithouttimezone -stafftimetracks|BASETABLE|stamp_in|timestampwithouttimezone -stafftimetracks|BASETABLE|stamp_out|timestampwithouttimezone -stafftimetracks|BASETABLE|tracktype|text -staffvacancy|BASETABLE|dayhours|timewithouttimezone -staffvacancy|BASETABLE|enddate|date -staffvacancy|BASETABLE|id|integer -staffvacancy|BASETABLE|id_staff|integer -staffvacancy|BASETABLE|note|text -staffvacancy|BASETABLE|startdate|date -staffvacancy|BASETABLE|vacancytype|text -staffvacancy|BASETABLE|validated|boolean -staffvacancyyear|BASETABLE|days|numeric -staffvacancyyear|BASETABLE|hours|numeric -staffvacancyyear|BASETABLE|id|integer -staffvacancyyear|BASETABLE|id_staff|integer -staffvacancyyear|BASETABLE|vyear|integer -staffworkplan|BASETABLE|daydate|date -staffworkplan|BASETABLE|id|bigint -staffworkplan|BASETABLE|id_staff|integer -staffworkplan|BASETABLE|timeend1|timewithouttimezone -staffworkplan|BASETABLE|timeend2|timewithouttimezone -staffworkplan|BASETABLE|timepause|timewithouttimezone -staffworkplan|BASETABLE|timestart1|timewithouttimezone -staffworkplan|BASETABLE|timestart2|timewithouttimezone -staffworkplan|BASETABLE|vacancyhours|timewithouttimezone -staffworkplan|BASETABLE|vacancytype|text -vw_reportperiodlist|VIEW|enddate|date -vw_reportperiodlist|VIEW|id|integer -vw_reportperiodlist|VIEW|periodname|text -vw_reportperiodlist|VIEW|startdate|date -vw_staffcontractdata|VIEW|id|integer -vw_staffcontractdata|VIEW|id_staffgroup|integer -vw_staffcontractdata|VIEW|id_staff|integer -vw_staffcontractdata|VIEW|monthhours|numeric -vw_staffcontractdata|VIEW|startdate|date -vw_staffcontractdata|VIEW|weekhours|numeric -vw_staffcontractlist|VIEW|groupcolor|text -vw_staffcontractlist|VIEW|groupname|text -vw_staffcontractlist|VIEW|id|integer -vw_staffcontractlist|VIEW|id_staffgroup|integer -vw_staffcontractlist|VIEW|id_staff|integer -vw_staffcontractlist|VIEW|monthhours|numeric -vw_staffcontractlist|VIEW|startdate|date -vw_staffcontractlist|VIEW|weekhours|numeric -vw_staffdata|VIEW|birthdate|date -vw_staffdata|VIEW|entrydate|date -vw_staffdata|VIEW|id|integer -vw_staffdata|VIEW|job|text -vw_staffdata|VIEW|leavedate|date -vw_staffdata|VIEW|prename|text -vw_staffdata|VIEW|staffnumber|text -vw_staffdata|VIEW|surname|text -vw_staffgroupsdata|VIEW|groupcolor|text -vw_staffgroupsdata|VIEW|groupname|text -vw_staffgroupsdata|VIEW|id|integer -vw_staffgroupslist|VIEW|groupcolor|text -vw_staffgroupslist|VIEW|groupname|text -vw_staffgroupslist|VIEW|id|integer -vw_stafflist|VIEW|birthdate|date -vw_stafflist|VIEW|dspname|text -vw_stafflist|VIEW|entrydate|date -vw_stafflist|VIEW|id|integer -vw_stafflist|VIEW|job|text -vw_stafflist|VIEW|leavedate|date -vw_stafflist|VIEW|prename|text -vw_stafflist|VIEW|staffnumber|text -vw_stafflist|VIEW|surname|text -vw_staffplanned_dayweektotals|VIEW|calweek|doubleprecision -vw_staffplanned_dayweektotals|VIEW|dates|date -vw_staffplanned_dayweektotals|VIEW|fri_end1|text -vw_staffplanned_dayweektotals|VIEW|fri_end2|text -vw_staffplanned_dayweektotals|VIEW|fri_id|bigint -vw_staffplanned_dayweektotals|VIEW|fri_pause|text -vw_staffplanned_dayweektotals|VIEW|fri_start1|text -vw_staffplanned_dayweektotals|VIEW|fri_start2|text -vw_staffplanned_dayweektotals|VIEW|fri_timetotal|text -vw_staffplanned_dayweektotals|VIEW|id_staff|integer -vw_staffplanned_dayweektotals|VIEW|mon_end1|text -vw_staffplanned_dayweektotals|VIEW|mon_end2|text -vw_staffplanned_dayweektotals|VIEW|mon_id|bigint -vw_staffplanned_dayweektotals|VIEW|mon_pause|text -vw_staffplanned_dayweektotals|VIEW|mon_start1|text -vw_staffplanned_dayweektotals|VIEW|mon_start2|text -vw_staffplanned_dayweektotals|VIEW|mon_timetotal|text -vw_staffplanned_dayweektotals|VIEW|sat_end1|text -vw_staffplanned_dayweektotals|VIEW|sat_end2|text -vw_staffplanned_dayweektotals|VIEW|sat_id|bigint -vw_staffplanned_dayweektotals|VIEW|sat_pause|text -vw_staffplanned_dayweektotals|VIEW|sat_start1|text -vw_staffplanned_dayweektotals|VIEW|sat_start2|text -vw_staffplanned_dayweektotals|VIEW|sat_timetotal|text -vw_staffplanned_dayweektotals|VIEW|sun_end1|text -vw_staffplanned_dayweektotals|VIEW|sun_end2|text -vw_staffplanned_dayweektotals|VIEW|sun_id|bigint -vw_staffplanned_dayweektotals|VIEW|sun_pause|text -vw_staffplanned_dayweektotals|VIEW|sun_start1|text -vw_staffplanned_dayweektotals|VIEW|sun_start2|text -vw_staffplanned_dayweektotals|VIEW|sun_timetotal|text -vw_staffplanned_dayweektotals|VIEW|thu_end1|text -vw_staffplanned_dayweektotals|VIEW|thu_end2|text -vw_staffplanned_dayweektotals|VIEW|thu_id|bigint -vw_staffplanned_dayweektotals|VIEW|thu_pause|text -vw_staffplanned_dayweektotals|VIEW|thu_start1|text -vw_staffplanned_dayweektotals|VIEW|thu_start2|text -vw_staffplanned_dayweektotals|VIEW|thu_timetotal|text -vw_staffplanned_dayweektotals|VIEW|tue_end1|text -vw_staffplanned_dayweektotals|VIEW|tue_end2|text -vw_staffplanned_dayweektotals|VIEW|tue_id|bigint -vw_staffplanned_dayweektotals|VIEW|tue_pause|text -vw_staffplanned_dayweektotals|VIEW|tue_start1|text -vw_staffplanned_dayweektotals|VIEW|tue_start2|text -vw_staffplanned_dayweektotals|VIEW|tue_timetotal|text -vw_staffplanned_dayweektotals|VIEW|wed_end1|text -vw_staffplanned_dayweektotals|VIEW|wed_end2|text -vw_staffplanned_dayweektotals|VIEW|wed_id|bigint -vw_staffplanned_dayweektotals|VIEW|wed_pause|text -vw_staffplanned_dayweektotals|VIEW|wed_start1|text -vw_staffplanned_dayweektotals|VIEW|wed_start2|text -vw_staffplanned_dayweektotals|VIEW|wed_timetotal|text -vw_staffplanned_dayweektotals|VIEW|week_timetotal|text -vw_staffworkplanlist|VIEW|calweek|integer -vw_staffworkplanlist|VIEW|calyear|text -vw_staffworkplanlist|VIEW|dspcalweek|text -vw_staffworkplanlist|VIEW|dspfritimes|text -vw_staffworkplanlist|VIEW|dspmontimes|text -vw_staffworkplanlist|VIEW|dspsattimes|text -vw_staffworkplanlist|VIEW|dspsuntimes|text -vw_staffworkplanlist|VIEW|dspthutimes|text -vw_staffworkplanlist|VIEW|dsptuetimes|text -vw_staffworkplanlist|VIEW|dspwedtimes|text -vw_staffworkplanlist|VIEW|fri_date|date -vw_staffworkplanlist|VIEW|fri_id|bigint -vw_staffworkplanlist|VIEW|fri_timetotal|text -vw_staffworkplanlist|VIEW|id_staff|integer -vw_staffworkplanlist|VIEW|mon_date|date -vw_staffworkplanlist|VIEW|mon_id|bigint -vw_staffworkplanlist|VIEW|mon_timetotal|text -vw_staffworkplanlist|VIEW|sat_date|date -vw_staffworkplanlist|VIEW|sat_id|bigint -vw_staffworkplanlist|VIEW|sat_timetotal|text -vw_staffworkplanlist|VIEW|staffname|text -vw_staffworkplanlist|VIEW|sun_date|date -vw_staffworkplanlist|VIEW|sun_id|bigint -vw_staffworkplanlist|VIEW|sun_timetotal|text -vw_staffworkplanlist|VIEW|thu_date|date -vw_staffworkplanlist|VIEW|thu_id|bigint -vw_staffworkplanlist|VIEW|thu_timetotal|text -vw_staffworkplanlist|VIEW|tue_date|date -vw_staffworkplanlist|VIEW|tue_id|bigint -vw_staffworkplanlist|VIEW|tue_timetotal|text -vw_staffworkplanlist|VIEW|wed_date|date -vw_staffworkplanlist|VIEW|wed_id|bigint -vw_staffworkplanlist|VIEW|wed_timetotal|text -vw_staffworkplanlist|VIEW|weekend|date -vw_staffworkplanlist|VIEW|weekminutes|numeric -vw_staffworkplanlist|VIEW|weekstart|date -vw_staffworkplanlist|VIEW|week_timetotal|text -vw_staffworkplanlist|VIEW|weekvacancy_minutes_ill|numeric -vw_staffworkplanlist|VIEW|weekvacancy_minutes|numeric -vw_staffworkplanlist|VIEW|weekvacancy_times_ill|text -vw_staffworkplanlist|VIEW|weekvacancy_times|text -vw_staffworkplan_weekly|VIEW|calweek|doubleprecision -vw_staffworkplan_weekly|VIEW|calyear|text -vw_staffworkplan_weekly|VIEW|dates|text -vw_staffworkplan_weekly|VIEW|fri_id|bigint -vw_staffworkplan_weekly|VIEW|fri_timeend1|text -vw_staffworkplan_weekly|VIEW|fri_timeend2|text -vw_staffworkplan_weekly|VIEW|fri_timepause|text -vw_staffworkplan_weekly|VIEW|fri_timestart1|text -vw_staffworkplan_weekly|VIEW|fri_timestart2|text -vw_staffworkplan_weekly|VIEW|fri_timetotal|text -vw_staffworkplan_weekly|VIEW|fri_vacancyhours|text -vw_staffworkplan_weekly|VIEW|fri_vacancytype|text -vw_staffworkplan_weekly|VIEW|id_staff|integer -vw_staffworkplan_weekly|VIEW|mon_id|bigint -vw_staffworkplan_weekly|VIEW|mon_timeend1|text -vw_staffworkplan_weekly|VIEW|mon_timeend2|text -vw_staffworkplan_weekly|VIEW|mon_timepause|text -vw_staffworkplan_weekly|VIEW|mon_timestart1|text -vw_staffworkplan_weekly|VIEW|mon_timestart2|text -vw_staffworkplan_weekly|VIEW|mon_timetotal|text -vw_staffworkplan_weekly|VIEW|mon_vacancyhours|text -vw_staffworkplan_weekly|VIEW|mon_vacancytype|text -vw_staffworkplan_weekly|VIEW|sat_id|bigint -vw_staffworkplan_weekly|VIEW|sat_timeend1|text -vw_staffworkplan_weekly|VIEW|sat_timeend2|text -vw_staffworkplan_weekly|VIEW|sat_timepause|text -vw_staffworkplan_weekly|VIEW|sat_timestart1|text -vw_staffworkplan_weekly|VIEW|sat_timestart2|text -vw_staffworkplan_weekly|VIEW|sat_timetotal|text -vw_staffworkplan_weekly|VIEW|sat_vacancyhours|text -vw_staffworkplan_weekly|VIEW|sat_vacancytype|text -vw_staffworkplan_weekly|VIEW|sun_id|bigint -vw_staffworkplan_weekly|VIEW|sun_timeend1|text -vw_staffworkplan_weekly|VIEW|sun_timeend2|text -vw_staffworkplan_weekly|VIEW|sun_timepause|text -vw_staffworkplan_weekly|VIEW|sun_timestart1|text -vw_staffworkplan_weekly|VIEW|sun_timestart2|text -vw_staffworkplan_weekly|VIEW|sun_timetotal|text -vw_staffworkplan_weekly|VIEW|sun_vacancyhours|text -vw_staffworkplan_weekly|VIEW|sun_vacancytype|text -vw_staffworkplan_weekly|VIEW|thu_id|bigint -vw_staffworkplan_weekly|VIEW|thu_timeend1|text -vw_staffworkplan_weekly|VIEW|thu_timeend2|text -vw_staffworkplan_weekly|VIEW|thu_timepause|text -vw_staffworkplan_weekly|VIEW|thu_timestart1|text -vw_staffworkplan_weekly|VIEW|thu_timestart2|text -vw_staffworkplan_weekly|VIEW|thu_timetotal|text -vw_staffworkplan_weekly|VIEW|thu_vacancyhours|text -vw_staffworkplan_weekly|VIEW|thu_vacancytype|text -vw_staffworkplan_weekly|VIEW|tue_id|bigint -vw_staffworkplan_weekly|VIEW|tue_timeend1|text -vw_staffworkplan_weekly|VIEW|tue_timeend2|text -vw_staffworkplan_weekly|VIEW|tue_timepause|text -vw_staffworkplan_weekly|VIEW|tue_timestart1|text -vw_staffworkplan_weekly|VIEW|tue_timestart2|text -vw_staffworkplan_weekly|VIEW|tue_timetotal|text -vw_staffworkplan_weekly|VIEW|tue_vacancyhours|text -vw_staffworkplan_weekly|VIEW|tue_vacancytype|text -vw_staffworkplan_weekly|VIEW|wed_id|bigint -vw_staffworkplan_weekly|VIEW|wed_timeend1|text -vw_staffworkplan_weekly|VIEW|wed_timeend2|text -vw_staffworkplan_weekly|VIEW|wed_timepause|text -vw_staffworkplan_weekly|VIEW|wed_timestart1|text -vw_staffworkplan_weekly|VIEW|wed_timestart2|text -vw_staffworkplan_weekly|VIEW|wed_timetotal|text -vw_staffworkplan_weekly|VIEW|wed_vacancyhours|text -vw_staffworkplan_weekly|VIEW|wed_vacancytype|text -vw_staffworkplan_weekly|VIEW|weekbegin|date -vw_staffworkplan_weekly|VIEW|week_timetotal|text -vw_workplanlist|VIEW|id|integer -vw_workplanlist|VIEW|workplan|text -vw_workplansdata|VIEW|fri_timeend1|text -vw_workplansdata|VIEW|fri_timeend2|text -vw_workplansdata|VIEW|fri_timepause|text -vw_workplansdata|VIEW|fri_timestart1|text -vw_workplansdata|VIEW|fri_timestart2|text -vw_workplansdata|VIEW|id|integer -vw_workplansdata|VIEW|mon_timeend1|text -vw_workplansdata|VIEW|mon_timeend2|text -vw_workplansdata|VIEW|mon_timepause|text -vw_workplansdata|VIEW|mon_timestart1|text -vw_workplansdata|VIEW|mon_timestart2|text -vw_workplansdata|VIEW|sat_timeend1|text -vw_workplansdata|VIEW|sat_timeend2|text -vw_workplansdata|VIEW|sat_timepause|text -vw_workplansdata|VIEW|sat_timestart1|text -vw_workplansdata|VIEW|sat_timestart2|text -vw_workplansdata|VIEW|sun_timeend1|text -vw_workplansdata|VIEW|sun_timeend2|text -vw_workplansdata|VIEW|sun_timepause|text -vw_workplansdata|VIEW|sun_timestart1|text -vw_workplansdata|VIEW|sun_timestart2|text -vw_workplansdata|VIEW|thu_timeend1|text -vw_workplansdata|VIEW|thu_timeend2|text -vw_workplansdata|VIEW|thu_timepause|text -vw_workplansdata|VIEW|thu_timestart1|text -vw_workplansdata|VIEW|thu_timestart2|text -vw_workplansdata|VIEW|tue_timeend1|text -vw_workplansdata|VIEW|tue_timeend2|text -vw_workplansdata|VIEW|tue_timepause|text -vw_workplansdata|VIEW|tue_timestart1|text -vw_workplansdata|VIEW|tue_timestart2|text -vw_workplansdata|VIEW|wed_timeend1|text -vw_workplansdata|VIEW|wed_timeend2|text -vw_workplansdata|VIEW|wed_timepause|text -vw_workplansdata|VIEW|wed_timestart1|text -vw_workplansdata|VIEW|wed_timestart2|text -vw_workplansdata|VIEW|workplan|text -vw_workplans|VIEW|dspfritimes|text -vw_workplans|VIEW|dspmontimes|text -vw_workplans|VIEW|dspsattimes|text -vw_workplans|VIEW|dspsuntimes|text -vw_workplans|VIEW|dspthutimes|text -vw_workplans|VIEW|dsptuetimes|text -vw_workplans|VIEW|dspwedtimes|text -vw_workplans|VIEW|id|integer -vw_workplans|VIEW|workplan|text -workplans|BASETABLE|fri_timeend1|timewithouttimezone -workplans|BASETABLE|fri_timeend2|timewithouttimezone -workplans|BASETABLE|fri_timepause|timewithouttimezone -workplans|BASETABLE|fri_timestart1|timewithouttimezone -workplans|BASETABLE|fri_timestart2|timewithouttimezone -workplans|BASETABLE|id|integer -workplans|BASETABLE|mon_timeend1|timewithouttimezone -workplans|BASETABLE|mon_timeend2|timewithouttimezone -workplans|BASETABLE|mon_timepause|timewithouttimezone -workplans|BASETABLE|mon_timestart1|timewithouttimezone -workplans|BASETABLE|mon_timestart2|timewithouttimezone -workplans|BASETABLE|sat_timeend1|timewithouttimezone -workplans|BASETABLE|sat_timeend2|timewithouttimezone -workplans|BASETABLE|sat_timepause|timewithouttimezone -workplans|BASETABLE|sat_timestart1|timewithouttimezone -workplans|BASETABLE|sat_timestart2|timewithouttimezone -workplans|BASETABLE|sun_timeend1|timewithouttimezone -workplans|BASETABLE|sun_timeend2|timewithouttimezone -workplans|BASETABLE|sun_timepause|timewithouttimezone -workplans|BASETABLE|sun_timestart1|timewithouttimezone -workplans|BASETABLE|sun_timestart2|timewithouttimezone -workplans|BASETABLE|thu_timeend1|timewithouttimezone -workplans|BASETABLE|thu_timeend2|timewithouttimezone -workplans|BASETABLE|thu_timepause|timewithouttimezone -workplans|BASETABLE|thu_timestart1|timewithouttimezone -workplans|BASETABLE|thu_timestart2|timewithouttimezone -workplans|BASETABLE|tue_timeend1|timewithouttimezone -workplans|BASETABLE|tue_timeend2|timewithouttimezone -workplans|BASETABLE|tue_timepause|timewithouttimezone -workplans|BASETABLE|tue_timestart1|timewithouttimezone -workplans|BASETABLE|tue_timestart2|timewithouttimezone -workplans|BASETABLE|wed_timeend1|timewithouttimezone -workplans|BASETABLE|wed_timeend2|timewithouttimezone -workplans|BASETABLE|wed_timepause|timewithouttimezone -workplans|BASETABLE|wed_timestart1|timewithouttimezone -workplans|BASETABLE|wed_timestart2|timewithouttimezone -workplans|BASETABLE|workplan|text -worktypes|BASETABLE|id|integer -worktypes|BASETABLE|isfreetime|boolean -worktypes|BASETABLE|isworktime|boolean -worktypes|BASETABLE|typecolor|text -worktypes|BASETABLE|worktype|text diff --git a/dev/db/potlu_db.test2.tables.live.txt b/dev/db/potlu_db.test2.tables.live.txt deleted file mode 100644 index 3a72c19e..00000000 --- a/dev/db/potlu_db.test2.tables.live.txt +++ /dev/null @@ -1,25 +0,0 @@ - -reportperiod|BASETABLE -sites|BASETABLE -staff|BASETABLE -staffcontract|BASETABLE -staffgroups|BASETABLE -stafftimetracks|BASETABLE -staffvacancy|BASETABLE -staffvacancyyear|BASETABLE -staffworkplan|BASETABLE -vw_reportperiodlist|VIEW -vw_staffcontractdata|VIEW -vw_staffcontractlist|VIEW -vw_staffdata|VIEW -vw_staffgroupsdata|VIEW -vw_staffgroupslist|VIEW -vw_stafflist|VIEW -vw_staffplanned_dayweektotals|VIEW -vw_staffworkplanlist|VIEW -vw_staffworkplan_weekly|VIEW -vw_workplanlist|VIEW -vw_workplansdata|VIEW -vw_workplans|VIEW -workplans|BASETABLE -worktypes|BASETABLE diff --git a/dev/db/reinstallschema.sh b/dev/db/reinstallschema.sh new file mode 100644 index 00000000..107dc47a --- /dev/null +++ b/dev/db/reinstallschema.sh @@ -0,0 +1,18 @@ +#!/bin/bash +CALLDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +DBNAME="potlu_db" +DBUSER="potlu_user" +export PGPASSWORD="r2btTTRfuJz4whez" +DBHOST="sql629.your-server.de" + +if [[ $# -eq 0 ]] +then + echo "No args" + exit 0 +fi + +DBSCHEMA=$1 + +psql -h ${DBHOST} -U ${DBUSER} -w ${DBNAME} -c "DROP SCHEMA ${DBSCHEMA} CASCADE;" +psql -h ${DBHOST} -U ${DBUSER} -w ${DBNAME} < ${CALLDIR}"/"${DBNAME}"."${DBSCHEMA}".pg.schema.sql" +psql -h ${DBHOST} -U ${DBUSER} -w ${DBNAME} < ${CALLDIR}"/"${DBNAME}"."${DBSCHEMA}".pg.data.sql" \ No newline at end of file diff --git a/dev/db/update.demo.columns.txt b/dev/db/update.demo.columns.txt deleted file mode 100644 index c9d5ee83..00000000 --- a/dev/db/update.demo.columns.txt +++ /dev/null @@ -1,100 +0,0 @@ -reportperiod|BASETABLE|enddate|date -reportperiod|BASETABLE|id|integer -reportperiod|BASETABLE|periodname|text -reportperiod|BASETABLE|startdate|date -sites|BASETABLE|address|text -sites|BASETABLE|city|text -sites|BASETABLE|country|text -sites|BASETABLE|created|timestampwithouttimezone -sites|BASETABLE|id|integer -sites|BASETABLE|id_timetracker|integer -sites|BASETABLE|modified|timestampwithouttimezone -sites|BASETABLE|sitename|text -sites|BASETABLE|timeclockhost|text -sites|BASETABLE|zip|text -staff|BASETABLE|birthdate|date -staff|BASETABLE|entrydate|date -staff|BASETABLE|job|text -staff|BASETABLE|leavedate|date -staff|BASETABLE|staffnumber|text -staffcontract|BASETABLE|id|integer -staffcontract|BASETABLE|id_staffgroup|integer -staffcontract|BASETABLE|id_staff|integer -staffcontract|BASETABLE|monthhours|numeric -staffcontract|BASETABLE|startdate|date -staffcontract|BASETABLE|weekhours|numeric -staffgroups|BASETABLE|groupcolor|text -staffgroups|BASETABLE|groupname|text -staffgroups|BASETABLE|id|integer -stafftimetracks|BASETABLE|created|timestampwithouttimezone -stafftimetracks|BASETABLE|id|bigint -stafftimetracks|BASETABLE|id_staff|integer -stafftimetracks|BASETABLE|modified|timestampwithouttimezone -stafftimetracks|BASETABLE|stamp_in|timestampwithouttimezone -stafftimetracks|BASETABLE|stamp_out|timestampwithouttimezone -stafftimetracks|BASETABLE|tracktype|text -staffvacancy|BASETABLE|dayhours|timewithouttimezone -staffvacancy|BASETABLE|enddate|date -staffvacancy|BASETABLE|id|integer -staffvacancy|BASETABLE|id_staff|integer -staffvacancy|BASETABLE|note|text -staffvacancy|BASETABLE|startdate|date -staffvacancy|BASETABLE|vacancytype|text -staffvacancy|BASETABLE|validated|boolean -staffvacancyyear|BASETABLE|days|numeric -staffvacancyyear|BASETABLE|hours|numeric -staffvacancyyear|BASETABLE|id|integer -staffvacancyyear|BASETABLE|id_staff|integer -staffvacancyyear|BASETABLE|vyear|integer -staffworkplan|BASETABLE|daydate|date -staffworkplan|BASETABLE|id|bigint -staffworkplan|BASETABLE|id_staff|integer -staffworkplan|BASETABLE|timeend1|timewithouttimezone -staffworkplan|BASETABLE|timeend2|timewithouttimezone -staffworkplan|BASETABLE|timepause|timewithouttimezone -staffworkplan|BASETABLE|timestart1|timewithouttimezone -staffworkplan|BASETABLE|timestart2|timewithouttimezone -staffworkplan|BASETABLE|vacancyhours|timewithouttimezone -staffworkplan|BASETABLE|vacancytype|text -workplans|BASETABLE|fri_timeend1|timewithouttimezone -workplans|BASETABLE|fri_timeend2|timewithouttimezone -workplans|BASETABLE|fri_timepause|timewithouttimezone -workplans|BASETABLE|fri_timestart1|timewithouttimezone -workplans|BASETABLE|fri_timestart2|timewithouttimezone -workplans|BASETABLE|id|integer -workplans|BASETABLE|mon_timeend1|timewithouttimezone -workplans|BASETABLE|mon_timeend2|timewithouttimezone -workplans|BASETABLE|mon_timepause|timewithouttimezone -workplans|BASETABLE|mon_timestart1|timewithouttimezone -workplans|BASETABLE|mon_timestart2|timewithouttimezone -workplans|BASETABLE|sat_timeend1|timewithouttimezone -workplans|BASETABLE|sat_timeend2|timewithouttimezone -workplans|BASETABLE|sat_timepause|timewithouttimezone -workplans|BASETABLE|sat_timestart1|timewithouttimezone -workplans|BASETABLE|sat_timestart2|timewithouttimezone -workplans|BASETABLE|sun_timeend1|timewithouttimezone -workplans|BASETABLE|sun_timeend2|timewithouttimezone -workplans|BASETABLE|sun_timepause|timewithouttimezone -workplans|BASETABLE|sun_timestart1|timewithouttimezone -workplans|BASETABLE|sun_timestart2|timewithouttimezone -workplans|BASETABLE|thu_timeend1|timewithouttimezone -workplans|BASETABLE|thu_timeend2|timewithouttimezone -workplans|BASETABLE|thu_timepause|timewithouttimezone -workplans|BASETABLE|thu_timestart1|timewithouttimezone -workplans|BASETABLE|thu_timestart2|timewithouttimezone -workplans|BASETABLE|tue_timeend1|timewithouttimezone -workplans|BASETABLE|tue_timeend2|timewithouttimezone -workplans|BASETABLE|tue_timepause|timewithouttimezone -workplans|BASETABLE|tue_timestart1|timewithouttimezone -workplans|BASETABLE|tue_timestart2|timewithouttimezone -workplans|BASETABLE|wed_timeend1|timewithouttimezone -workplans|BASETABLE|wed_timeend2|timewithouttimezone -workplans|BASETABLE|wed_timepause|timewithouttimezone -workplans|BASETABLE|wed_timestart1|timewithouttimezone -workplans|BASETABLE|wed_timestart2|timewithouttimezone -workplans|BASETABLE|workplan|text -worktypes|BASETABLE|id|integer -worktypes|BASETABLE|isfreetime|boolean -worktypes|BASETABLE|isworktime|boolean -worktypes|BASETABLE|typecolor|text -worktypes|BASETABLE|worktype|text diff --git a/dev/db/update.demo.tables.txt b/dev/db/update.demo.tables.txt deleted file mode 100644 index 96647a37..00000000 --- a/dev/db/update.demo.tables.txt +++ /dev/null @@ -1,10 +0,0 @@ -reportperiod|BASETABLE -sites|BASETABLE -staffcontract|BASETABLE -staffgroups|BASETABLE -stafftimetracks|BASETABLE -staffvacancy|BASETABLE -staffvacancyyear|BASETABLE -staffworkplan|BASETABLE -workplans|BASETABLE -worktypes|BASETABLE diff --git a/dev/db/update.portanova.columns.txt b/dev/db/update.portanova.columns.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/dev/db/update.portanova.tables.txt b/dev/db/update.portanova.tables.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/dev/db/update.public.columns.txt b/dev/db/update.public.columns.txt index 1e1b0113..157a26b2 100644 --- a/dev/db/update.public.columns.txt +++ b/dev/db/update.public.columns.txt @@ -1,6 +1,5 @@ -public|users|BASETABLE|id_company|integer -public|users|BASETABLE|id_usergroups|json -public|users|BASETABLE|job|text -public|users|BASETABLE|phone|text -public|users|BASETABLE|prename|text -public|users|BASETABLE|surname|text +public|apps|BASETABLE|id_usergroups|json +public|companies|BASETABLE|reportperiodlength|integer +public|companies|BASETABLE|reportperiodstart|date +public|companies|BASETABLE|reportperiodunit|text +public|users|BASETABLE|id_usergroup|integer diff --git a/dev/db/update.test.columns.txt b/dev/db/update.test.columns.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/dev/db/update.test.tables.txt b/dev/db/update.test.tables.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/dev/db/update.test2.columns.txt b/dev/db/update.test2.columns.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/dev/db/update.test2.tables.txt b/dev/db/update.test2.tables.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/dev/db/users.sql b/dev/db/users.sql new file mode 100644 index 00000000..fa22dd07 --- /dev/null +++ b/dev/db/users.sql @@ -0,0 +1,4 @@ +INSERT INTO public.users (id, userpassword, created, "blocked", username, regcode, vcode, schemaaccess, id_company, id_usergroups, job, phone, prename, surname) VALUES(2, '6eae75b57865a4a2c6e7995ba9c9e03e7a81765fce6c3dce8673ea94e8ed4cfa', '2019-12-29 16:54:03.977', NULL, 'max.dibartolomeo@dbe.lu', NULL, NULL, '["pot"]', 2, '["3","2","5"]', NULL, NULL, 'Max', 'Di Bartolomeo'); +INSERT INTO public.users (id, userpassword, created, "blocked", username, regcode, vcode, schemaaccess, id_company, id_usergroups, job, phone, prename, surname) VALUES(4, 'a7a79278b41386634d6062a25756ba559b00690f3911bf889da09ac658cc4182', '2019-12-29 16:58:20.244', NULL, 'fiduciairetiger@gmail.com', NULL, NULL, '["pot"]', 2, '["2","3","5"]', NULL, NULL, 'André', 'Wantz'); +INSERT INTO public.users (id, userpassword, created, "blocked", username, regcode, vcode, schemaaccess, id_company, id_usergroups, job, phone, prename, surname) VALUES(3, '8b35dcf77029733c5565a167241c3129544aaa2d5d220feeee0be0042afa3040', '2019-12-29 16:55:37.027', NULL, 'pierre.eberhard@dbe.lu', NULL, NULL, '["pot"]', 2, '["2","3","5"]', NULL, NULL, 'Pierre', 'Eberhard'); +INSERT INTO public.users (id, userpassword, created, "blocked", username, regcode, vcode, schemaaccess, id_company, id_usergroups, job, phone, prename, surname) VALUES(1, 'a146bb8ab1ff4710ac055fb5dfe70cf24a676fb26a18ddc8ac90254d335e27f3', '2019-10-10 17:12:11.934', NULL, 'ksaffran@dks.lu', NULL, NULL, '["pot"]', 2, '["2","5","3"]', NULL, NULL, 'Kilian', 'Saffran'); diff --git a/dev/diff_files.sh b/dev/diff_files.sh index b143b79a..145ebe30 100644 --- a/dev/diff_files.sh +++ b/dev/diff_files.sh @@ -8,7 +8,7 @@ SSHHOST="www422.your-server.de" CALLDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd .. -find . -type f -printf "%p|%s\n" | grep -v -e "^\.\/\.git\/" | grep -v -e "\.\/dev\/" | grep -v -e "\.\/OLD\/" | grep -v -e "\.\/data\/output\/" | grep -v -e "\.\/data\/tmp\/" | sort > dev/sourcefiles.local.txt +find . -type f -printf "%p|%s\n" | grep -v -e "^\.\/\.git\/" | grep -v -e "\.\/dev\/" | grep -v -e "\.\/OLD\/" | grep -v -e "\/data\/output\/" | grep -v -e "\/data\/tmp\/" | grep -v -e "\/backoffice\/tmp\/" | sort > dev/sourcefiles.local.txt ssh -p ${SSHPORT} ${SSHUSER}@${SSHHOST} 'cd '${REMOTEFOLDER}' && find . -type f -printf "%p|%s\n" | sort' > dev/sourcefiles.remote.txt diff --git a/dev/sourcefiles.local.txt b/dev/sourcefiles.local.txt index c193beed..f570716e 100644 --- a/dev/sourcefiles.local.txt +++ b/dev/sourcefiles.local.txt @@ -661,10 +661,6 @@ ./backoffice/data/mail/body/user_forgotpasswd.tt|243 ./backoffice/data/mail/body/user_registration.tt|551 ./backoffice/data/mail/mail.tt|709 -./backoffice/data/output/pot/periode_20191230-20200223_pot_period.pdf|302716 -./backoffice/data/output/pot/periode_20200224-20200419_pot_period.pdf|299068 -./backoffice/data/output/pot/periode_20200420-20200614_pot_period.pdf|17755 -./backoffice/data/output/pot/periode_20200615-20200809_pot_period.pdf|18187 ./backoffice/data/reports/invoices/dks-deutsch.conf|244 ./backoffice/data/reports/invoices/dks-deutsch/dks_500.png|19377 ./backoffice/data/reports/invoices/dks-deutsch.footer.tt|1595 @@ -685,15 +681,6 @@ ./backoffice/data/reports/pot/pot_period.tt|3247 ./backoffice/data/schemata/defaultcompany.schema.sql|47179 ./backoffice/data/schemata/.htaccess|167 -./backoffice/data/tmp/pot_period4139.footer.html|1381 -./backoffice/data/tmp/pot_period4139.header.html|674 -./backoffice/data/tmp/pot_period4139.html|441145 -./backoffice/data/tmp/pot_period8800.footer.html|1381 -./backoffice/data/tmp/pot_period8800.header.html|674 -./backoffice/data/tmp/pot_period8800.html|414923 -./backoffice/data/tmp/pot_period8874.footer.html|1381 -./backoffice/data/tmp/pot_period8874.header.html|674 -./backoffice/data/tmp/pot_period8874.html|432945 ./backoffice/.htaccess|202 ./backoffice/img/bg1.jpg|135161 ./backoffice/img/favicon/android-icon-144x144.png|12179 @@ -897,12 +884,6 @@ ./backoffice/tmpl/skeleton/login/validationcode.tt|954 ./backoffice/tmpl/skeleton/module_file.tt|84 ./backoffice/tmpl/skeleton/module.tt|2584 -./backoffice/tmp/periods.html|13713 -./backoffice/tmp/rp.js|10474 -./backoffice/tmp/staffreportperiod.js|2268 -./backoffice/tmp/staffworkplan_daily.js|5230 -./backoffice/tmp/staffworkplanform.html|5985 -./backoffice/tmp/staffworkplan.js|24993 ./backoffice/vendors/choices/base.css|2320 ./backoffice/vendors/choices/base.min.css|1391 ./backoffice/vendors/choices/choices.css|8549 diff --git a/dev/sourcefiles.remote.txt b/dev/sourcefiles.remote.txt index 27d7f900..c8260b15 100644 --- a/dev/sourcefiles.remote.txt +++ b/dev/sourcefiles.remote.txt @@ -1,9 +1,10 @@ -./backoffice/api/db.cgi|4005 +./backoffice/api/db.cgi|4588 ./backoffice/api/file.cgi|4381 -./backoffice/api/index.cgi|6445 -./backoffice/api/lib/dksconfig.pm|1536 -./backoffice/api/lib/dksdb.pm|10421 +./backoffice/api/index.cgi|6962 +./backoffice/api/lib/dksconfig.pm|1525 +./backoffice/api/lib/dksdb.pm|10832 ./backoffice/api/lib/dkssavefile.pm|991 +./backoffice/api/lib/pdfreport.pm|4180 ./backoffice/api/lib/perl5/Business/Tax/VAT/Validation.pm|14797 ./backoffice/api/lib/perl5/CGI/Cookie.pm|6599 ./backoffice/api/lib/perl5/CGI/File/Temp.pm|969 @@ -646,8 +647,9 @@ ./backoffice/api/lib/perl5/x86_64-linux-gnu-thread-multi/Test/LeakTrace/Script.pm|986 ./backoffice/api/lib/perl5/x86_64-linux-gnu-thread-multi/Text/Soundex.pm|8345 ./backoffice/api/lib/sendemail_new.pm|4865 -./backoffice/api/lib/sendemail.pm|3040 +./backoffice/api/lib/sendemail.pm|3038 ./backoffice/api/lib/session.pm|9650 +./backoffice/api/report.cgi|3938 ./backoffice/api/sendEmail|80246 ./backoffice/api/tmp/mailbody_fiduciairetiger_gmail.com.txt|1026 ./backoffice/api/tmp/mailbody_ksaffran_dks.lu.txt|831 @@ -655,14 +657,33 @@ ./backoffice/api/tmp/mailbody_pierre.eberhard_dbe.lu.txt|1027 ./backoffice/api/upload.cgi|9418 ./backoffice/css/module.css|181 -./backoffice/css/w3pro.css|27053 +./backoffice/css/w3pro.css|27227 +./backoffice/css/w3pro.min.css|25940 ./backoffice/data/.htaccess|169 ./backoffice/data/mail/block/greeting.tt|180 ./backoffice/data/mail/block/signature.tt|62 ./backoffice/data/mail/body/user_forgotpasswd.tt|243 ./backoffice/data/mail/body/user_registration.tt|551 ./backoffice/data/mail/mail.tt|709 -./backoffice/data/schemata/defaultcompany.schema.sql|53843 +./backoffice/data/reports/invoices/dks-deutsch.conf|244 +./backoffice/data/reports/invoices/dks-deutsch/dks_500.png|19377 +./backoffice/data/reports/invoices/dks-deutsch.footer.tt|1595 +./backoffice/data/reports/invoices/dks-deutsch.header.tt|685 +./backoffice/data/reports/invoices/dks-deutsch/sitc.png|57392 +./backoffice/data/reports/invoices/dks-deutsch.tt|3712 +./backoffice/data/reports/invoices/staff_department.conf|262 +./backoffice/data/reports/invoices/staff_department.footer.tt|1595 +./backoffice/data/reports/invoices/staff_department.header.tt|685 +./backoffice/data/reports/invoices/staff_department.tt|3712 +./backoffice/data/reports/invoices/staff_workplan.conf|258 +./backoffice/data/reports/invoices/staff_workplan.footer.tt|1595 +./backoffice/data/reports/invoices/staff_workplan.header.tt|685 +./backoffice/data/reports/invoices/staff_workplan.tt|1568 +./backoffice/data/reports/pot/pot_period.conf|259 +./backoffice/data/reports/pot/pot_period.footer.tt|1381 +./backoffice/data/reports/pot/pot_period.header.tt|1205 +./backoffice/data/reports/pot/pot_period.tt|3247 +./backoffice/data/schemata/defaultcompany.schema.sql|47179 ./backoffice/data/schemata/.htaccess|167 ./backoffice/.htaccess|214 ./backoffice/img/bg1.jpg|135161 @@ -711,6 +732,7 @@ ./backoffice/img/icons/clubs_white.svg|1045 ./backoffice/img/icons/club_white.svg|835 ./backoffice/img/icons/code.svg|589 +./backoffice/img/icons/coin.svg|2323 ./backoffice/img/icons/company.svg|1482 ./backoffice/img/icons/company_white.svg|1498 ./backoffice/img/icons/cubelight.svg|1023 @@ -719,6 +741,8 @@ ./backoffice/img/icons/cube_white.svg|378 ./backoffice/img/icons/dashboard.svg|1085 ./backoffice/img/icons/dashboard_white.svg|1098 +./backoffice/img/icons/data_refresh.svg|2969 +./backoffice/img/icons/data_refresh_white.svg|2985 ./backoffice/img/icons/Document_Save.svg|729 ./backoffice/img/icons/documents.svg|987 ./backoffice/img/icons/documents_white.svg|1003 @@ -726,10 +750,11 @@ ./backoffice/img/icons/download_white.svg|351 ./backoffice/img/icons/duplicate.svg|430 ./backoffice/img/icons/duplicate_white.svg|442 -./backoffice/img/icons/edit.svg|712 +./backoffice/img/icons/edit.svg|750 ./backoffice/img/icons/edit_white.svg|725 ./backoffice/img/icons/excel.svg|1394 ./backoffice/img/icons/excel_white.svg|1410 +./backoffice/img/icons/expand.svg|322 ./backoffice/img/icons/file/dir.png|6937 ./backoffice/img/icons/file/doc.png|6455 ./backoffice/img/icons/file/docx.png|6455 @@ -776,22 +801,27 @@ ./backoffice/img/icons/numberlist_white.svg|920 ./backoffice/img/icons/package.svg|408 ./backoffice/img/icons/package_white.svg|420 +./backoffice/img/icons/pay.svg|3048 ./backoffice/img/icons/pdfexport.svg|2730 ./backoffice/img/icons/pdfexport_white.svg|2730 ./backoffice/img/icons/pdf.svg|3436 ./backoffice/img/icons/pdf_white.svg|3452 ./backoffice/img/icons/pictures.svg|1420 ./backoffice/img/icons/pictures_white.svg|1436 -./backoffice/img/icons/plus.svg|535 +./backoffice/img/icons/plus2.svg|535 +./backoffice/img/icons/plus.svg|404 ./backoffice/img/icons/plus_white.svg|547 ./backoffice/img/icons/poticon.svg|10061 ./backoffice/img/icons/projects.svg|939 ./backoffice/img/icons/projects_white.svg|955 -./backoffice/img/icons/remove.svg|816 +./backoffice/img/icons/remove_2.svg|816 +./backoffice/img/icons/remove.svg|447 ./backoffice/img/icons/remove_white.svg|828 +./backoffice/img/icons/rename.svg|1136 ./backoffice/img/icons/Save.svg|477 ./backoffice/img/icons/squares.svg|502 ./backoffice/img/icons/squares_white.svg|514 +./backoffice/img/icons/table.svg|454 ./backoffice/img/icons/target.svg|780 ./backoffice/img/icons/target_white.svg|792 ./backoffice/img/icons/upload.svg|507 @@ -804,47 +834,46 @@ ./backoffice/img/no-news-img.png|17922 ./backoffice/img/pottop.png|2689 ./backoffice/img/toplogo.png|31456 -./backoffice/index.cgi|5550 -./backoffice/js/admin.js|3435 +./backoffice/index.cgi|5552 +./backoffice/js/admin.js|2596 ./backoffice/js/.DS_Store|6148 -./backoffice/js/formsave.js|9096 -./backoffice/js/module_global.js|3286 -./backoffice/js/request.js|3866 +./backoffice/js/formsave.js|8472 +./backoffice/js/module_global.js|4107 +./backoffice/js/request.js|2967 ./backoffice/tmpl/block/cgu.tt|9358 +./backoffice/tmpl/block/dlgaction.tt|2865 ./backoffice/tmpl/block/dlgdataload.tt|1293 -./backoffice/tmpl/block/dlgdeleterow.tt|2573 +./backoffice/tmpl/block/dlgdeleterow.tt|2736 ./backoffice/tmpl/block/dlgmessage.tt|950 +./backoffice/tmpl/block/dlgreport.tt|2354 ./backoffice/tmpl/block/dlguploadfile.tt|3399 ./backoffice/tmpl/block/head.tt|1782 ./backoffice/tmpl/block/snackbar.tt|25 -./backoffice/tmpl/block/toolbars.tt|515 -./backoffice/tmpl/macro/fields.tt|8707 -./backoffice/tmpl/module/companies/index.js|229 -./backoffice/tmpl/module/companies/index.tt|626 +./backoffice/tmpl/block/toolbars.tt|519 +./backoffice/tmpl/macro/fields.tt|12382 +./backoffice/tmpl/module/companies/companies.js|4239 +./backoffice/tmpl/module/companies/index.js|186 +./backoffice/tmpl/module/companies/index.tt|8478 +./backoffice/tmpl/module/companies/staffgroups.js|2346 ./backoffice/tmpl/module/companies/widgets/companies/companies.js|4126 ./backoffice/tmpl/module/companies/widgets/companies/frm_companies.tt|1897 ./backoffice/tmpl/module/companies/widgets/companies/tbar_companies.tt|694 ./backoffice/tmpl/module/companies/widgets/companies/tbl_companies.tt|133 +./backoffice/tmpl/module/companies/worktimes.js|3616 ./backoffice/tmpl/module/dashboard/index.js|165 -./backoffice/tmpl/module/dashboard/index.tt|987 -./backoffice/tmpl/module/planning/index.js|305 -./backoffice/tmpl/module/planning/index.tt|1001 -./backoffice/tmpl/module/planning/widgets/reportperiod/dlg_reportperiod.tt|1396 -./backoffice/tmpl/module/planning/widgets/reportperiod/reportperiod.js|3491 -./backoffice/tmpl/module/planning/widgets/reportperiod/tbar_reportperiod.tt|632 -./backoffice/tmpl/module/planning/widgets/reportperiod/tbl_reportperiod.tt|139 -./backoffice/tmpl/module/planning/widgets/staffworkplan/frm_staffworkplan.tt|2928 -./backoffice/tmpl/module/planning/widgets/staffworkplan/staffworkplan.js|14277 -./backoffice/tmpl/module/planning/widgets/staffworkplan/tbar_staffworkplan.tt|912 -./backoffice/tmpl/module/planning/widgets/staffworkplan/tbl_staffworkplan.tt|141 +./backoffice/tmpl/module/dashboard/index.tt|1163 +./backoffice/tmpl/module/periods/index.js|219 +./backoffice/tmpl/module/periods/index.tt|7831 +./backoffice/tmpl/module/periods/reportperiod.js|4442 +./backoffice/tmpl/module/periods/staffperiodweeks.js|10895 ./backoffice/tmpl/module/profile/dlgpassword.tt|2911 ./backoffice/tmpl/module/profile/dlgusername.tt|3814 -./backoffice/tmpl/module/profile/index.js|1410 +./backoffice/tmpl/module/profile/index.js|403 ./backoffice/tmpl/module/profile/index.tt|1767 -./backoffice/tmpl/module/sites/index.js|4519 -./backoffice/tmpl/module/sites/index.tt|0 -./backoffice/tmpl/module/staff/index.js|247 -./backoffice/tmpl/module/staff/index.tt|701 +./backoffice/tmpl/module/staff/index.js|199 +./backoffice/tmpl/module/staff/index.tt|5754 +./backoffice/tmpl/module/staff/staffcontract.js|6449 +./backoffice/tmpl/module/staff/staff.js|3528 ./backoffice/tmpl/module/staff/widgets/staffcontract/dlg_staffcontract.tt|1344 ./backoffice/tmpl/module/staff/widgets/staffcontract/staffcontract.js|4239 ./backoffice/tmpl/module/staff/widgets/staffcontract/tbar_staffcontract.tt|645 @@ -853,17 +882,19 @@ ./backoffice/tmpl/module/staff/widgets/staff/staff.js|3787 ./backoffice/tmpl/module/staff/widgets/staff/tbar_staff.tt|672 ./backoffice/tmpl/module/staff/widgets/staff/tbl_staff.tt|125 -./backoffice/tmpl/module/timetrackers/index.js|399 -./backoffice/tmpl/module/timetrackers/index.tt|1304 -./backoffice/tmpl/module/users/index.js|221 -./backoffice/tmpl/module/users/index.tt|594 +./backoffice/tmpl/module/timetrackers/index.js|401 +./backoffice/tmpl/module/timetrackers/index.tt|1310 +./backoffice/tmpl/module/users/index.js|126 +./backoffice/tmpl/module/users/index.tt|3043 +./backoffice/tmpl/module/users/users.js|6741 ./backoffice/tmpl/module/users/widgets/users/dlg_users.tt|1765 ./backoffice/tmpl/module/users/widgets/users/tbar_users.tt|601 ./backoffice/tmpl/module/users/widgets/users/tbl_users.tt|125 ./backoffice/tmpl/module/users/widgets/users/users.js|6218 -./backoffice/tmpl/module/workplans/index.js|3126 -./backoffice/tmpl/module/workplans/index.tt|3065 -./backoffice/tmpl/skeleton/index.tt|4550 +./backoffice/tmpl/module/workplans/index.js|169 +./backoffice/tmpl/module/workplans/index.tt|5446 +./backoffice/tmpl/module/workplans/workplans.js|6385 +./backoffice/tmpl/skeleton/index.tt|4407 ./backoffice/tmpl/skeleton/login/accountreset.tt|1679 ./backoffice/tmpl/skeleton/login/forgotpassword.tt|874 ./backoffice/tmpl/skeleton/login/login.tt|1231 @@ -872,21 +903,22 @@ ./backoffice/tmpl/skeleton/login.tt|1171 ./backoffice/tmpl/skeleton/login/validationcode.tt|954 ./backoffice/tmpl/skeleton/module_file.tt|84 -./backoffice/tmpl/skeleton/module.tt|2718 -./backoffice/vendors/choices/base.css|2314 -./backoffice/vendors/choices/base.min.css|1604 -./backoffice/vendors/choices/choices.css|8099 +./backoffice/tmpl/skeleton/module.tt|2584 +./backoffice/vendors/choices/base.css|2320 +./backoffice/vendors/choices/base.min.css|1391 +./backoffice/vendors/choices/choices.css|8549 ./backoffice/vendors/choices/choices.js|217424 -./backoffice/vendors/choices/choices.min.css|6735 +./backoffice/vendors/choices/choices.min.css|6293 ./backoffice/vendors/choices/choices.min.js|91604 +./backoffice/vendors/choices/choices.min.orig.css|6735 +./backoffice/vendors/choices/choices.orig.css|8099 ./backoffice/vendors/choices/scripts/choices.js|217424 ./backoffice/vendors/choices/scripts/choices.min.js|91604 -./backoffice/vendors/ctxmenu/ctxmenu.css|1689 -./backoffice/vendors/ctxmenu/ctxmenu.js|7569 ./backoffice/vendors/flatpickr/flatpickr.css|18831 -./backoffice/vendors/flatpickr/flatpickr.js|118042 -./backoffice/vendors/flatpickr/flatpickr.min.css|15954 -./backoffice/vendors/flatpickr/flatpickr.min.js|48368 +./backoffice/vendors/flatpickr/flatpickr.js|118005 +./backoffice/vendors/flatpickr/flatpickr.min.css|15556 +./backoffice/vendors/flatpickr/flatpickr.min.js|48355 +./backoffice/vendors/flatpickr/flatpickr.min.orig.css|15954 ./backoffice/vendors/flatpickr/ie.css|260 ./backoffice/vendors/flatpickr/index.d.ts|138 ./backoffice/vendors/flatpickr/l10n/de.d.ts|2272 @@ -903,7 +935,7 @@ ./backoffice/vendors/flatpickr/plugins/labelPlugin/labelPlugin.d.ts|114 ./backoffice/vendors/flatpickr/plugins/labelPlugin/labelPlugin.js|964 ./backoffice/vendors/flatpickr/plugins/minMaxTimePlugin.d.ts|491 -./backoffice/vendors/flatpickr/plugins/minMaxTimePlugin.js|12399 +./backoffice/vendors/flatpickr/plugins/minMaxTimePlugin.js|12386 ./backoffice/vendors/flatpickr/plugins/monthSelect/index.d.ts|367 ./backoffice/vendors/flatpickr/plugins/monthSelect/index.js|7757 ./backoffice/vendors/flatpickr/plugins/monthSelect/style.css|1561 @@ -915,6 +947,7 @@ ./backoffice/vendors/flatpickr/plugins/weekSelect/weekSelect.d.ts|218 ./backoffice/vendors/flatpickr/plugins/weekSelect/weekSelect.js|3500 ./backoffice/vendors/flatpickr/themes/airbnb.css|21148 +./backoffice/vendors/flatpickr/themes/airbnb.min.css|17638 ./backoffice/vendors/flatpickr/themes/confetti.css|19048 ./backoffice/vendors/flatpickr/themes/dark.css|18875 ./backoffice/vendors/flatpickr/themes/light.css|18996 @@ -932,21 +965,6 @@ ./backoffice/vendors/flatpickr/utils/formatting.d.ts|834 ./backoffice/vendors/flatpickr/utils/index.d.ts|393 ./backoffice/vendors/flatpickr/utils/polyfills.d.ts|0 -./backoffice/vendors/jspdf/jspdf.min.js|307591 -./backoffice/vendors/jspdf/jspdf.plugin.autotable.js|71296 -./backoffice/vendors/jspdf/jspdf.plugin.autotable.min.js|30274 -./backoffice/vendors/jsxlsx/cpexcel.js|471033 -./backoffice/vendors/jsxlsx/jszip.js|288108 -./backoffice/vendors/jsxlsx/LICENSE|11356 -./backoffice/vendors/jsxlsx/shim.min.js|5651 -./backoffice/vendors/jsxlsx/xlsx.core.min.js|477227 -./backoffice/vendors/jsxlsx/xlsx.core.min.map|717898 -./backoffice/vendors/jsxlsx/xlsx.extendscript.js|992249 -./backoffice/vendors/jsxlsx/xlsx.full.min.js|921331 -./backoffice/vendors/jsxlsx/xlsx.full.min.map|841224 -./backoffice/vendors/jsxlsx/xlsx.js|696439 -./backoffice/vendors/jsxlsx/xlsx.min.js|397226 -./backoffice/vendors/jsxlsx/xlsx.min.map|586186 ./backoffice/vendors/moment/moment.js|150941 ./backoffice/vendors/moment/moment.min.js|53324 ./backoffice/vendors/moment/moment-with-locales.js|541363 @@ -1220,4 +1238,4 @@ ./index.cgi|2355 ./js/slides.js|669 ./tmpl/skeleton/index_next.tt|11738 -./tmpl/skeleton/index.tt|3324 +./tmpl/skeleton/index.tt|3321 -- 2.39.5