diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..1f0809a21 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,13 @@ +**NOTE**: (PR title should be of the form ticket:short description, e.g. TICKET-123: Add more templates) + +**JIRA ticket**: [TICKET-123](https://link.to.jira) + +**Summary**: + +A brief description of what this pull request aims to achieve + +**Changes**: +- List changes made in this pull request + +**To test**: +- List actions that should be taken to test that functionality works as expected diff --git a/api/assets/emails/dewar-transfer.html b/api/assets/emails/dewar-transfer.html index 7d930256d..099ed9587 100644 --- a/api/assets/emails/dewar-transfer.html +++ b/api/assets/emails/dewar-transfer.html @@ -5,16 +5,7 @@ Dear local contact: , -Your user: requested an internal transfer for his/her dewar(s). Please print this e-mail and affix it on the shipping case and put the dewar for the visit on the rack outside the beamline: "to be Stored at Diamond" by the . - -Local contact for next visit: - - -Dear EHC, - -Please collect the dewar from visit (Dewar Code: ) currently stored on the rack outside and transfer it to the rack in the MX storage room -The dewar should be ready for internal transfer by the - +Your user: from visit requested an internal transfer for his/her dewar(s). Please print this e-mail and affix it on the shipping case. Information for the transfer: @@ -42,14 +33,11 @@ Current dewar location -New Location in storage room - - -Pickup date: - - Local contact email (in case of problems finding the dewar): +Local contact for next visit: + + Comments: diff --git a/api/assets/emails/html/dewar-transfer.html b/api/assets/emails/html/dewar-transfer.html index be0387bd6..7be5954c1 100644 --- a/api/assets/emails/html/dewar-transfer.html +++ b/api/assets/emails/html/dewar-transfer.html @@ -3,16 +3,9 @@

Local Contact:

-

requested an internal transfer for his/her dewar(s). Please print this e-mail and affix it on the shipping case and put the dewar for the visit on the rack outside the beamline: "to be Stored at Diamond" by the

-

Local contact for next visit:

+

from visit requested an internal transfer for his/her dewar(s). Please print this e-mail and affix it on the shipping case.

-
-

EHCs

-

Please collect the dewar from visit (Dewar Code: ) currently stored on the rack outside and transfer it to the rack in the MX storage room

-

The dewar should be ready for internal transfer by the

-
- @@ -40,11 +33,10 @@

EHCs

- - + + - @@ -61,12 +53,7 @@

EHCs

- - - - - - + diff --git a/api/src/Database/DatabaseQueryBuilder.php b/api/src/Database/DatabaseQueryBuilder.php index 8046a9ef2..1a41ba920 100644 --- a/api/src/Database/DatabaseQueryBuilder.php +++ b/api/src/Database/DatabaseQueryBuilder.php @@ -24,8 +24,11 @@ class DatabaseQueryBuilder private $query_bound_values = []; /** @var ?string where clause column name */ private $where_columnName = Null; - /** @var ?mixed where vlause value */ + /** @var ?mixed where clause value */ private $where_value = Null; + /** @var array join clauses*/ + private $join_clauses = []; + /** * @var DatabaseParent database parent to use */ @@ -104,6 +107,33 @@ public function insert($expectedTable) return $this->db->id(); } + + /** + * Add while join clauses with no processing except to remove duplicates + * ONLY USED WITH getJoins at the moment + * + * @param string $join_clause The join clause to add, e.g. JOIN table t ON t.id = s.id + * @return DatabaseQueryBuilder the builder + */ + public function joinClause($join_clause) + { + if (!in_array($join_clause, $this->join_clauses)) + array_push($this->join_clauses, $join_clause); + return $this; + } + + /** + * Pull back the join clauses ready to be added to a SQL statement + * + * This is a half-way house into adding join caluses to this builder + * + * @return string The join caluses as one long string + */ + public function getJoins() + { + return implode(" ", $this->join_clauses); + } + private function bindArrayAsList($values): string { $bound_list_sql = ""; diff --git a/api/src/Model/Services/AssignData.php b/api/src/Model/Services/AssignData.php index 96657b322..f2d681a41 100644 --- a/api/src/Model/Services/AssignData.php +++ b/api/src/Model/Services/AssignData.php @@ -21,7 +21,7 @@ function getContainer($visitId, $containerId) INNER JOIN shipping s ON s.shippingid = d.shippingid INNER JOIN blsession bl ON bl.proposalid = s.proposalid INNER JOIN proposal p ON s.proposalid = p.proposalid - WHERE CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), bl.visit_number) LIKE :1 + WHERE CONCAT(p.proposalcode, p.proposalnumber, '-', bl.visit_number) LIKE :1 AND c.containerid=:2", array($visitId, $containerId)); } @@ -65,7 +65,7 @@ function getDewar($dewarId, $proposalId, $visitId) $arg = $proposalId; if ($visitId) { - $where = "CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), bl.visit_number) LIKE :1"; + $where = "CONCAT(p.proposalcode, p.proposalnumber, '-', bl.visit_number) LIKE :1"; $arg = $visitId; } @@ -113,4 +113,4 @@ function getContainerBarcodesForProposal($proposalId) INNER JOIN containerregistry_has_proposal crhp ON crhp.containerregistryid = cr.containerregistryid WHERE crhp.proposalid = :1", array($proposalId)); } -} \ No newline at end of file +} diff --git a/api/src/Model/Services/UserData.php b/api/src/Model/Services/UserData.php index c3a611d0b..bb762b322 100644 --- a/api/src/Model/Services/UserData.php +++ b/api/src/Model/Services/UserData.php @@ -154,7 +154,7 @@ function getUsers($getCount, $isStaffMember, $stringMatch, $page, $sortBy = null INNER JOIN proposal pr ON pr.proposalid = s.proposalid LEFT OUTER JOIN session_has_person shp2 ON p.personid = shp2.personid LEFT OUTER JOIN blsession ses ON ses.sessionid = shp2.sessionid AND ses.startdate < s.startdate'; - $where .= " AND shp.remote IS NOT NULL AND CONCAT(CONCAT(CONCAT(pr.proposalcode,pr.proposalnumber), '-'), s.visit_number) LIKE :" . (sizeof($args) + 1); + $where .= " AND shp.remote IS NOT NULL AND CONCAT(pr.proposalcode, pr.proposalnumber, '-', s.visit_number) LIKE :" . (sizeof($args) + 1); $group = 'GROUP BY p.personid, p.givenname, p.familyname, p.login'; array_push($args, $visitName); } @@ -162,7 +162,7 @@ function getUsers($getCount, $isStaffMember, $stringMatch, $page, $sortBy = null { $join = 'INNER JOIN project_has_person php ON p.personid = php.personid'; $where .= ' AND php.projectid=:' . (sizeof($args) + 1); - $extc = "CONCAT(CONCAT(p.personid, '-'), php.projectid) as ppid,"; + $extc = "CONCAT(p.personid, '-', php.projectid) as ppid,"; array_push($args, $pjid); } @@ -192,7 +192,7 @@ function getUsers($getCount, $isStaffMember, $stringMatch, $page, $sortBy = null } } - $rows = $this->db->paginate("SELECT $extc p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country + $rows = $this->db->paginate("SELECT $extc p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM person p LEFT OUTER JOIN proposalhasperson prhp ON prhp.personid = p.personid LEFT OUTER JOIN labcontact lc ON lc.personid = p.personid @@ -253,7 +253,7 @@ function getUsersForProposal($where, $getCount, $page, $sortBy, $proposalid, $cu } } - $extc = "p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country"; + $extc = "p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country"; $rows = $this->db->paginate("(SELECT $extc FROM person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid diff --git a/api/src/Page.php b/api/src/Page.php index 0a712db31..603592949 100644 --- a/api/src/Page.php +++ b/api/src/Page.php @@ -272,7 +272,7 @@ function auth($require_staff) } else { - $rows = $this->db->pq("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as vis + $rows = $this->db->pq("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as vis FROM proposal p INNER JOIN blsession s ON p.proposalid = s.proposalid INNER JOIN session_has_person shp ON shp.sessionid = s.sessionid @@ -315,7 +315,7 @@ function auth($require_staff) if ($table == 'datacollectiongroup') { - $vis = $this->db->pq("SELECT p.proposalid, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as vis + $vis = $this->db->pq("SELECT p.proposalid, CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as vis FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) INNER JOIN datacollectiongroup dcg ON s.sessionid = dcg.sessionid @@ -323,7 +323,7 @@ function auth($require_staff) } else { - $vis = $this->db->pq("SELECT p.proposalid, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as vis + $vis = $this->db->pq("SELECT p.proposalid, CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as vis FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) INNER JOIN $table dc ON s.sessionid = dc.sessionid WHERE dc.$col = :1", array($this->arg('id'))); @@ -339,7 +339,7 @@ function auth($require_staff) { $vis = $this->arg('visit'); - $visp = $this->db->pq("SELECT p.proposalid FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) LIKE :1", array($this->arg('visit'))); + $visp = $this->db->pq("SELECT p.proposalid FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :1", array($this->arg('visit'))); if (sizeof($visp)) $this->proposalid = $visp[0]['PROPOSALID']; @@ -348,7 +348,7 @@ function auth($require_staff) } else if ($this->has_arg('prop')) { - $viss = $this->db->pq("SELECT p.proposalid, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as vis FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE CONCAT(p.proposalcode, p.proposalnumber) LIKE :1", array($this->arg('prop'))); + $viss = $this->db->pq("SELECT p.proposalid, CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as vis FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE CONCAT(p.proposalcode, p.proposalnumber) LIKE :1", array($this->arg('prop'))); $vis = array(); foreach ($viss as $v) @@ -780,8 +780,8 @@ function blsr_visits() if (!$b) return array(); - $visits = $this->db->pq("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE TIMESTAMPDIFF('DAY', s.startdate, CURRENT_TIMESTAMP) < 1 AND TIMESTAMPDIFF('DAY', CURRENT_TIMESTAMP, s.enddate) < 2 AND s.beamlinename LIKE :1 ORDER BY s.startdate", array($b)); - $v = $this->db->paginate("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE p.proposalcode LIKE 'cm' AND s.beamlinename LIKE :1 AND s.enddate <= CURRENT_TIMESTAMP ORDER BY s.startdate DESC", array($b, 0, 1)); + $visits = $this->db->pq("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE TIMESTAMPDIFF('DAY', s.startdate, CURRENT_TIMESTAMP) < 1 AND TIMESTAMPDIFF('DAY', CURRENT_TIMESTAMP, s.enddate) < 2 AND s.beamlinename LIKE :1 ORDER BY s.startdate", array($b)); + $v = $this->db->paginate("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE p.proposalcode LIKE 'cm' AND s.beamlinename LIKE :1 AND s.enddate <= CURRENT_TIMESTAMP ORDER BY s.startdate DESC", array($b, 0, 1)); $visits = array_merge($visits, $v); return $visits; } @@ -1137,4 +1137,4 @@ protected function haltIfLackingPermission($permission) { $this->user->can($permission, $this->app); } -} \ No newline at end of file +} diff --git a/api/src/Page/Cal.php b/api/src/Page/Cal.php index cbfada03d..428e2433d 100644 --- a/api/src/Page/Cal.php +++ b/api/src/Page/Cal.php @@ -55,13 +55,13 @@ function _export_ics() { array_push($args, $hash['CKEY']); } - $visits = $this->db->pq("SELECT s.beamlineoperator as lc, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as vis, CONCAT(p.proposalcode, p.proposalnumber) as prop, s.beamlinename as bl, TO_CHAR(s.startdate, 'DD-MM-YYYY') as d, TO_CHAR(s.enddate, 'DD-MM-YYYY') as e, TO_CHAR(s.startdate, 'HH24:MI') as st, TO_CHAR(s.enddate, 'HH24:MI') as en, s.sessionid + $visits = $this->db->pq("SELECT s.beamlineoperator as lc, CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as vis, CONCAT(p.proposalcode, p.proposalnumber) as prop, s.beamlinename as bl, TO_CHAR(s.startdate, 'DD-MM-YYYY') as d, TO_CHAR(s.enddate, 'DD-MM-YYYY') as e, TO_CHAR(s.startdate, 'HH24:MI') as st, TO_CHAR(s.enddate, 'HH24:MI') as en, s.sessionid FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE s.startdate > TO_DATE(:1,'YYYY') $where ORDER BY s.startdate, s.beamlinename", $args); - $user_tmp = $this->db->pq("SELECT s.sessionid, pe.login, CONCAT(CONCAT(pe.givenname, ' '), pe.familyname) as fullname, shp.role + $user_tmp = $this->db->pq("SELECT s.sessionid, pe.login, CONCAT(pe.givenname, ' ', pe.familyname) as fullname, shp.role FROM person pe INNER JOIN session_has_person shp ON shp.personid = pe.personid INNER JOIN blsession s ON s.sessionid = shp.sessionid diff --git a/api/src/Page/Cell.php b/api/src/Page/Cell.php index 1ee300ca5..80fbcc071 100644 --- a/api/src/Page/Cell.php +++ b/api/src/Page/Cell.php @@ -147,7 +147,7 @@ function _cells($output = true) if ($tot % $pp != 0) $pgs++; - $rows = $this->db->paginate("SELECT s.sessionid, api.autoprocprogramid, api.autoprocintegrationid, sqrt(power(ap.refinedcell_a-:13,2)+power(ap.refinedcell_b-:14,2)+power(ap.refinedcell_c-:15,2)+power(ap.refinedcell_alpha-:16,2)+power(ap.refinedcell_beta-:17,2)+power(ap.refinedcell_gamma-:18,2)) as dist, s.beamlinename as bl, app.processingcommandline as type, apss.ntotalobservations as ntobs, apss.ntotaluniqueobservations as nuobs, apss.resolutionlimitlow as rlow, apss.resolutionlimithigh as rhigh, apss.scalingstatisticstype as shell, apss.rmerge, apss.completeness, apss.multiplicity, apss.meanioversigi as isigi, ap.spacegroup as sg, ap.refinedcell_a as cell_a, ap.refinedcell_b as cell_b, ap.refinedcell_c as cell_c, ap.refinedcell_alpha as cell_al, ap.refinedcell_beta as cell_be, ap.refinedcell_gamma as cell_ga, dc.datacollectionid as id, TO_CHAR(dc.starttime, 'DD-MM-YYYY HH24:MI:SS') as st, dc.imagedirectory as dir, dc.filetemplate, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, dc.numberofimages as numimg, dc.axisrange, dc.axisstart, dc.wavelength, dc.transmission, dc.exposuretime, IFNULL(dc.rotationaxis, 'Omega') as rotationaxis + $rows = $this->db->paginate("SELECT s.sessionid, api.autoprocprogramid, api.autoprocintegrationid, sqrt(power(ap.refinedcell_a-:13,2)+power(ap.refinedcell_b-:14,2)+power(ap.refinedcell_c-:15,2)+power(ap.refinedcell_alpha-:16,2)+power(ap.refinedcell_beta-:17,2)+power(ap.refinedcell_gamma-:18,2)) as dist, s.beamlinename as bl, app.processingcommandline as type, apss.ntotalobservations as ntobs, apss.ntotaluniqueobservations as nuobs, apss.resolutionlimitlow as rlow, apss.resolutionlimithigh as rhigh, apss.scalingstatisticstype as shell, apss.rmerge, apss.completeness, apss.multiplicity, apss.meanioversigi as isigi, ap.spacegroup as sg, ap.refinedcell_a as cell_a, ap.refinedcell_b as cell_b, ap.refinedcell_c as cell_c, ap.refinedcell_alpha as cell_al, ap.refinedcell_beta as cell_be, ap.refinedcell_gamma as cell_ga, dc.datacollectionid as id, TO_CHAR(dc.starttime, 'DD-MM-YYYY HH24:MI:SS') as st, dc.imagedirectory as dir, dc.filetemplate, CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, dc.numberofimages as numimg, dc.axisrange, dc.axisstart, dc.wavelength, dc.transmission, dc.exposuretime, IFNULL(dc.rotationaxis, 'Omega') as rotationaxis FROM autoprocintegration api INNER JOIN autoprocscaling_has_int aph ON api.autoprocintegrationid = aph.autoprocintegrationid INNER JOIN autoprocscaling aps ON aph.autoprocscalingid = aps.autoprocscalingid @@ -470,4 +470,4 @@ function _proxy_pdbs() $this->app->contentType('text/plain'); $this->app->response()->body($response); } -} \ No newline at end of file +} diff --git a/api/src/Page/DC.php b/api/src/Page/DC.php index 1cfbd8a3c..c6e49a59c 100644 --- a/api/src/Page/DC.php +++ b/api/src/Page/DC.php @@ -176,7 +176,7 @@ function _data_collections($single = null) $info = array(); # Visits if ($this->has_arg('visit')) { - $info = $this->db->pq("SELECT TO_CHAR(s.startdate, 'HH24') as sh, TO_CHAR(s.startdate, 'DDMMYYYY') as dmy, s.sessionid, s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) LIKE :1", array($this->arg('visit'))); + $info = $this->db->pq("SELECT TO_CHAR(s.startdate, 'HH24') as sh, TO_CHAR(s.startdate, 'DDMMYYYY') as dmy, s.sessionid, s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :1", array($this->arg('visit'))); if (!sizeof($info)) { $this->_error('No such visit'); @@ -225,8 +225,8 @@ function _data_collections($single = null) array('project_has_xfefspectrum', 'xrf', 'xfefluorescencespectrumid'), ); - $extc = "CONCAT(CONCAT(CONCAT(prop.proposalcode,prop.proposalnumber), '-'), ses.visit_number) as vis, CONCAT(prop.proposalcode, prop.proposalnumber) as prop, "; - $extcg = "max(CONCAT(CONCAT(CONCAT(prop.proposalcode,prop.proposalnumber), '-'), ses.visit_number)) as vis, max(CONCAT(prop.proposalcode, prop.proposalnumber)) as prop, "; + $extc = "CONCAT(prop.proposalcode, prop.proposalnumber, '-', ses.visit_number) as vis, CONCAT(prop.proposalcode, prop.proposalnumber) as prop, "; + $extcg = "max(CONCAT(prop.proposalcode, prop.proposalnumber, '-', ses.visit_number)) as vis, max(CONCAT(prop.proposalcode, prop.proposalnumber)) as prop, "; if ($this->has_arg('dcg')) $extcg = $extc; @@ -1063,7 +1063,7 @@ function _chk_image() return; } - $dct = $this->db->pq("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as vis, dc.datacollectionid as id, dc.startimagenumber, dc.filetemplate, dc.xtalsnapshotfullpath1 as x1, dc.xtalsnapshotfullpath2 as x2, dc.xtalsnapshotfullpath3 as x3, dc.xtalsnapshotfullpath4 as x4,dc.imageprefix as imp, dc.datacollectionnumber as run, dc.imagedirectory as dir, s.visit_number + $dct = $this->db->pq("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as vis, dc.datacollectionid as id, dc.startimagenumber, dc.filetemplate, dc.xtalsnapshotfullpath1 as x1, dc.xtalsnapshotfullpath2 as x2, dc.xtalsnapshotfullpath3 as x3, dc.xtalsnapshotfullpath4 as x4,dc.imageprefix as imp, dc.datacollectionnumber as run, dc.imagedirectory as dir, s.visit_number FROM datacollection dc INNER JOIN datacollectiongroup dcg ON dcg.datacollectiongroupid = dc.datacollectiongroupid INNER JOIN blsession s ON s.sessionid = dcg.sessionid diff --git a/api/src/Page/Download.php b/api/src/Page/Download.php index 4d4ce8099..b86188db5 100644 --- a/api/src/Page/Download.php +++ b/api/src/Page/Download.php @@ -289,7 +289,7 @@ function _csv_report() if (!$this->has_arg('visit')) $this->_error('No visit specified', 'You must specify a visit to download a report for'); - $vis = $this->db->pq("SELECT s.sessionid,s.beamlinename,TO_CHAR(s.startdate, 'DD_MM_YYYY') as st FROM blsession s INNER JOIN proposal p ON p.proposalid = s.proposalid WHERE CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) LIKE :1", array($this->arg('visit'))); + $vis = $this->db->pq("SELECT s.sessionid,s.beamlinename,TO_CHAR(s.startdate, 'DD_MM_YYYY') as st FROM blsession s INNER JOIN proposal p ON p.proposalid = s.proposalid WHERE CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :1", array($this->arg('visit'))); if (!sizeof($vis)) $this->_error('No such visit', 'The specified visit doesnt exist'); diff --git a/api/src/Page/Fault.php b/api/src/Page/Fault.php index 759e3e8a5..1c7f58004 100644 --- a/api/src/Page/Fault.php +++ b/api/src/Page/Fault.php @@ -119,7 +119,7 @@ function _get_faults() if ($this->has_arg('visit')) { - array_push($where, "CONCAT(CONCAT(CONCAT(p.proposalcode,p.proposalnumber),'-'),bl.visit_number) LIKE :" . (sizeof($args) + 1)); + array_push($where, "CONCAT(p.proposalcode, p.proposalnumber, '-', bl.visit_number) LIKE :" . (sizeof($args) + 1)); array_push($args, $this->arg('visit')); } @@ -202,7 +202,7 @@ function _get_faults() array_push($args, $start); array_push($args, $end); - $rows = $this->db->paginate("SELECT $ext_columns f.personid, f.assigneeid, CONCAT(CONCAT(pe.givenname, ' '), pe.familyname) as name, CONCAT(CONCAT(asi.givenname, ' '), asi.familyname) as assignee, f.faultid, f.sessionid, f.elogid, f.attachment, CONCAT(CONCAT(CONCAT(p.proposalcode,p.proposalnumber),'-'),bl.visit_number) as visit, bl.beamlinename as beamline, s.systemid, s.name as system, c.componentid, c.name as component, f.subcomponentid, sc.name as subcomponent, TO_CHAR(f.starttime, 'DD-MM-YYYY HH24:MI') as starttime, TO_CHAR(f.endtime, 'DD-MM-YYYY HH24:MI') as endtime, f.beamtimelost, round(TIMESTAMPDIFF('MINUTE',f.beamtimelost_starttime, f.beamtimelost_endtime)/60,2) as lost, f.title, f.resolved, TO_CHAR(f.beamtimelost_endtime, 'DD-MM-YYYY HH24:MI') as beamtimelost_endtime, TO_CHAR(f.beamtimelost_starttime, 'DD-MM-YYYY HH24:MI') as beamtimelost_starttime + $rows = $this->db->paginate("SELECT $ext_columns f.personid, f.assigneeid, CONCAT(pe.givenname, ' ', pe.familyname) as name, CONCAT(asi.givenname, ' ', asi.familyname) as assignee, f.faultid, f.sessionid, f.elogid, f.attachment, CONCAT(p.proposalcode, p.proposalnumber, '-', bl.visit_number) as visit, bl.beamlinename as beamline, s.systemid, s.name as system, c.componentid, c.name as component, f.subcomponentid, sc.name as subcomponent, TO_CHAR(f.starttime, 'DD-MM-YYYY HH24:MI') as starttime, TO_CHAR(f.endtime, 'DD-MM-YYYY HH24:MI') as endtime, f.beamtimelost, round(TIMESTAMPDIFF('MINUTE',f.beamtimelost_starttime, f.beamtimelost_endtime)/60,2) as lost, f.title, f.resolved, TO_CHAR(f.beamtimelost_endtime, 'DD-MM-YYYY HH24:MI') as beamtimelost_endtime, TO_CHAR(f.beamtimelost_starttime, 'DD-MM-YYYY HH24:MI') as beamtimelost_starttime FROM bf_fault f INNER JOIN person pe ON pe.personid = f.personid LEFT OUTER JOIN person asi ON asi.personid = f.assigneeid @@ -280,7 +280,7 @@ function _update_fault() if ($f == 'SESSIONID') { - $v = $this->db->pq("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode,p.proposalnumber),'-'),bl.visit_number) as visit FROM blsession bl INNER JOIN proposal p ON bl.proposalid = p.proposalid WHERE bl.sessionid=:1", array($this->arg($f))); + $v = $this->db->pq("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', bl.visit_number) as visit FROM blsession bl INNER JOIN proposal p ON bl.proposalid = p.proposalid WHERE bl.sessionid=:1", array($this->arg($f))); if (sizeof($v)) { $this->_output(array('VISIT' => $v[0]['VISIT'])); @@ -628,7 +628,7 @@ function _add_fault() $newid = $this->db->id(); - $info = $this->db->pq("SELECT CONCAT(CONCAT(pe.givenname, ' '), pe.familyname) as name, CONCAT(CONCAT(CONCAT(p.proposalcode,p.proposalnumber),'-'),bl.visit_number) as visit, bl.beamlinename as beamline, s.name as system, c.name as component, sc.name as subcomponent, TO_CHAR(f.starttime, 'DD-MM-YYYY HH24:MI') as starttime, TO_CHAR(f.endtime, 'DD-MM-YYYY HH24:MI') as endtime, f.beamtimelost, round(TIMESTAMPDIFF('MINUTE', f.beamtimelost_starttime, f.beamtimelost_endtime)/60,2) as lost, f.title, f.resolved, f.resolution, f.description, TO_CHAR(f.beamtimelost_endtime, 'DD-MM-YYYY HH24:MI') as beamtimelost_endtime, TO_CHAR(f.beamtimelost_starttime, 'DD-MM-YYYY HH24:MI') as beamtimelost_starttime, f.owner + $info = $this->db->pq("SELECT CONCAT(pe.givenname, ' ', pe.familyname) as name, CONCAT(p.proposalcode, p.proposalnumber, '-', bl.visit_number) as visit, bl.beamlinename as beamline, s.name as system, c.name as component, sc.name as subcomponent, TO_CHAR(f.starttime, 'DD-MM-YYYY HH24:MI') as starttime, TO_CHAR(f.endtime, 'DD-MM-YYYY HH24:MI') as endtime, f.beamtimelost, round(TIMESTAMPDIFF('MINUTE', f.beamtimelost_starttime, f.beamtimelost_endtime)/60,2) as lost, f.title, f.resolved, f.resolution, f.description, TO_CHAR(f.beamtimelost_endtime, 'DD-MM-YYYY HH24:MI') as beamtimelost_endtime, TO_CHAR(f.beamtimelost_starttime, 'DD-MM-YYYY HH24:MI') as beamtimelost_starttime, f.owner FROM bf_fault f INNER JOIN bf_subcomponent sc ON f.subcomponentid = sc.subcomponentid INNER JOIN bf_component c ON sc.componentid = c.componentid @@ -692,4 +692,4 @@ function _add_fault() $this->_output(array('FAULTID' => $newid)); } -} \ No newline at end of file +} diff --git a/api/src/Page/Image.php b/api/src/Page/Image.php index 1bce9b3e9..56925ae6d 100644 --- a/api/src/Page/Image.php +++ b/api/src/Page/Image.php @@ -119,7 +119,7 @@ function _action_image() { FROM robotaction r INNER JOIN blsession s ON r.blsessionid = s.sessionid INNER JOIN proposal p ON s.proposalid = p.proposalid - WHERE r.robotactionid=:1 AND CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) LIKE :2", array($this->arg('aid'), $this->arg('visit'))); + WHERE r.robotactionid=:1 AND CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :2", array($this->arg('aid'), $this->arg('visit'))); //print_r($image); diff --git a/api/src/Page/Imaging.php b/api/src/Page/Imaging.php index ccb7b7abd..09d704bce 100644 --- a/api/src/Page/Imaging.php +++ b/api/src/Page/Imaging.php @@ -440,7 +440,7 @@ function _get_inspections() } $inspections = $this->db->paginate("SELECT ROUND(TIMESTAMPDIFF('HOUR', i.bltimestamp, CURRENT_TIMESTAMP)/24,1) as age, ROUND(TIMESTAMPDIFF('MINUTE', i.scheduledtimestamp, i.bltimestamp)/(24*60),2) as dwell, c.code as container, CONCAT(p.proposalcode, p.proposalnumber) as prop, TO_CHAR(min(im.modifiedtimestamp), 'DD-MM-YYYY HH24:MI') as imagesscoredtimestamp, case when count(im.blsampleimageid) > 0 then 1 else 0 end as imagesscored, - TO_CHAR(i.scheduledtimestamp, 'DD-MM-YYYY HH24:MI') as scheduledtimestamp, sc.offset_hours, i.priority, i.state, i.schedulecomponentid, i.manual, img.name as imager, it.name as inspectiontype, i.containerinspectionid, i.containerid, i.inspectiontypeid, i.temperature, TO_CHAR(i.bltimestamp, 'DD-MM-YYYY HH24:MI') as bltimestamp, i.imagerid, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), ses.visit_number) as visit, ses.visit_number, TIMESTAMPDIFF('MINUTE', i.bltimestamp, i.completedtimestamp) as duration $extc + TO_CHAR(i.scheduledtimestamp, 'DD-MM-YYYY HH24:MI') as scheduledtimestamp, sc.offset_hours, i.priority, i.state, i.schedulecomponentid, i.manual, img.name as imager, it.name as inspectiontype, i.containerinspectionid, i.containerid, i.inspectiontypeid, i.temperature, TO_CHAR(i.bltimestamp, 'DD-MM-YYYY HH24:MI') as bltimestamp, i.imagerid, CONCAT(p.proposalcode, p.proposalnumber, '-', ses.visit_number) as visit, ses.visit_number, TIMESTAMPDIFF('MINUTE', i.bltimestamp, i.completedtimestamp) as duration $extc FROM containerinspection i LEFT OUTER JOIN schedulecomponent sc ON sc.schedulecomponentid = i.schedulecomponentid LEFT OUTER JOIN blsampleimage im ON im.containerinspectionid = i.containerinspectionid AND im.blsampleimagescoreid IS NOT NULL diff --git a/api/src/Page/PDF.php b/api/src/Page/PDF.php index 326ca05ad..48d6944d3 100644 --- a/api/src/Page/PDF.php +++ b/api/src/Page/PDF.php @@ -202,10 +202,10 @@ function _visit_report() $this->_error('No visit specified', 'You need to specify a visit to view this page'); } - $info = $this->db->pq("SELECT TIMESTAMPDIFF('MINUTE', s.startdate, s.enddate)/60 as len, s.sessionid as sid, s.beamlinename, s.beamlineoperator as lc, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, CONCAT(p.proposalcode, p.proposalnumber) as prop + $info = $this->db->pq("SELECT TIMESTAMPDIFF('MINUTE', s.startdate, s.enddate)/60 as len, s.sessionid as sid, s.beamlinename, s.beamlineoperator as lc, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en, CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, CONCAT(p.proposalcode, p.proposalnumber) as prop FROM blsession s INNER JOIN proposal p ON p.proposalid = s.proposalid - WHERE CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) LIKE :1", array($this->arg('visit'))); + WHERE CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :1", array($this->arg('visit'))); if (!sizeof($info)) $this->_error('No such visit', 'The specified visit doesnt exist'); diff --git a/api/src/Page/Processing.php b/api/src/Page/Processing.php index fd2996fa1..4620f4abb 100644 --- a/api/src/Page/Processing.php +++ b/api/src/Page/Processing.php @@ -400,7 +400,7 @@ function _get_downstreams($dcid = null, $aid = null) { app.processingstatus, app.processingmessage, app.processingstarttime, app.processingendtime, pj.recipe, pj.comments as processingcomments, dc.imageprefix as dcimageprefix, dc.imagedirectory as dcimagedirectory, - CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, + CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, GROUP_CONCAT(CONCAT(pjp.parameterkey, '=', pjp.parametervalue)) as parameters FROM datacollection dc INNER JOIN datacollectiongroup dcg ON dcg.datacollectiongroupid = dc.datacollectiongroupid diff --git a/api/src/Page/Projects.php b/api/src/Page/Projects.php index 132d3d385..34e4eb239 100644 --- a/api/src/Page/Projects.php +++ b/api/src/Page/Projects.php @@ -78,7 +78,7 @@ function _projects() array_push($args, $start); array_push($args, $end); - $rows = $this->db->paginate("SELECT p.title, p.projectid, p.acronym, p.personid, CONCAT(CONCAT(pe.givenname, ' '), pe.familyname) as person + $rows = $this->db->paginate("SELECT p.title, p.projectid, p.acronym, p.personid, CONCAT(pe.givenname, ' ', pe.familyname) as person FROM project p INNER JOIN person pe ON p.personid = pe.personid LEFT OUTER JOIN project_has_person php ON php.projectid = p.projectid $where @@ -219,7 +219,7 @@ function _add_user() $this->_error('No such project'); $proj = $proj[0]; - $person = $this->db->pq("SELECT CONCAT(CONCAT(givenname, ' '), familyname) as fullname FROM person WHERE personid=:1", array($this->arg('PERSONID'))); + $person = $this->db->pq("SELECT CONCAT(givenname, ' ', familyname) as fullname FROM person WHERE personid=:1", array($this->arg('PERSONID'))); if (!sizeof($person)) $this->_error('No such person'); $person = $person[0]; @@ -278,4 +278,4 @@ function _migrate() } } } -} \ No newline at end of file +} diff --git a/api/src/Page/Proposal.php b/api/src/Page/Proposal.php index aa61460f1..dc9acc00a 100644 --- a/api/src/Page/Proposal.php +++ b/api/src/Page/Proposal.php @@ -24,6 +24,7 @@ class Proposal extends Page 'started' => '\d', 'scheduled' => '\d', 'current' => '\d', + 'notnull' => '\d+', 'COMMENTS' => '(\w|\s|-)+', @@ -209,7 +210,7 @@ function _get_proposals($id = null) $order = $cols[$this->arg('sort_by')] . ' ' . $dir; } - $rows = $this->db->paginate("SELECT CONCAT(p.proposalcode,p.proposalnumber) as proposal, p.title, TO_CHAR(p.bltimestamp, 'DD-MM-YYYY') as st, p.proposalcode, p.proposalnumber, count(distinct s.sessionid) as vcount, p.proposalid, CONCAT(CONCAT(pe.givenname, ' '), pe.familyname) as fullname, pe.personid, p.state, IF(p.state = 'Open', 1, 0) as active, CONCAT(p.proposalcode,p.proposalnumber) as prop, s.beamlinename + $rows = $this->db->paginate("SELECT CONCAT(p.proposalcode,p.proposalnumber) as proposal, p.title, TO_CHAR(p.bltimestamp, 'DD-MM-YYYY') as st, p.proposalcode, p.proposalnumber, count(distinct s.sessionid) as vcount, p.proposalid, CONCAT(pe.givenname, ' ', pe.familyname) as fullname, pe.personid, p.state, IF(p.state = 'Open', 1, 0) as active, CONCAT(p.proposalcode,p.proposalnumber) as prop, s.beamlinename FROM proposal p LEFT OUTER JOIN blsession s ON p.proposalid = s.proposalid LEFT OUTER JOIN person pe ON pe.personid = p.personid @@ -340,6 +341,10 @@ function _get_visits($visit = null, $output = true) $where = 'WHERE s.proposalid = :1'; } + if ($this->has_arg('notnull')) { + $where .= ' AND s.visit_number is not NULL'; + } + if ($this->has_arg('year')) { $where .= " AND TO_CHAR(s.startdate, 'YYYY') = :" . (sizeof($args) + 1); array_push($args, $this->arg('year')); @@ -393,7 +398,7 @@ function _get_visits($visit = null, $output = true) } if ($visit) { - $where .= " AND CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) LIKE :" . (sizeof($args) + 1); + $where .= " AND CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :" . (sizeof($args) + 1); array_push($args, $visit); } @@ -567,7 +572,7 @@ function _update_visit_comment() $vis = $this->db->pq("SELECT s.sessionid, st.sessiontypeid, st.typename from blsession s INNER JOIN proposal p ON p.proposalid = s.proposalid LEFT OUTER JOIN sessiontype st on st.sessionid = s.sessionid - WHERE p.proposalid = :1 AND CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) LIKE :2", array($this->proposalid, $this->arg('visit'))); + WHERE p.proposalid = :1 AND CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :2", array($this->proposalid, $this->arg('visit'))); if (!sizeof($vis)) $this->_error('No such visit'); $vis = $vis[0]; @@ -592,7 +597,7 @@ function _update_visit() $vis = $this->db->pq("SELECT s.sessionid, st.sessiontypeid, st.typename from blsession s INNER JOIN proposal p ON p.proposalid = s.proposalid LEFT OUTER JOIN sessiontype st on st.sessionid = s.sessionid - WHERE p.proposalid = :1 AND CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) LIKE :2", array($this->proposalid, $this->arg('visit'))); + WHERE p.proposalid = :1 AND CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :2", array($this->proposalid, $this->arg('visit'))); if (!sizeof($vis)) $this->_error('No such visit'); @@ -756,7 +761,7 @@ function _get_visit_users() 'shp.personid DESC' ); - $rows = $this->db->paginate("SELECT shp.personid, shp.sessionid, shp.role, shp.remote, CONCAT(shp.sessionid, '-', pe.personid) as shpkey, CONCAT(CONCAT(pe.givenname, ' '), pe.familyname) as fullname + $rows = $this->db->paginate("SELECT shp.personid, shp.sessionid, shp.role, shp.remote, CONCAT(shp.sessionid, '-', pe.personid) as shpkey, CONCAT(pe.givenname, ' ', pe.familyname) as fullname FROM session_has_person shp INNER JOIN person pe ON pe.personid = shp.personid INNER JOIN blsession s ON s.sessionid = shp.sessionid diff --git a/api/src/Page/Robot.php b/api/src/Page/Robot.php index 93147015a..da209ff59 100644 --- a/api/src/Page/Robot.php +++ b/api/src/Page/Robot.php @@ -35,14 +35,14 @@ function _averages() { : "MEDIAN(TIMESTAMPDIFF('SECOND', CAST(r.starttimestamp AS DATE), CAST(r.endtimestamp AS DATE))) as avgt"; - $rows = $this->db->pq("SELECT CONCAT(CONCAT(vr.run, '-'), s.beamlinename) as rbl, min(vr.run) as run, min(vr.runid) as runid, min(s.beamlinename) as bl, count(r.robotactionid) as num, + $rows = $this->db->pq("SELECT CONCAT(vr.run, '-', s.beamlinename) as rbl, min(vr.run) as run, min(vr.runid) as runid, min(s.beamlinename) as bl, count(r.robotactionid) as num, $median FROM v_run vr INNER JOIN blsession s ON (s.startdate BETWEEN vr.startdate AND vr.enddate) INNER JOIN proposal p ON (p.proposalid = s.proposalid) INNER JOIN robotaction r ON (r.blsessionid = s.sessionid) WHERE /*r.robotactionid > 1 AND*/ p.proposalcode <> 'cm' AND r.status='SUCCESS' AND (r.actiontype = 'LOAD') - GROUP BY CONCAT(CONCAT(vr.run, '-'), s.beamlinename) + GROUP BY CONCAT(vr.run, '-', s.beamlinename) ORDER BY min(s.beamlinename), min(vr.runid)"); $tvs = $this->db->pq("SELECT distinct vr.run,vr.runid @@ -122,7 +122,7 @@ function _errors() { array_push($args, $this->arg('run')); } if ($this->has_arg('visit')) { - array_push($where, "CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) LIKE :" . (sizeof($args)+1)); + array_push($where, "CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :" . (sizeof($args)+1)); array_push($args, $this->arg('visit')); } if ($this->has_arg('s')) { @@ -154,7 +154,7 @@ function _errors() { array_push($args, $start); array_push($args, $end); - $errors = $this->db->paginate("SELECT r.samplebarcode, r.actiontype, r.dewarlocation, r.containerlocation, r.message, TO_CHAR(r.starttimestamp, 'DD-MM-YYYY HH24:MI:SS') as st, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as vis, s.beamlinename as bl, r.status, TIMESTAMPDIFF('SECOND', CAST(r.starttimestamp AS DATE), CAST(r.endtimestamp AS DATE)) as time + $errors = $this->db->paginate("SELECT r.samplebarcode, r.actiontype, r.dewarlocation, r.containerlocation, r.message, TO_CHAR(r.starttimestamp, 'DD-MM-YYYY HH24:MI:SS') as st, CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as vis, s.beamlinename as bl, r.status, TIMESTAMPDIFF('SECOND', CAST(r.starttimestamp AS DATE), CAST(r.endtimestamp AS DATE)) as time FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) INNER JOIN v_run vr ON s.startdate BETWEEN vr.startdate AND vr.enddate @@ -188,7 +188,7 @@ function _visit_profile() { } if ($this->has_arg('visit')) { - $where .= " AND CONCAT(CONCAT(CONCAT(p.proposalcode,p.proposalnumber), '-'), s.visit_number) LIKE :".(sizeof($args)+1); + $where .= " AND CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :".(sizeof($args)+1); array_push($args, $this->arg('visit')); } @@ -266,7 +266,7 @@ function _totals() { INNER JOIN proposal p ON (p.proposalid = s.proposalid) INNER JOIN robotaction r ON (r.blsessionid = s.sessionid) WHERE p.proposalcode <> 'cm' AND $where AND (r.actiontype = 'LOAD') - GROUP BY CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number)) inq", $args); + GROUP BY CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number)) inq", $args); $tot = intval($tot[0]['TOT']); $start = 0; @@ -289,13 +289,13 @@ function _totals() { "ROUND(AVG(CASE WHEN r.status='SUCCESS' then TIMESTAMPDIFF('SECOND', CAST(r.starttimestamp AS DATE), CAST(r.endtimestamp AS DATE)) END),1) as avgt" : "ROUND(MEDIAN(CASE WHEN r.status='SUCCESS' then TIMESTAMPDIFF('SECOND', CAST(r.starttimestamp AS DATE), CAST(r.endtimestamp AS DATE)) END),1) as avgt"; - $q = "SELECT TO_CHAR(min(r.starttimestamp), 'DD-MM-YYYY HH24:MI:SS') as st, CONCAT(CONCAT(CONCAT(p.proposalcode,p.proposalnumber), '-'), s.visit_number) as vis, s.beamlinename as bl, count(r.robotactionid) as num, count(CASE WHEN r.status='SUCCESS' then 1 end) as success, count(CASE WHEN r.status='ERROR' then 1 end) as error, count(CASE WHEN r.status='CRITICAL' then 1 end) as critical, count(CASE WHEN r.status='WARNING' then 1 end) as warning, count(CASE WHEN r.status='EPICSFAIL' then 1 end) as epicsfail, count(CASE WHEN r.status='COMMANDNOTSENT' then 1 end) as commandnotsent, + $q = "SELECT TO_CHAR(min(r.starttimestamp), 'DD-MM-YYYY HH24:MI:SS') as st, CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as vis, s.beamlinename as bl, count(r.robotactionid) as num, count(CASE WHEN r.status='SUCCESS' then 1 end) as success, count(CASE WHEN r.status='ERROR' then 1 end) as error, count(CASE WHEN r.status='CRITICAL' then 1 end) as critical, count(CASE WHEN r.status='WARNING' then 1 end) as warning, count(CASE WHEN r.status='EPICSFAIL' then 1 end) as epicsfail, count(CASE WHEN r.status='COMMANDNOTSENT' then 1 end) as commandnotsent, $median FROM v_run vr INNER JOIN blsession s ON (s.startdate BETWEEN vr.startdate AND vr.enddate) INNER JOIN proposal p ON (p.proposalid = s.proposalid) INNER JOIN robotaction r ON (r.blsessionid = s.sessionid) WHERE p.proposalcode <> 'cm' AND $where AND r.actiontype = 'LOAD' - GROUP BY CONCAT(CONCAT(CONCAT(p.proposalcode,p.proposalnumber), '-'), s.visit_number), s.beamlinename + GROUP BY CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number), s.beamlinename ORDER BY min(r.starttimestamp) DESC"; $rows = $this->db->paginate($q, $args); diff --git a/api/src/Page/Sample.php b/api/src/Page/Sample.php index a43884313..b9f4bce38 100644 --- a/api/src/Page/Sample.php +++ b/api/src/Page/Sample.php @@ -86,6 +86,7 @@ class Sample extends Page 'DIMENSION2' => '\d+(.\d+)?', 'DIMENSION3' => '\d+(.\d+)?', 'SHAPE' => '\w+', + 'COLOR' => '\w+', 'LOOPTYPE' => '\w+', 'COMPONENTID' => '\d+', 'BLSAMPLETYPEID' => '\d+', @@ -167,6 +168,7 @@ class Sample extends Page array('/sub/:ssid', 'put', '_update_sub_sample_full'), array('/sub', 'post', '_add_sub_sample'), array('/sub/:ssid', 'delete', '_delete_sub_sample'), + array('/sub/queue/cid/:cid', 'post', '_queue_all_sub_samples'), array('/sub/queue(/:BLSUBSAMPLEID)', 'get', '_pre_q_sub_sample'), array('/plan', 'get', '_get_diffraction_plans'), @@ -584,6 +586,31 @@ function _remove_sample_component() $this->_output(1); } + function _queue_all_sub_samples() + { + if (!$this->has_arg('cid')) { + $this->_error('No containerid specified'); + } + + $args = array($this->proposalid, $this->arg('cid'), $this->arg('cid'), $this->arg('cid')); + $where = ' AND c.containerid=:2 AND cq2.completedtimestamp IS NULL'; + $first_inner_select_where = ' AND s.containerid=:3'; + $second_inner_select_where = ' AND s.containerid=:4'; + + $this->db->wait_rep_sync(true); + $ss_query_string = $this->get_sub_samples_query($where, $first_inner_select_where, $second_inner_select_where); + $subs = $this->db->pq($ss_query_string, $args); + + $this->db->wait_rep_sync(false); + + $ret = array(); + foreach ($subs as $sub) { + array_push($ret, array( + 'BLSUBSAMPLEID' => $sub['BLSUBSAMPLEID'], + 'CONTAINERQUEUESAMPLEID' => $this->_do_pre_q_sample(array('BLSUBSAMPLEID' => $sub['BLSUBSAMPLEID'])))); + } + $this->_output($ret); + } function _sub_samples() { @@ -1047,7 +1074,7 @@ function _samples() # For a visit if ($this->has_arg('visit')) { - $info = $this->db->pq("SELECT s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON p.proposalid = s.proposalid WHERE CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) LIKE :1", array($this->arg('visit'))); + $info = $this->db->pq("SELECT s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON p.proposalid = s.proposalid WHERE CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :1", array($this->arg('visit'))); if (!sizeof($info)) $this->_error('No such visit'); @@ -1150,7 +1177,7 @@ function _samples() $order = $cols[$this->arg('sort_by')] . ' ' . $dir; } - $rows = $this->db->paginate("SELECT distinct b.blsampleid, b.crystalid, b.screencomponentgroupid, ssp.blsampleid as parentsampleid, ssp.name as parentsample, b.blsubsampleid, count(distinct si.blsampleimageid) as inspections, CONCAT(p.proposalcode,p.proposalnumber) as prop, b.code, b.location, pr.acronym, pr.proteinid, cr.spacegroup,b.comments,b.name,s.shippingname as shipment,s.shippingid,d.dewarid,d.code as dewar, c.code as container, c.containerid, c.samplechangerlocation as sclocation, count(distinct IF(dc.overlap != 0,dc.datacollectionid,NULL)) as sc, count(distinct IF(dc.overlap = 0 AND dc.axisrange = 0,dc.datacollectionid,NULL)) as gr, count(distinct IF(dc.overlap = 0 AND dc.axisrange > 0,dc.datacollectionid,NULL)) as dc, count(distinct IF(dcg.experimenttype LIKE 'XRF map', dc.datacollectionid, NULL)) as xm, count(distinct IF(dcg.experimenttype LIKE 'XRF spectrum', dc.datacollectionid, NULL)) as xs, count(distinct IF(dcg.experimenttype LIKE 'Energy scan', dc.datacollectionid, NULL)) as es, count(distinct so.screeningid) as ai, count(distinct app.autoprocprogramid) as ap, count(distinct r.robotactionid) as r, round(min(st.rankingresolution),2) as scresolution, max(ssw.completeness) as sccompleteness, round(min(apss.resolutionlimithigh),2) as dcresolution, round(max(apss.completeness),1) as dccompleteness, dp.anomalousscatterer, dp.requiredresolution, cr.cell_a, cr.cell_b, cr.cell_c, cr.cell_alpha, cr.cell_beta, cr.cell_gamma, b.packingfraction, b.dimension1, b.dimension2, b.dimension3, b.shape, cr.theoreticaldensity, cr.name as crystal, pr.name as protein, b.looptype, dp.centringmethod, dp.experimentkind, cq.containerqueueid, TO_CHAR(cq.createdtimestamp, 'DD-MM-YYYY HH24:MI') as queuedtimestamp + $rows = $this->db->paginate("SELECT distinct b.blsampleid, b.crystalid, b.screencomponentgroupid, ssp.blsampleid as parentsampleid, ssp.name as parentsample, b.blsubsampleid, count(distinct si.blsampleimageid) as inspections, CONCAT(p.proposalcode,p.proposalnumber) as prop, b.code, b.location, pr.acronym, pr.proteinid, cr.spacegroup,b.comments,b.name,s.shippingname as shipment,s.shippingid,d.dewarid,d.code as dewar, c.code as container, c.containerid, c.samplechangerlocation as sclocation, count(distinct IF(dc.overlap != 0,dc.datacollectionid,NULL)) as sc, count(distinct IF(dc.overlap = 0 AND dc.axisrange = 0,dc.datacollectionid,NULL)) as gr, count(distinct IF(dc.overlap = 0 AND dc.axisrange > 0,dc.datacollectionid,NULL)) as dc, count(distinct IF(dcg.experimenttype LIKE 'XRF map', dc.datacollectionid, NULL)) as xm, count(distinct IF(dcg.experimenttype LIKE 'XRF spectrum', dc.datacollectionid, NULL)) as xs, count(distinct IF(dcg.experimenttype LIKE 'Energy scan', dc.datacollectionid, NULL)) as es, count(distinct so.screeningid) as ai, count(distinct app.autoprocprogramid) as ap, count(distinct r.robotactionid) as r, round(min(st.rankingresolution),2) as scresolution, max(ssw.completeness) as sccompleteness, round(min(apss.resolutionlimithigh),2) as dcresolution, round(max(apss.completeness),1) as dccompleteness, dp.anomalousscatterer, dp.requiredresolution, cr.cell_a, cr.cell_b, cr.cell_c, cr.cell_alpha, cr.cell_beta, cr.cell_gamma, b.packingfraction, b.dimension1, b.dimension2, b.dimension3, b.shape, cr.color, cr.theoreticaldensity, cr.name as crystal, pr.name as protein, b.looptype, dp.centringmethod, dp.experimentkind, cq.containerqueueid, TO_CHAR(cq.createdtimestamp, 'DD-MM-YYYY HH24:MI') as queuedtimestamp , $cseq $sseq string_agg(cpr.name) as componentnames, string_agg(cpr.density) as componentdensities ,string_agg(cpr.proteinid) as componentids, string_agg(cpr.acronym) as componentacronyms, string_agg(cpr.global) as componentglobals, string_agg(chc.abundance) as componentamounts, string_agg(ct.symbol) as componenttypesymbols, b.volume, pct.symbol,ROUND(cr.abundance,3) as abundance, TO_CHAR(b.recordtimestamp, 'DD-MM-YYYY') as recordtimestamp, dp.radiationsensitivity, dp.energy, dp.userpath, dp.strategyoption, dp.minimalresolution as minimumresolution ,count(distinct dc.dataCollectionId) as dcc @@ -1425,6 +1452,7 @@ function _prepare_sample_args($s = null) 'DIMENSION2', 'DIMENSION3', 'SHAPE', + 'COLOR', 'THEORETICALDENSITY', 'LOOPTYPE', 'ENERGY', @@ -1886,7 +1914,7 @@ function _update_sample() } } - $cfields = array('PROTEINID', 'SPACEGROUP', 'CELL_A', 'CELL_B', 'CELL_C', 'CELL_ALPHA', 'CELL_BETA', 'CELL_GAMMA', 'ABUNDANCE', 'THEORETICALDENSITY'); + $cfields = array('PROTEINID', 'SPACEGROUP', 'CELL_A', 'CELL_B', 'CELL_C', 'CELL_ALPHA', 'CELL_BETA', 'CELL_GAMMA', 'ABUNDANCE', 'THEORETICALDENSITY', 'COLOR'); foreach ($cfields as $f) { if ($this->has_arg($f)) { $this->db->pq("UPDATE crystal SET $f=:1 WHERE crystalid=:2", array($this->arg($f), $samp['CRYSTALID'])); @@ -2734,7 +2762,7 @@ function _get_sample_group_samples() b.blsampleid, cr.crystalid, cr.name as crystal, - CONCAT(CONCAT(bshg.blsamplegroupid, '-'), b.blsampleid) as blsamplegroupsampleid, + CONCAT(bshg.blsamplegroupid, '-', b.blsampleid) as blsamplegroupsampleid, c.containerid, IF(c.code IS NOT NULL, c.code, c.barcode) as container, c.capacity diff --git a/api/src/Page/Shipment.php b/api/src/Page/Shipment.php index 376360c89..0010755ae 100644 --- a/api/src/Page/Shipment.php +++ b/api/src/Page/Shipment.php @@ -3,6 +3,7 @@ namespace SynchWeb\Page; use Exception; +use SynchWeb\Database\DatabaseQueryBuilder; use SynchWeb\Page; use SynchWeb\Shipment\Courier\DHL; use SynchWeb\Shipment\ShippingService; @@ -402,7 +403,7 @@ function _get_history() array_push($args, $start); array_push($args, $end); - $rows = $this->db->paginate("SELECT s.shippingid, s.shippingname as shipment, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), b.visit_number) as visit, b.beamlinename as bl, b.beamlineoperator as localcontact, h.dewarid, h.dewarstatus,h.storagelocation,TO_CHAR(h.arrivaldate, 'DD-MM-YYYY HH24:MI') as arrival, d.comments + $rows = $this->db->paginate("SELECT s.shippingid, s.shippingname as shipment, CONCAT(p.proposalcode, p.proposalnumber, '-', b.visit_number) as visit, b.beamlinename as bl, b.beamlineoperator as localcontact, h.dewarid, h.dewarstatus,h.storagelocation,TO_CHAR(h.arrivaldate, 'DD-MM-YYYY HH24:MI') as arrival, d.comments FROM dewartransporthistory h INNER JOIN dewar d ON d.dewarid = h.dewarid INNER JOIN shipping s ON d.shippingid = s.shippingid @@ -429,7 +430,7 @@ function _add_history() if (!$this->has_arg('LOCATION')) $this->_error('No location specified'); - $dew = $this->db->pq("SELECT CONCAT(CONCAT(pe.givenname, ' '), pe.familyname) as lcout, pe.emailaddress as lcoutemail, CONCAT(CONCAT(pe2.givenname, ' '), pe2.familyname) as lcret, pe2.emailaddress as lcretemail, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), e.visit_number) as firstexp, TO_CHAR(e.startdate, 'DD-MM-YYYY HH24:MI') as firstexpst, e.beamlinename, e.beamlineoperator, d.dewarid, d.trackingnumberfromsynchrotron, s.shippingid, s.shippingname, p.proposalcode, CONCAT(p.proposalcode, p.proposalnumber) as prop, d.barcode, d.facilitycode, d.firstexperimentid, d.dewarstatus + $dew = $this->db->pq("SELECT CONCAT(pe.givenname, ' ', pe.familyname) as lcout, pe.emailaddress as lcoutemail, CONCAT(CONCAT(pe2.givenname, ' '), pe2.familyname) as lcret, pe2.emailaddress as lcretemail, CONCAT(p.proposalcode, p.proposalnumber, '-', e.visit_number) as firstexp, TO_CHAR(e.startdate, 'DD-MM-YYYY HH24:MI') as firstexpst, e.beamlinename, e.beamlineoperator, d.dewarid, d.trackingnumberfromsynchrotron, s.shippingid, s.shippingname, p.proposalcode, CONCAT(p.proposalcode, p.proposalnumber) as prop, d.barcode, d.facilitycode, d.firstexperimentid, d.dewarstatus FROM dewar d INNER JOIN shipping s ON s.shippingid = d.shippingid LEFT OUTER JOIN labcontact c ON s.sendinglabcontactid = c.labcontactid @@ -792,7 +793,7 @@ function _add_dewar_report() if (!$this->has_arg('FACILITYCODE')) $this->_error('No dewar specified'); - $last_visits = $this->db->pq("SELECT s.beamlineoperator as localcontact, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, TO_CHAR(s.startdate, 'YYYY') as year, s.beamlinename + $last_visits = $this->db->pq("SELECT s.beamlineoperator as localcontact, CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, TO_CHAR(s.startdate, 'YYYY') as year, s.beamlinename FROM dewar d INNER JOIN blsession s ON d.firstexperimentid = s.sessionid INNER JOIN shipping sh ON sh.shippingid = d.shippingid @@ -1336,15 +1337,17 @@ function _get_dewars() $order = $cols[$this->arg('sort_by')] . ' ' . $dir; } - $dewars = $this->db->paginate("SELECT CONCAT(p.proposalcode, p.proposalnumber) as prop, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), se.visit_number) as firstexperiment, r.labcontactid, se.beamlineoperator as localcontact, se.beamlinename, TO_CHAR(se.startdate, 'HH24:MI DD-MM-YYYY') as firstexperimentst, d.firstexperimentid, s.shippingid, s.shippingname, d.facilitycode, count(c.containerid) as ccount, (case when se.visit_number > 0 then (CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), se.visit_number)) else '' end) as exp, d.code, d.barcode, d.storagelocation, d.dewarstatus, d.dewarid, d.trackingnumbertosynchrotron, d.trackingnumberfromsynchrotron, s.deliveryagent_agentname, d.weight, d.deliveryagent_barcode, GROUP_CONCAT(c.code SEPARATOR ', ') as containers, s.sendinglabcontactid, s.returnlabcontactid + $dewars = $this->db->paginate("SELECT CONCAT(p.proposalcode, p.proposalnumber) as prop, CONCAT(p.proposalcode, p.proposalnumber, '-', se.visit_number) as firstexperiment, r.labcontactid, se.beamlineoperator as localcontact, se.beamlinename, TO_CHAR(se.startdate, 'HH24:MI DD-MM-YYYY') as firstexperimentst, d.firstexperimentid, s.shippingid, s.shippingname, d.facilitycode, count(c.containerid) as ccount, (case when se.visit_number > 0 then (CONCAT(p.proposalcode, p.proposalnumber, '-', se.visit_number)) else '' end) as exp, d.code, d.barcode, d.storagelocation, d.dewarstatus, d.dewarid, d.trackingnumbertosynchrotron, d.trackingnumberfromsynchrotron, s.deliveryagent_agentname, d.weight, d.deliveryagent_barcode, GROUP_CONCAT(c.code SEPARATOR ', ') as containers, s.sendinglabcontactid, s.returnlabcontactid, pe.givenname, pe.familyname FROM dewar d LEFT OUTER JOIN container c ON c.dewarid = d.dewarid INNER JOIN shipping s ON d.shippingid = s.shippingid INNER JOIN proposal p ON p.proposalid = s.proposalid LEFT OUTER JOIN blsession se ON d.firstexperimentid = se.sessionid LEFT OUTER JOIN dewarregistry r ON r.facilitycode = d.facilitycode + LEFT OUTER JOIN labcontact lc ON s.sendinglabcontactid = lc.labcontactid + LEFT OUTER JOIN person pe ON lc.personid = pe.personid WHERE $where - GROUP BY CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), se.visit_number), r.labcontactid, se.beamlineoperator, TO_CHAR(se.startdate, 'HH24:MI DD-MM-YYYY'), (case when se.visit_number > 0 then (CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), se.visit_number)) else '' end),s.shippingid, s.shippingname, d.code, d.barcode, d.storagelocation, d.dewarstatus, d.dewarid, d.trackingnumbertosynchrotron, d.trackingnumberfromsynchrotron, d.facilitycode, d.firstexperimentid + GROUP BY CONCAT(p.proposalcode, p.proposalnumber, '-', se.visit_number), r.labcontactid, se.beamlineoperator, TO_CHAR(se.startdate, 'HH24:MI DD-MM-YYYY'), (case when se.visit_number > 0 then (CONCAT(p.proposalcode, p.proposalnumber, '-', se.visit_number)) else '' end),s.shippingid, s.shippingname, d.code, d.barcode, d.storagelocation, d.dewarstatus, d.dewarid, d.trackingnumbertosynchrotron, d.trackingnumberfromsynchrotron, d.facilitycode, d.firstexperimentid ORDER BY $order", $args); if ($this->has_arg('did')) { @@ -1489,7 +1492,7 @@ function _update_dewar() $sessionId = !empty($experimentId) ? $this->arg('FIRSTEXPERIMENTID') : NULL; $this->db->pq("UPDATE dewar SET $f=:1 WHERE dewarid=:2", array($sessionId, $this->arg('did'))); - $visit = $this->db->pq("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit + $visit = $this->db->pq("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit FROM blsession s INNER JOIN proposal p ON p.proposalid = s.proposalid WHERE s.sessionid=:1", array($sessionId)); @@ -1642,8 +1645,6 @@ function _check_container() $this->_output($cont[0]); } - - function _get_all_containers() { //$this->db->set_debug(True); @@ -1651,11 +1652,17 @@ function _get_all_containers() $this->_error('No proposal specified'); $having = ''; + $subsamplesInTotal = ""; + $totalQuery = new DatabaseQueryBuilder($this->db); if ($this->has_arg('visit')) { $join = " INNER JOIN blsession ses2 ON ses2.proposalid = p.proposalid"; $args = array($this->arg('visit')); - $where = "CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), ses2.visit_number) LIKE :1"; + $where = "CONCAT(p.proposalcode, p.proposalnumber, '-', ses2.visit_number) LIKE :1"; + $totalQuery->joinClause("INNER JOIN blsession ses2 ON ses2.proposalid = p.proposalid"); + $totalQuery->joinClause("INNER JOIN dewar d ON d.dewarid = c.dewarid"); + $totalQuery->joinClause("INNER JOIN shipping sh ON sh.shippingid = d.shippingid"); + $totalQuery->joinClause("INNER JOIN proposal p ON p.proposalid = sh.proposalid"); } else if ($this->has_arg('all') && $this->staff) { $join = ''; $args = array(); @@ -1664,6 +1671,8 @@ function _get_all_containers() $join = ''; $args = array($this->proposalid); $where = 'sh.proposalid=:1'; + $totalQuery->joinClause("INNER JOIN dewar d ON d.dewarid = c.dewarid"); + $totalQuery->joinClause("INNER JOIN shipping sh ON sh.shippingid = d.shippingid"); } @@ -1677,16 +1686,22 @@ function _get_all_containers() } else if ($this->arg('ty') == 'todispose') { $where .= " AND c.imagerid IS NOT NULL"; $having .= " HAVING (TIMESTAMPDIFF('HOUR', min(ci.bltimestamp), CURRENT_TIMESTAMP)/24) > 42"; + $totalQuery->joinClause("LEFT OUTER JOIN containerinspection ci ON ci.containerid = c.containerid AND ci.state = 'Completed'"); } else if ($this->arg('ty') == 'queued') { $where .= " AND cq.containerqueueid IS NOT NULL"; + $totalQuery->joinClause("LEFT OUTER JOIN containerqueue cq ON cq.containerid = c.containerid AND cq.completedtimestamp IS NULL"); } else if ($this->arg('ty') == 'completed') { $where .= " AND cq2.completedtimestamp IS NOT NULL"; + $totalQuery->joinClause("LEFT OUTER JOIN containerqueue cq2 ON cq2.containerid = c.containerid AND cq2.completedtimestamp IS NOT NULL"); $this->args['sort_by'] = 'COMPLETEDTIMESTAMP'; $this->args['order'] = 'desc'; } else if ($this->arg('ty') == 'processing') { $where .= " AND c.containerstatus = 'processing'"; } else if ($this->arg('ty') == 'subsamples') { - $having .= " HAVING COUNT(distinct ss.blsubsampleid) > 0"; + $having .= " HAVING subsamples > 0"; + $subsamplesInTotal = ", count(distinct ss.blsubsampleid) as subsamples"; + $totalQuery->joinClause("LEFT OUTER JOIN blsample s ON s.containerid = c.containerid"); + $totalQuery->joinClause("LEFT OUTER JOIN blsubsample ss ON s.blsampleid = ss.blsampleid AND ss.source='manual'"); } } @@ -1698,10 +1713,13 @@ function _get_all_containers() if ($this->has_arg('did')) { $where .= ' AND d.dewarid=:' . (sizeof($args) + 1); + $totalQuery->joinClause("INNER JOIN dewar d ON d.dewarid = c.dewarid"); array_push($args, $this->arg('did')); } if ($this->has_arg('sid')) { $where .= ' AND sh.shippingid=:' . (sizeof($args) + 1); + $totalQuery->joinClause("INNER JOIN dewar d ON d.dewarid = c.dewarid"); + $totalQuery->joinClause("INNER JOIN shipping sh ON sh.shippingid = d.shippingid"); array_push($args, $this->arg('sid')); } if ($this->has_arg('cid')) { @@ -1711,12 +1729,17 @@ function _get_all_containers() if ($this->has_arg('pid')) { // $this->db->set_debug(True); + $join .= ' LEFT OUTER JOIN crystal cr ON cr.crystalid = s.crystalid LEFT OUTER JOIN protein pr ON pr.proteinid = cr.proteinid'; $where .= ' AND pr.proteinid=:' . (sizeof($args) + 1); + $totalQuery->joinClause("LEFT OUTER JOIN blsample s ON s.containerid = c.containerid"); + $totalQuery->joinClause("LEFT OUTER JOIN crystal cr ON cr.crystalid = s.crystalid"); + $totalQuery->joinClause("LEFT OUTER JOIN protein pr ON pr.proteinid = cr.proteinid"); array_push($args, $this->arg('pid')); } if ($this->has_arg('assigned')) { $where .= " AND d.dewarstatus LIKE 'processing' AND c.samplechangerlocation > 0"; + $totalQuery->joinClause("INNER JOIN dewar d ON d.dewarid = c.dewarid"); } if ($this->has_arg('bl')) { @@ -1728,6 +1751,8 @@ function _get_all_containers() $where .= " AND c.containerid NOT IN (SELECT c.containerid FROM container c INNER JOIN dewar d ON d.dewarid = c.dewarid WHERE d.dewarstatus LIKE 'processing' AND c.samplechangerlocation > 0 AND c.beamlinelocation=:" . (sizeof($args) + 1) . ")"; array_push($args, $this->arg('unassigned')); + $totalQuery->joinClause("INNER JOIN dewar d ON d.dewarid = c.dewarid"); + $totalQuery->joinClause("INNER JOIN shipping sh ON sh.shippingid = d.shippingid"); $this->args['sort_by'] = 'SHIPPINGID'; $this->args['order'] = 'desc'; } @@ -1756,18 +1781,9 @@ function _get_all_containers() } $tot = $this->db->pq("SELECT count(distinct c.containerid) as tot + $subsamplesInTotal FROM container c - INNER JOIN dewar d ON d.dewarid = c.dewarid - INNER JOIN shipping sh ON sh.shippingid = d.shippingid - INNER JOIN proposal p ON p.proposalid = sh.proposalid - LEFT OUTER JOIN blsample s ON s.containerid = c.containerid - LEFT OUTER JOIN blsubsample ss ON s.blsampleid = ss.blsampleid AND ss.source='manual' - LEFT OUTER JOIN crystal cr ON cr.crystalid = s.crystalid - LEFT OUTER JOIN protein pr ON pr.proteinid = cr.proteinid - LEFT OUTER JOIN containerinspection ci ON ci.containerid = c.containerid AND ci.state = 'Completed' - LEFT OUTER JOIN containerqueue cq ON cq.containerid = c.containerid AND cq.completedtimestamp IS NULL - LEFT OUTER JOIN containerqueue cq2 ON cq2.containerid = c.containerid AND cq2.completedtimestamp IS NOT NULL - $join + {$totalQuery->getJoins()} WHERE $where $having", $args); $tot = sizeof($tot) ? intval($tot[0]['TOT']) : 0; @@ -1805,7 +1821,7 @@ function _get_all_containers() if ($this->has_arg('sort_by')) { $cols = array( 'NAME' => 'c.code', 'DEWAR' => 'd.code', 'SHIPMENT' => 'sh.shippingname', 'SAMPLES' => 'count(s.blsampleid)', 'SHIPPINGID' => 'sh.shippingid', 'LASTINSPECTION' => 'max(ci.bltimestamp)', 'INSPECTIONS' => 'count(ci.containerinspectionid)', - 'DCCOUNT' => 'COUNT(distinct dc.datacollectionid)', 'SUBSAMPLES' => 'count(distinct ss.blsubsampleid)', + 'DCCOUNT' => 'COUNT(distinct dc.datacollectionid)', 'SUBSAMPLES' => 'subsamples', 'LASTQUEUECOMPLETED' => 'max(cq2.completedtimestamp)', 'QUEUEDTIMESTAMP' => 'max(cq.createdtimestamp)' ); $dir = $this->has_arg('order') ? ($this->arg('order') == 'asc' ? 'ASC' : 'DESC') : 'ASC'; @@ -1813,34 +1829,28 @@ function _get_all_containers() $order = $cols[$this->arg('sort_by')] . ' ' . $dir; } // $this->db->set_debug(True); - $rows = $this->db->paginate("SELECT round(TIMESTAMPDIFF('HOUR', min(ci.bltimestamp), CURRENT_TIMESTAMP)/24,1) as age, case when count(ci2.containerinspectionid) > 1 then 0 else 1 end as allow_adhoc, sch.name as schedule, c.scheduleid, c.screenid, sc.name as screen, c.imagerid, i.temperature as temperature, i.name as imager, TO_CHAR(max(ci.bltimestamp), 'HH24:MI DD-MM-YYYY') as lastinspection, round(TIMESTAMPDIFF('HOUR', max(ci.bltimestamp), CURRENT_TIMESTAMP)/24,1) as lastinspectiondays, count(distinct ci.containerinspectionid) as inspections, CONCAT(p.proposalcode, p.proposalnumber) as prop, c.bltimestamp, c.samplechangerlocation, c.beamlinelocation, d.dewarstatus, c.containertype, c.capacity, c.containerstatus, c.containerid, c.code as name, d.code as dewar, sh.shippingname as shipment, d.dewarid, sh.shippingid, count(distinct s.blsampleid) as samples, cq.containerqueueid, TO_CHAR(cq.createdtimestamp, 'DD-MM-YYYY HH24:MI') as queuedtimestamp, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), ses.visit_number) as visit, ses.beamlinename, c.requestedreturn, c.requestedimagerid, i2.name as requestedimager, c.comments, c.experimenttype, c.storagetemperature, c.barcode, reg.barcode as registry, reg.containerregistryid, - count(distinct ss.blsubsampleid) as subsamples, - ses3.beamlinename as firstexperimentbeamline, - pp.name as pipeline, + $rows = $this->db->paginate("SELECT round(TIMESTAMPDIFF('HOUR', min(ci.bltimestamp), CURRENT_TIMESTAMP)/24,1) as age, case when count(ci2.containerinspectionid) > 1 then 0 else 1 end as allow_adhoc, c.scheduleid, c.screenid, sc.name as screen, c.imagerid, i.temperature as temperature, i.name as imager, TO_CHAR(max(ci.bltimestamp), 'HH24:MI DD-MM-YYYY') as lastinspection, round(TIMESTAMPDIFF('HOUR', max(ci.bltimestamp), CURRENT_TIMESTAMP)/24,1) as lastinspectiondays, count(distinct ci.containerinspectionid) as inspections, CONCAT(p.proposalcode, p.proposalnumber) as prop, c.bltimestamp, c.samplechangerlocation, c.beamlinelocation, d.dewarstatus, c.containertype, c.capacity, c.containerstatus, c.containerid, c.code as name, d.code as dewar, sh.shippingname as shipment, d.dewarid, sh.shippingid, count(distinct s.blsampleid) as samples, cq.containerqueueid, TO_CHAR(cq.createdtimestamp, 'DD-MM-YYYY HH24:MI') as queuedtimestamp, CONCAT(p.proposalcode, p.proposalnumber, '-', ses.visit_number) as visit, ses.beamlinename, c.requestedreturn, c.requestedimagerid, c.comments, c.experimenttype, c.storagetemperature, c.barcode, reg.barcode as registry, reg.containerregistryid, + (SELECT sch.name FROM schedule sch WHERE sch.scheduleid = c.scheduleid) as schedule, + (SELECT i2.name FROM imager i2 WHERE i2.imagerid = c.requestedimagerid) as requestedimager, + (SELECT count(distinct ss.blsubsampleid) FROM blsubsample ss RIGHT OUTER JOIN blsample s2 ON s2.blsampleid = ss.blsampleid WHERE s2.containerid = c.containerid AND ss.source='manual') as subsamples, + (SELECT ses3.beamlinename FROM blsession ses3 WHERE d.firstexperimentid = ses3.sessionid) as firstexperimentbeamline, + (SELECT pp.name FROM processingpipeline pp WHERE c.prioritypipelineid = pp.processingpipelineid) as pipeline, TO_CHAR(max(cq2.completedtimestamp), 'HH24:MI DD-MM-YYYY') as lastqueuecompleted, TIMESTAMPDIFF('MINUTE', max(cq2.completedtimestamp), max(cq2.createdtimestamp)) as lastqueuedwell, - c.ownerid, CONCAT(pe.givenname, ' ', pe.familyname) as owner + c.ownerid, + (SELECT CONCAT(pe.givenname, ' ', pe.familyname) FROM person pe WHERE c.ownerid = pe.personid) as owner FROM container c INNER JOIN dewar d ON d.dewarid = c.dewarid - LEFT OUTER JOIN blsession ses3 ON d.firstexperimentid = ses3.sessionid INNER JOIN shipping sh ON sh.shippingid = d.shippingid INNER JOIN proposal p ON p.proposalid = sh.proposalid LEFT OUTER JOIN blsample s ON s.containerid = c.containerid - LEFT OUTER JOIN blsubsample ss ON s.blsampleid = ss.blsampleid AND ss.source='manual' - LEFT OUTER JOIN crystal cr ON cr.crystalid = s.crystalid - LEFT OUTER JOIN protein pr ON pr.proteinid = cr.proteinid LEFT OUTER JOIN containerinspection ci ON ci.containerid = c.containerid AND ci.state = 'Completed' LEFT OUTER JOIN imager i ON i.imagerid = c.imagerid - LEFT OUTER JOIN imager i2 ON i2.imagerid = c.requestedimagerid LEFT OUTER JOIN screen sc ON sc.screenid = c.screenid - LEFT OUTER JOIN schedule sch ON sch.scheduleid = c.scheduleid LEFT OUTER JOIN containerinspection ci2 ON ci2.containerid = c.containerid AND ci2.state != 'Completed' AND ci2.manual!=1 AND ci2.schedulecomponentid IS NULL LEFT OUTER JOIN containerqueue cq ON cq.containerid = c.containerid AND cq.completedtimestamp IS NULL LEFT OUTER JOIN containerqueue cq2 ON cq2.containerid = c.containerid AND cq2.completedtimestamp IS NOT NULL LEFT OUTER JOIN containerregistry reg ON reg.containerregistryid = c.containerregistryid - LEFT OUTER JOIN blsession ses ON c.sessionid = ses.sessionid - LEFT OUTER JOIN processingpipeline pp ON c.prioritypipelineid = pp.processingpipelineid - LEFT OUTER JOIN person pe ON c.ownerid = pe.personid $join WHERE $where @@ -2074,7 +2084,7 @@ function _container_history() array_push($args, $start); array_push($args, $end); - $rows = $this->db->paginate("SELECT h.containerhistoryid, s.shippingid, s.shippingname as shipment, CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), b.visit_number) as visit, b.beamlinename as bl, b.beamlineoperator as localcontact, h.containerid, h.status,h.location,TO_CHAR(h.bltimestamp, 'DD-MM-YYYY HH24:MI') as bltimestamp, h.beamlinename + $rows = $this->db->paginate("SELECT h.containerhistoryid, s.shippingid, s.shippingname as shipment, CONCAT(p.proposalcode, p.proposalnumber, '-', b.visit_number) as visit, b.beamlinename as bl, b.beamlineoperator as localcontact, h.containerid, h.status,h.location,TO_CHAR(h.bltimestamp, 'DD-MM-YYYY HH24:MI') as bltimestamp, h.beamlinename FROM containerhistory h INNER JOIN container c ON c.containerid = h.containerid INNER JOIN dewar d ON d.dewarid = c.dewarid @@ -2380,7 +2390,7 @@ function _add_container_report() if (!$this->has_arg('CONTAINERREGISTRYID')) $this->_error('No container specified'); - $last_visits = $this->db->pq("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, TO_CHAR(s.startdate, 'YYYY') as year, s.beamlinename, s.beamlineoperator as localcontact, pe.emailaddress, r.containerregistryid, r.barcode, CONCAT(p.proposalcode, p.proposalnumber) as prop + $last_visits = $this->db->pq("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, TO_CHAR(s.startdate, 'YYYY') as year, s.beamlinename, s.beamlineoperator as localcontact, pe.emailaddress, r.containerregistryid, r.barcode, CONCAT(p.proposalcode, p.proposalnumber) as prop FROM containerregistry r INNER JOIN container c ON c.containerregistryid = r.containerregistryid LEFT OUTER JOIN person pe ON pe.personid = c.ownerid @@ -2606,7 +2616,7 @@ function _get_default_dewar() if (!$this->has_arg('visit')) $this->_error('No visit specified'); - $sids = $this->db->pq("SELECT s.sessionid FROM blsession s INNER JOIN proposal p ON p.proposalid = s.proposalid WHERE CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) LIKE :1 AND p.proposalid=:2", array($this->arg('visit'), $this->proposalid)); + $sids = $this->db->pq("SELECT s.sessionid FROM blsession s INNER JOIN proposal p ON p.proposalid = s.proposalid WHERE CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :1 AND p.proposalid=:2", array($this->arg('visit'), $this->proposalid)); if (!sizeof($sids)) $this->_error('No such visit'); diff --git a/api/src/Page/Stats.php b/api/src/Page/Stats.php index 89abbb868..652abfd1d 100644 --- a/api/src/Page/Stats.php +++ b/api/src/Page/Stats.php @@ -27,7 +27,7 @@ class Stats extends Page # Whos online list function _online_users() { - $rows = $this->db->pq("SELECT a.username, a.comments, TO_CHAR(a.datetime, 'DD-MM-YYYY HH24:MI:SS') as time, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as name + $rows = $this->db->pq("SELECT a.username, a.comments, TO_CHAR(a.datetime, 'DD-MM-YYYY HH24:MI:SS') as time, CONCAT(p.givenname, ' ', p.familyname) as name FROM adminactivity a LEFT OUTER JOIN person p ON p.login = a.username WHERE TIMESTAMPDIFF('MINUTE', a.datetime, CURRENT_TIMESTAMP) < 15 ORDER BY a.datetime DESC"); @@ -37,7 +37,7 @@ function _online_users() { function _last_actions() { - $rows = $this->db->paginate("SELECT a.username, a.comments, TO_CHAR(a.datetime, 'DD-MM-YYYY HH24:MI:SS') as time, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as name + $rows = $this->db->paginate("SELECT a.username, a.comments, TO_CHAR(a.datetime, 'DD-MM-YYYY HH24:MI:SS') as time, CONCAT(p.givenname, ' ', p.familyname) as name FROM adminactivity a LEFT OUTER JOIN person p ON p.login = a.username WHERE comments LIKE 'ISPyB2%' diff --git a/api/src/Page/Vstat.php b/api/src/Page/Vstat.php index 653353700..64a476873 100644 --- a/api/src/Page/Vstat.php +++ b/api/src/Page/Vstat.php @@ -199,7 +199,7 @@ function _visit_breakdown() $ctf = array(); $missed = array(); - $sched = $this->db->pq("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI:SS') as en, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI:SS') as st, p.title, s.scheduled, p.proposalcode + $sched = $this->db->pq("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI:SS') as en, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI:SS') as st, p.title, s.scheduled, p.proposalcode FROM blsession s INNER JOIN proposal p ON p.proposalid = s.proposalid INNER JOIN v_run vr ON s.startdate BETWEEN vr.startdate AND vr.enddate @@ -732,7 +732,7 @@ function _check_visit() $this->_error('No visit specified'); $args = array($this->arg('visit')); - $where = "WHERE CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) LIKE :1"; + $where = "WHERE CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :1"; if (!$this->staff) { if (!$this->has_arg('prop')) diff --git a/api/src/TemplateParser.php b/api/src/TemplateParser.php index bb52ffecf..9d97e2823 100644 --- a/api/src/TemplateParser.php +++ b/api/src/TemplateParser.php @@ -65,7 +65,7 @@ function visit_dir($options) { } if (array_key_exists('VISIT', $options)) { - $where = "WHERE CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) LIKE :1"; + $where = "WHERE CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) LIKE :1"; array_push($args, $options['VISIT']); } @@ -74,7 +74,7 @@ function visit_dir($options) { array_push($args, $options['DCID']); } - $visit = $this->db->pq("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, TO_CHAR(s.startdate, 'YYYY') as year, s.beamlinename, pe.login as pilogin, dc.imagedirectory + $visit = $this->db->pq("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, TO_CHAR(s.startdate, 'YYYY') as year, s.beamlinename, pe.login as pilogin, dc.imagedirectory FROM blsession s INNER JOIN proposal p ON p.proposalid = s.proposalid INNER JOIN person pe ON pe.personid = p.personid diff --git a/api/tests/Controllers/AssignControllerTest.php b/api/tests/Controllers/AssignControllerTest.php index dc8852009..8c0426f39 100644 --- a/api/tests/Controllers/AssignControllerTest.php +++ b/api/tests/Controllers/AssignControllerTest.php @@ -160,8 +160,8 @@ public function testGetBeamlineVisitsWithValidConfigReturnsNothing(): void { $response = $this->setUpCommonResponse(); $_SERVER['REMOTE_ADDR'] = 'www.diamond.103.com'; - $this->dbStub->expects($this->exactly(1))->method('pq')->with("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE TIMESTAMPDIFF('DAY', s.startdate, CURRENT_TIMESTAMP) < 1 AND TIMESTAMPDIFF('DAY', CURRENT_TIMESTAMP, s.enddate) < 2 AND s.beamlinename LIKE :1 ORDER BY s.startdate", array('i03'))->willReturn(array()); - $this->dbStub->expects($this->exactly(1))->method('paginate')->with("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE p.proposalcode LIKE 'cm' AND s.beamlinename LIKE :1 AND s.enddate <= CURRENT_TIMESTAMP ORDER BY s.startdate DESC", array('i03', 0, 1))->willReturn(array()); + $this->dbStub->expects($this->exactly(1))->method('pq')->with("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE TIMESTAMPDIFF('DAY', s.startdate, CURRENT_TIMESTAMP) < 1 AND TIMESTAMPDIFF('DAY', CURRENT_TIMESTAMP, s.enddate) < 2 AND s.beamlinename LIKE :1 ORDER BY s.startdate", array('i03'))->willReturn(array()); + $this->dbStub->expects($this->exactly(1))->method('paginate')->with("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE p.proposalcode LIKE 'cm' AND s.beamlinename LIKE :1 AND s.enddate <= CURRENT_TIMESTAMP ORDER BY s.startdate DESC", array('i03', 0, 1))->willReturn(array()); $this->assignController->getBeamlineVisits(); $this->assertEquals('[]', $response->getBody()); @@ -173,8 +173,8 @@ public function testGetBeamlineVisitsWithValidConfigAndVisitReturnsData(): void $response = $this->setUpCommonResponse(); $_SERVER['REMOTE_ADDR'] = 'www.diamond.103.com'; $result = ['VISIT' => $visitId, 'BL' => 'test03']; - $this->dbStub->expects($this->exactly(1))->method('pq')->with("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE TIMESTAMPDIFF('DAY', s.startdate, CURRENT_TIMESTAMP) < 1 AND TIMESTAMPDIFF('DAY', CURRENT_TIMESTAMP, s.enddate) < 2 AND s.beamlinename LIKE :1 ORDER BY s.startdate", array('i03'))->willReturn(array($result)); - $this->dbStub->expects($this->exactly(1))->method('paginate')->with("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE p.proposalcode LIKE 'cm' AND s.beamlinename LIKE :1 AND s.enddate <= CURRENT_TIMESTAMP ORDER BY s.startdate DESC", array('i03', 0, 1))->willReturn(array()); + $this->dbStub->expects($this->exactly(1))->method('pq')->with("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE TIMESTAMPDIFF('DAY', s.startdate, CURRENT_TIMESTAMP) < 1 AND TIMESTAMPDIFF('DAY', CURRENT_TIMESTAMP, s.enddate) < 2 AND s.beamlinename LIKE :1 ORDER BY s.startdate", array('i03'))->willReturn(array($result)); + $this->dbStub->expects($this->exactly(1))->method('paginate')->with("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE p.proposalcode LIKE 'cm' AND s.beamlinename LIKE :1 AND s.enddate <= CURRENT_TIMESTAMP ORDER BY s.startdate DESC", array('i03', 0, 1))->willReturn(array()); $this->assignController->getBeamlineVisits($visitId); $this->assertEquals('{"VISIT":123,"BL":"test03"}', $response->getBody()); @@ -185,8 +185,8 @@ public function testGetBeamlineVisitsWithValidConfigAndInvalidVisitReturnsError( $visitId = 123; $_SERVER['REMOTE_ADDR'] = 'www.diamond.103.com'; $result = ['VISIT' => 1230, 'BL' => 'test03']; - $this->dbStub->expects($this->exactly(1))->method('pq')->with("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE TIMESTAMPDIFF('DAY', s.startdate, CURRENT_TIMESTAMP) < 1 AND TIMESTAMPDIFF('DAY', CURRENT_TIMESTAMP, s.enddate) < 2 AND s.beamlinename LIKE :1 ORDER BY s.startdate", array('i03'))->willReturn(array($result)); - $this->dbStub->expects($this->exactly(1))->method('paginate')->with("SELECT CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE p.proposalcode LIKE 'cm' AND s.beamlinename LIKE :1 AND s.enddate <= CURRENT_TIMESTAMP ORDER BY s.startdate DESC", array('i03', 0, 1))->willReturn(array()); + $this->dbStub->expects($this->exactly(1))->method('pq')->with("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE TIMESTAMPDIFF('DAY', s.startdate, CURRENT_TIMESTAMP) < 1 AND TIMESTAMPDIFF('DAY', CURRENT_TIMESTAMP, s.enddate) < 2 AND s.beamlinename LIKE :1 ORDER BY s.startdate", array('i03'))->willReturn(array($result)); + $this->dbStub->expects($this->exactly(1))->method('paginate')->with("SELECT CONCAT(p.proposalcode, p.proposalnumber, '-', s.visit_number) as visit, TO_CHAR(s.startdate, 'DD-MM-YYYY HH24:MI') as st, TO_CHAR(s.enddate, 'DD-MM-YYYY HH24:MI') as en,s.beamlinename as bl FROM blsession s INNER JOIN proposal p ON (p.proposalid = s.proposalid) WHERE p.proposalcode LIKE 'cm' AND s.beamlinename LIKE :1 AND s.enddate <= CURRENT_TIMESTAMP ORDER BY s.startdate DESC", array('i03', 0, 1))->willReturn(array()); $this->slimStub->shouldReceive('halt')->times(1)->with(400, '{"status":400,"message":"No such visit"}')->andThrow(new \Exception); $this->expectException(\Exception::class); @@ -287,4 +287,4 @@ public function testGetPuckNamesWithPropAndValidBlArrayForStaffMemberReturnsReal $this->assignController->getPuckNames(); $this->assertEquals('[{"id":1,"name":11},{"id":12,"name":1231}]', $response->getBody()); } -} \ No newline at end of file +} diff --git a/api/tests/Model/Services/AssignDataTest.php b/api/tests/Model/Services/AssignDataTest.php index c007cb63c..064a69d87 100644 --- a/api/tests/Model/Services/AssignDataTest.php +++ b/api/tests/Model/Services/AssignDataTest.php @@ -47,7 +47,7 @@ protected function setUp(): void public function testGetContainerCreatesCorrectSql(): void { $this->assignData->getContainer('testVisitId', 'testContainerId'); - $this->assertEquals("SELECT d.dewarid,bl.beamlinename,c.containerid,c.code FROM Container c INNER JOIN Dewar d ON d.dewarid = c.dewarid INNER JOIN Shipping s ON s.shippingid = d.shippingid INNER JOIN BLSession bl ON bl.proposalid = s.proposalid INNER JOIN Proposal p ON s.proposalid = p.proposalid WHERE CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), bl.visit_number) LIKE 'testVisitId' AND c.containerid='testContainerId'", $this->db->getLastQuery()); + $this->assertEquals("SELECT d.dewarid,bl.beamlinename,c.containerid,c.code FROM Container c INNER JOIN Dewar d ON d.dewarid = c.dewarid INNER JOIN Shipping s ON s.shippingid = d.shippingid INNER JOIN BLSession bl ON bl.proposalid = s.proposalid INNER JOIN Proposal p ON s.proposalid = p.proposalid WHERE CONCAT(p.proposalcode, p.proposalnumber, '-', bl.visit_number) LIKE 'testVisitId' AND c.containerid='testContainerId'", $this->db->getLastQuery()); } public function testAssignContainerCreatesCorrectSql(): void @@ -85,7 +85,7 @@ public function testUpdateContainerHistoryCreatesCorrectSql(): void public function testGetDewarWithVisitDataCreatesCorrectSql(): void { $this->assignData->getDewar('testDewarId', 'testProposalId', 'testVisitId'); - $this->assertEquals("SELECT d.dewarid FROM Dewar d INNER JOIN Shipping s ON s.shippingid = d.shippingid INNER JOIN BLSession bl ON bl.proposalid = s.proposalid INNER JOIN Proposal p ON s.proposalid = p.proposalid WHERE CONCAT(CONCAT(CONCAT(p.proposalcode, p.proposalnumber), '-'), bl.visit_number) LIKE 'testVisitId' AND d.dewarid='testDewarId'", $this->db->getLastQuery()); + $this->assertEquals("SELECT d.dewarid FROM Dewar d INNER JOIN Shipping s ON s.shippingid = d.shippingid INNER JOIN BLSession bl ON bl.proposalid = s.proposalid INNER JOIN Proposal p ON s.proposalid = p.proposalid WHERE CONCAT(p.proposalcode, p.proposalnumber, '-', bl.visit_number) LIKE 'testVisitId' AND d.dewarid='testDewarId'", $this->db->getLastQuery()); } public function testGetDewarWithNoVisitDataCreatesCorrectSql(): void diff --git a/api/tests/Model/Services/UserDataSingleInvocationTest.php b/api/tests/Model/Services/UserDataSingleInvocationTest.php index 0b0200408..d1add87da 100644 --- a/api/tests/Model/Services/UserDataSingleInvocationTest.php +++ b/api/tests/Model/Services/UserDataSingleInvocationTest.php @@ -134,7 +134,7 @@ public function testGetUsersCountWithDefaults(): void public function testGetUsersWithDefaults(): void { $res = $this->userData->getUsers(false, true, 's', 3); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.familyname,p.givenname LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.familyname,p.givenname LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -148,14 +148,14 @@ public function testGetUsersCountWithInvalidSortBy(): void public function testGetUsersWithValidSortBy(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN'); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } public function testGetUsersWithInvalidSortBy(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'blah'); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.familyname,p.givenname LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.familyname,p.givenname LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -169,7 +169,7 @@ public function testGetUsersCountWithValidSortBy(): void public function testGetUsersWithValidSortBypID(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=null) AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=null) AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -183,7 +183,7 @@ public function testGetUsersCountWithValidSortByPid(): void public function testGetUsersWithValidSortBypIDPersonId(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=null) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=null) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -197,7 +197,7 @@ public function testGetUsersCountWithValidSortByPidPersonId(): void public function testGetUsersWithValidSortBypIDPersonIdIsManager(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6, true); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=null) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=null) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -211,7 +211,7 @@ public function testGetUsersCountWithValidSortByPidPersonIdIsManager(): void public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserId(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6, true, 7); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -225,7 +225,7 @@ public function testGetUsersCountWithValidSortByPidPersonIdIsManagerCurrentUserI public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserIdGid(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6, true, 7, 8); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN UserGroup_has_Person uhp ON uhp.personid = p.personid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND uhp.usergroupid=8 GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN UserGroup_has_Person uhp ON uhp.personid = p.personid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND uhp.usergroupid=8 GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -239,7 +239,7 @@ public function testGetUsersCountWithValidSortByPidPersonIdIsManagerCurrentUserI public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserIdSid(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6, true, 7, null, 9); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN blsession_has_person shp ON shp.personid = p.personid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND shp.sessionid=9 GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN blsession_has_person shp ON shp.personid = p.personid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND shp.sessionid=9 GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -253,7 +253,7 @@ public function testGetUsersCountWithValidSortByPidPersonIdIsManagerCurrentUserI public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserIdPjid(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6, true, 7, null, null, 10); - $this->assertEquals("SELECT CONCAT(CONCAT(p.personid, '-'), php.projectid) as ppid, p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN Project_has_Person php ON p.personid = php.personid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND php.projectid=10 GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT CONCAT(p.personid, '-', php.projectid) as ppid, p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN Project_has_Person php ON p.personid = php.personid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND php.projectid=10 GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -267,21 +267,21 @@ public function testGetUsersCountWithValidSortByPidPersonIdIsManagerCurrentUserI public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserIdVisitname(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6, true, 7, null, null, null, 'visit1'); - $this->assertEquals("SELECT count(ses.sessionid) as visits, DATE_FORMAT(max(ses.startdate), '%d-%m-%Y') as last, shp.remote, shp.role, p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN Session_has_Person shp ON shp.personid = p.personid INNER JOIN BLSession s ON shp.sessionid = s.sessionid INNER JOIN Proposal pr ON pr.proposalid = s.proposalid LEFT OUTER JOIN Session_has_Person shp2 ON p.personid = shp2.personid LEFT OUTER JOIN BLSession ses ON ses.sessionid = shp2.sessionid AND ses.startdate < s.startdate WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND shp.remote IS NOT NULL AND CONCAT(CONCAT(CONCAT(pr.proposalcode,pr.proposalnumber), '-'), s.visit_number) LIKE 'visit1' GROUP BY p.personid, p.givenname, p.familyname, p.login ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT count(ses.sessionid) as visits, DATE_FORMAT(max(ses.startdate), '%d-%m-%Y') as last, shp.remote, shp.role, p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN Session_has_Person shp ON shp.personid = p.personid INNER JOIN BLSession s ON shp.sessionid = s.sessionid INNER JOIN Proposal pr ON pr.proposalid = s.proposalid LEFT OUTER JOIN Session_has_Person shp2 ON p.personid = shp2.personid LEFT OUTER JOIN BLSession ses ON ses.sessionid = shp2.sessionid AND ses.startdate < s.startdate WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND shp.remote IS NOT NULL AND CONCAT(pr.proposalcode, pr.proposalnumber, '-', s.visit_number) LIKE 'visit1' GROUP BY p.personid, p.givenname, p.familyname, p.login ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } public function testGetUsersCountWithValidSortByPidPersonIdIsManagerCurrentUserIdVisitname(): void { $res = $this->userData->getUsers(true, true, 's', 3, 'LOGIN', 5, 5, 6, true, 7, null, null, null, 'visit1'); - $this->assertEquals("SELECT count(distinct p.personid) as tot FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid INNER JOIN Session_has_Person shp ON shp.personid = p.personid INNER JOIN BLSession s ON shp.sessionid = s.sessionid INNER JOIN Proposal pr ON pr.proposalid = s.proposalid LEFT OUTER JOIN Session_has_Person shp2 ON p.personid = shp2.personid LEFT OUTER JOIN BLSession ses ON ses.sessionid = shp2.sessionid AND ses.startdate < s.startdate WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND shp.remote IS NOT NULL AND CONCAT(CONCAT(CONCAT(pr.proposalcode,pr.proposalnumber), '-'), s.visit_number) LIKE 'visit1'", $this->db->getLastQuery()); + $this->assertEquals("SELECT count(distinct p.personid) as tot FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid INNER JOIN Session_has_Person shp ON shp.personid = p.personid INNER JOIN BLSession s ON shp.sessionid = s.sessionid INNER JOIN Proposal pr ON pr.proposalid = s.proposalid LEFT OUTER JOIN Session_has_Person shp2 ON p.personid = shp2.personid LEFT OUTER JOIN BLSession ses ON ses.sessionid = shp2.sessionid AND ses.startdate < s.startdate WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND shp.remote IS NOT NULL AND CONCAT(pr.proposalcode, pr.proposalnumber, '-', s.visit_number) LIKE 'visit1'", $this->db->getLastQuery()); $this->assertEmpty($res); } public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserIdPerPage(): void { $res = $this->userData->getUsers(false, true, 's', 1, 'LOGIN', 5, 5, 6, true, 7, null, null, null, null, 3); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 0,3", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 0,3", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -302,7 +302,7 @@ public function testGetUsersCountWithValidSortByPidPersonIdIsManagerCurrentUserI public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserIdPerPageDirAndIsOnlyLogin(): void { $res = $this->userData->getUsers(false, true, 's', 1, 'LOGIN', 5, 5, 6, true, 7, null, null, null, null, 3, false, false, true); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(CONCAT(p.givenname, ' '), p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login DESC LIMIT 0,3", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login DESC LIMIT 0,3", $this->db->getLastQuery()); $this->assertEmpty($res); } diff --git a/client/src/js/models/sample.js b/client/src/js/models/sample.js index d1a52789a..3abf17909 100644 --- a/client/src/js/models/sample.js +++ b/client/src/js/models/sample.js @@ -65,6 +65,7 @@ define(['backbone', 'collections/components', CELL_BETA: '', CELL_GAMMA: '', CENTRINGMETHOD: '', + COLOR: '', COMMENTS: '', COMPOSITION: '', CONTAINERID: '', @@ -183,6 +184,16 @@ define(['backbone', 'collections/components', pattern: 'number' }, + SHAPE: { + required: false, + pattern: 'word', + }, + + COLOR: { + required: false, + pattern: 'word', + }, + LOOPTYPE: { required: false, pattern: 'word', diff --git a/client/src/js/modules/imaging/views/queuecontainer.js b/client/src/js/modules/imaging/views/queuecontainer.js index 18e12b079..8c53dc5eb 100644 --- a/client/src/js/modules/imaging/views/queuecontainer.js +++ b/client/src/js/modules/imaging/views/queuecontainer.js @@ -524,6 +524,7 @@ define(['marionette', 'click button.submit': 'queueContainer', 'click a.apply': 'applyPreset', 'click a.unqueue': 'unqueueContainer', + 'click a.addpage': 'queuePageSamples', 'click a.addall': 'queueAllSamples', 'change @ui.nodata': 'refreshSubSamples', 'change @ui.notcompleted': 'refreshSubSamples', @@ -538,7 +539,7 @@ define(['marionette', }, - queueAllSamples: function(e) { + queuePageSamples: function(e) { e.preventDefault() var self = this @@ -562,6 +563,28 @@ define(['marionette', }, 200) }, + queueAllSamples: function(e) { + e.preventDefault() + + var self = this + this.$el.addClass('loading'); + Backbone.ajax({ + url: app.apiurl+'/sample/sub/queue/cid/'+this.model.get('CONTAINERID'), + method: "post", + data: {}, + success: function(resp) { + _.each(resp, function (r) { + var ss = self.subsamples.fullCollection.findWhere({ BLSUBSAMPLEID: r.BLSUBSAMPLEID }) + ss.set({ READYFORQUEUE: '1' }) + }) + }, + complete: function(resp, status) { + self.$el.removeClass('loading') + self.refreshQSubSamples(self) + } + }) + }, + unqueueContainer: function(e) { e.preventDefault() diff --git a/client/src/js/modules/samples/views/view.js b/client/src/js/modules/samples/views/view.js index 945810f86..30777376e 100644 --- a/client/src/js/modules/samples/views/view.js +++ b/client/src/js/modules/samples/views/view.js @@ -103,6 +103,11 @@ define(['marionette', edit.create('EXPERIMENTKIND', 'select', { data: EXP.obj() }) edit.create('RADIATIONSENSITIVITY', 'select', { data: RS.obj() }) edit.create('ENERGY', 'text') + edit.create('DIMENSION1', 'text') + edit.create('DIMENSION2', 'text') + edit.create('DIMENSION3', 'text') + edit.create('SHAPE', 'text') + edit.create('COLOR', 'text') if (!this.model.get('HASDATA')) { edit.create('CODE', 'text') diff --git a/client/src/js/modules/shipment/models/transfer.js b/client/src/js/modules/shipment/models/transfer.js index cea27feb4..786ce1545 100644 --- a/client/src/js/modules/shipment/models/transfer.js +++ b/client/src/js/modules/shipment/models/transfer.js @@ -65,11 +65,6 @@ define(['backbone'], function(Backbone) { } }, - DELIVERYAGENT_SHIPPINGDATE: { - pattern: 'edate', - required: true, - }, - }, }) diff --git a/client/src/js/modules/shipment/views/dispatch.js b/client/src/js/modules/shipment/views/dispatch.js index c9ac364cc..cf74fb433 100644 --- a/client/src/js/modules/shipment/views/dispatch.js +++ b/client/src/js/modules/shipment/views/dispatch.js @@ -167,6 +167,7 @@ define(['marionette', 'views/form', var self = this this.visits = new VVisits(null, { state: { pageSize: 9999 } }) + this.visits.queryParams.notnull = 1 this.ready = [] this.ready.push(this.visits.fetch()) diff --git a/client/src/js/modules/shipment/views/transfer.js b/client/src/js/modules/shipment/views/transfer.js index 20f0f16f8..0169d9f38 100644 --- a/client/src/js/modules/shipment/views/transfer.js +++ b/client/src/js/modules/shipment/views/transfer.js @@ -80,12 +80,6 @@ define(['marionette', 'views/form', }, onRender: function() { - this.date('input[name=DELIVERYAGENT_SHIPPINGDATE]') - - var d = new Date() - var today = (d.getDate() < 10 ? '0'+d.getDate() : d.getDate()) + '-' + (d.getMonth() < 9 ? '0'+(d.getMonth()+1) : d.getMonth()+1) + '-' + d.getFullYear() - this.$el.find('input[name=DELIVERYAGENT_SHIPPINGDATE]').val(today) - var self = this this.ready.done(function() { self.ui.exp.html(self.visits.opts()).val(self.model.get('VISIT')) @@ -156,4 +150,4 @@ define(['marionette', 'views/form', }, }) -}) \ No newline at end of file +}) diff --git a/client/src/js/modules/visits/views/visit_list.vue b/client/src/js/modules/visits/views/visit_list.vue index f5414b38d..36a7d4396 100644 --- a/client/src/js/modules/visits/views/visit_list.vue +++ b/client/src/js/modules/visits/views/visit_list.vue @@ -45,6 +45,15 @@ v-model="visit.edited_comment" v-on:keyup.enter="onEnter(visit)" /> +
+
+ + + {{dewar.FACILITYCODE || dewar.CODE}} + - {{dewar.GIVENNAME}} {{dewar.FAMILYNAME}} - {{dewar.STORAGELOCATION || dewar.DEWARSTATUS}} + +
+
@@ -79,7 +88,7 @@
New LocationNew Local Contact
Full Name Lab / Company Name
Pickup Date
Comments