=== modified file 'uc_order/uc_order.install' --- uc_order/uc_order.install 2009-01-30 15:57:34 +0000 +++ uc_order/uc_order.install 2009-02-26 14:41:25 +0000 @@ -370,6 +370,10 @@ 'not null' => TRUE, 'default' => 0, ), + 'data' => array( + 'description' => t('Serialized array of extra data.'), + 'type' => 'text', + ), ), 'indexes' => array( 'order_id' => array('order_id'), @@ -907,3 +911,13 @@ return $ret; } + +// add data field to uc_order_line_items +function uc_order_update_6007() { + + $ret = array(); + + db_add_field($ret, 'uc_order_line_items', 'data', array('type' => 'text')); + + return $ret; +} === modified file 'uc_order/uc_order.line_item.inc' --- uc_order/uc_order.line_item.inc 2008-10-15 20:20:43 +0000 +++ uc_order/uc_order.line_item.inc 2009-02-26 14:41:25 +0000 @@ -91,12 +91,12 @@ return TRUE; } -function uc_order_line_item_add($order_id, $type, $title, $amount, $weight = NULL) { +function uc_order_line_item_add($order_id, $type, $title, $amount, $weight = NULL, $data = NULL) { if (is_null($weight)) { $weight = _line_item_data($type, 'weight'); } - db_query("INSERT INTO {uc_order_line_items} (order_id, type, title, amount, weight) VALUES (%d, '%s', '%s', %f, %d)", $order_id, $type, $title, $amount, $weight); + db_query("INSERT INTO {uc_order_line_items} (order_id, type, title, amount, weight, data) VALUES (%d, '%s', '%s', %f, %d, '%s')", $order_id, $type, $title, $amount, $weight, serialize( $data )); return TRUE; } === modified file 'uc_order/uc_order.module' --- uc_order/uc_order.module 2009-02-20 18:39:24 +0000 +++ uc_order/uc_order.module 2009-02-26 14:41:25 +0000 @@ -1180,6 +1180,7 @@ 'title' => $row->title, 'amount' => $row->amount, 'weight' => $row->weight, + 'data' => unserialize( $row->data ), ); } } @@ -1198,6 +1199,7 @@ 'title' => $line['title'], 'amount' => $line['amount'], 'weight' => isset($line['weight']) ? $line['weight'] : $type['weight'], + 'data' => $line['data'], ); } } @@ -1436,6 +1438,7 @@ 'title' => $line['title'], 'amount' => $line['amount'], 'weight' => $item['weight'], + 'data' => $item['data'], ); } } === added directory 'uc_tax_report' === added file 'uc_tax_report/uc_tax_report.info' --- uc_tax_report/uc_tax_report.info 1970-01-01 00:00:00 +0000 +++ uc_tax_report/uc_tax_report.info 2009-02-13 23:24:03 +0000 @@ -0,0 +1,8 @@ +; $Id$ +name = Tax Report +description = View a report about sales tax your customers paid. +dependencies[] = uc_reports +dependencies[] = uc_taxes +package = "Ubercart - core (optional)" +core = 6.x +php = 5.0 === added file 'uc_tax_report/uc_tax_report.module' --- uc_tax_report/uc_tax_report.module 1970-01-01 00:00:00 +0000 +++ uc_tax_report/uc_tax_report.module 2009-02-26 14:47:28 +0000 @@ -0,0 +1,232 @@ + 'Sales tax report', + 'description' => 'View report on sales tax', + 'page callback' => 'uc_tax_report_report_page', + 'access arguments' => array('view reports'), + 'type' => MENU_NORMAL_ITEM, + ); + + return $items; +} + +// Displays the sales tax report form and table. +function uc_tax_report_report_page() { + $timezone = _uc_reports_timezone_offset(); + $timezone_offset = time() + $timezone; + $format = variable_get('uc_date_format_default', 'm/d/Y'); + + // Use default report parameters if we don't detect values in the URL. + if (arg(4) == '') { + $args = array( + 'start_date' => gmmktime(0, 0, 0, gmdate('n', $timezone_offset), 1, gmdate('Y', $timezone_offset) - 1), + 'end_date' => time(), + 'status' => FALSE, + ); + } + else { + $args = array( + 'start_date' => arg(4), + 'end_date' => arg(5), + 'status' => explode(',', urldecode(arg(6))), + ); + } + + // Pull the order statuses into a SQL friendly array. + if ($args['status'] === FALSE) { + $order_statuses = _uc_reports_order_statuses(); + } + else { + $order_statuses = "('". implode("', '", $args['status']) ."')"; + } + + // Build the header for the report table. + $header = array(t('Tax Name'), t('Jurisdiction'), t('Tax rate'), t('Total taxable amount'), t('Total tax collected')); + $rows = array(); + $csv_rows = array(); + $csv_rows[] = $header; + + // Query to get the tax line items in this date range + + $result = db_query("SELECT ucoli.amount, ucoli.title, ucoli.data FROM {uc_orders} ucord LEFT JOIN {uc_order_statuses} ON order_status_id = order_status LEFT JOIN {uc_order_line_items} ucoli ON ucord.order_id = ucoli.order_id WHERE %d <= created AND created <= %d AND order_status IN $order_statuses AND ucoli.type = 'tax'", $args['start_date'], $args['end_date']); + + // add up the amounts by jurisdiction + $totals = array(); + $no_meta_totals = array(); + + while($item = db_fetch_object($result)) { + $name = trim($item->title); + $amt = floatval($item->amount); + + // get the meta-data out of the serialized array + $dat = unserialize($item->data); + $jur = trim($dat['tax_jurisdiction']); + $tamt = floatval($dat['taxable_amount']); + $rate = floatval($dat['tax_rate']); + + // make a line item in the report for each name/jurisdiction/rate + $key = strtolower($name) . strtolower($jur) . number_format($rate, 5); + + if(!empty($jur) && $amt && $tamt) { + // we have meta-data + if(empty($totals[ $key ])) { + $totals[ $key ] = array($name, $jur, $rate, $tamt, $amt); + } else { + $totals[ $key ][3] += $tamt; + $totals[ $key ][4] += $amt; + } + } else if($amt) { + // old data - no meta-data was stored - just report the amount collected + if(empty($no_meta_totals[$key ])) { + $no_meta_totals[$key] = array($name, $amt); + } else { + $no_meta_totals[$key][1] += $amt; + } + } + } + + // sort and make this into a report + + ksort($totals); + ksort($no_meta_totals); + $tamt = 0; + $amt = 0; + $starleg = ''; + + foreach($totals as $line) { + $row = array($line[0], $line[1], number_format($line[2] * 100, 3) . '%', + uc_currency_format($line[3]), + uc_currency_format($line[4])); + $rows[] = $row; + $csv_rows[] = $row; + $tamt += $line[3]; + $amt += $line[4]; + } + + foreach($no_meta_totals as $line) { + $row = array($line[0], '*', '*', '*', + uc_currency_format($line[1])); + $rows[] = $row; + $csv_rows[] = $row; + $amt += $line[1]; + // we have at least one no-meta-data line - explain why + $starleg = t('* No information on jurisdiction, tax rate, or taxable amount is available for this line.'); + } + + // add a totals line + + $row = array(t('Total'), '', '', uc_currency_format($tamt), + uc_currency_format($amt)); + $rows[] = $row; + $csv_rows[] = $row; + + // Cache the CSV export. + $csv_data = uc_reports_store_csv('uc_tax_report', $csv_rows); + + // Build the page output holding the form, table, and CSV export link. + $output = drupal_get_form('uc_tax_report_params_form', $args, $args['status']); + $output .= theme('table', $header, $rows, array('width' => '100%', 'class' => 'uc-sales-table')); + if($starleg) { + $output .= '
' . $starleg . '