This CodeLet generate a unique invoice number for every order placed with ubercart. The unique invice number is stored in a custom table and a function is provided to fetch the invoice number for respective order number. You can use this function in order template to display the inovice number
CodeLet
<?php
/**
* @file
*
* Generat unique invoice number for each Ubercart order
*
* @author DrupalD <DrupalD@twitter>
*/
/**
* Implementation of hook_uc_invoice
*
* @param $op
* @param $order
* @param $arg2
* @author DrupalD <DrupalD@twitter>
*/
function uc_invoice_uc_order($op, $order, $arg2) {
switch($op) {
case 'new':
$result = db_query("SELECT MAX(invoice_id) last_id FROM {uc_invoice}");
$record = $result->fetchAssoc();
$sn__invoice = ($record['last_id'] == 0 || $record['last_id'] == NULL) ? 1 : $record['last_id'] + 1;
if ($order->order_status != 'abandoned') {
$sn__invoice_id = db_insert('uc_invoice')
->fields(array(
'invoice_id' => $sn__invoice,
'order_id' => $order->order_id,
))
->execute();
drupal_set_message(t('Invoice @invice_id created', array('@invice_id' => $sn__invoice)));
}
break;
case 'delete':
$sn__invoice_id = _get_uc_invoice_number($order->order_id);
//Update other invoices
db_update('uc_invoice')
->expression('invoice_id', 'invoice_id - :invoice_id', array('invoice_id' => 1))
->condition('invoice_id', $sn__invoice_id, '>')
->execute();
//Delete invoice id
$b__order_delete = db_delete('uc_invoice')
->condition('order_id', $order->order_id)
->execute();
break;
}
}
/**
* _get_uc_invoice_number
*
* Retrieve invoice number from order number
*
* @param $sn__order_id
* Id of the order
* @return invoice id
* @author DrupalD <DrupalD@twitter>
*/
function _get_uc_invoice_number($sn__order_id) {
$record = db_select('uc_invoice', 'ui')
->fields('ui', array('invoice_id'))
->condition('order_id', $sn__order_id, '=')
->execute()
->fetchAssoc();
return $record['invoice_id'];
}
/**
* Implementation of hook_cron
*
* @author DrupalD <DrupalD@twitter>
*/
function uc_invoice_cron() {
$om__query = db_select('uc_orders', 'uo');
$om__query->leftjoin('uc_invoice', 'ui', 'uo.order_id = ui.order_id');
$om__query->fields('uo', array('order_id'))
->condition('uo.order_status', 'abandoned', '<>')
->isNull('ui.invoice_id');
$result = $om__query->execute();
while ($record = $result->fetchAssoc()) {
$sn_invoice_result = db_query("SELECT MAX(invoice_id) last_id FROM {uc_invoice}");
$sn_invoice_record = $sn_invoice_result->fetchAssoc();
$sn__invoice = ($sn_invoice_record['last_id'] == 0 || $sn_invoice_record['last_id'] == NULL) ? 1 : $sn_invoice_record['last_id'] + 1;
$om__query = db_insert('uc_invoice')
->fields(array(
'invoice_id' => $sn__invoice,
'order_id' => $record['order_id'],
))
->execute();
watchdog('invoice', t('Invoice @invice_id created'), array('@invice_id' => $record['order_id']));
}
}
?>
Install file details
<?php
/**
* @file
*
* Create schema for uc_invoice
*
* @author DrupalD <DrupalD@twitter>
*/
/**
* Implementation of hook_schema
*
* @author DrupalD <DrupalD@twitter>
*/
function uc_invoice_schema() {
$schema['uc_invoice'] = array(
'description' => 'Relates Ubercart orders with invoice',
'fields' => array(
'invoice_id' => array(
'description' => 'Unique invoice number',
'type' => 'int',
'length' => 11,
'not null' => TRUE,
),
'order_id' => array(
'description' => 'Unique order number',
'type' => 'int',
'lenght' => 11,
'not null' => TRUE,
),
),
'primary key' => array('invoice_id', 'order_id'),
);
return $schema;
}
/**
* Implmentation of hook_update_N
*
* @author DrupalD <DrupalD@twitter>
*/
function uc_invoice_update_7001(&$sandbox) {
db_query("ALTER TABLE {uc_invoice} MODIFY COLUMN invoice_id int(11) not null");
db_add_primary_key('uc_invoice', array('invoice_id', 'order_id'));
}
?>