Firstly thank you soo much for creating such an awesome module. I think there is a lot of people out there like myself that wanted something like this.

I have a few suggestions that might make this module heaps better.

1. Increment Start Number - It would be great to be able to choose what number you could start from.
2. Prefix or Suffix - The ability to put characters before or after the serial number
3. Re-use Serial - The ability to choose to re-use a serial number after a node has been deleted.

I think thats all I can think of off the top of my head, but double thumbs up for this module!

Regards,

Daimian

Comments

kirsh’s picture

Assigned: Unassigned » kirsh
Status: Active » Postponed

Good ideas, thanks.

kirsh’s picture

Category: support » feature
EHA’s picture

I agree with the ideas here.

Also, in addition to prefix/suffix, there should be a way to "zero-fill" the field to a specified number of digits. Seldom do serial numbers like in invoices or bills show up as variable digit numbers. They are usually fixed at 6 digits or 10 digits or something like that (e.g. 000025).

Looking forward to this. Great module.

mradcliffe’s picture

This is a nice module. I'd be willing to write a patch for prefix/suffix and zerofill (number of digits), but this would require a schema update, which would require a lengthy hook_update_N. I don't really have the time for that.

pedrorocha’s picture

I'm training a team member to develop with Drupal, and his exercise is exactly this "preffix/suffix" patch. I guess this could be done in a week, cause is his first work with Drupal.

About the schema, will be a good training for him..rsrs

mradcliffe’s picture

Component: User interface » Code
Status: Postponed » Needs review
StatusFileSize
new10.62 KB

I've completed a patch that lets you do the following:

  • specify prefix
  • specify suffix
  • specify a minimum length. it is zero-padded up to the minimum length... so if you had 25 and 6 as the length then you'd get 000025. Should work.
  • has an update path to alter all tables from int to varchar and update the content_node_field entry for a field

Please review and test the update path on a development environment and not your production environment.

mradcliffe’s picture

Status: Needs review » Needs work

Quick note, things still suffer from performance as in the other issue in this queue.

It would be best to add $sandbox['progress'] capabilities to the upgrade path, fix the form from not updating every node every time when you save the widget/field settings, and when it does update every node make that a batch api like suggested.

kirsh’s picture

Thanks for the patch. I have 2 quick questions:

(1)
It seems that the new allocation algorithm is not atomic anymore (the database serial field was removed) - is it true?

(2)
Why have you changed the schema of the temporary allocation tables? It is only temporary and has nothing to do with the final content that is stored by CCK.
Wouldn't it be better to keep the atomic allocation temporary table schema as is and just alter the stored field content (e.g. in function serial_field)?

acalderon’s picture

In my personal experience, the leading zeros can be applied with formatting on the template side. The prefix and suffix can also be set as parameters on the serial's configuration, with no need to change the actual data on the database.

On a different note, to set the start (or next) increment start number would be a great addition.

mradcliffe’s picture

That seems kind of hackish to me. If I wanted to setup a view I would need to create a template for the field that did this as well.

I guess this could be out of the scope of a generic serial module although I don't want to create a duplicate module.

@#8

I kind of wanted to keep things consistent with regard to schema for everything. I guess this does not need to be the case. I looked at things from the temporary tables first and kind of just changed it without thinking of any consequences other than consistent data storage.

I guess the temporary tables could store things atomically while the cck field would store as a textfield. This would cut down some code I think.

Architeck’s picture

Patch from #8 is a great addition, and it works! thanks for the patch

I would like to see a "Set Default Value" or similar option in the future.

peterpoe’s picture

This patch creates a block that allows to go to a node entering its serial number:
#740152: Search node by serial block

bocaj’s picture

Love the module...thanks for your work on this! This is exactly what I was needing for one of my projects. I was using the nid, but since it obviously isn't sequential on a node type level it wasn't real useful.

One thing I would like it see (if it isn't possible already, haven't found it if it is) is to have the option to display the number/label on the page. I am wanting to display the 'issue' (serial) number on the page so that visitors can reference the number directly. I did a work around for this by creating a custom page.tpl.php file for that particular node type, but built-in display, like other CCK fields, would be very nice!

Thanks again for your great work!

killua99’s picture

Hi, is a great module!

But I want something what I can't get, I'm looking for a same serial nº for each content, but my website is multilingual and I want to share the same serial, is possible make a patch for this 'feature'? also I'm looking if I can make that 'feature'.

