'. t("Not ready yet! Just for testing!") .'

'; break; } return $o; } /* * Since we do not configure anything, the implementation of this hook is needles. But itīs prepared anyway */ /* function stormrecurring_menu() { $items = array(); $items['admin/settings/storm/recurring'] = array( 'title' => 'Expense recurring settings', 'description' => 'Settings for recurring expenses and invoices (not ready yet)', 'page callback' => 'stormrecurring_admin_settings', 'access arguments' => array('Storm: access administration pages'), 'type' => MENU_LOCAL_TASK, ); return $items; } function stormrecurring_admin_settings() { $form['debug'] = array( '#type' => 'markup', '#value' => t('Noting to set up at the moment.'), ); return system_settings_form($form); } */ function stormrecurring_form_alter(&$form, &$form_state, $form_id){ switch($form_id){ case 'stormexpense_node_form': $recurring_nid = db_result(db_query("SELECT recurring_nid FROM {stormrecurrings} WHERE recurring_nid = %d", $form['nid']['#value'])); $form['recurring'] = array( '#type' => 'fieldset', '#title' => t('Set recurring dates for this expense'), '#collapsible' => TRUE, '#collapsed' => TRUE, '#weight' => -10, '#tree' => TRUE, ); #Check if, the current node is no recurring. Recurrings cannot have recurrings. if(!$recurring_nid){ $default = db_fetch_object(db_query("SELECT * FROM {stormrecurring_expense} WHERE expense_nid = %d", $form['nid']['#value'])); $date_begin = _storm_gmtimestamp_to_date($default->date_begin); $date_end = _storm_gmtimestamp_to_date($default->date_end); $form['#storage']['recurring'] = $default; $form['recurring']['interval'] = array( '#type' => 'select', '#default_value' => $default->intervall, '#options' => array('none', 'monthly', 'weekly', 'daily'), ); $form['recurring']['delete'] = array( '#type' => 'fieldset', '#title' => t('Delete options'), '#collapsible' => TRUE, '#collapsed' => TRUE, '#weight' => -10, '#tree' => TRUE, ); $form['recurring']['delete']['delete_all'] = array( '#type' => 'checkbox', '#title' => t('Delete all recurrings of this expense. !ATTENTION: All recurrings will be deleted immediately!'), ); $form['recurring']['delete']['delete_old'] = array( '#type' => 'checkbox', '#default_value' => 1, '#title' => t('Delete recurrings of this expense, and add new ones. !ATTENTION: All recurrings will be deleted immediately!'), ); $form['recurring']['date_begin'] = array( '#type' => 'date', '#default_value' => $date_begin, '#title' => t('Specify the date to begin.'), ); $form['recurring']['date_end'] = array( '#type' => 'date', '#default_value' => $date_end, '#title' => t('Specify the date to stop.'), '#description' => t('ATTENTION: The creating of recurring expenses is limited to 20! Otherwise your system may come into performance trouble!'), ); }else{ $form['recurring']['attention'] = array( '#type' => 'item', '#value' => t('ATTENTION: This expense is already a recurring expense. No further recurrings possible.'), ); } break; } } function stormrecurring_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL){ if($node->type == 'stormexpense'){ switch($op){ case 'validate': $delete_info = $node->recurring['delete']; if($delete_info['delete_old'] && $delete_info['delete_all']){ form_set_error('delete_old', t('You selected both delete options. This operation is impossible.')); } break; case 'presave': #The flag $node->is_recurring is set before the recurrings are created to avoid conflicts in this hook. if(!$node->is_recurring && $node->recurring['interval'] != 0){ #get storage and prepare db queries. $storage = db_fetch_object(db_query("SELECT * FROM {stormrecurring_expense} WHERE expense_nid = %d", $node->nid)); $delete_info = $node->recurring['delete']; $record = new stdClass(); $record->expense_nid = $node->nid; $record->intervall = $node->recurring['interval']; $record->date_begin = mktime(0, 0, 0, $node->recurring['date_begin']['month'], $node->recurring['date_begin']['day'], $node->recurring['date_begin']['year']); $record->date_end = mktime(0, 0, 0, $node->recurring['date_end']['month'], $node->recurring['date_end']['day'], $node->recurring['date_end']['year']); $expense_object = db_fetch_object(db_query("SELECT * FROM {stormrecurring_expense} WHERE expense_nid = %d",$node->nid)); $update = $expense_object->expense_nid ? 'eid' : NULL; $record->eid = $expense_object->expense_nid ? $expense_object->eid : NULL; #check the recurring data changes and delete options #todo: check each recurring data change to avoid redundant deletes and re-creations of existing recurrings if($delete_info['delete_old'] && !$delete_info['delete_all']){ if(($storage->date_begin != $record->date_begin) || ($storage->date_end != $record->date_end) || ($storage->intervall != $record->intervall)){ _stormrecurring_delete_recurring_nodes($node->nid); drupal_write_record('stormrecurring_expense', $record, $update); stormrecurring_create_recurring_nodes($record, $storage); } }elseif(!$delete_info['delete_old'] && $delete_info['delete_all']){ _stormrecurring_delete_recurring_nodes($node->nid); db_query("DELETE FROM {stormrecurring_expense} WHERE expense_nid = %d",$node->nid); }elseif(!$delete_info['delete_old'] && !$delete_info['delete_all']){ drupal_write_record('stormrecurring_expense', $record, $update); stormrecurring_create_recurring_nodes($record, $storage); } } break; case 'view': $recurring_nid = db_result(db_query("SELECT recurring_nid FROM {stormrecurrings} WHERE recurring_nid = %d", $node->nid)); if(!$recurring_nid){ drupal_add_css(drupal_get_path('module','stormrecurring').'/stormrecurring.css'); $data = db_fetch_object(db_query("SELECT * FROM {stormrecurring_expense} WHERE expense_nid = %d", $node->nid)); $res = db_query("SELECT a.*, b.title FROM {stormrecurrings} AS a, {node} AS b WHERE a.expense_nid = %d AND a.recurring_nid = b.nid", $node->nid); while($recurring_expenses = db_fetch_object($res)){ $item = array(); $item[] = l(t($recurring_expenses->title), 'node/' .$recurring_expenses->recurring_nid); $items[] = $item; } $data->item_list = theme('item_list', $items); $o = theme('stormrecurring_view', $data); $node->content['recurrings'] = array( '#value' => $o, '#weight' => 20, ); } } } } function stormrecurring_theme() { return array( 'stormrecurring_view' => array( 'arguments' => array('data' => NULL), ), ); } function theme_stormrecurring_view($data){ $begin_date = date("m/d/Y", $data->date_begin); $end_date = date("m/d/Y", $data->date_end); if($data->intervall == 1){ $intervall = t('monthly'); }elseif($data->intervall == 2){ $intervall = t('weekly'); }elseif($data->intervall == 3){ $intervall = t('daily'); }else{ $intervall = t('not defined');; $begin_date = t('none'); } $o = '

