Skip to content

Commit

Permalink
Work on barcode number generation.
Browse files Browse the repository at this point in the history
Normalize code for barcode module.
  • Loading branch information
eldy committed Jan 30, 2014
1 parent 8abde9e commit a2afea7
Show file tree
Hide file tree
Showing 8 changed files with 329 additions and 25 deletions.
3 changes: 2 additions & 1 deletion ChangeLog
Expand Up @@ -39,13 +39,14 @@ For developers:
- New: Triggers OPENSURVEY_CREATE, OPENSURVEY_DELETE added.
- New: Add new hook function addMoreActionsButtons to allow a module to add/replace
action buttons into an element.
- New: Normalize code for barcode generation to match other modules.

WARNING: Following change may create regression for some external modules, but was necessary to make
Dolibarr better:

- The deprecated way (with 4 parameters) to declare a new tab into a module descriptor file has been
removed. You must now use the 6 parameters way. See file modMyModule.class.php for example.

-

***** ChangeLog for 3.5 compared to 3.4.* *****
For users:
Expand Down
10 changes: 5 additions & 5 deletions htdocs/admin/barcode.php
Expand Up @@ -108,7 +108,7 @@


// Scan list of all barcode included provided by external modules
$dirbarcode=array_merge(array("/core/modules/barcode/"), $conf->modules_parts['barcode']);
$dirbarcode=array_merge(array("/core/modules/barcode/doc/"), $conf->modules_parts['barcode']);

foreach($dirbarcode as $reldir)
{
Expand Down Expand Up @@ -289,8 +289,8 @@
print '</form>';
}

// Module produits
if (! empty($conf->societe->enabled))
// Module products
if (! empty($conf->product->enabled))
{
$var=!$var;
print "<form method=\"post\" action=\"".$_SERVER["PHP_SELF"]."\">";
Expand All @@ -307,8 +307,8 @@
print '</form>';
}