If you have a better idea for my problem, tell me.

Regards.
from Madrid, Spain.

killua99’s picture

Status: Needs work » Reviewed & tested by the community
StatusFileSize
new13.2 KB

Actually see this code I did.

druplicate’s picture

@jacobneher (#13)

You can accomplish this by using the rules module. I populated the node title using the module "node auto title" this way.

See this: http://drupal.org/node/615410

druplicate’s picture

I would like a feature to reset the counter to zero without uninstalling and reinstalling the serial module.

I have a database that I need to replace with a new one but can't figure out how to reset the counter to zero.

I looked in the DB but couldn't figure it out. I went into the field table entry and set one remaining record to "1" but then when I created a new record of that content type, serial field picked up where it left off (1342) from the old set of records. I had deleted them all previously with a Views Bulk Operations view.

How can I reset the counter?

jolidog’s picture

Status: Reviewed & tested by the community » Needs review

@killua99
Please don't mark the issue has reviewed and tested if you are the one who created the patch.
Thanks

vicentefoxxx’s picture

@killua99
The patch for multilingual support is not working. First, under the field options i can´t select the Multilingual support. Secondly, every time I create a node i keep getting the same number 20, well, when the node ist created I am gettin 21 but after is translated is 20 and that happens with every single node that I create. So this patch is not working.

I think in Killua99 patch are also included the patch in number 6# and i can confirm that:
specify prefix
specify suffix
specify a minimum length
are working great in my installation and i love that :) but i dont know how to patch :( so i will wait until is added in the new release.

Regards

killua99’s picture

@Jolidog
Sorry for that, it's not gonna happen again.

@vicentefoxxx
Yes actually my serial.inc is diferent for that I public in the past.

This is my code I use for my website, I change some thing. (maybe this code had bugs or security issue please review)

*****
THIS IS NOT A PATCH
*****

<?php
// $Id: serial.inc,v 1.1.2.5 2009/10/24 16:43:45 kirsh Exp $
 
/**
 * @file
 * Internal functions for the Serial module.
 *
 * Note: This module uses php in SQL to support dynamic table names.
 * (required because each serial field needs a dedicated dynamic table).
 * However, all table names are safe (passed through db_escape_table).
 *
 * It seems that this is better than using table names as arguments, e.g.
 *   $query = 'INSERT INTO %s (nid) VALUES(%d)';
 *   db_query($query, db_prefix_tables('{'. $table .'}'), $nid);
 */
 
/**
 * Creates an assistant serial table for a new created field.
 *
 * @param $field a new serial field
 */
function _serial_create_table($field) {
  $table = _serial_get_table_name($field);
  $schema = _serial_get_table_schema();
  db_create_table($ret, $table, $schema);
}

/**
 * Drops an assistant serial table for a deleted field.
 *
 * @param $field a deleted serial field
 */
function _serial_drop_table($field) {
  $table = _serial_get_table_name($field);
  db_drop_table($ret, $table);
}

/**
 * Gets the name of the assistant table for a specific field.
 *
 * @param $field
 *   a serial field instance
 * @return
 *   the name of the assistant table of the specified field instance.
 */
function _serial_get_table_name($field) {
  return db_escape_table( // be on the safe side
    'serial_'. $field['type_name'] .'_'. $field['field_name']);
}

 /**
 * Returns sid value or NULL if it does not exist
 *
 * @param $nid
 *   the node id for the serial field instance
 * @param $table
 *   the table name of the serial field instance
 * @return
 *   a string containing the value or NULL
 */
function _serial_value_exists($nid, $table) {
  $query = 'SELECT sid FROM {'. $table .'} WHERE nid = %d';
  $res = db_query($query, $nid);

  if ( $serial = db_fetch_object($res) ) {
    return $serial->sid;
  }

  return NULL;
}

/**
 * Gets the last sid of a field and returns the next increment
 *
 * @param $field
 *   a serial field instance
 * @param $table
 *   the table name of the serial field instance so we don't have to have redundant calls
 * @return
 *   a string containing the next value to insert
 */
function _serial_get_next_id($field, $table) {
  $query = 'SELECT sid FROM {' . $table . '} ORDER BY sid DESC';
  $res = db_query($query);

  $serial = db_fetch_object($res);

  if ($serial == FALSE) {
    $sid = '1';
  }
  else {
    if (preg_match('/[1-9][0-9]+/', $serial->sid, $matches) == 1) {
      $sid = $matches[0];
      $sid = $sid + 1;
    }
    else {
      $sid = '1';
    }
  }

  return _serial_format_sid($field, $sid);
}

/**
 *
 */
function _serial_format_sid($field, $sid) {
  $prefix = '';
  if ($field['widget']['minlength'] > 0 && $field['widget']['minlength'] - strlen($sid) > 0) {
    $i = 0;
    while ($i < ($field['widget']['minlength'] - strlen($sid))) {
      $prefix .= '0';
      $i++;
    }
  }
  return $field['widget']['prefix'] . $prefix . $sid . $field['widget']['suffix'];
}


/**
 * Gets the schema of the assistant tables for generating serial values.
 *
 * @return
 *   the assistant table schema.
 */
function _serial_get_table_schema() {
  return array(
    'fields' => array(
      'sid' => array(
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
        'default' => '',
        'description' => 'The atomic serial field.',
      ),
      'nid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'description' => 'Id of the owner node.',
      ),
    ),
    'unique keys' => array(
      'nid' => array('nid'),
    ),
  );
}

