diff --git a/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight.css b/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight.css
new file mode 100644
index 00000000..81bc80c8
--- /dev/null
+++ b/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight.css
@@ -0,0 +1,7 @@
+@media (min-width: 992px) {
+ .farm-report-graph {
+ float: right;
+ margin-left: 1em;
+ width: 50%;
+ }
+}
diff --git a/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight.info b/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight.info
index 00073689..64af6435 100644
--- a/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight.info
+++ b/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight.info
@@ -6,3 +6,4 @@ dependencies[] = farm_livestock
dependencies[] = farm_inventory
dependencies[] = farm_quantity
dependencies[] = farm_quantity_log
+dependencies[] = farm_report
diff --git a/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight.install b/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight.install
new file mode 100644
index 00000000..4b135fda
--- /dev/null
+++ b/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight.install
@@ -0,0 +1,16 @@
+ 'Weight',
+ 'page callback' => 'farm_livestock_weight_individual_report',
+ 'page arguments' => array($farm_asset_uri_argument_position),
+ 'access callback' => 'farm_livestock_weight_individual_report_access',
+ 'access arguments' => array($farm_asset_uri_argument_position),
+ 'file' => 'farm_livestock_weight.report.inc',
+ 'type' => MENU_LOCAL_TASK,
+ 'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
+ );
+
+ // Animal group report form.
+ $items['farm/report/weight'] = array(
+ 'title' => 'Animal Weights',
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('farm_livestock_weight_group_report_form'),
+ 'access arguments' => array('view farm reports'),
+ 'type' => MENU_LOCAL_TASK,
+ );
+
+ return $items;
+};
+
+/**
+ * Individual report view access callback.
+ *
+ * @param $farm_asset
+ * The asset to check access for.
+ *
+ * @return bool
+ * Returns boolean value indicating whether or not access is granted.
+ */
+function farm_livestock_weight_individual_report_access($farm_asset) {
+
+ // If the asset is not an animal, deny access.
+ if ($farm_asset->type != 'animal') {
+ return FALSE;
+ }
+
+ // Finally, check to see if the user has access to the asset.
+ return farm_asset_access('view', $farm_asset);
+}
+
+/**
+ * Animal group report form.
+ */
+function farm_livestock_weight_group_report_form($form, &$form_state) {
+
+ // Set the page title.
+ drupal_set_title('Animal Weights');
+
+ // Build an entity field query of group assets.
+ $query = new EntityFieldQuery();
+ $query->entityCondition('entity_type', 'farm_asset');
+ $query->entityCondition('bundle', 'group');
+ $query->propertyOrderBy('name', 'ASC');
+
+ // Limit to non-archived groups.
+ $query->propertyCondition('archived', 0);
+
+ // Execute the query and build a list of options.
+ $result = $query->execute();
+ if (isset($result['farm_asset'])) {
+ $group_ids = array_keys($result['farm_asset']);
+ $groups = farm_asset_load_multiple($group_ids);
+ if (!empty($groups)) {
+ foreach ($groups as $group) {
+ if (!empty($group->id)) {
+ $options[$group->id] = entity_label('farm_asset', $group);
+ }
+ }
+ }
+ }
+
+ // Define the input fieldset
+ $form['input'] = array(
+ '#type' => 'fieldset',
+ '#title' => t('Input Form'),
+ '#collapsible' => TRUE,
+ '#collapsed' => FALSE,
+ );
+
+ // Create a select field for the groups.
+ $form['input']['group'] = array(
+ '#type' => 'select',
+ '#title' => t('Animal Group'),
+ '#description' => t('Select the group(s) of animals to include in the weight report.'),
+ '#options' => $options,
+ '#required' => TRUE,
+ '#multiple' => TRUE,
+ );
+
+ // Provide a default date in the format YYYY-MM-DD.
+ $format = 'Y-m-d';
+ $current_date = date($format, REQUEST_TIME);
+
+ $form['input']['start_date'] = array(
+ '#type' => 'date_select',
+ '#title' => t('Start date'),
+ '#description' => t('First recorded date of animal weights to include..'),
+ '#default_value' => '',
+ '#date_year_range' => '-10:+1',
+ '#date_format' => $format,
+ '#date_label_position' => 'within',
+ );
+
+ $form['input']['end_date'] = array(
+ '#type' => 'date_select',
+ '#title' => t('End date'),
+ '#description' => t('Last recorded date of animal weights to include..'),
+ '#default_value' => $current_date,
+ '#date_year_range' => '-10:+1',
+ '#date_format' => $format,
+ '#date_label_position' => 'within',
+ );
+
+ // Add submit button to generate report.
+ $form['input']['submit'] = array(
+ '#type' => 'submit',
+ '#value' => t('Submit'),
+ '#submit' => array('farm_livestock_weight_group_report_form_submit'),
+ );
+
+ // Add submit button to download CSV.
+ $form['input']['csv'] = array(
+ '#type' => 'submit',
+ '#value' => t('CSV'),
+ '#submit' => array('farm_livestock_weight_group_report_csv'),
+ );
+
+ // Display results from the form.
+ if (!empty($form_state['results_table'])) {
+ // Hide the input fieldset
+ $form['input']['#collapsed'] = TRUE;
+
+ // Create a results fieldset.
+ $form['results'] = array(
+ '#type' => 'fieldset',
+ '#title' => t('Results'),
+ '#collapsible' => TRUE,
+ '#collapsed' => FALSE,
+ );
+
+ // Display the Graphs.
+ $graphs = '
' . implode('', $form_state['graph-markup']) . '
';
+
+ // Add JS and CSS to build the graphs.
+ drupal_add_js($form_state['graph-settings'], 'setting');
+ drupal_add_js(drupal_get_path('module', 'farm_livestock_weight') . '/farm_livestock_weight_group_graph.js');
+ drupal_add_js('https://cdn.plot.ly/plotly-latest.min.js', 'external');
+ drupal_add_css(drupal_get_path('module', 'farm_livestock_weight') . '/farm_livestock_weight.css');
+
+ $form['results']['graphs'] = array('#markup' => $graphs);
+
+ // Display the HTML Table.
+ $form['results']['results_table'] = array('#markup' => $form_state['results_table']);
+ }
+
+ return $form;
+}
+
+/**
+ * Submit handler for the weight report form
+ */
+function farm_livestock_weight_group_report_form_submit($form, &$form_state) {
+ $results = farm_livestock_weight_group_report($form_state);
+ $form_state['graph-settings'] = $results['graph-settings'];
+ $form_state['graph-markup'] = $results['graph-markup'];
+ $form_state['results_table'] = $results['table'];
+ $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Generate Animal Weight Group Report
+ */
+function farm_livestock_weight_group_report(&$form_state) {
+
+ // Get the submitted group IDs to include in the report.
+ $group_ids = $form_state['values']['group'];
+
+ // Get the start and end dates.
+ $start_date = strtotime($form_state['values']['start_date']);
+ $end_date = strtotime($form_state['values']['end_date']);
+
+ // Array to store dates of animal weight logs for CSV export.
+ $date_format = 'Y-m-d';
+ $all_log_dates = array();
+
+ // Array to store animals and log data
+ $animals = array();
+
+ // Loop through each group, its members, and all weight logs.
+ foreach ($group_ids as $id) {
+
+ // Load the farm group asset.
+ $group = farm_asset_load($id);
+ $group_name = $group->name;
+
+ // Load the farm group members.
+ $members = farm_group_members($group);
+
+ // Loop through members.
+ foreach ($members as $asset) {
+
+ // If member is not an animal, bail.
+ if ($asset->type != 'animal') {
+ continue;
+ }
+
+ // Save the animal info
+ $asset->group = $group;
+
+ // Load the group member's weights
+ $time = REQUEST_TIME;
+ if (!empty($end_date)) {
+ $time = $end_date;
+ }
+ $logs = farm_quantity_log_asset($asset, 'weight', NULL, $time, TRUE, NULL, FALSE);
+
+ // Array to save log dates for this one animal.
+ $log_dates = array();
+
+ // Array to save data from animal logs.
+ $all_log_data = array();
+
+ // Loop through weight logs.
+ foreach ($logs as $log) {
+ // Get the date of the log from the timestamp.
+ $log_date = date($date_format, $log->timestamp);
+
+ // Check that the log timestamp fits the date parameters. Note that we
+ // only need to check the start date bound, because end date is already
+ // filtered by farm_quantity_log_asset().
+ if ($log->timestamp < $start_date) {
+ continue;
+ }
+
+ // Add the log date to the array if not already included.
+ if (!in_array($log_date, $log_dates)){
+ $log_dates[] = $log_date;
+ } else {
+ continue;
+ }
+
+ // Extract quantity data from the log.
+ $data = farm_quantity_log_data($log, 'weight');
+
+ // Iterate through the data and return the first one with a value.
+ foreach ($data as $quantity) {
+ if (!empty($quantity['value'])) {
+ $value = $quantity['value'];
+ $units = $quantity['units'];
+
+ // Add the log data to array of logs.
+ $log_data = array();
+ $log_data['date'] = $log_date;
+ $log_data['value'] = $value;
+ $log_data['units'] = $units;
+
+ $all_log_data[]= $log_data;
+ }
+ }
+ }
+ // Merge animal's log dates with all_log_dates.
+ $all_log_dates = array_unique( array_merge( $all_log_dates, $log_dates));
+
+ // Save all log data with the animal.
+ $asset->all_log_data = $all_log_data;
+
+ // Add animal data to array of all animals.
+ $animals[] = $asset;
+ }
+ }
+
+ // Sort all collected log_dates.
+ sort($all_log_dates);
+
+ // Create a header for CSV and HTML Table
+ $header = array('AssetID', 'AssetName', 'Group');
+
+ // Add columns for each date collected.
+ foreach ($all_log_dates as $date) {
+ $header[] = 'Date - ' . $date ;
+ $header[] = 'Weight';
+ $header[] = 'Units';
+ }
+
+ // Add the CSV header.
+ $csvdata = implode(',', $header) . PHP_EOL;
+
+ // Initialize array for Date Averages
+ $group_date_averages = array();
+ foreach($group_ids as $id) {
+ $group_date_averages[$id] = array(
+ 'group' => farm_asset_load($id),
+ 'dates' => array(),
+ );
+ }
+
+ foreach ($animals as $animal) {
+ // Add a row of data.
+ $row = array();
+ $row[] = $animal->id;
+ $row[] = $animal->name;
+ $row[] = $animal->group->name;
+
+ // Save the logs.
+ $logs = $animal->all_log_data;
+
+ // Skip adding logs if the animal has no logs
+ if (sizeof($logs) == 0) {
+ // Add Animal info to results.
+ $table_data[] = $row;
+ $csvdata .= implode(',', $row) . PHP_EOL;
+ continue;
+ }
+
+ // Sort the logs by date.
+ usort($logs, "farm_livestock_weight_log_array_sort_date");
+
+ // Save a counter for which log to compare.
+ $curr_log_index = 0;
+
+ // Save a counter for which column to compare.
+ $curr_column_index = 0;
+
+ // Walk through each column and add log data if log date == column date.
+ // Note that each date requires 3 columns in the CSV file to display the
+ // date, value and units of recorded log weights.
+ while($curr_log_index < sizeof($logs) && $curr_column_index < sizeof($all_log_dates)) {
+
+ // Conert the dates to times for easier comparison.
+ $column_time = strtotime($all_log_dates[$curr_column_index]);
+ $log_time = strtotime($logs[$curr_log_index]['date']);
+
+ // If the log_time is less than column_time, then there are multiple logs
+ // on the same date for the animal. The first one has already been saved,
+ // skip any additional logs with the same date.
+ if ($column_time > $log_time) {
+ $curr_log_index += 1;
+
+ // Set empty values if the times don't match.
+ // Move to next column
+ } else if ($column_time != $log_time) {
+ $row[] = '';
+ $row[] = '';
+ $row[] = '';
+ $curr_column_index += 1;
+
+
+ } else {
+ $log_date = $logs[$curr_log_index]['date'];
+ $log_value = $logs[$curr_log_index]['value'];
+ $log_units = $logs[$curr_log_index]['units'];
+
+ // Save the log date, value and units if the times match.
+ $row[] = $log_date;
+ $row[] = $log_value;
+ $row[] = $log_units;
+
+ // For displaying graphs of average weights
+ // Tally the weight of the animal in the All Log Dates array
+
+ // Initialize the Group's average weight array for the log date.
+ if (!isset($group_date_averages[$animal->group->id]['dates'][$log_date])) {
+ $group_date_averages[$animal->group->id]['dates'][$log_date] = array(
+ 'units' => $log_units,
+ 'total_weight' => $log_value,
+ 'animal_count' => 1,
+ );
+ } else {
+ $group_date_averages[$animal->group->id]['dates'][$log_date]['total_weight'] += $log_value;
+ $group_date_averages[$animal->group->id]['dates'][$log_date]['animal_count'] += 1;
+ }
+
+ // Move to next column, and next log.
+ $curr_column_index += 1;
+ $curr_log_index += 1;
+ }
+ }
+
+ // Add row to HTML Table
+ $table_data[] = $row;
+
+ // Add to CSV string
+ $csvdata .= implode(',', $row) . PHP_EOL;
+ }
+
+ // Create HTML Table
+ $table = theme('table', array('header' => $header, 'rows' => $table_data));
+
+ // Create the div to hold report graphs.
+ $graph_markup = array();
+
+ // Create a graph object to pass to JS.
+ $graphs = array();
+
+ // Create graphs for each group
+ foreach($group_date_averages as $group){
+ $group_name = $group['group']->name;
+
+ // Sort the array by date
+ ksort($group['dates']);
+
+ $dates = array_keys($group['dates']);
+ for($i = 0; $i < count($group['dates']); $i++){
+ $date = $dates[$i];
+
+ // Calculate average weight.
+ $date_average = $group['dates'][$date]['total_weight'] / $group['dates'][$date]['animal_count'];
+ $group['dates'][$date]['average_weight'] = $date_average;
+
+ // Calculate Average Daily Gain after the first date.
+ if ($i > 0) {
+ $previous_date = $dates[$i -1];
+ $previous_average = $group['dates'][$previous_date]['average_weight'];
+
+ // Calculate gain between the two dates.
+ $gain = $date_average - $previous_average;
+
+ // Calculate days elapsed.
+ $dStart = new DateTime($previous_date);
+ $dEnd = new DateTime($date);
+ $days_elapsed = (int) $dStart->diff($dEnd)->format("%a");
+
+ // Save the daily gain value within the 'date' array.
+ $group['dates'][$date]['gain'] = $gain / $days_elapsed;
+ }
+ }
+
+ // Create Average Weight Graph
+ $graph = array(
+ 'name' => 'Average Weight - ' . $group_name,
+ 'id' => 'farm-livestock-average-weight-' . $group_name . '-graph',
+ 'data' => $group['dates'],
+ );
+ $graphs[] = $graph;
+ $graph_markup[] = '';
+ }
+
+ $graph_settings = array(
+ 'farm_livestock_report' => array(
+ 'graphs' => $graphs,
+ ),
+ );
+
+ return array(
+ 'graph-settings' => $graph_settings,
+ 'graph-markup' => $graph_markup,
+ 'table' => $table,
+ 'csv' => $csvdata,
+ );
+}
+
+/**
+ * Animal Weight Group Report CSV Export
+ */
+function farm_livestock_weight_group_report_csv($form, &$form_state){
+ $results = farm_livestock_weight_group_report($form_state);
+
+ drupal_add_http_header('Content-Type', 'text/csv');
+ drupal_add_http_header('Content-Disposition', 'attachment; filename=animal_weights.csv');
+ print $results['csv'];
+
+ drupal_exit();
+}
+
+/**
+ * Helper function to sort an array of logs by timestamp
+ */
+ function farm_livestock_weight_log_array_sort_date($a, $b) {
+ return strtotime($a['date']) - strtotime($b['date']);
+ }
/**
* Implements hook_entity_view_alter().
@@ -101,6 +585,7 @@ function farm_livestock_weight_entity_view_alter(&$build, $type) {
// Alias the asset variable.
$asset = $build['#entity'];
+ $asset_uri = entity_uri('farm_asset', $asset);
// If it isn't an animal asset, bail.
if ($asset->type != 'animal') {
@@ -120,7 +605,7 @@ function farm_livestock_weight_entity_view_alter(&$build, $type) {
$units = !empty($weight['units']) ? $weight['units'] : '';
// Build the weight display.
- $output = '' . t('Weight') . ': ' . $value . ' ' . $units;
+ $output = '' . t('Weight') . ': ' . $value . ' ' . $units . ' (weight report) ';
// If the animal has an inventory greater than 1, add "(average)".
$inventory = farm_inventory($asset);
diff --git a/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight.report.inc b/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight.report.inc
new file mode 100644
index 00000000..096c622f
--- /dev/null
+++ b/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight.report.inc
@@ -0,0 +1,96 @@
+No weight recorded for asset';
+ } else {
+ $output .= 'Current Weight: ' . $current_weight['value'] . ' ' . $current_weight['units'] . '
';
+ };
+
+ // Get all 'weight' logs associated with the asset.
+ $logs = farm_quantity_log_asset($farm_asset, 'weight', $label = NULL, $time = REQUEST_TIME, $done = TRUE, $type = NULL, $single = FALSE);
+
+ // Store all log weight data
+ $log_weights = array();
+
+ // Ensure there are weight logs.
+ if (!empty($logs)) {
+ // Simple html table of weights.
+ $output .= ' All Weights
';
+ $header = array('Date', 'Value', 'Units');
+ $table_data = array();
+
+ foreach ($logs as $log) {
+ // Extract quantity data from the log.
+ $data = farm_quantity_log_data($log, 'weight');
+
+ // Iterate through the data and return the first one with a value.
+ foreach ($data as $quantity) {
+ if (!empty($quantity['value'])) {
+ $value = $quantity['value'];
+ $units = $quantity['units'];
+
+ // Save the timestamp with data for the graph.
+ $quantity['timestamp'] = $log->timestamp;
+
+ // Add to $log_weights array.
+ $log_weights[] = $quantity;
+ $table_data[] = array(format_date($log->timestamp), $value, $units);
+ }
+ }
+ }
+ $output .= theme('table', array('header' => $header, 'rows' => $table_data));
+
+ // Create the div to hold report graphs.
+ $graph_markup = array();
+
+ // Create a graph object to pass to JS.
+ $graphs = array();
+
+ // Create a Weight Report Graph
+ $graph = array(
+ 'name' => $farm_asset->name . ' Weight Report',
+ 'id' => 'farm-report-weight-graph',
+ 'data' => $log_weights,
+ );
+ $graph_markup[] = '';
+ $graphs[] = $graph;
+
+ $settings = array(
+ 'farm_livestock_report' => array(
+ 'graphs' => $graphs,
+ ),
+ );
+
+ // Add graphs to output.
+ $output = '' . implode('', $graph_markup) . '
' . $output;
+
+ // Add JS and CSS to build the graphs.
+ drupal_add_js($settings, 'setting');
+ drupal_add_js(drupal_get_path('module', 'farm_livestock_weight') . '/farm_livestock_weight.js');
+ drupal_add_js('https://cdn.plot.ly/plotly-latest.min.js', 'external');
+ drupal_add_css(drupal_get_path('module', 'farm_livestock_weight') . '/farm_livestock_weight.css');
+ }
+
+ return $output;
+}
diff --git a/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight_group_graph.js b/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight_group_graph.js
new file mode 100644
index 00000000..59ccbaae
--- /dev/null
+++ b/modules/farm/farm_livestock/farm_livestock_weight/farm_livestock_weight_group_graph.js
@@ -0,0 +1,80 @@
+(function ($) {
+ Drupal.behaviors.farm_livestock_weight_graph = {
+ attach: function (context, settings) {
+
+ // Calculate the timezone offset in milliseconds.
+ var tzoffset = (new Date()).getTimezoneOffset() * 60000;
+
+ // Iterate through the graphs.
+ for (var i = 0; i < settings.farm_livestock_report.graphs.length; i++) {
+
+ // Get the graph name, id, and data.
+ var name = settings.farm_livestock_report.graphs[i]['name'];
+ var id = settings.farm_livestock_report.graphs[i]['id'];
+ var data = settings.farm_livestock_report.graphs[i]['data'];
+
+ // Initialize variables.
+ var average_dates=[];
+ var average_values=[];
+ var average_value_text=[];
+
+ var gain_dates=[];
+ var gain_values=[];
+
+ // Initialize the default_units
+ var default_units = '';
+
+ // Iterate through the data and put it into the arrays.
+ for (var d in data) {
+ if (default_units == '') {
+ default_units = data[d].units;
+ }
+ var date = new Date(d).toISOString();
+ average_dates.push(date);
+ average_values.push(data[d].average_weight);
+ average_value_text.push(data[d].animal_count + " animals weighed");
+
+ if (data[d].hasOwnProperty('gain')) {
+ gain_dates.push(date);
+ gain_values.push(data[d].gain);
+ }
+ }
+
+ // Assemble variables for plotly.
+ var average_data={
+ x: average_dates,
+ y: average_values,
+ text: average_value_text,
+ name: 'Average Weight',
+ type: 'scatter'
+ };
+
+ var gain_data={
+ x: gain_dates,
+ y: gain_values,
+ yaxis: 'y2',
+ name: 'Average Daily Gain',
+ type: 'scatter'
+ };
+
+ var all_data = [average_data, gain_data];
+
+ var layout = {
+ title: name,
+ height: 400,
+ xaxis: { title: 'Date' },
+ yaxis: { title: 'Average Weight (' + default_units + ')' },
+ yaxis2: {
+ title: 'Average Daily Gain (' + default_units + ')',
+ overlaying: 'y',
+ side: 'right'
+ }
+ };
+
+ // Draw the graph to the element.
+ element = document.getElementById(id);
+ Plotly.newPlot(element, all_data, layout);
+ }
+ }
+ };
+}(jQuery));
diff --git a/modules/farm/farm_quantity/farm_quantity_log/farm_quantity_log.module b/modules/farm/farm_quantity/farm_quantity_log/farm_quantity_log.module
index 598ea862..d9c582b5 100644
--- a/modules/farm/farm_quantity/farm_quantity_log/farm_quantity_log.module
+++ b/modules/farm/farm_quantity/farm_quantity_log/farm_quantity_log.module
@@ -74,7 +74,7 @@ function farm_quantity_log_data(Log $log, $measure = NULL, $label = NULL) {
}
/**
- * Load an asset's latest log with a given quantity measure and/or label.
+ * Load logs for an asset with a given quantity measure and/or label.
*
* @param FarmAsset $asset
* The farm_asset object to look for.
@@ -89,11 +89,15 @@ function farm_quantity_log_data(Log $log, $measure = NULL, $label = NULL) {
* Whether or not to only show logs that are marked as "done". TRUE will limit
* to logs that are done, and FALSE will limit to logs that are not done. If
* this is set to NULL, no filtering will be applied. Defaults to TRUE.
+ * @param string $type
+ * The log type to filter by. If empty, no filtering will be applied.
+ * @param bool $single
+ * Whether or not to limit the query to a single result. Defaults to TRUE.
*
- * @return Log|bool
- * Returns a log entity. FALSE if something goes wrong.
+ * @return Log|array|bool
+ * Returns a log entity, or an array of them. FALSE if something goes wrong.
*/
-function farm_quantity_log_asset(FarmAsset $asset, $measure = NULL, $label = NULL, $time = REQUEST_TIME, $done = TRUE) {
+function farm_quantity_log_asset(FarmAsset $asset, $measure = NULL, $label = NULL, $time = REQUEST_TIME, $done = TRUE, $type = NULL, $single = TRUE) {
// If the asset doesn't have an ID (for instance if it is new and hasn't been
// saved yet), bail.
@@ -102,21 +106,34 @@ function farm_quantity_log_asset(FarmAsset $asset, $measure = NULL, $label = NUL
}
// Make a query for loading the latest quantity log.
- $query = farm_quantity_log_asset_query($asset->id, $measure, $label, $time, $done);
+ $query = farm_quantity_log_asset_query($asset->id, $measure, $label, $time, $done, $type, $single);
// Execute the query and gather the log id.
$result = $query->execute();
- $log_id = $result->fetchField();
- // If a log id exists, load and return it.
- if (!empty($log_id)) {
- return log_load($log_id);
+ // Return array of log objects. $single = FALSE
+ if (empty($single)) {
+ $log_item_ids = $result->fetchCol();
+ $logs = entity_load('log', $log_item_ids);
+ return $logs;
}
+
+ // Return one log object. $single = TRUE
+ else {
+ if (!empty($single)) {
+ $log_id = $result->fetchField();
+ if (!empty($log_id)) {
+ return log_load($log_id);
+ };
+ };
+ }
+
+ // If all else fails, return FALSE.
return FALSE;
}
/**
- * Build a query to find the latest log of an asset that defines a quantity.
+ * Build a query to find logs of an asset that defines a quantity.
*
* @param int $asset_id
* The asset id to search for.
@@ -127,15 +144,19 @@ function farm_quantity_log_asset(FarmAsset $asset, $measure = NULL, $label = NUL
* @param int $time
* Unix timestamp limiter. Only logs before this time will be included.
* Defaults to the current time. Set to 0 to load the absolute last.
- * @param $done
+ * @param bool|null $done
* Whether or not to only show logs that are marked as "done". TRUE will limit
* to logs that are done, and FALSE will limit to logs that are not done. If
- * any other value is used, no filtering will be applied. Defaults to TRUE.
+ * this is set to NULL, no filtering will be applied. Defaults to TRUE.
+ * @param string|null $type
+ * The log type to filter by. If this is NULL, no filtering will be applied.
+ * @param bool $single
+ * Whether or not to limit the query to a single result. Defaults to TRUE.
*
* @return \SelectQuery
* Returns a SelectQuery object.
*/
-function farm_quantity_log_asset_query($asset_id, $measure = NULL, $label = NULL, $time = REQUEST_TIME, $done = TRUE) {
+function farm_quantity_log_asset_query($asset_id, $measure = NULL, $label = NULL, $time = REQUEST_TIME, $done = TRUE, $type = NULL, $single = TRUE) {
/**
* Please read the comments in farm_log_asset_query() to understand how this
@@ -144,7 +165,7 @@ function farm_quantity_log_asset_query($asset_id, $measure = NULL, $label = NULL
*/
// Use the farm_log_asset_query() helper function to start a query object.
- $query = farm_log_asset_query($asset_id, $time, $done);
+ $query = farm_log_asset_query($asset_id, $time, $done, $type, $single);
// Add a query tag to identify where this came from.
$query->addTag('farm_quantity_log_asset_query');
diff --git a/modules/farm/farm_quantity/farm_quantity_report/farm_quantity_report.info b/modules/farm/farm_quantity/farm_quantity_report/farm_quantity_report.info
index 7469d1c7..83596abd 100644
--- a/modules/farm/farm_quantity/farm_quantity_report/farm_quantity_report.info
+++ b/modules/farm/farm_quantity/farm_quantity_report/farm_quantity_report.info
@@ -6,6 +6,7 @@ dependencies[] = ctools
dependencies[] = farm_asset
dependencies[] = farm_log
dependencies[] = farm_quantity
+dependencies[] = farm_report
dependencies[] = views
dependencies[] = views_data_export
features[ctools][] = views:views_default:3.0
diff --git a/modules/farm/farm_quantity/farm_quantity_report/farm_quantity_report.install b/modules/farm/farm_quantity/farm_quantity_report/farm_quantity_report.install
new file mode 100644
index 00000000..c166ce3f
--- /dev/null
+++ b/modules/farm/farm_quantity/farm_quantity_report/farm_quantity_report.install
@@ -0,0 +1,16 @@
+new_display('page', 'Page', 'page');
- $handler->display->display_options['path'] = 'farm/quantity';
+ $handler->display->display_options['path'] = 'farm/report/quantity';
$handler->display->display_options['menu']['type'] = 'tab';
$handler->display->display_options['menu']['title'] = 'Quantity';
$handler->display->display_options['menu']['weight'] = '0';
diff --git a/modules/farm/farm_report/farm_report.info b/modules/farm/farm_report/farm_report.info
new file mode 100644
index 00000000..0aad2044
--- /dev/null
+++ b/modules/farm/farm_report/farm_report.info
@@ -0,0 +1,4 @@
+name = Farm Report
+description = Features for viewing reports.
+core = 7.x
+package = farmOS
diff --git a/modules/farm/farm_report/farm_report.module b/modules/farm/farm_report/farm_report.module
new file mode 100644
index 00000000..dd12785d
--- /dev/null
+++ b/modules/farm/farm_report/farm_report.module
@@ -0,0 +1,64 @@
+ array(
+ 'title' => t('View farm reports'),
+ ),
+ 'configure farm reports' => array(
+ 'title' => t('Configure farm reports'),
+ ),
+ );
+ }
+
+ /**
+ * Implements hook_farm_access_perms().
+ */
+ function farm_report_farm_access_perms($role) {
+ $perms = array();
+
+ // Add the "view farm reports" permission to all roles.
+ $perms[] = 'view farm reports';
+
+ // Load the list of farm roles.
+ $roles = farm_access_roles();
+
+ // If this role has 'config' access, allow them to configure farm reports.
+ if (!empty($roles[$role]['access']['config'])) {
+ $perms[] = 'configure farm reports';
+ }
+
+ return $perms;
+ }
+
+ /**
+ * Implements hook_menu().
+ */
+function farm_report_menu() {
+ $items = array();
+
+ $items['farm/report'] = array(
+ 'title' => 'Reports',
+ 'page callback' => 'farm_report_view',
+ 'access arguments' => array('view farm reports'),
+ 'type' => MENU_LOCAL_TASK,
+ );
+ $items['farm/report/info'] = array(
+ 'title' => 'Info',
+ 'type' => MENU_DEFAULT_LOCAL_TASK,
+ 'weight' => -100,
+ );
+
+ return $items;
+};
+
+function farm_report_view() {
+ return t('Select a report from the menu above.');
+};