diff --git a/include/class.export.php b/include/class.export.php index 0cd672a0270f46c91a64fd8330780b8cafc4fc02..e0da0906b984991a411b34ba9fa616096d7b4fbd 100644 --- a/include/class.export.php +++ b/include/class.export.php @@ -149,6 +149,57 @@ class Export { return false; } + + static function saveOrganizations($sql, $filename, $how='csv') { + + $exclude = array('name'); + $form = OrganizationForm::getDefaultForm(); + $fields = $form->getExportableFields($exclude); + + // Field selection callback + $fname = function ($f) { + return 'cdata.`'.$f->getSelectName().'` AS __field_'.$f->get('id'); + }; + + $sql = substr_replace($sql, + ','.implode(',', array_map($fname, $fields)).' ', + strpos($sql, 'FROM '), 0); + + $sql = substr_replace($sql, + 'LEFT JOIN ('.$form->getCrossTabQuery($form->type, '_org_id', $exclude).') cdata + ON (cdata._org_id = org.id) ', + strpos($sql, 'WHERE '), 0); + + $cdata = array_combine(array_keys($fields), + array_values(array_map( + function ($f) { return $f->get('label'); }, $fields))); + + ob_start(); + echo self::dumpQuery($sql, + array( + 'name' => 'Name', + 'account_manager' => 'Account Manager', + 'users' => 'Users' + ) + $cdata, + $how, + array('modify' => function(&$record, $keys) use ($fields) { + foreach ($fields as $k=>$f) { + if ($f && ($i = array_search($k, $keys)) !== false) { + $record[$i] = $f->export($f->to_php($record[$i])); + } + } + return $record; + }) + ); + $stuff = ob_get_contents(); + ob_end_clean(); + + if ($stuff) + Http::download($filename, "text/$how", $stuff); + + return false; + } + } class ResultSetExporter { diff --git a/include/staff/orgs.inc.php b/include/staff/orgs.inc.php index 4c11d1d369f283ff5bb949f6f17001bf6fd1d815..3da261f3978107a1c6df6da02e91181a589a44e1 100644 --- a/include/staff/orgs.inc.php +++ b/include/staff/orgs.inc.php @@ -3,9 +3,15 @@ if(!defined('OSTSCPINC') || !$thisstaff) die('Access Denied'); $qstr=''; -$select = 'SELECT org.* '; - -$from = 'FROM '.ORGANIZATION_TABLE.' org '; +$select = 'SELECT org.* + ,COALESCE(team.name, + IF(staff.staff_id, CONCAT_WS(" ", staff.firstname, staff.lastname), NULL) + ) as account_manager '; +$from = 'FROM '.ORGANIZATION_TABLE.' org ' + .'LEFT JOIN '.STAFF_TABLE.' staff ON ( + LEFT(org.manager, 1) = "s" AND staff.staff_id = SUBSTR(org.manager, 2)) ' + .'LEFT JOIN '.TEAM_TABLE.' team ON ( + LEFT(org.manager, 1) = "t" AND team.team_id = SUBSTR(org.manager, 2)) '; $where = ' WHERE 1 '; @@ -61,6 +67,8 @@ $from .= ' LEFT JOIN '.USER_TABLE.' user ON (user.org_id = org.id) '; $query="$select $from $where GROUP BY org.id ORDER BY $order_by LIMIT ".$pageNav->getStart().",".$pageNav->getLimit(); //echo $query; +$qhash = md5($query); +$_SESSION['orgs_qs_'.$qhash] = $query; ?> <h2>Organizations</h2> <div style="width:700px; float:left;"> @@ -125,7 +133,10 @@ else </table> <?php if($res && $num): //Show options.. - echo '<div> Page:'.$pageNav->getPageLinks().' </div>'; + echo sprintf('<div> Page: %s <a class="no-pjax" + href="orgs.php?a=export&qh=%s">Export</a></div>', + $pageNav->getPageLinks(), + $qhash); endif; ?> </form> diff --git a/scp/orgs.php b/scp/orgs.php index bfdc267aeacd56772f5226b49ec9f4c57e543e71..b6285da808dee72e1dca344d5d398a686127a061 100644 --- a/scp/orgs.php +++ b/scp/orgs.php @@ -30,7 +30,19 @@ if ($_POST) { $msg = "Successfully imported $status clients"; else $errors['err'] = $status; + break; + default: + $errors['err'] = 'Unknown action'; } +} elseif ($_REQUEST['a'] == 'export') { + require_once(INCLUDE_DIR.'class.export.php'); + $ts = strftime('%Y%m%d'); + if (!($token=$_REQUEST['qh'])) + $errors['err'] = 'Query token required'; + elseif (!($query=$_SESSION['orgs_qs_'.$token])) + $errors['err'] = 'Query token not found'; + elseif (!Export::saveOrganizations($query, "organizations-$ts.csv", 'csv')) + $errors['err'] = 'Internal error: Unable to export results'; } $page = $org? 'org-view.inc.php' : 'orgs.inc.php';