/**
 * Edit by killua99 ----
 * Gets the sid by a tnid from other node that means is the same node only
 * diferent transletion.
 *
 * @since (idk the version)
 * 
 * @param int $nid
 *   Node id.
 * @param string $table
 *   The table name of the serial field instance so we don't have to have
 *   redundant calls.
 * @return int
 *   The value tnid.
 */
function _serial_sidBytnid_exists($nid,$table){
  $query = 'SELECT tnid FROM { node } WHERE nid = %d';
  $tnid = db_result(db_query($query, $nid));

  if ( $tnid ) {

    $sql = 'SELECT COUNT(DISTINCT n.nid) FROM {node} n WHERE n.tnid = %d';
    $count = db_result(db_query($query,$tnid));

    if ( $count <> NULL ) {

      $sql = 'SELECT n.nid FROM {node} n WHERE n.tnid = %d AND n.nid != %d LIMIT 1';
      $new_nid = db_result(db_query($query,$tnid,$nid));
      $sidBytnid = _serial_value_exists($new_nid,$table);
      
      if ( $sidBytnid <> NULL ) return $sidBytnid;
    }

  }

  return NULL;
}

/**
 * Generates a unique serial value (unique per node type).
 *
 * Edit by killua99
 *   Share the same serial value for each language.
 *
 * @since (the creator put your version here).
 *
 * @param $nid
 *   id of the node for which to generate a serial value
 * @param $field
 *   the serial field
 *
 * @return
 *   the unique serial value number.
 */
function _serial_generate_value($nid, $field, $delete = TRUE) {
  // Insert a temporary record to get a new unique serial value:
  $table = _serial_get_table_name($field);
  $sid = _serial_value_exists($nid, $table);
  // Killua99 -------
  $sidBytnid = _serial_sidBytnid_exists($nid,$table);
  

  form_set_error($table);

  // TODO: This is a bad request but for my site works, need recode
  if ($sid <> NULL && $sidBytnid <> NULL) {
    $query = 'UPDATE {'. $table ."} SET sid = '%s' WHERE nid = %d";
    // coment by killua99 -----
    // preg_match('/[1-9][0-9]?/', $sid, $matches);
    preg_match('/[1-9][0-9]+/', $sidBytnid, $matches); // New line killua99 ----
    $new_sid = _serial_format_sid($field, $matches[0]);
    if ($new_sid == $sid) {
      return $sid;
    }
    $sid = $new_sid;
  }
  else if ( $sidBytnid <> NULL ) {  // Killua99 -------
    $query = 'INSERT INTO {'. $table ."} (sid, nid) VALUES('%s', %d)";
    preg_match('/[1-9][0-9]+/', $sidBytnid, $matches);
    $new_sid = _serial_format_sid($field, $matches[0]);
    $sid = $new_sid;
  } // End killua99 ------
  else {
    $query = 'INSERT INTO {'. $table ."} (sid, nid) VALUES('%s', %d)";
    $sid = _serial_get_next_id($field, $table);
  }
  $res = db_query($query, $sid, $nid);


  // Retrieve the new unique serial value:
  $query = 'SELECT sid FROM {'. $table .'} WHERE nid = %d';
  $result = db_result(db_query($query, $nid));
  $sid = $result ? $result : 0;

  // Delete old temporary records:
  if ($delete && ($sid % 10) == 0) {
    $query = 'DELETE FROM {'. $table .'} WHERE nid < %d';
    db_query($query, $nid);
  }

  // Return the new unique serial value:
  return $sid;
}

