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'));
}
?>
Submitted by DrupalD on