'.t('Recurring expense').'

'. t('Interval: @interval',array('@interval' => $intervall)) .'
'. t('Date begin: @date_begin',array('@date_begin' => $begin_date)) .'
'. t('Date end: @date_end',array('@date_end' => $end_date)) .'
'. $data->item_list .'
'; return $o; } function _stormrecurring_delete_recurring_nodes($nid){ $res = db_query("SELECT * FROM {stormrecurrings} WHERE expense_nid = %d", $nid); while($data_to_delete = db_fetch_object($res)){ $recurring_nid_to_delete = db_result(db_query("SELECT nid FROM {node} WHERE nid = %d", $data_to_delete->recurring_nid)); node_delete($recurring_nid_to_delete); } db_query("DELETE FROM {stormrecurrings} WHERE expense_nid = %d", $nid); } function stormrecurring_create_recurring_nodes($record, $storage){ if(($storage->date_begin != $record->date_begin) || ($storage->date_end != $record->date_end) || ($storage->intervall != $record->intervall)){ #get the days between dates as base calculating value $days = floor(($record->date_begin - $record->date_end) / 86400) * -1; $new_date = $record->date_begin; #check the dates, which are set as expensedate switch($record->intervall){ case 1: $devider = 30; $loop_count = round($days / $devider); break; case 2: $devider = 7; $loop_count = round($days / $devider); break; case 3: $devider = 1; $loop_count = round($days); break; } for($i = 0; ($i < $loop_count && $i < 20); $i++){ $node = new stdClass(); $node = node_load($record->expense_nid); unset($node->nid); #prepare the expensedate $new_date = $new_date + ($devider * 24 * 60 * 60); $node->title = t('@title (#@loop: @date)', array('@title' => t($node->title), '@loop' => $i + 1, '@date' => date("m/d/Y", $new_date))); $node->expensedate = $new_date; $node->is_recurring = 1; $node = node_submit($node); #for any reason I get an error message about alias building. node_save($node); $storing->expense_nid = $record->expense_nid; $storing->recurring_nid = $node->nid; drupal_write_record('stormrecurrings', $storing); } drupal_set_message(t('@count expense(s) created.', array('@count' => $loop_count))); } }