/**
 * Initializes the value of a new serial field in existing nodes.
 *
 * @return the number of existing nodes that have been initialized.
 */
function _serial_init_old_nodes($field) {
  // Retrieve all the node ids of that type:
  $query = "SELECT DISTINCT nid FROM {node} WHERE type = '%s' ORDER BY nid";
  $result = db_query($query, $field['type_name']);

  // Allocate a serial number for every old node:
  $count = 0;
  $field_name = $field['field_name'];
  while ($nid = db_result($result)) {
    $node = node_load($nid);
    $node->{$field_name}[0]['value'] = _serial_generate_value($nid, $field, FALSE);
    
    node_save($node);
    $last_nid = $nid;
    $count++;
  }

  // Delete temporary records (except the last):
  if (isset($last_nid)) {
    $serial_table = _serial_get_table_name($field);
    $query = "DELETE FROM {$serial_table} WHERE nid < %d";
    db_query($query, $last_nid);
  }

  // Return the number of existing nodes that have been initialized:
  return $count;
}
?>
<?php
// $Id: serial.module,v 1.1.2.4 2009/10/20 19:10:12 kirsh Exp $

/**
 * @file
 * The Serial module main file.
 */
 
//==================//
// Field Definition //
//==================//
 
/**
 * Implementation of hook_field_info().
 */
function serial_field_info() {
  return array(
    'serial' => array(
      'label' => t('Serial'),
      'description' => t('Auto increment serial field type.'),
    ),
  );
}

/**
 * Implementation of hook_fieldapi().
 */
function serial_content_fieldapi($op, $field) {
  if ($field['type'] == 'serial') {
    switch ($op) {
      case 'create instance':
        module_load_include('inc', 'serial');
        _serial_create_table($field);
        break;
      case 'delete instance':
        module_load_include('inc', 'serial');
        _serial_drop_table($field);
        break;
    }
  }
}

/**
 *
 * Implementation of hook_field_settings().
 */
function serial_field_settings($op, $field) {
  switch ($op) {
    case 'database columns':
      $columns['value'] = array(
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
        'default' => '0',
        'sortable' => TRUE,
        'views' => TRUE,
        'index' => TRUE,
      );
      return $columns;
    break;
  }
}

/**
 * Implementation of hook_form_alter().
 */
function serial_form_alter(&$form, $form_state, $form_id) {
  if ($form_id == 'content_field_edit_form' && $form['#field']['type'] == 'serial') {
    // Hide irrelevant settings:
    //unset($form['widget']);
    unset($form['field']);

    $form['#submit'][] = 'serial_field_form_submit';
  }
}

/**
 *
 */
function serial_field_form_submit($form, &$form_state) {
  module_load_include('inc', 'serial');

  $field = $form['#field'];
  // Edit by Killua99 ------
  if ( $field['widget']['multilingual'] ) {
    $table = $field['widget']['field_name'];
    $table = _serial_get_table_name($field);
    db_drop_primary_key($ret, $table);
   } // END edit killua99 -----
  $field['widget']['minlength'] = $form['#post']['minlength'];
  $field['widget']['prefix'] = $form['#post']['prefix'];
  $field['widget']['suffix'] = $form['#post']['suffix'];
  $old_count = _serial_init_old_nodes($field);
  // (field is not ready yet at serial_content_fieldapi's 'create instance')
  if ($old_count) {
    drupal_set_message(
      t('Serial values have been automatically set for %count existing nodes.',
        array('%count' => $old_count))
    );
   }
 }


/**
 * Implementation of hook_field().
 */
function serial_field($op, &$node, $field, &$items, $teaser, $page) {
  switch ($op) {
    case 'insert':
      module_load_include('inc', 'serial');
      $sid = _serial_generate_value($node->nid, $field);
      $items = array(array('value' => $sid));
      $node->$field['field_name'] = $items;
  }
}

/**
 * Implementation of hook_content_is_empty().
 */
function serial_content_is_empty($item, $field) {
  return FALSE; // never should be treated as empty
}