// Module produits
if (! empty($conf->product->enabled))
// Module thirdparty
if (! empty($conf->societe->enabled))
{
$var=!$var;
print "<form method=\"post\" action=\"".$_SERVER["PHP_SELF"]."\">";
Expand Down
2 changes: 1 addition & 1 deletion htdocs/barcode/printsheet.php
Expand Up @@ -129,7 +129,7 @@
dol_mkdir($diroutput);

// Generate barcode
$dirbarcode=array_merge(array("/core/modules/barcode/"),$conf->modules_parts['barcode']);
$dirbarcode=array_merge(array("/core/modules/barcode/doc/"),$conf->modules_parts['barcode']);

foreach($dirbarcode as $reldir)
{
Expand Down
Expand Up @@ -18,12 +18,12 @@
*/

/**
* \file htdocs/core/modules/barcode/phpbarcode.modules.php
* \file htdocs/core/modules/barcode/doc/phpbarcode.modules.php
* \ingroup barcode
* \brief File with class to generate barcode images using php barcode generator
*/

require_once DOL_DOCUMENT_ROOT.'/core/modules/barcode/modules_barcode.php';
require_once DOL_DOCUMENT_ROOT.'/core/modules/barcode/modules_barcode.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/barcode.lib.php'; // This is to include def like $genbarcode_loc and $font_loc


Expand Down
280 changes: 280 additions & 0 deletions htdocs/core/modules/barcode/mod_barcode_standard.php
@@ -0,0 +1,280 @@
<?php
/* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2014 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2007-2012 Regis Houssin <regis.houssin@capnetworks.com>
* Copyright (C) 2011 Juanjo Menent <jmenent@2byte.es>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* or see http://www.gnu.org/
*/

/**
* \file htdocs/core/modules/product/mod_barcode_standard.php
* \ingroup barcode
* \brief File of class to manage barcode numbering with standard rule
*/

require_once DOL_DOCUMENT_ROOT.'/core/modules/barcode/modules_barcode.class.php';


/**
* Class to manage barcode with standard rule
*/
class mod_barcode_standard extends ModeleNumRefBarCode
{
var $nom='Standard'; // Nom du modele
var $code_modifiable; // Code modifiable
var $code_modifiable_invalide; // Code modifiable si il est invalide
var $code_modifiable_null; // Code modifiables si il est null
var $code_null; // Code facultatif
var $version='dolibarr'; // 'development', 'experimental', 'dolibarr'
var $code_auto; // Numerotation automatique

var $searchcode; // String de recherche
var $numbitcounter; // Nombre de chiffres du compteur
var $prefixIsRequired; // Le champ prefix du tiers doit etre renseigne quand on utilise {pre}


/**
* Constructor
*/
function __construct()
{
$this->code_null = 0;
$this->code_modifiable = 1;
$this->code_modifiable_invalide = 1;
$this->code_modifiable_null = 1;
$this->code_auto = 1;
$this->prefixIsRequired = 0;
}


/** Return description of module
*
* @param string $langs Object langs
* @return string Description of module
*/
function info($langs)
{
global $conf, $mc;
global $form;

$langs->load("products");

$disabled = ((! empty($mc->sharings['referent']) && $mc->sharings['referent'] != $conf->entity) ? ' disabled="disabled"' : '');

$texte = $langs->trans('GenericNumRefModelDesc')."<br>\n";
$texte.= '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
$texte.= '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
$texte.= '<input type="hidden" name="action" value="setModuleOptions">';
$texte.= '<input type="hidden" name="param1" value="BARCODE_STANDARD_MASK">';
$texte.= '<table class="nobordernopadding" width="100%">';

$tooltip=$langs->trans("GenericMaskCodes",$langs->transnoentities("Product"),$langs->transnoentities("Product"));
$tooltip.=$langs->trans("GenericMaskCodes3");
$tooltip.=$langs->trans("GenericMaskCodes4c");
$tooltip.=$langs->trans("GenericMaskCodes5");

// Mask parameter
$texte.= '<tr><td>'.$langs->trans("Mask").' ('.$langs->trans("BarCodeModel").'):</td>';
$texte.= '<td align="right">'.$form->textwithpicto('<input type="text" class="flat" size="24" name="value1" value="'.(! empty($conf->global->PRODUCT_ELEPHANT_MASK_PRODUCT)?$conf->global->PRODUCT_ELEPHANT_MASK_PRODUCT:'').'"'.$disabled.'>',$tooltip,1,1).'</td>';
$texte.= '<td align="left" rowspan="2">&nbsp; <input type="submit" class="button" value="'.$langs->trans("Modify").'" name="Button"'.$disabled.'></td>';
$texte.= '</tr>';

$texte.= '</table>';
$texte.= '</form>';

return $texte;
}


/**
* Return an example of result returned by getNextValue
*
* @param Translate $langs Object langs
* @param product $objproduct Object product
* @param int $type Type of third party (1:customer, 2:supplier, -1:autodetect)
* @return string Return string example
*/
function getExample($langs,$objproduct=0,$type=-1)
{
if ($type == 0 || $type == -1)
{
$exampleproduct = $this->getNextValue($objproduct,0);
if (! $exampleproduct)
{
$exampleproduct = $langs->trans('NotConfigured');
}
if($exampleproduct=="ErrorBadMask")
{
$langs->load("errors");
$exampleproduct=$langs->trans($exampleproduct);
}
}
if ($type == 1 || $type == -1)
{
$exampleservice = $this->getNextValue($objproduct,1);
if (! $exampleservice)
{
$exampleservice = $langs->trans('NotConfigured');
}
if($exampleservice=="ErrorBadMask")
{
$langs->load("errors");
$exampleservice=$langs->trans($exampleservice);
}
}

if ($type == 0) return $exampleproduct;
if ($type == 1) return $exampleservice;
return $exampleproduct.'<br>'.$exampleservice;
}

/**
* Return next value
*
* @param Product $objproduct Object product
* @param string $type type of barcode (EAN, ISBN, ...)
* @return string Value if OK, '' if module not configured, <0 if KO
*/
function getNextValue($objproduct,$type='')
{
global $db,$conf;

require_once DOL_DOCUMENT_ROOT .'/core/lib/functions2.lib.php';

// TODO

// Get Mask value
$mask = '';
if (! empty($conf->global->BARCODE_STANDARD_MASK)) $mask = $conf->global->BARCODE_STANDARD_MASK;

if (empty($mask))
{
$this->error='NotConfigured';
return '';
}

$field='barcode';$where='';

$now=dol_now();

$numFinal=get_next_value($db,$mask,'product',$field,$where,'',$now);

return $numFinal;
}


/**
* Check if mask/numbering use prefix
*
* @return int 0 or 1
*/
function verif_prefixIsUsed()
{
global $conf;

$mask = $conf->global->BARCODE_STANDARD_MASK;
if (preg_match('/\{pre\}/i',$mask)) return 1;

return 0;
}


/**
* Check validity of code according to its rules
*
* @param DoliDB $db Database handler
* @param string &$code Code to check/correct
* @param Product $product Object product
* @param int $type 0 = customer/prospect , 1 = supplier
* @return int 0 if OK
* -1 ErrorBadCustomerCodeSyntax
* -2 ErrorCustomerCodeRequired
* -3 ErrorCustomerCodeAlreadyUsed
* -4 ErrorPrefixRequired
*/
function verif($db, &$code, $product, $type)
{
global $conf;

require_once DOL_DOCUMENT_ROOT .'/core/lib/functions2.lib.php';

$result=0;
$code = strtoupper(trim($code));

if (empty($code) && $this->code_null && empty($conf->global->MAIN_COMPANY_CODE_ALWAYS_REQUIRED))
{
$result=0;
}
else if (empty($code) && (! $this->code_null || ! empty($conf->global->MAIN_COMPANY_CODE_ALWAYS_REQUIRED)) )
{
$result=-2;
}
else
{
// Get Mask value
$mask = '';
if ($type==0) $mask = empty($conf->global->PRODUCT_ELEPHANT_MASK_PRODUCT)?'':$conf->global->PRODUCT_ELEPHANT_MASK_PRODUCT;
if ($type==1) $mask = empty($conf->global->PRODUCT_ELEPHANT_MASK_SSERVICE)?'':$conf->global->PRODUCT_ELEPHANT_MASK_SERVICE;
if (! $mask)
{
$this->error='NotConfigured';
return '';
}

$result=check_value($mask,$code);
}

dol_syslog("mod_codeclient_elephant::verif type=".$type." result=".$result);
return $result;
}


/**
* Renvoi si un code est pris ou non (par autre tiers)
*
* @param DoliDB $db Handler acces base
* @param string $code Code a verifier
* @param Product $product Objet product
* @return int 0 if available, <0 if KO
*/
function verif_dispo($db, $code, $product)
{
$sql = "SELECT ref FROM ".MAIN_DB_PREFIX."product";
$sql.= " WHERE ref = '".$code."'";
if ($product->id > 0) $sql.= " AND rowid <> ".$product->id;

$resql=$db->query($sql);
if ($resql)
{
if ($db->num_rows($resql) == 0)
{
return 0;
}
else
{
return -1;
}
}
else
{
return -2;
}

}

}

?>

0 comments on commit a2afea7

Please sign in to comment.