You are here

public function SalesTaxReport::report in Ubercart 8.4

Displays the sales tax report form and table.

Return value

array Form API render array.

1 string reference to 'SalesTaxReport::report'
uc_tax_report.routing.yml in uc_tax_report/uc_tax_report.routing.yml
uc_tax_report/uc_tax_report.routing.yml

File

uc_tax_report/src/Controller/SalesTaxReport.php, line 19

Class

SalesTaxReport
Displays sales tax report.

Namespace

Drupal\uc_tax_report\Controller

Code

public function report($start_date = NULL, $end_date = NULL, $statuses = NULL) {

  // Use default report parameters if we don't detect values in the URL.
  if ($start_date == '') {
    $args = [
      'start_date' => mktime(0, 0, 0, date('n'), 1, date('Y')),
      'end_date' => \Drupal::time()
        ->getRequestTime(),
      'statuses' => uc_report_order_statuses(),
    ];
  }
  else {
    $args = [
      'start_date' => $start_date,
      'end_date' => $end_date,
      'statuses' => explode(',', $statuses),
    ];
  }

  // Build the header for the report table.
  $header = [
    t('Tax Name'),
    t('Jurisdiction'),
    t('Tax rate'),
    t('Total taxable amount'),
    t('Total tax collected'),
  ];
  $rows = [];
  $csv_rows = [];
  $csv_rows[] = $header;

  // Query to get the tax line items in this date range.
  $result = \Drupal::database()
    ->query("SELECT li.amount, li.title, li.data FROM {uc_orders} o LEFT JOIN {uc_order_line_items} li ON o.order_id = li.order_id WHERE :start <= created AND created <= :end AND order_status IN (:statuses[]) AND li.type = :type", [
    ':start' => $args['start_date'],
    ':end' => $args['end_date'],
    ':statuses[]' => $args['statuses'],
    ':type' => 'tax',
  ]);

  // Add up the amounts by jurisdiction.
  $totals = [];
  $no_meta_totals = [];
  foreach ($result as $item) {
    $name = trim($item->title);
    $amount = floatval($item->amount);

    // Get the meta-data out of the serialized array.
    $data = unserialize($item->data);
    $jurisdiction = trim($data['tax_jurisdiction']);
    $taxable_amount = floatval($data['taxable_amount']);
    $rate = floatval($data['tax_rate']);

    // Make a line item in the report for each name/jurisdiction/rate.
    $key = strtolower($name) . strtolower($jurisdiction) . number_format($rate, 5);
    if (!empty($jurisdiction) && $amount && $taxable_amount) {

      // We have meta-data.
      if (empty($totals[$key])) {
        $totals[$key] = [
          'name' => $name,
          'jurisdiction' => $jurisdiction,
          'rate' => $rate,
          'taxable_amount' => $taxable_amount,
          'amount' => $amount,
        ];
      }
      else {
        $totals[$key]['taxable_amount'] += $taxable_amount;
        $totals[$key]['amount'] += $amount;
      }
    }
    elseif ($amount) {

      // Old data: no meta-data was stored. Just report the amount collected.
      if (empty($no_meta_totals[$key])) {
        $no_meta_totals[$key] = [
          'name' => $name,
          'amount' => $amount,
        ];
      }
      else {
        $no_meta_totals[$key]['amount'] += $amount;
      }
    }
  }

  // Sort and make this into a report.
  ksort($totals);
  ksort($no_meta_totals);
  $taxable_amount = 0;
  $amount = 0;
  $star_legend = '';
  foreach ($totals as $line) {
    $row = [
      $line['name'],
      $line['jurisdiction'],
      number_format($line['rate'] * 100, 3) . '%',
      [
        '#theme' => 'uc_price',
        '#price' => $line['taxable_amount'],
      ],
      [
        '#theme' => 'uc_price',
        '#price' => $line['amount'],
      ],
    ];
    $rows[] = $row;

    // Remove HTML for CSV files.
    $row[3] = $line['taxable_amount'];
    $row[4] = $line['amount'];
    $csv_rows[] = $row;
    $taxable_amount += $line['taxable_amount'];
    $amount += $line['amount'];
  }
  foreach ($no_meta_totals as $line) {
    $row = [
      $line['name'],
      '*',
      '*',
      '*',
      [
        '#theme' => 'uc_price',
        '#price' => $line['amount'],
      ],
    ];
    $rows[] = $row;

    // Remove HTML for CSV files.
    $row[4] = $line['amount'];
    $csv_rows[] = $row;
    $amount += $line['amount'];

    // We have at least one no-meta-data line. Explain why.
    $star_legend = t('* No information on jurisdiction, tax rate, or taxable amount is available for this line.');
  }

  // Add a totals line.
  $row = [
    t('Total'),
    '',
    '',
    [
      '#theme' => 'uc_price',
      '#price' => $taxable_amount,
    ],
    [
      '#theme' => 'uc_price',
      '#price' => $amount,
    ],
  ];
  $rows[] = $row;

  // Removes HTML for CSV files.
  $row[3] = $taxable_amount;
  $row[4] = $amount;
  $csv_rows[] = $row;

  // Cache the CSV export.
  $controller = new Reports();
  $csv_data = $controller
    ->store_csv('uc_tax_report', $csv_rows);

  // Build the page output holding the form, table, and CSV export link.
  $build['form'] = \Drupal::formBuilder()
    ->getForm('\\Drupal\\uc_tax_report\\Form\\ParametersForm', $args);
  $build['report'] = [
    '#theme' => 'table',
    '#header' => $header,
    '#rows' => $rows,
    '#attributes' => [
      'width' => '100%',
      'class' => [
        'uc-sales-table',
      ],
    ],
  ];
  if ($star_legend) {
    $build['legend'] = [
      '#prefix' => '<div class="uc-reports-note"><p>',
      '#markup' => $star_legend,
      '#suffix' => '</p></div>',
    ];
  }
  $build['export_csv'] = [
    '#type' => 'link',
    '#prefix' => '<div class="uc-reports-links">',
    '#title' => t('Export to CSV file.'),
    '#url' => Url::fromRoute('uc_report.getcsv', [
      'report_id' => $csv_data['report'],
      'user_id' => $csv_data['user'],
    ]),
    '#suffix' => '</div>',
  ];
  return $build;
}