/**
 * Implementation of hook_token_list().
 */
function serial_token_list($type = 'all') {
  if ($type == 'field' || $type == 'all') {
    $tokens['serial']['id'] = t('Serial field value (unique per node type)');
    return $tokens;
  }
}

/**
 * Implementation of hook_token_values().
 */
function serial_token_values($type, $object = NULL) {
  if ($type == 'field') {
    $tokens['id'] = $object[0]['value'];
    return $tokens;
  }
}

//=================//
// Field Formatter //
//=================//

/**
 * Implementation of hook_field_formatter_info().
 */
function serial_field_formatter_info() {
  return array(
    'default' => array(
      'label' => '9999',
      'field types' => array('serial'),
      'multiple values' => CONTENT_HANDLE_CORE,
    )
  );
}

/**
 * Implementation of hook_theme().
 */
function serial_theme() {
  return array(
    'serial_formatter_default' => array(
      'arguments' => array('element' => NULL),
    ),
  );
}

/**
 * Theme function for 'default' serial field formatter.
 */
function theme_serial_formatter_default($element) {
  return $element['#item']['value'];
}

//==============//
// Field Widget //
//==============//

/**
 * Implementation of hook_widget_info().
 */
function serial_widget_info() {
  return array(
    'serial_widget' => array(
      'label' => t('Hidden (Automatic)'),
      'field types' => array('serial'),
      'multiple values' => CONTENT_HANDLE_CORE,
      'callbacks' => array('default value' => CONTENT_CALLBACK_NONE),
    ),
  );
}

/**
 * Implementation of hook_widget().
 */
function serial_widget(&$form, &$form_state, $field, $items, $delta = 0) {
  return array(
    'value' => array(
      '#type' => 'hidden',
      '#default_value' => $items[$delta]['value'],
    )
  );
}

/**
 * Implementation of hook_widget_settings()
 */
function serial_widget_settings($op,$widget) {
  switch($op) {
    case 'form':
      $form['prefix'] = array(
        '#type' => 'textfield',
        '#title' => t('Prefix'),
        '#description' => t('Add a prefix to the serial field.'),
        '#default_value' => $widget['prefix'],
      );
      $form['suffix'] = array(
        '#type' => 'textfield',
        '#title' => t('Suffix'),
        '#description' => t('Add a suffix to the serial field.'),
        '#default_value' => $widget['suffix'],
      );
      $form['minlength'] = array(
        '#type' => 'textfield',
        '#title' => t('Minimum Field Length'),
        '#description' => t('Specify the minimum length of the field. If the auto-increment value is less than the minimum length, the value will be auto-filled. A value of 0 will disable this field.'),
        '#default' => '0',
        '#default_value' => $widget['minlength'],
      );
      // Edit by killua99 -----
      $form['multilingual'] = array(
        '#type' => 'checkbox',
        '#title' => t('Multilingual support.'),
        '#description' => t('This feature will ALTER table and eliminate primal key to be available to duplicate the same Serial Nº to diferent Language.'),
      );
      return $form;
      break;
    case 'validate':
      if (!is_numeric($widget['minlength']) || $widget['minlength'] < 0) {
        form_set_error('minlength', t('You have entered an illegal value for the minimum length. This value needs to be 0 or greater.'));
      }
      break;
    case 'save':
      return array('prefix', 'suffix', 'minlength');
      break;
  }
}
?>
Steel Rat’s picture

Would love to see the requests at the opening post implemented.

I think this module would go a long way towards universal usefulness if it populated when the node creation form is presented, instead when a node is saved. When creating purchase orders/invoices, the user often needs a PO number to give to a vendor while on the phone, and they may not have created their PO yet. If the field was populated immediately upon hitting create content, then the user would have a PO number immediately available.

pomliane’s picture

Version: 6.x-1.0-beta2 » 6.x-1.0-rc1
Status: Needs review » Needs work

At first glance, multilingual support is not working here either.

Other new features not tested.

killua99’s picture

Well I post a code but it'nt a patch. I'll work this week to make a "version" or something like that to add the "multilingual" support correctly.

Maybe this Wednesday.

pomliane’s picture

@killua99: This would be awesome! I look forward to testing it (and please let me know if I can help).

pomliane’s picture

StatusFileSize
new999 bytes

I think I've got the first half part(!) of a patch for the multilingual part: it simply checks if the node has a translation source on form validation.
What happens after the creation of a new serial field for a defined content type (the original function counts all the nodes of this content type: sources and translations) is not yet implemented, which is bad — but I'm working on it.
I guess it should probably happen here (in function _serial_init_old_nodes()):
$query = "SELECT DISTINCT nid FROM {node} WHERE type = '%s' ORDER BY nid";
With, maybe, something like:
$query = "SELECT DISTINCT nid FROM {node} WHERE type = '%s' AND (tnid = nid OR tnid = 0) ORDER BY nid";

There also is no way to choose if once wants to count all node of a type or just one node per translation set, would this be useful to add this option?

Thanks in advance.

EDIT: contrary to the attached file, the multilingual part of the patch is complete and tested as functional here (except there's still no option to choose if once wants to count all node of a type or just one node per translation set, but I'm not sure it's really useful), do you think I'd better open a new issue or post it here?

pomliane’s picture

Status: Needs work » Needs review
druplicate’s picture

Another possible way around this issue without making code changes:

When the original form is completed and saved, use the Rules module to copy the serial ID to a CCK field, using this technique: #615410: Auto Node-Title cannot use serial field. I am currently using the serial ID in the title using auto-node-title, but you could use any field. That field and assigned ID is then the same for all translations, and can be used for searching with Views, though not sure what would happen if you searched for that ID and were not using the language of the original record. Would the translation system present the correct translation since that ID is the same for three records? I'm assuming it would.

The only other problem is the original record does not have contiguous serial IDs, so for example if the original record has a serial ID of 1000, and there are two translations assigned serial numbers 1001 and 1002, the next original record saved will have an ID of 1003, with translation IDs 1004 and 1005.

This is not a problem for my application, but may be for others.

UPDATE: Oops, this doesn't work - I created a translation of a node and the serial ID/node title did in fact get incremented for each translation. Bummer - should have known better. Have to figure out a way to set a variable that gets stored in the original record, to "0", so that when a translation is saved, that variable is incremented, and subsequently always "1" or greater --> test for that variable when executing the Rules set and not overwrite the node title for translations. I'll work on it and report back.

andypost’s picture

Code in #20 looks like D7, so maybe better to extend Number module's field Integer? Just a bit to extend widget and add another formatter (could be configurale see #796658: UI for field formatter settings)
By default field should override: multiple disabled so Field Api could store all serial values per table/entity
Removal process should be overriden by the serial modules to leave empty values (for example)

druplicate’s picture

I tested the code posted in #20, and had to grossly extend the PHP memory and execution time limits but even at that, it never completed after running all night. I have 2,000 existing nodes (but no corresponding translations) that it would have to process, but it never took this long before, so something appears to be stuck.

Once this basic code is proved to be functional, someone needs to integrate the batch api, as the Migrate module did. It's designed expressly for this situation. For those of us with real-world sites and thousands of nodes the batch method of processing is essential. With it you can control how many records you want to process at the outset, and can even arrange for chunks to be processed by CRON.

Add the ability to start the serial field with an offset, i.e. a number other than zero, and we're done!

druplicate’s picture

Any chance this can get fixed sometime soon?

I really need this to work on a site going to production soon.

My only alternative is to use Rules and some PHP to take the serial ID from the original record and fill in the ID field in the translation when it's saved. That of course wastes the serial ID automatically created by the serial module every time a translation is created, but I could live with that. Maybe there's an easy way to prevent the incrementing of the serial field when a translation node is saved.

pomliane’s picture

Priority: Normal » Major
Issue tags: +multilingual

@druplicate: Have you tried the patch at #25 ? It does the trick quite well here!

derEremit’s picture

btw.
for suffix / prefix you can also combine this module with "computed field"
thats how i did it

webadpro’s picture

Has the maintainer added any of the features to the module?

kirsh’s picture

Assigned: kirsh » Unassigned
Priority: Major » Normal
Status: Needs review » Closed (won't fix)

I am closing this thread since it deals with too many different issues.

Prefix / suffix should be discussed on #610152: Prefix / Suffix support.
Sharing serial values between different types should be discussed on #605936: Share serial fields.
Compatibility with multi language should be discussed on #652354: Compatibility for multilanguage.
Initial (starting) serial value should be discussed on #1031542: Option to specify the serial value (initially or later).

Any content in this thread which is still relevant should be posted again to one of the threads above or to a new thread.

Thanks!