diff --git a/ChangeLog b/ChangeLog index dfbe16035034003e3e25f160091ba0253c1e1a09..8377c3d35d36ab6b7471ff1e7b8f018233a8d76e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -56,6 +56,8 @@ removed. You must now use the 6 parameters way. See file modMyModule.class.php f ***** ChangeLog for 3.5.1 compared to 3.5.0 ***** +Fix: Do not report trigger errors twice. +Fix: Error when creating event was not reported. Fix: Bug of import of agenda when using https link Fix: Field nature not saved correctly Fix: Substituion of extra field was ko for order @@ -72,6 +74,11 @@ Fix: Page load not ending when large number of thirdparies. We combo feature that is root cause of problem. Fix: [ bug #1231 ] PDF always generated in interventions Fix: Be sure there is no duplicate default rib. +Fix: Enable extrafields for customer order, proposal and invoice lines. This feature + was developed for 3.5 but was disabled (hidden) because of a bug not possible to + fix enough quickly for 3.5.0 release. +Fix: user right on Holiday for month report nor working. +Fix: [ bug #1250 ] "Supplier Ref. product" sidebar search box does not work ***** ChangeLog for 3.5 compared to 3.4.* ***** For users: diff --git a/build/makepack-dolibarrmodule.pl b/build/makepack-dolibarrmodule.pl index e708340266d2536526b8b47f7fd42dc2ac6b81eb..62002fd063b6efdf02ad3df72f467d4b14741ccb 100755 --- a/build/makepack-dolibarrmodule.pl +++ b/build/makepack-dolibarrmodule.pl @@ -2,7 +2,7 @@ #---------------------------------------------------------------------------- # \file build/makepack-dolibarrmodule.pl # \brief Package builder (tgz, zip, rpm, deb, exe) -# \author (c)2005-2013 Laurent Destailleur <eldy@users.sourceforge.net> +# \author (c)2005-2014 Laurent Destailleur <eldy@users.sourceforge.net> #---------------------------------------------------------------------------- use Cwd; @@ -20,8 +20,8 @@ $GROUP="ldestailleur"; use vars qw/ $REVISION $VERSION /; -$REVISION='1.20'; -$VERSION="1.0 (build $REVISION)"; +$REVISION='1.0'; +$VERSION="3.5 (build $REVISION)"; @@ -245,18 +245,30 @@ foreach my $PROJECT (@PROJECTLIST) { if (! $result) { die "Error: Can't open conf file makepack-".$PROJECT.".conf for reading.\n"; } while(<IN>) { - if ($_ =~ /^#/) { next; } # Do not process comments + $entry=$_; + + if ($entry =~ /^#/) { next; } # Do not process comments - $_ =~ s/\n//; - $_ =~ /^(.*)\/[^\/]+/; + $entry =~ s/\n//; + + if ($entry =~ /^!(.*)$/) # Exclude so remove file/dir + { + print "Remove $BUILDROOT/$PROJECTLC/$1\n"; + $ret=`rm -fr "$BUILDROOT/$PROJECTLC/"$1`; + if ($? != 0) { die "Failed to delete a file to exclude declared into makepack-".$PROJECT.".conf file (Fails on line ".$entry.")\n"; } + next; + } + + $entry =~ /^(.*)\/[^\/]+/; print "Create directory $BUILDROOT/$PROJECTLC/$1\n"; $ret=`mkdir -p "$BUILDROOT/$PROJECTLC/$1"`; - if ($_ !~ /version\-/) + if ($entry !~ /version\-/) { - print "Copy $SOURCE/$_ into $BUILDROOT/$PROJECTLC/$_\n"; - $ret=`cp -pr "$SOURCE/$_" "$BUILDROOT/$PROJECTLC/$_"`; - if ($? != 0) { die "Failed to make copy of a file declared into makepack-".$PROJECT.".conf file (Fails on line ".$_.")\n"; } + print "Copy $SOURCE/$entry into $BUILDROOT/$PROJECTLC/$entry\n"; + $ret=`cp -pr "$SOURCE/$entry" "$BUILDROOT/$PROJECTLC/$entry"`; + if ($? != 0) { die "Failed to make copy of a file declared into makepack-".$PROJECT.".conf file (Fails on line ".$entry.")\n"; } } + } close IN; diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index 86f0ce4c5f6cb2e010fa95a6f315edc6bc7bda0c..35319dcdbdfe47a2ecf151dd1ff76941622afb1f 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -145,7 +145,7 @@ $tabsql[12]= "SELECT c.rowid as rowid, code, sortorder, c.libelle, c.libelle_fac $tabsql[13]= "SELECT id as rowid, code, c.libelle, type, active FROM ".MAIN_DB_PREFIX."c_paiement AS c"; $tabsql[14]= "SELECT e.rowid as rowid, e.code as code, e.libelle, e.price, e.organization, e.fk_pays as country_id, p.code as country_code, p.libelle as country, e.active FROM ".MAIN_DB_PREFIX."c_ecotaxe AS e, ".MAIN_DB_PREFIX."c_pays as p WHERE e.fk_pays=p.rowid and p.active=1"; $tabsql[15]= "SELECT rowid as rowid, code, label as libelle, width, height, unit, active FROM ".MAIN_DB_PREFIX."c_paper_format"; -$tabsql[16]= "SELECT code, label as libelle, active FROM ".MAIN_DB_PREFIX."c_prospectlevel"; +$tabsql[16]= "SELECT code, label as libelle, sortorder, active FROM ".MAIN_DB_PREFIX."c_prospectlevel"; $tabsql[17]= "SELECT id as rowid, code, libelle, active FROM ".MAIN_DB_PREFIX."c_type_fees"; $tabsql[18]= "SELECT rowid as rowid, code, libelle, tracking, active FROM ".MAIN_DB_PREFIX."c_shipment_mode"; $tabsql[19]= "SELECT id as rowid, code, libelle, active FROM ".MAIN_DB_PREFIX."c_effectif"; @@ -201,7 +201,7 @@ $tabfield[12]= "code,libelle,libelle_facture,nbjour,fdm,decalage"; $tabfield[13]= "code,libelle,type"; $tabfield[14]= "code,libelle,price,organization,country_id,country"; $tabfield[15]= "code,libelle,width,height,unit"; -$tabfield[16]= "code,libelle"; +$tabfield[16]= "code,libelle,sortorder"; $tabfield[17]= "code,libelle"; $tabfield[18]= "code,libelle,tracking"; $tabfield[19]= "code,libelle"; @@ -229,7 +229,7 @@ $tabfieldvalue[12]= "code,libelle,libelle_facture,nbjour,fdm,decalage"; $tabfieldvalue[13]= "code,libelle,type"; $tabfieldvalue[14]= "code,libelle,price,organization,country"; $tabfieldvalue[15]= "code,libelle,width,height,unit"; -$tabfieldvalue[16]= "code,libelle"; +$tabfieldvalue[16]= "code,libelle,sortorder"; $tabfieldvalue[17]= "code,libelle"; $tabfieldvalue[18]= "code,libelle,tracking"; $tabfieldvalue[19]= "code,libelle"; @@ -257,7 +257,7 @@ $tabfieldinsert[12]= "code,libelle,libelle_facture,nbjour,fdm,decalage"; $tabfieldinsert[13]= "code,libelle,type"; $tabfieldinsert[14]= "code,libelle,price,organization,fk_pays"; $tabfieldinsert[15]= "code,label,width,height,unit"; -$tabfieldinsert[16]= "code,label"; +$tabfieldinsert[16]= "code,label,sortorder"; $tabfieldinsert[17]= "code,libelle"; $tabfieldinsert[18]= "code,libelle,tracking"; $tabfieldinsert[19]= "code,libelle"; @@ -440,6 +440,7 @@ if (GETPOST('actionadd') || GETPOST('actionmodify')) if ($fieldnamekey == 'position') $fieldnamekey = 'Position'; if ($fieldnamekey == 'unicode') $fieldnamekey = 'Unicode'; if ($fieldnamekey == 'deductible') $fieldnamekey = 'Deductible'; + if ($fieldnamekey == 'sortorder') $fieldnamekey = 'SortOrder'; setEventMessage($langs->transnoentities("ErrorFieldRequired", $langs->transnoentities($fieldnamekey)),'errors'); } @@ -767,6 +768,7 @@ if ($id) if ($fieldlist[$field]=='account_parent') { $valuetoshow=$langs->trans("Accountparent"); } if ($fieldlist[$field]=='pcg_type') { $valuetoshow=$langs->trans("Pcg_type"); } if ($fieldlist[$field]=='pcg_subtype') { $valuetoshow=$langs->trans("Pcg_subtype"); } + if ($fieldlist[$field]=='sortorder') { $valuetoshow=$langs->trans("SortOrder"); } if ($valuetoshow != '') { print '<td align="'.$align.'">'; @@ -881,10 +883,11 @@ if ($id) if ($fieldlist[$field]=='accountancy_code'){ $valuetoshow=$langs->trans("AccountancyCode"); } if ($fieldlist[$field]=='accountancy_code_sell'){ $valuetoshow=$langs->trans("AccountancyCodeSell"); $sortable=0; } if ($fieldlist[$field]=='accountancy_code_buy'){ $valuetoshow=$langs->trans("AccountancyCodeBuy"); $sortable=0; } - if ($fieldlist[$field]=='fk_pcg_version') { $valuetoshow=$langs->trans("Pcg_version"); } + if ($fieldlist[$field]=='fk_pcg_version') { $valuetoshow=$langs->trans("Pcg_version"); } if ($fieldlist[$field]=='account_parent') { $valuetoshow=$langs->trans("Accountsparent"); } if ($fieldlist[$field]=='pcg_type') { $valuetoshow=$langs->trans("Pcg_type"); } if ($fieldlist[$field]=='pcg_subtype') { $valuetoshow=$langs->trans("Pcg_subtype"); } + if ($fieldlist[$field]=='sortorder') { $valuetoshow=$langs->trans("SortOrder"); } // Affiche nom du champ if ($showfield) { diff --git a/htdocs/admin/stock.php b/htdocs/admin/stock.php index 067da1dd91ea359c569937932bbc29ac8102bf83..9f18ebb1657c0a5d3075c41bf94f8f00c43f68e1 100644 --- a/htdocs/admin/stock.php +++ b/htdocs/admin/stock.php @@ -41,45 +41,43 @@ $action = GETPOST('action','alpha'); * Actions */ -if ($action == 'STOCK_USERSTOCK_AUTOCREATE') -{ - $db->begin(); - $res = dolibarr_set_const($db, "STOCK_USERSTOCK_AUTOCREATE", GETPOST('STOCK_USERSTOCK_AUTOCREATE','alpha'),'chaine',0,'',$conf->entity); -} -// Mode of stock decrease -if ($action == 'STOCK_CALCULATE_ON_BILL' -|| $action == 'STOCK_CALCULATE_ON_VALIDATE_ORDER' -|| $action == 'STOCK_CALCULATE_ON_SHIPMENT') -{ - $db->begin(); - $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_BILL", '','chaine',0,'',$conf->entity); - $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_VALIDATE_ORDER", '','chaine',0,'',$conf->entity); - $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SHIPMENT", '','chaine',0,'',$conf->entity); - if ($action == 'STOCK_CALCULATE_ON_BILL') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_BILL", GETPOST('STOCK_CALCULATE_ON_BILL','alpha'),'chaine',0,'',$conf->entity); - if ($action == 'STOCK_CALCULATE_ON_VALIDATE_ORDER') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_VALIDATE_ORDER", GETPOST('STOCK_CALCULATE_ON_VALIDATE_ORDER','alpha'),'chaine',0,'',$conf->entity); - if ($action == 'STOCK_CALCULATE_ON_SHIPMENT') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SHIPMENT", GETPOST('STOCK_CALCULATE_ON_SHIPMENT','alpha'),'chaine',0,'',$conf->entity); -} -// Mode of stock increase -if ($action == 'STOCK_CALCULATE_ON_SUPPLIER_BILL' -|| $action == 'STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER' -|| $action == 'STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER') +if($action) { $db->begin(); - $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_BILL", '','chaine',0,'',$conf->entity); - $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER", '','chaine',0,'',$conf->entity); - $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER", '','chaine',0,'',$conf->entity); - if ($action == 'STOCK_CALCULATE_ON_SUPPLIER_BILL') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_BILL", GETPOST('STOCK_CALCULATE_ON_SUPPLIER_BILL','alpha'),'chaine',0,'',$conf->entity); - if ($action == 'STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER", GETPOST('STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER','alpha'),'chaine',0,'',$conf->entity); - if ($action == 'STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER", GETPOST('STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER','alpha'),'chaine',0,'',$conf->entity); -} -if($action == 'USE_VIRTUAL_STOCK') { - $db->begin(); - $res = dolibarr_set_const($db, "USE_VIRTUAL_STOCK", GETPOST('USE_VIRTUAL_STOCK','alpha'),'chaine',0,'',$conf->entity); -} + if ($action == 'STOCK_USERSTOCK_AUTOCREATE') + { + $res = dolibarr_set_const($db, "STOCK_USERSTOCK_AUTOCREATE", GETPOST('STOCK_USERSTOCK_AUTOCREATE','alpha'),'chaine',0,'',$conf->entity); + } + // Mode of stock decrease + if ($action == 'STOCK_CALCULATE_ON_BILL' + || $action == 'STOCK_CALCULATE_ON_VALIDATE_ORDER' + || $action == 'STOCK_CALCULATE_ON_SHIPMENT') + { + $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_BILL", '','chaine',0,'',$conf->entity); + $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_VALIDATE_ORDER", '','chaine',0,'',$conf->entity); + $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SHIPMENT", '','chaine',0,'',$conf->entity); + if ($action == 'STOCK_CALCULATE_ON_BILL') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_BILL", GETPOST('STOCK_CALCULATE_ON_BILL','alpha'),'chaine',0,'',$conf->entity); + if ($action == 'STOCK_CALCULATE_ON_VALIDATE_ORDER') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_VALIDATE_ORDER", GETPOST('STOCK_CALCULATE_ON_VALIDATE_ORDER','alpha'),'chaine',0,'',$conf->entity); + if ($action == 'STOCK_CALCULATE_ON_SHIPMENT') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SHIPMENT", GETPOST('STOCK_CALCULATE_ON_SHIPMENT','alpha'),'chaine',0,'',$conf->entity); + } + // Mode of stock increase + if ($action == 'STOCK_CALCULATE_ON_SUPPLIER_BILL' + || $action == 'STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER' + || $action == 'STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER') + { + $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_BILL", '','chaine',0,'',$conf->entity); + $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER", '','chaine',0,'',$conf->entity); + $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER", '','chaine',0,'',$conf->entity); + if ($action == 'STOCK_CALCULATE_ON_SUPPLIER_BILL') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_BILL", GETPOST('STOCK_CALCULATE_ON_SUPPLIER_BILL','alpha'),'chaine',0,'',$conf->entity); + if ($action == 'STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER", GETPOST('STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER','alpha'),'chaine',0,'',$conf->entity); + if ($action == 'STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER", GETPOST('STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER','alpha'),'chaine',0,'',$conf->entity); + } + + if($action == 'STOCK_USE_VIRTUAL_STOCK') { + $res = dolibarr_set_const($db, "STOCK_USE_VIRTUAL_STOCK", GETPOST('STOCK_USE_VIRTUAL_STOCK','alpha'),'chaine',0,'',$conf->entity); + } -if($action) -{ if (! $res > 0) $error++; if (! $error) @@ -249,25 +247,34 @@ if (! empty($conf->fournisseur->enabled)) print '</table>'; -print '<br>'; -print '<table class="noborder" width="100%">'; -print '<tr class="liste_titre">'; -print " <td>".$langs->trans("RuleForStockReplenishment")."</td>\n"; -print " <td align=\"right\" width=\"160\"> </td>\n"; -print '</tr>'."\n"; -$var = !$var; -print "<tr ".$bc[$var].">"; -print '<td width="60%">'.$langs->trans("UseVirtualStock").'</td>'; -print '<td width="160" align="right">'; -print "<form method=\"post\" action=\"stock.php\">"; -print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; -print "<input type=\"hidden\" name=\"action\" value=\"USE_VIRTUAL_STOCK\">"; -print $form->selectyesno("USE_VIRTUAL_STOCK",$conf->global->USE_VIRTUAL_STOCK,1); -print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'; -print '</form>'; -print "</td>\n"; -print "</tr>\n"; -print '</table>'; + +$virtualdiffersfromphysical=0; +if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) + || ! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER) + ) $virtualdiffersfromphysical=1; // According to increase/decrease stock options, virtual and physical stock may differs. + +if ($virtualdiffersfromphysical) +{ + print '<br>'; + print '<table class="noborder" width="100%">'; + print '<tr class="liste_titre">'; + print " <td>".$langs->trans("RuleForStockReplenishment")." ".img_help('help',$langs->trans("VirtualDiffersFromPhysical"))."</td>\n"; + print " <td align=\"right\" width=\"160\"> </td>\n"; + print '</tr>'."\n"; + $var = !$var; + print "<tr ".$bc[$var].">"; + print '<td width="60%">'.$langs->trans("UseVirtualStockByDefault").'</td>'; + print '<td width="160" align="right">'; + print "<form method=\"post\" action=\"stock.php\">"; + print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; + print "<input type=\"hidden\" name=\"action\" value=\"STOCK_USE_VIRTUAL_STOCK\">"; + print $form->selectyesno("STOCK_USE_VIRTUAL_STOCK",$conf->global->STOCK_USE_VIRTUAL_STOCK,1); + print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'; + print '</form>'; + print "</td>\n"; + print "</tr>\n"; + print '</table>'; +} $db->close(); diff --git a/htdocs/admin/system/xdebug.php b/htdocs/admin/system/xdebug.php index b3b833557f6b85ba473f9bdcaffb2e0ad07325b1..704bb7773740dc8ff2b85a0a2705355a41713afe 100644 --- a/htdocs/admin/system/xdebug.php +++ b/htdocs/admin/system/xdebug.php @@ -49,12 +49,18 @@ if (!function_exists('xdebug_is_enabled')) if (function_exists('socket_create')) { - $address = empty($conf->global->XDEBUG_SERVER)?'127.0.0.1':$conf->global->XDEBUG_SERVER; - $port = empty($conf->global->XDEBUG_PORT)?9000:$conf->global->XDEBUG_PORT; - - print 'XDEBUG_SERVER: '.$address."<br>\n"; - print 'XDEBUG_PORT: '.$port."<br>\n"; + $address = ini_get('xdebug.remote_host')?ini_get('xdebug.remote_host'):'127.0.0.1'; + $port = ini_get('xdebug.remote_port')?ini_get('xdebug.remote_port'):9000; + + print "<strong>Current xdebug setup:</strong><br>\n"; + print 'xdebug.remote_host = '.$address."<br>\n"; + print 'xdebug.remote_port = '.$port."<br>\n"; + print 'xdebug.profiler_output_dir = '.ini_get('xdebug.profiler_output_dir')."<br>\n"; + print 'xdebug.profiler_enable = '.ini_get('xdebug.profiler_enable')."<br>\n"; + print 'xdebug.profiler_enable_trigger = '.ini_get('xdebug.profiler_enable_trigger')."<br>\n"; print "<br>\n"; + + print "<strong>Test debugger server (Eclipse for example):</strong><br>\n"; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if (empty($socket)) die('Unable to prepare a socket'); //socket_bind($sock, $address, $port) or die('Unable to bind on address='.$address.' port='.$port); @@ -66,29 +72,29 @@ if (function_exists('socket_create')) echo "Connection established: ".$client." - address=".$address." port=".$port."<br>\n"; echo "There is a Remote debug server at this address.<br>\n"; echo "<br>\n"; - echo "To be sure this debugger accepts input from your PHP server, be sure to have\n"; + echo "To be sure this debugger accepts input from your PHP server and xdebug, be sure to have\n"; echo "your php.ini file with this :<br>\n"; - echo 'xdebug.remote_enable=on<br> - xdebug.remote_handle=dbgp<br> - xdebug.remote_host=localhost<br> - xdebug.remote_port=9000<br> - xdebug.profiler_enable=0<br> - xdebug.profiler_enable_trigger=1<br> - xdebug.show_local_vars=off<br> - xdebug.profiler_output_dir=/tmp/xdebug<br> - xdebug.profiler_append=0<br> - <br> - xdebug.trace_enable_trigger=1<br> - xdebug.show_mem_delta=1<br> - xdebug.trace_output_dir=/tmp/trace<br> - xdebug.auto_trace=0<br> - '."\n"; - print "<br>\n"; + echo '<textarea cols="80" rows="16">'."xdebug.remote_enable=on +xdebug.remote_handle=dbgp +xdebug.remote_host=localhost +xdebug.remote_port=9000 +xdebug.profiler_enable=0 +xdebug.profiler_enable_trigger=1 +xdebug.show_local_vars=off +xdebug.profiler_output_dir=/tmp/xdebug +xdebug.profiler_append=0 +; for xdebug 2.2+ +xdebug.trace_enable_trigger=1 +xdebug.show_mem_delta=1 +xdebug.trace_output_dir=/tmp/trace +xdebug.auto_trace=0 +</textarea>\n"; + print "<br><br>\n"; echo 'Then check in your debug server (Eclipse), you have setup:<br> XDebug with same port than in php.ini<br> Allow Remote debug=yes or prompt<br>'."\n"; print "<br>\n"; - echo "Then, to run a debug session, add parameter XDEBUG_SESSION_START=aname on your URL. To stop, remove cookie XDEBUG_SESSION_START.\n"; + echo "Then, to run a debug session (when xdebug.profiler_enable_trigger=1), add parameter XDEBUG_SESSION_START=aname on your URL. To stop, remove cookie XDEBUG_SESSION_START.\n"; } else { diff --git a/htdocs/cashdesk/index_verif.php b/htdocs/cashdesk/index_verif.php index 94ec87edea014eb408bb23acf0f3f8aa24c14e72..9f7e0332046e730010261a289ca140a2f0abfd8b 100644 --- a/htdocs/cashdesk/index_verif.php +++ b/htdocs/cashdesk/index_verif.php @@ -65,6 +65,21 @@ if (! empty($conf->stock->enabled) && $conf->global->STOCK_CALCULATE_ON_BILL && exit; } +// If stock decrease on bill validation, check user has stock edit permissions +if (! empty($conf->stock->enabled) && $conf->global->STOCK_CALCULATE_ON_BILL && ! empty($username)) +{ + $testuser=new User($db); + $testuser->fetch(0,$username); + $testuser->getrights('stock'); + if (empty($testuser->rights->stock->creer)) + { + $retour=$langs->trans("UserNeedPermissionToEditStockToUsePos"); + header('Location: '.DOL_URL_ROOT.'/cashdesk/index.php?err='.urlencode($retour).'&user='.$username.'&socid='.$thirdpartyid.'&warehouseid='.$warehouseid.'&bankid_cash='.$bankid_cash.'&bankid_cheque='.$bankid_cheque.'&bankid_cb='.$bankid_cb); + exit; + } +} + + /* if (! empty($_POST['txtUsername']) && ! empty($conf->banque->enabled) && (empty($conf_fkaccount_cash) && empty($conf_fkaccount_cheque) && empty($conf_fkaccount_cb))) { diff --git a/htdocs/comm/action/fiche.php b/htdocs/comm/action/fiche.php index 9f5005570bc4f2e30bd0e0e382f5a3579d59a2e1..0f2d9b8447c129b12606134b2955a6c3a0ce0065 100644 --- a/htdocs/comm/action/fiche.php +++ b/htdocs/comm/action/fiche.php @@ -226,7 +226,7 @@ if ($action == 'add_action') // On cree l'action $idaction=$object->add($user); - + if ($idaction > 0) { if (! $object->error) @@ -261,8 +261,10 @@ if ($action == 'add_action') { $db->rollback(); $langs->load("errors"); + if (! empty($object->error)) setEventMessage($langs->trans($object->error), 'errors'); if (count($object->errors)) setEventMessage($object->errors, 'errors'); + $action = 'create'; } } diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index e61750f7bfd6c3d2d9e7b2b5d878ab7e69ef991b..a8dd4ab2a9e3ef50e13ffcf990068775f1852d75 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -657,7 +657,7 @@ else if (($action == 'addline' || $action == 'addline_predef') && $user->rights- //Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline =$extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); + $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline,$predef); //Unset extrafield if (is_array($extralabelsline)) { diff --git a/htdocs/commande/fiche.php b/htdocs/commande/fiche.php index 9b1093873ed5a56efbc382bf91d0995e293058c1..760324d23e8c17654ada17026a21e1d6f6e9c85d 100644 --- a/htdocs/commande/fiche.php +++ b/htdocs/commande/fiche.php @@ -591,7 +591,7 @@ else if ($action == 'addline' && $user->rights->commande->creer) //Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline =$extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); + $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline,$predef); //Unset extrafield if (is_array($extralabelsline)) { @@ -605,12 +605,12 @@ else if ($action == 'addline' && $user->rights->commande->creer) if ((empty($idprod) || GETPOST('usenewaddlineform')) && ($price_ht < 0) && ($qty < 0)) { setEventMessage($langs->trans('ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv('UnitPriceHT'), $langs->transnoentitiesnoconv('Qty')), 'errors'); - $error = true; + $error++; } if (empty($idprod) && GETPOST('type') < 0) { setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Type')), 'errors'); - $error = true; + $error++; } if ((empty($idprod) || GETPOST('usenewaddlineform')) && (!($price_ht >= 0) || $price_ht == '')) // Unit price can be 0 but not '' { @@ -620,12 +620,12 @@ else if ($action == 'addline' && $user->rights->commande->creer) if ($qty == '') { setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Qty')), 'errors'); - $error = true; + $error++; } if (empty($idprod) && empty($product_desc)) { setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Description')), 'errors'); - $error = true; + $error++; } if (! $error && ($qty >= 0) && (! empty($product_desc) || ! empty($idprod))) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index a164253dc690ba92eb3629f0c0862bdd78742c9c..c900b0d7ebb56f05240381afc98d6ac9b838efe2 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -1135,7 +1135,7 @@ else if (($action == 'addline' || $action == 'addline_predef') && $user->rights- $price_ht = ''; $tva_tx = ''; } - if (GETPOST('usenewaddlineform')) { + if (GETPOST('usenewaddlineform')) { // TODO Remove this $idprod=GETPOST('idprod', 'int'); $product_desc = (GETPOST('product_desc')?GETPOST('product_desc'):(GETPOST('np_desc')?GETPOST('np_desc'):(GETPOST('dp_desc')?GETPOST('dp_desc'):''))); $price_ht = GETPOST('price_ht'); @@ -1147,13 +1147,13 @@ else if (($action == 'addline' || $action == 'addline_predef') && $user->rights- //Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline =$extrafieldsline->fetch_name_optionals_label($object->table_element_line); - $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline); + $array_option = $extrafieldsline->getOptionalsFromPost($extralabelsline,$predef); //Unset extrafield if (is_array($extralabelsline)) { // Get extra fields foreach ($extralabelsline as $key => $value) { - unset($_POST["options_".$key]); + unset($_POST["options_".$key.$predef]); } } @@ -1314,8 +1314,8 @@ else if (($action == 'addline' || $action == 'addline_predef') && $user->rights- } // Margin - $fournprice=(GETPOST('fournprice'.$predef)?GETPOST('fournprice'.$predef):''); - $buyingprice=(GETPOST('buying_price'.$predef)?GETPOST('buying_price'.$predef):''); + $fournprice=price2num(GETPOST('fournprice'.$predef)?GETPOST('fournprice'.$predef):''); + $buyingprice=price2num(GETPOST('buying_price'.$predef)?GETPOST('buying_price'.$predef):''); // Local Taxes $localtax1_tx= get_localtax($tva_tx, 1, $object->client); @@ -1436,8 +1436,8 @@ elseif ($action == 'updateligne' && $user->rights->facture->creer && ! GETPOST(' $localtax2_rate=get_localtax($vat_rate,2,$object->client); // Add buying price - $fournprice=(GETPOST('fournprice')?GETPOST('fournprice'):''); - $buyingprice=(GETPOST('buying_price')?GETPOST('buying_price'):''); + $fournprice=price2num(GETPOST('fournprice')?GETPOST('fournprice'):''); + $buyingprice=price2num(GETPOST('buying_price')?GETPOST('buying_price'):''); //Extrafields $extrafieldsline = new ExtraFields($db); diff --git a/htdocs/compta/sociales/index.php b/htdocs/compta/sociales/index.php index a8432c38d5213abd96ce22bb2b73841f3524e5fd..6ccc9943afaff0e39397b81fd57f86413ea39b4c 100644 --- a/htdocs/compta/sociales/index.php +++ b/htdocs/compta/sociales/index.php @@ -28,6 +28,8 @@ require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php' require_once DOL_DOCUMENT_ROOT.'/core/class/html.formsocialcontrib.class.php'; $langs->load("compta"); +$langs->load("banks"); +$langs->load("bills"); // Security check $socid = isset($_GET["socid"])?$_GET["socid"]:''; diff --git a/htdocs/compta/tva/index.php b/htdocs/compta/tva/index.php index 56aa234b3c996341412f32faedcd3f51215bcf0d..4bab6f143d115d28a0bed447c30662f166dd945c 100644 --- a/htdocs/compta/tva/index.php +++ b/htdocs/compta/tva/index.php @@ -30,6 +30,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; $langs->load("other"); $langs->load("compta"); +$langs->load("banks"); +$langs->load("bills"); $year=GETPOST("year","int"); if ($year == 0) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 35f09944ef7edd17e1072bb7ae315f4e2a9abd6c..9f96f3ff8ec4241c98ecd8ec3ece3b07ffb583c5 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -2268,13 +2268,14 @@ abstract class CommonObject /** * Function to show lines of extrafields with output datas * - * @param object $extrafields extrafield Object + * @param object $extrafields Extrafield Object * @param string $mode Show output (view) or input (edit) for extrafield - * @param array $params optionnal parameters + * @param array $params Optionnal parameters + * @param string $keyprefix Prefix string to add into name and id of field (can be used to avoid duplicate names) * * @return string */ - function showOptionals($extrafields,$mode='view',$params=0) + function showOptionals($extrafields, $mode='view', $params=0, $keyprefix='') { global $_POST; @@ -2342,7 +2343,7 @@ abstract class CommonObject $out .= $extrafields->showOutputField($key,$value); break; case "edit": - $out .= $extrafields->showInputField($key,$value); + $out .= $extrafields->showInputField($key,$value,'',$keyprefix); break; } @@ -2893,17 +2894,22 @@ abstract class CommonObject $product_static->ref=$line->ref; $text=$product_static->getNomUrl(1); - // Define output language (TODO Does this works ?) - if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) + // Define output language and label + if (! empty($conf->global->MAIN_MULTILANGS)) { - $this->fetch_thirdparty(); + if (! is_object($this->thirdparty)) + { + dol_print_error('','Error: Method printObjectLine was called on an object and object->fetch_thirdparty was not done before'); + return; + } + $prod = new Product($this->db); $prod->fetch($line->fk_product); $outputlangs = $langs; $newlang=''; if (empty($newlang) && GETPOST('lang_id')) $newlang=GETPOST('lang_id'); - if (empty($newlang)) $newlang=$this->client->default_lang; + if (! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE) && empty($newlang)) $newlang=$this->thirdparty->default_lang; // For language to language of customer if (! empty($newlang)) { $outputlangs = new Translate("",$conf); diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index ae705ee7ab85fd8ad4ce27cdfb341175271bfbda..128dec24d8cc4616e7066d5940de96f5e2a1d42e 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -571,14 +571,15 @@ class ExtraFields /** - * Return HTML string to put an input field into a page + * Return HTML string to put an input field into a page * - * @param string $key Key of attribute - * @param string $value Value to show (for date type it must be in timestamp format) - * @param string $moreparam To add more parametes on html input tag - * @return void + * @param string $key Key of attribute + * @param string $value Value to show (for date type it must be in timestamp format) + * @param string $moreparam To add more parametes on html input tag + * @param string $keyprefix Prefix string to add into name and id of field (can be used to avoid duplicate names) + * @return void */ - function showInputField($key,$value,$moreparam='') + function showInputField($key,$value,$moreparam='',$keyprefix='') { global $conf,$langs; @@ -620,23 +621,23 @@ class ExtraFields if(!$required && $value == '') $value = '-1'; - $out = $formstat->select_date($value, 'options_'.$key, $showtime, $showtime, $required, '', 1, 1, 1, 0, 1); - //$out='<input type="text" name="options_'.$key.'" size="'.$showsize.'" maxlength="'.$newsize.'" value="'.$value.'"'.($moreparam?$moreparam:'').'>'; + $out = $formstat->select_date($value, 'options_'.$key.$keyprefix, $showtime, $showtime, $required, '', 1, 1, 1, 0, 1); + // TODO Missing to add $moreparam } elseif (in_array($type,array('int'))) { $tmp=explode(',',$size); $newsize=$tmp[0]; - $out='<input type="text" class="flat" name="options_'.$key.'" size="'.$showsize.'" maxlength="'.$newsize.'" value="'.$value.'"'.($moreparam?$moreparam:'').'>'; + $out='<input type="text" class="flat" name="options_'.$key.$keyprefix.'" size="'.$showsize.'" maxlength="'.$newsize.'" value="'.$value.'"'.($moreparam?$moreparam:'').'>'; } elseif ($type == 'varchar') { - $out='<input type="text" class="flat" name="options_'.$key.'" size="'.$showsize.'" maxlength="'.$size.'" value="'.$value.'"'.($moreparam?$moreparam:'').'>'; + $out='<input type="text" class="flat" name="options_'.$key.$keyprefix.'" size="'.$showsize.'" maxlength="'.$size.'" value="'.$value.'"'.($moreparam?$moreparam:'').'>'; } elseif ($type == 'text') { require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; - $doleditor=new DolEditor('options_'.$key,$value,'',200,'dolibarr_notes','In',false,false,! empty($conf->fckeditor->enabled) && $conf->global->FCKEDITOR_ENABLE_SOCIETE,5,100); + $doleditor=new DolEditor('options_'.$key.$keyprefix,$value,'',200,'dolibarr_notes','In',false,false,! empty($conf->fckeditor->enabled) && $conf->global->FCKEDITOR_ENABLE_SOCIETE,5,100); $out=$doleditor->Create(1); } elseif ($type == 'boolean') @@ -647,36 +648,36 @@ class ExtraFields } else { $checked=' value="1" '; } - $out='<input type="checkbox" class="flat" name="options_'.$key.'" '.$checked.' '.($moreparam?$moreparam:'').'>'; + $out='<input type="checkbox" class="flat" name="options_'.$key.$keyprefix.'" '.$checked.' '.($moreparam?$moreparam:'').'>'; } elseif ($type == 'mail') { - $out='<input type="text" class="flat" name="options_'.$key.'" size="32" value="'.$value.'">'; + $out='<input type="text" class="flat" name="options_'.$key.$keyprefix.'" size="32" value="'.$value.'" '.($moreparam?$moreparam:'').'>'; } elseif ($type == 'phone') { - $out='<input type="text" class="flat" name="options_'.$key.'" size="20" value="'.$value.'">'; + $out='<input type="text" class="flat" name="options_'.$key.$keyprefix.'" size="20" value="'.$value.'" '.($moreparam?$moreparam:'').'>'; } elseif ($type == 'price') { - $out='<input type="text" class="flat" name="options_'.$key.'" size="6" value="'.price($value).'"> '.$langs->getCurrencySymbol($conf->currency); + $out='<input type="text" class="flat" name="options_'.$key.$keyprefix.'" size="6" value="'.price($value).'" '.($moreparam?$moreparam:'').'> '.$langs->getCurrencySymbol($conf->currency); } elseif ($type == 'double') { if (!empty($value)) { $value=price($value); } - $out='<input type="text" class="flat" name="options_'.$key.'" size="6" value="'.$value.'"> '; + $out='<input type="text" class="flat" name="options_'.$key.$keyprefix.'" size="6" value="'.$value.'" '.($moreparam?$moreparam:'').'> '; } elseif ($type == 'select') { $out = ''; if ($conf->use_javascript_ajax && $conf->global->COMPANY_USE_SEARCH_TO_SELECT && ! $forcecombo) { - $out.= ajax_combobox('options_'.$key, $event, $conf->global->COMPANY_USE_SEARCH_TO_SELECT); + $out.= ajax_combobox('options_'.$key.$keyprefix, $event, $conf->global->COMPANY_USE_SEARCH_TO_SELECT); } - $out.='<select class="flat" name="options_'.$key.'" id="options_'.$key.'">'; + $out.='<select class="flat" name="options_'.$key.$keyprefix.'" id="options_'.$key.$keyprefix.'" '.($moreparam?$moreparam:'').'>'; foreach ($param['options'] as $key=>$val ) { list($val, $parent) = explode('|', $val); @@ -692,10 +693,10 @@ class ExtraFields $out = ''; if ($conf->use_javascript_ajax && $conf->global->COMPANY_USE_SEARCH_TO_SELECT && ! $forcecombo) { - $out.= ajax_combobox('options_'.$key, $event, $conf->global->COMPANY_USE_SEARCH_TO_SELECT); + $out.= ajax_combobox('options_'.$key.$keyprefix, $event, $conf->global->COMPANY_USE_SEARCH_TO_SELECT); } - $out.='<select class="flat" name="options_'.$key.'" id="options_'.$key.'">'; + $out.='<select class="flat" name="options_'.$key.$keyprefix.'" id="options_'.$key.$keyprefix.'" '.($moreparam?$moreparam:'').'>'; if (is_array($param['options'])) { $param_list=array_keys($param['options']); @@ -836,7 +837,7 @@ class ExtraFields foreach ($param['options'] as $keyopt=>$val ) { - $out.='<input class="flat" type="checkbox" name="options_'.$key.'[]"'; + $out.='<input class="flat" type="checkbox" name="options_'.$key.$keyprefix.'[]" '.($moreparam?$moreparam:''); $out.=' value="'.$keyopt.'"'; if ((is_array($value_arr)) && in_array($keyopt,$value_arr)) { @@ -853,7 +854,7 @@ class ExtraFields $out=''; foreach ($param['options'] as $keyopt=>$val ) { - $out.='<input class="flat" type="radio" name="options_'.$key.'"'; + $out.='<input class="flat" type="radio" name="options_'.$key.$keyprefix.'" '.($moreparam?$moreparam:''); $out.=' value="'.$keyopt.'"'; $out.= ($value==$keyopt?'checked="checked"':''); $out.='/>'.$val.'<br>'; @@ -1101,9 +1102,10 @@ class ExtraFields * return array_options array for object by extrafields value (using for data send by forms) * * @param array $extralabels $array of extrafields + * @param string $keyprefix Prefix string to add into name and id of field (can be used to avoid duplicate names) * @return int 1 if array_options set / 0 if no value */ - function getOptionalsFromPost($extralabels) + function getOptionalsFromPost($extralabels,$keyprefix='') { global $_POST; @@ -1118,23 +1120,24 @@ class ExtraFields if (in_array($key_type,array('date','datetime'))) { // Clean parameters - $value_key=dol_mktime($_POST["options_".$key."hour"], $_POST["options_".$key."min"], 0, $_POST["options_".$key."month"], $_POST["options_".$key."day"], $_POST["options_".$key."year"]); + $value_key=dol_mktime($_POST["options_".$key.$keyprefix."hour"], $_POST["options_".$key.$keyprefix."min"], 0, $_POST["options_".$key.$keyprefix."month"], $_POST["options_".$key.$keyprefix."day"], $_POST["options_".$key.$keyprefix."year"]); } else if (in_array($key_type,array('checkbox'))) { - $value_arr=GETPOST("options_".$key); + $value_arr=GETPOST("options_".$key.$keyprefix); $value_key=implode($value_arr,','); } else if (in_array($key_type,array('price','double'))) { - $value_arr=GETPOST("options_".$key); + $value_arr=GETPOST("options_".$key.$keyprefix); $value_key=price2num($value_arr); } else { - $value_key=GETPOST("options_".$key); + $value_key=GETPOST("options_".$key.$keyprefix); } - $array_options["options_".$key]=$value_key; + + $array_options["options_".$key]=$value_key; // No keyprefix here. keyprefix is used only for read. } return $array_options; diff --git a/htdocs/core/class/html.formadmin.class.php b/htdocs/core/class/html.formadmin.class.php index ccd3e038f743f761bdf4e60a1e1fdfeecf84df71..6d570b7088029f0beada3b31b19b945a7d9b1914 100644 --- a/htdocs/core/class/html.formadmin.class.php +++ b/htdocs/core/class/html.formadmin.class.php @@ -1,5 +1,5 @@ <?php -/* Copyright (C) 2004-2012 Laurent Destailleur <eldy@users.sourceforge.net> +/* Copyright (C) 2004-2014 Laurent Destailleur <eldy@users.sourceforge.net> * Copyright (C) 2005-2011 Regis Houssin <regis.houssin@capnetworks.com> * Copyright (C) 2007 Patrick Raguin <patrick.raguin@gmail.com> * @@ -146,7 +146,7 @@ class FormAdmin if (preg_match('/eldy_(backoffice|frontoffice)\.php$/i',$file)) continue; // We exclude all menu manager files if (preg_match('/auguria_(backoffice|frontoffice)\.php$/i',$file)) continue; // We exclude all menu manager files if (preg_match('/smartphone_(backoffice|frontoffice)\.php$/i',$file)) continue; // We exclude all menu manager files - + $filelib=preg_replace('/\.php$/i','',$file); $prefix=''; // 0=Recommanded, 1=Experimental, 2=Developpement, 3=Other @@ -324,7 +324,7 @@ class FormAdmin * * @param string $selected Paper format pre-selected * @param string $htmlname Name of HTML select field - * @param string $filter Key to filter + * @param string $filter Value to filter on code * @param int $showempty Add empty value * @return string Return HTML output */ @@ -332,8 +332,12 @@ class FormAdmin { global $langs; - $sql="SELECT code, label, width, height, unit FROM ".MAIN_DB_PREFIX."c_paper_format where active=1"; - if ($filter) $sql.=" WHERE code LIKE '%".$filter."%'"; + $langs->load("dict"); + + $sql = "SELECT code, label, width, height, unit"; + $sql.= " FROM ".MAIN_DB_PREFIX."c_paper_format"; + $sql.= " WHERE active=1"; + if ($filter) $sql.=" AND code LIKE '%".$this->db->escape($filter)."%'"; $resql=$this->db->query($sql); if ($resql) @@ -350,7 +354,11 @@ class FormAdmin $i++; } } - else dol_print_error($this->db); + else + { + dol_print_error($this->db); + return ''; + } $out=''; $out.= '<select class="flat" id="'.$htmlname.'" name="'.$htmlname.'">'; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 3f5b90df5296ea8945ea17bc8b2792d714ac747f..b9e25aa58f1b3e1244cf5a28cff44de9f29c53c2 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4523,26 +4523,23 @@ if (! function_exists('getmypid')) * Natural search * * @param mixed $fields String or array of strings filled with the fields names in the SQL query - * @param string $value The value to look for + * @param string $value The value to look for (example: "keyword1 keyword2") * @return string $res The statement to append to the SQL query */ function natural_search($fields, $value) { global $db; $crits = explode(' ', $value); - $res = ""; - if (! is_array($fields)) { - $fields = array($fields); - } + $res = ''; + if (! is_array($fields)) $fields = array($fields); + $end = count($fields); $end2 = count($crits); $j = 0; foreach ($crits as $crit) { $i = 0; foreach ($fields as $field) { - if ( $i > 0 && $i < $end){ - $res .= " OR "; - } + if ( $i > 0 && $i < $end) $res .= " OR "; $res .= $field . " LIKE '%" . $db->escape(trim($crit)) . "%'"; $i++; } diff --git a/htdocs/core/lib/invoice.lib.php b/htdocs/core/lib/invoice.lib.php index b3983a0c5ab2cc76fa4a1e13d08774e8c00d5ffe..0142bfae11397f2a75c69757132b318bbe79b8ee 100644 --- a/htdocs/core/lib/invoice.lib.php +++ b/htdocs/core/lib/invoice.lib.php @@ -132,13 +132,10 @@ function invoice_admin_prepare_head($object) $head[$h][2] = 'attributes'; $h++; - if ($conf->global->MAIN_FEATURES_LEVEL >= 2) // FIXME This feature will works when form for predefined and free product will be merged, otherwise there is duplicate fields with same name - { $head[$h][0] = DOL_URL_ROOT.'/compta/facture/admin/facturedet_cust_extrafields.php'; $head[$h][1] = $langs->trans("ExtraFieldsLines"); $head[$h][2] = 'attributeslines'; $h++; - } complete_head_from_modules($conf,$langs,$object,$head,$h,'invoice_admin','remove'); diff --git a/htdocs/core/lib/order.lib.php b/htdocs/core/lib/order.lib.php index 46dca55fb3ad6212ea2405c48683a339d826d967..216887139d4ff0a94f230fe29b3332e1dfb1912d 100644 --- a/htdocs/core/lib/order.lib.php +++ b/htdocs/core/lib/order.lib.php @@ -138,13 +138,10 @@ function order_admin_prepare_head($object) $head[$h][2] = 'attributes'; $h++; - if ($conf->global->MAIN_FEATURES_LEVEL >= 2) // FIXME This feature will works when form for predefined and free product will be merged, otherwise there is duplicate fields with same name - { $head[$h][0] = DOL_URL_ROOT.'/admin/orderdet_extrafields.php'; $head[$h][1] = $langs->trans("ExtraFieldsLines"); $head[$h][2] = 'attributeslines'; $h++; - } complete_head_from_modules($conf,$langs,$object,$head,$h,'order_admin','remove'); diff --git a/htdocs/core/lib/propal.lib.php b/htdocs/core/lib/propal.lib.php index 8f5e61eeceec0f56ad38878ab2e04393154e0a8a..d43885adf95376015e46088764acd085ce834dc2 100644 --- a/htdocs/core/lib/propal.lib.php +++ b/htdocs/core/lib/propal.lib.php @@ -136,13 +136,10 @@ function propal_admin_prepare_head($object) $head[$h][2] = 'attributes'; $h++; - if ($conf->global->MAIN_FEATURES_LEVEL >= 2) // FIXME This feature will works when form for predefined and free product will be merged, otherwise there is duplicate fields with same name - { $head[$h][0] = DOL_URL_ROOT.'/comm/admin/propaldet_extrafields.php'; $head[$h][1] = $langs->trans("ExtraFieldsLines"); $head[$h][2] = 'attributeslines'; $h++; - } complete_head_from_modules($conf,$langs,$object,$head,$h,'propal_admin','remove'); diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index b7dee64a100d36c5c7d9fadf11be5d68ff1e99a0..ea9852253e2e29ac64c4178071cc6d93bf813d86 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -281,5 +281,5 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5001__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/fiche.php?&action=request', 'MenuAddCP', 1, 'holiday', '$user->rights->holiday->write', '', 0, 1, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5002__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/define_holiday.php?&action=request', 'MenuConfCP', 1, 'holiday', '$user->rights->holiday->define_holiday', '', 0, 2, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5003__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/view_log.php?&action=request', 'MenuLogCP', 1, 'holiday', '$user->rights->holiday->view_log', '', 0, 3, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5004__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/month_report.php?&action=request', 'MenuReportMonth', 1, 'holiday', '$user->rights->holiday->view_log', '', 0, 4, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5004__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/month_report.php?&action=request', 'MenuReportMonth', 1, 'holiday', '$user->rights->holiday->month_report', '', 0, 4, __ENTITY__); diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index b244e8bbd15d98d4e03cd552748ef105798f92f3..14de23b298f76c624bb3faf2903e16651e3b0f33 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1090,7 +1090,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $newmenu->add("/holiday/fiche.php?&action=request", $langs->trans("MenuAddCP"), 1,$user->rights->holiday->write); $newmenu->add("/holiday/define_holiday.php?&action=request", $langs->trans("MenuConfCP"), 1, $user->rights->holiday->define_holiday); $newmenu->add("/holiday/view_log.php?&action=request", $langs->trans("MenuLogCP"), 1, $user->rights->holiday->view_log); - $newmenu->add("/holiday/month_report.php?&action=request", $langs->trans("MenuReportMonth"), 1, $user->rights->holiday->view_log); + $newmenu->add("/holiday/month_report.php?&action=request", $langs->trans("MenuReportMonth"), 1, $user->rights->holiday->month_report); } } diff --git a/htdocs/core/tpl/freeproductline_create.tpl.php b/htdocs/core/tpl/freeproductline_create.tpl.php index 51479f24399ba34755c12d44f1b6d904742425b7..41eccdddda9d07ff9f1e4ceb90e5bb26d8fba21a 100644 --- a/htdocs/core/tpl/freeproductline_create.tpl.php +++ b/htdocs/core/tpl/freeproductline_create.tpl.php @@ -126,13 +126,20 @@ else { <input type="text" size="5" name="buying_price" class="flat" value="<?php echo (isset($_POST["buying_price"])?$_POST["buying_price"]:''); ?>"> </td> <?php + $colspan++; + $coldisplay++; + if ($user->rights->margins->creer) { if (! empty($conf->global->DISPLAY_MARGIN_RATES)) { echo '<td align="right" class="nowrap"><input type="text" size="2" name="np_marginRate" value="'.(isset($_POST["np_marginRate"])?$_POST["np_marginRate"]:'').'"><span class="hideonsmartphone">%</span></td>'; + $colspan++; + $coldisplay++; } if (! empty($conf->global->DISPLAY_MARK_RATES)) { echo '<td align="right" class="nowrap"><input type="text" size="2" name="np_markRate" value="'.(isset($_POST["np_markRate"])?$_POST["np_markRate"]:'').'"><span class="hideonsmartphone">%</span></td>'; + $colspan++; + $coldisplay++; } } else @@ -164,7 +171,7 @@ else { $newline = new FactureLigne($this->db); } if (is_object($newline)) { - print $newline->showOptionals($extrafieldsline,'edit',array('style'=>$bcnd[$var],'colspan'=>$coldisplay+8)); + print $newline->showOptionals($extrafieldsline, 'edit', array('style'=>$bcnd[$var], 'colspan'=>$coldisplay+8)); } } ?> @@ -262,43 +269,57 @@ if (! empty($usemargins) && $user->rights->margins->creer) return false; } - var np_price = 0; - if (remise.val().replace(',','.') != 100) + var price = 0; + remisejs=price2numjs(remise.val()); + + if (remisejs != 100) { - if (npRate == "np_marginRate") - np_price = ((buying_price.val().replace(',','.') * (1 + rate.val().replace(',','.') / 100)) / (1 - remise.val().replace(',','.') / 100)); - else { - if (npRate == "np_markRate") - np_price = ((buying_price.val().replace(',','.') / (1 - rate.val().replace(',','.') / 100)) / (1 - remise.val().replace(',','.') / 100)); - } + bpjs=price2numjs(buying_price.val()); + ratejs=price2numjs(rate.val()); + + if (npRate == "marginRate") + price = ((bpjs * (1 + ratejs / 100)) / (1 - remisejs / 100)); + else if (npRate == "markRate") + price = ((bpjs / (1 - ratejs / 100)) / (1 - remisejs / 100)); } - $("input[name='price_ht']:first").val(roundFloat(np_price)); + $("input[name='price_ht']:first").val(price); // TODO Must use a function like php price to have here a formated value return true; } - // TODO This works for french numbers only - function roundFloat(num) + + /* Function similar to price2num in PHP */ + function price2numjs(num) { + <?php + $dec=','; $thousand=' '; + if ($langs->transnoentitiesnoconv("SeparatorDecimal") != "SeparatorDecimal") $dec=$langs->transnoentitiesnoconv("SeparatorDecimal"); + if ($langs->transnoentitiesnoconv("SeparatorThousand")!= "SeparatorThousand") $thousand=$langs->transnoentitiesnoconv("SeparatorThousand"); + if ($thousand == 'None') $thousand=''; + print "var dec='".$dec."'; var thousand='".$thousand."';\n"; + ?> + var main_max_dec_shown = <?php echo $conf->global->MAIN_MAX_DECIMALS_SHOWN; ?>; - var main_rounding = <?php echo min($conf->global->MAIN_MAX_DECIMALS_UNIT,$conf->global->MAIN_MAX_DECIMALS_TOT); ?>; + var main_rounding_unit = <?php echo $conf->global->MAIN_MAX_DECIMALS_UNIT; ?>; + var main_rounding_tot = <?php echo $conf->global->MAIN_MAX_DECIMALS_TOT; ?>; + + var amount = num.toString(); - var amount = num.toString().replace(',','.'); // should be useless - var nbdec = 0; - var rounding = main_rounding; - var pos = amount.indexOf('.'); + // rounding for unit price + var rounding = main_rounding_unit; + var pos = amount.indexOf(dec); var decpart = ''; - if (pos >= 0) - decpart = amount.substr(pos+1).replace('/0+$/i',''); // Supprime les 0 de fin de partie decimale - nbdec = decpart.length; - if (nbdec > rounding) - rounding = nbdec; - // Si on depasse max - if (rounding > main_max_dec_shown) - { - rounding = main_max_dec_shown; - } - //amount = parseFloat(amount) + (1 / Math.pow(100, rounding)); // to avoid floating-point errors + if (pos >= 0) decpart = amount.substr(pos+1).replace('/0+$/i',''); // Supprime les 0 de fin de partie decimale + var nbdec = decpart.length; + if (nbdec > rounding) rounding = nbdec; + // If rounding higher than max shown + if (rounding > main_max_dec_shown) rounding = main_max_dec_shown; + + if (thousand != ',' && thousand != '.') amount=amount.replace(',','.'); + amount=amount.replace(' ',''); // To avoid spaces + amount=amount.replace(thousand,''); // Replace of thousand before replace of dec to avoid pb if thousand is . + amount=amount.replace(dec,'.'); + return parseFloat(amount).toFixed(rounding); } diff --git a/htdocs/core/tpl/objectline_add.tpl.php b/htdocs/core/tpl/objectline_add.tpl.php index 74d12a8d1a0dea8d352eb81257a3fef2b4b4cf3a..0c03206ae67b413e650661a620ef424d67d0d9d8 100644 --- a/htdocs/core/tpl/objectline_add.tpl.php +++ b/htdocs/core/tpl/objectline_add.tpl.php @@ -190,10 +190,10 @@ if (! empty($conf->margin->enabled)) { if ($user->rights->margins->creer) { if (! empty($conf->global->DISPLAY_MARGIN_RATES)) { - echo '<td align="right"><input type="text" size="2" name="np_marginRate" value="'.(isset($_POST["np_marginRate"])?$_POST["np_marginRate"]:'').'">%</td>'; + echo '<td align="right" class="nowrap"><input type="text" size="2" name="np_marginRate" value="'.(isset($_POST["np_marginRate"])?$_POST["np_marginRate"]:'').'">%</td>'; } elseif (! empty($conf->global->DISPLAY_MARK_RATES)) { - echo '<td align="right"><input type="text" size="2" name="np_markRate" value="'.(isset($_POST["np_markRate"])?$_POST["np_markRate"]:'').'">%</td>'; + echo '<td align="right" class="nowrap"><input type="text" size="2" name="np_markRate" value="'.(isset($_POST["np_markRate"])?$_POST["np_markRate"]:'').'">%</td>'; } } else @@ -629,47 +629,63 @@ function checkFreeLine(e, npRate) return false; } - var np_price = 0; - if (remise.val().replace(',','.') != 100) + var price = 0; + remisejs=price2numjs(remise.val()); + + if (remisejs != 100) { + bpjs=price2numjs(buying_price.val()); + ratejs=price2numjs(rate.val()); + if (npRate == "np_marginRate") - np_price = ((buying_price.val().replace(',','.') * (1 + rate.val().replace(',','.') / 100)) / (1 - remise.val().replace(',','.') / 100)); - else { - if (npRate == "np_markRate") - np_price = ((buying_price.val().replace(',','.') / (1 - rate.val().replace(',','.') / 100)) / (1 - remise.val().replace(',','.') / 100)); - } + price = ((bpjs * (1 + ratejs / 100)) / (1 - remisejs / 100)); + else if (npRate == "np_markRate") + price = ((bpjs / (1 - ratejs / 100)) / (1 - remisejs / 100)); } - $("input[name='price_ht']:first").val(formatFloat(np_price)); + $("input[name='price_ht']:first").val(price); // TODO Must use a function like php price to have here a formated value + update_price('price_ht', 'price_ttc'); return true; } -function roundFloat(num) { + + + +/* Function similar to price2num in PHP */ +function price2numjs(num) +{ + <?php + $dec=','; $thousand=' '; + if ($langs->transnoentitiesnoconv("SeparatorDecimal") != "SeparatorDecimal") $dec=$langs->transnoentitiesnoconv("SeparatorDecimal"); + if ($langs->transnoentitiesnoconv("SeparatorThousand")!= "SeparatorThousand") $thousand=$langs->transnoentitiesnoconv("SeparatorThousand"); + if ($thousand == 'None') $thousand=''; + print "var dec='".$dec."'; var thousand='".$thousand."';\n"; + ?> + var main_max_dec_shown = <?php echo $conf->global->MAIN_MAX_DECIMALS_SHOWN; ?>; - var main_rounding = <?php echo min($conf->global->MAIN_MAX_DECIMALS_UNIT,$conf->global->MAIN_MAX_DECIMALS_TOT); ?>; + var main_rounding_unit = <?php echo $conf->global->MAIN_MAX_DECIMALS_UNIT; ?>; + var main_rounding_tot = <?php echo $conf->global->MAIN_MAX_DECIMALS_TOT; ?>; + + var amount = num.toString(); - var amount = num.toString().replace(',','.'); // should be useless - var nbdec = 0; - var rounding = main_rounding; - var pos = amount.indexOf('.'); + // rounding for unit price + var rounding = main_rounding_unit; + var pos = amount.indexOf(dec); var decpart = ''; - if (pos >= 0) - decpart = amount.substr(pos+1).replace('/0+$/i',''); // Supprime les 0 de fin de partie decimale - nbdec = decpart.length; - if (nbdec > rounding) - rounding = nbdec; - // Si on depasse max - if (rounding > main_max_dec_shown) - { - rounding = main_max_dec_shown; - } - //amount = parseFloat(amount) + (1 / Math.pow(100, rounding)); // to avoid floating-point errors + if (pos >= 0) decpart = amount.substr(pos+1).replace('/0+$/i',''); // Supprime les 0 de fin de partie decimale + var nbdec = decpart.length; + if (nbdec > rounding) rounding = nbdec; + // If rounding higher than max shown + if (rounding > main_max_dec_shown) rounding = main_max_dec_shown; + + if (thousand != ',' && thousand != '.') amount=amount.replace(',','.'); + amount=amount.replace(' ',''); // To avoid spaces + amount=amount.replace(thousand,''); // Replace of thousand before replace of dec to avoid pb if thousand is . + amount=amount.replace(dec,'.'); + return parseFloat(amount).toFixed(rounding); } -function formatFloat(num) { - return roundFloat(num).replace('.', ','); -} <?php } ?> }); </script> diff --git a/htdocs/core/tpl/objectline_edit.tpl.php b/htdocs/core/tpl/objectline_edit.tpl.php index ee961f5ad70db8ebd34a84ce0d4049982be87a80..58ce0e6481f028787d441e415a8f82be0c53094a 100644 --- a/htdocs/core/tpl/objectline_edit.tpl.php +++ b/htdocs/core/tpl/objectline_edit.tpl.php @@ -471,41 +471,55 @@ if (! empty($conf->margin->enabled)) } var price = 0; - if (remise.val().replace(',','.') != 100) + remisejs=price2numjs(remise.val()); + + if (remisejs != 100) { + bpjs=price2numjs(buying_price.val()); + ratejs=price2numjs(rate.val()); + if (npRate == "marginRate") - price = ((buying_price.val().replace(',','.') * (1 + rate.val().replace(',','.') / 100)) / (1 - remise.val().replace(',','.') / 100)); - else { - if (npRate == "markRate") - price = ((buying_price.val().replace(',','.') / (1 - rate.val().replace(',','.') / 100)) / (1 - remise.val().replace(',','.') / 100)); - } + price = ((bpjs * (1 + ratejs / 100)) / (1 - remisejs / 100)); + else if (npRate == "markRate") + price = ((bpjs / (1 - ratejs / 100)) / (1 - remisejs / 100)); } - $("input[name='price_ht']:first").val(roundFloat(price)); + $("input[name='price_ht']:first").val(price); // TODO Must use a function like php price to have here a formated value return true; } - // TODO This works for french numbers only - function roundFloat(num) { + /* Function similar to price2num in PHP */ + function price2numjs(num) + { + <?php + $dec=','; $thousand=' '; + if ($langs->transnoentitiesnoconv("SeparatorDecimal") != "SeparatorDecimal") $dec=$langs->transnoentitiesnoconv("SeparatorDecimal"); + if ($langs->transnoentitiesnoconv("SeparatorThousand")!= "SeparatorThousand") $thousand=$langs->transnoentitiesnoconv("SeparatorThousand"); + if ($thousand == 'None') $thousand=''; + print "var dec='".$dec."'; var thousand='".$thousand."';\n"; + ?> + var main_max_dec_shown = <?php echo $conf->global->MAIN_MAX_DECIMALS_SHOWN; ?>; - var main_rounding = <?php echo min($conf->global->MAIN_MAX_DECIMALS_UNIT,$conf->global->MAIN_MAX_DECIMALS_TOT); ?>; + var main_rounding_unit = <?php echo $conf->global->MAIN_MAX_DECIMALS_UNIT; ?>; + var main_rounding_tot = <?php echo $conf->global->MAIN_MAX_DECIMALS_TOT; ?>; + + var amount = num.toString(); - var amount = num.toString().replace(',','.'); // should be useless - var nbdec = 0; - var rounding = main_rounding; - var pos = amount.indexOf('.'); + // rounding for unit price + var rounding = main_rounding_unit; + var pos = amount.indexOf(dec); var decpart = ''; - if (pos >= 0) - decpart = amount.substr(pos+1).replace('/0+$/i',''); // Supprime les 0 de fin de partie decimale - nbdec = decpart.length; - if (nbdec > rounding) - rounding = nbdec; - // Si on depasse max - if (rounding > main_max_dec_shown) - { - rounding = main_max_dec_shown; - } - //amount = parseFloat(amount) + (1 / Math.pow(100, rounding)); // to avoid floating-point errors + if (pos >= 0) decpart = amount.substr(pos+1).replace('/0+$/i',''); // Supprime les 0 de fin de partie decimale + var nbdec = decpart.length; + if (nbdec > rounding) rounding = nbdec; + // If rounding higher than max shown + if (rounding > main_max_dec_shown) rounding = main_max_dec_shown; + + if (thousand != ',' && thousand != '.') amount=amount.replace(',','.'); + amount=amount.replace(' ',''); // To avoid spaces + amount=amount.replace(thousand,''); // Replace of thousand before replace of dec to avoid pb if thousand is . + amount=amount.replace(dec,'.'); + return parseFloat(amount).toFixed(rounding); } diff --git a/htdocs/core/tpl/predefinedproductline_create.tpl.php b/htdocs/core/tpl/predefinedproductline_create.tpl.php index 4816c94e26d0385c3a38bfd259795b6580aeff52..acd06c807d3990758c0c42901dd5a74073f0b724 100644 --- a/htdocs/core/tpl/predefinedproductline_create.tpl.php +++ b/htdocs/core/tpl/predefinedproductline_create.tpl.php @@ -134,13 +134,20 @@ else { <input type="text" size="5" id="buying_price_predef" name="buying_price_predef" class="flat" value="<?php echo (isset($_POST["buying_price_predef"])?$_POST["buying_price_predef"]:''); ?>"> </td> <?php + $colspan++; + $coldisplay++; + if ($user->rights->margins->creer) { if (! empty($conf->global->DISPLAY_MARGIN_RATES)) { echo '<td align="right"><input type="text" size="2" name="np_marginRate_predef" value="'.(isset($_POST["np_marginRate_predef"])?$_POST["np_marginRate_predef"]:'').'">%</td>'; + $colspan++; + $coldisplay++; } if (! empty($conf->global->DISPLAY_MARK_RATES)) { echo '<td align="right"><input type="text" size="2" name="np_markRate_predef" value="'.(isset($_POST["np_markRate_predef"])?$_POST["np_markRate_predef"]:'').'">%</td>'; + $colspan++; + $coldisplay++; } } else @@ -172,7 +179,7 @@ else { $newline = new FactureLigne($this->db); } if (is_object($newline)) { - print $newline->showOptionals($extrafieldsline,'edit',array('style'=>$bcnd[$var],'colspan'=>$coldisplay+5)); + print $newline->showOptionals($extrafieldsline, 'edit', array('style'=>$bcnd[$var],'colspan'=>$coldisplay+5), '_predef'); } } ?> @@ -270,42 +277,56 @@ if (! empty($usemargins) && $user->rights->margins->creer) return false; } - var np_price = 0; - if (remise.val().replace(',','.') != 100) + var price = 0; + remisejs=price2numjs(remise.val()); + + if (remisejs != 100) { + bpjs=price2numjs(buying_price.val()); + ratejs=price2numjs(rate.val()); + if (npRate == "np_marginRate_predef") - np_price = ((buying_price.val().replace(',','.') * (1 + rate.val().replace(',','.') / 100)) / (1 - remise.val().replace(',','.') / 100)); - else { - if (npRate == "np_markRate_predef") - np_price = ((buying_price.val().replace(',','.') / (1 - rate.val().replace(',','.') / 100)) / (1 - remise.val().replace(',','.') / 100)); - } + price = ((bpjs * (1 + ratejs / 100)) / (1 - remisejs / 100)); + else if (npRate == "np_markRate_predef") + price = ((bpjs / (1 - ratejs / 100)) / (1 - remisejs / 100)); } - $("input[name='price_ht_predef']:last").val(roundFloat(np_price)); + $("input[name='price_ht_predef']:last").val(price); // TODO Must use a function like php price to have here a formated value return true; } - // TODO This works for french numbers only - function roundFloat(num) { + /* Function similar to price2num in PHP */ + function price2numjs(num) + { + <?php + $dec=','; $thousand=' '; + if ($langs->transnoentitiesnoconv("SeparatorDecimal") != "SeparatorDecimal") $dec=$langs->transnoentitiesnoconv("SeparatorDecimal"); + if ($langs->transnoentitiesnoconv("SeparatorThousand")!= "SeparatorThousand") $thousand=$langs->transnoentitiesnoconv("SeparatorThousand"); + if ($thousand == 'None') $thousand=''; + print "var dec='".$dec."'; var thousand='".$thousand."';\n"; + ?> + var main_max_dec_shown = <?php echo $conf->global->MAIN_MAX_DECIMALS_SHOWN; ?>; - var main_rounding = <?php echo min($conf->global->MAIN_MAX_DECIMALS_UNIT,$conf->global->MAIN_MAX_DECIMALS_TOT); ?>; + var main_rounding_unit = <?php echo $conf->global->MAIN_MAX_DECIMALS_UNIT; ?>; + var main_rounding_tot = <?php echo $conf->global->MAIN_MAX_DECIMALS_TOT; ?>; + + var amount = num.toString(); - var amount = num.toString().replace(',','.'); // should be useless - var nbdec = 0; - var rounding = main_rounding; - var pos = amount.indexOf('.'); + // rounding for unit price + var rounding = main_rounding_unit; + var pos = amount.indexOf(dec); var decpart = ''; - if (pos >= 0) - decpart = amount.substr(pos+1).replace('/0+$/i',''); // Supprime les 0 de fin de partie decimale - nbdec = decpart.length; - if (nbdec > rounding) - rounding = nbdec; - // Si on depasse max - if (rounding > main_max_dec_shown) - { - rounding = main_max_dec_shown; - } - //amount = parseFloat(amount) + (1 / Math.pow(100, rounding)); // to avoid floating-point errors + if (pos >= 0) decpart = amount.substr(pos+1).replace('/0+$/i',''); // Supprime les 0 de fin de partie decimale + var nbdec = decpart.length; + if (nbdec > rounding) rounding = nbdec; + // If rounding higher than max shown + if (rounding > main_max_dec_shown) rounding = main_max_dec_shown; + + if (thousand != ',' && thousand != '.') amount=amount.replace(',','.'); + amount=amount.replace(' ',''); // To avoid spaces + amount=amount.replace(thousand,''); // Replace of thousand before replace of dec to avoid pb if thousand is . + amount=amount.replace(dec,'.'); + return parseFloat(amount).toFixed(rounding); } diff --git a/htdocs/fichinter/fiche.php b/htdocs/fichinter/fiche.php index 563663a770804c1c691b2653aab340e07765bd77..e40d2b44daab3536a7a8ec2a62b94d756108c28d 100644 --- a/htdocs/fichinter/fiche.php +++ b/htdocs/fichinter/fiche.php @@ -1315,9 +1315,24 @@ else if ($id > 0 || ! empty($ref)) include DOL_DOCUMENT_ROOT.'/core/tpl/bloc_showhide.tpl.php'; } + + + print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" name="addinter" method="post">'; + print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; + print '<input type="hidden" name="id" value="'.$object->id.'">'; + if ($action == 'editline') + { + print '<input type="hidden" name="action" value="updateline">'; + print '<input type="hidden" name="line_id" value="'.GETPOST('line_id','int').'">'; + } + else + { + print '<input type="hidden" name="action" value="addline">'; + } + /* * Lignes d'intervention - */ + */ $sql = 'SELECT ft.rowid, ft.description, ft.fk_fichinter, ft.duree, ft.rang,'; $sql.= ' ft.date as date_intervention'; $sql.= ' FROM '.MAIN_DB_PREFIX.'fichinterdet as ft'; @@ -1405,11 +1420,6 @@ else if ($id > 0 || ! empty($ref)) // Ligne en mode update if ($object->statut == 0 && $action == 'editline' && $user->rights->ficheinter->creer && GETPOST('line_id','int') == $objp->rowid) { - print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'#'.$objp->rowid.'" method="post">'; - print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; - print '<input type="hidden" name="action" value="updateline">'; - print '<input type="hidden" name="id" value="'.$object->id.'">'; - print '<input type="hidden" name="line_id" value="'.GETPOST('line_id','int').'">'; print '<tr '.$bc[$var].'>'; print '<td>'; print '<a name="'.$objp->rowid.'"></a>'; // ancre pour retourner sur la ligne @@ -1433,8 +1443,6 @@ else if ($id > 0 || ! empty($ref)) print '<td align="center" colspan="5" valign="center"><input type="submit" class="button" name="save" value="'.$langs->trans("Save").'">'; print '<br><input type="submit" class="button" name="cancel" value="'.$langs->trans("Cancel").'"></td>'; print '</tr>' . "\n"; - - print "</form>\n"; } $i++; @@ -1459,12 +1467,6 @@ else if ($id > 0 || ! empty($ref)) print '<td colspan="4"> </td>'; print "</tr>\n"; - // Ajout ligne d'intervention - print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'#add" name="addinter" method="post">'; - print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; - print '<input type="hidden" name="id" value="'.$object->id.'">'; - print '<input type="hidden" name="action" value="addline">'; - $var=false; print '<tr '.$bc[$var].">\n"; @@ -1492,8 +1494,6 @@ else if ($id > 0 || ! empty($ref)) print '<td align="center" valign="middle" colspan="4"><input type="submit" class="button" value="'.$langs->trans('Add').'" name="addline"></td>'; print '</tr>'; - print '</form>'; - if (! $num) print '</table>'; } @@ -1504,6 +1504,8 @@ else if ($id > 0 || ! empty($ref)) dol_print_error($db); } + print '</form>'."\n"; + print '</div>'; print "\n"; diff --git a/htdocs/fourn/product/liste.php b/htdocs/fourn/product/liste.php index 76c34be7034139053d806fb6291c2689d94d2603..e380f9dd7df2d6c31e4f6e81beaeec5701019572 100644 --- a/htdocs/fourn/product/liste.php +++ b/htdocs/fourn/product/liste.php @@ -94,36 +94,25 @@ if ($catid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."categorie_product as cp ON cp.f $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_fournisseur_price as ppf ON p.rowid = ppf.fk_product"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON ppf.fk_soc = s.rowid"; $sql.= " WHERE p.entity IN (".getEntity('product', 1).")"; -if (GETPOST('mode', 'alpha') == 'search') +if ($sRefSupplier) { - $sql .= natural_search(array('p.ref', 'p.label'), GETPOST('mode', 'alpha')); + $sql .= natural_search('ppf.ref_fourn', $sRefSupplier); } -else +if (GETPOST('type')) { - if (GETPOST('type')) - { - $sql .= " AND p.fk_product_type = " . GETPOST('type','int'); - } - if ($sref) - { - $sql .= natural_search('p.ref', $sref); - } - if ($sRefSupplier) - { - $sql .= natural_search('ppf.ref_fourn', $sRefSupplier); - } - if ($snom) - { - $sql .= natural_search('p.label', $snom); - } - if($catid) - { - $sql .= " AND cp.fk_categorie = ".$catid; - } + $sql .= " AND p.fk_product_type = " . GETPOST('type','int'); } -if ($sRefSupplier) +if ($sref) { - $sql .= natural_search('ppf.ref_fourn', $sRefSupplier); + $sql .= natural_search('p.ref', $sref); +} +if ($snom) +{ + $sql .= natural_search('p.label', $snom); +} +if($catid) +{ + $sql .= " AND cp.fk_categorie = ".$catid; } if ($fourn_id > 0) { @@ -132,9 +121,7 @@ if ($fourn_id > 0) $sql .= " ORDER BY ".$sortfield." ".$sortorder; $sql .= $db->plimit($limit + 1, $offset); - -dol_syslog("fourn/product/liste: sql=".$sql); - +dol_syslog("fourn/product/liste.php: sql=".$sql); $resql = $db->query($sql); if ($resql) { @@ -142,10 +129,10 @@ if ($resql) $i = 0; - if ($num == 1 && ( isset($_POST["sall"]) || $snom || $sref ) ) + if ($num == 1 && (GETPOST("mode") == 'search')) { $objp = $db->fetch_object($resql); - header("Location: fiche.php?id=".$objp->rowid); + header("Location: ".DOL_URL_ROOT."/product/fiche.php?id=".$objp->rowid); exit; } @@ -155,8 +142,8 @@ if ($resql) llxHeader("","",$texte); - $param="&tobuy=$tobuy&sref=$sref&snom=$snom&fourn_id=$fourn_id".(isset($type)?"&type=$type":""); - print_barre_liste($texte, $page, "liste.php", $param, $sortfield, $sortorder,'',$num); + $param="&tobuy=".$tobuy."&sref=".$sref."&snom=".$snom."&fourn_id=".$fourn_id.(isset($type)?"&type=".$type:"").(empty($sRefSupplier)?"":"&srefsupplier=".$sRefSupplier); + print_barre_liste($texte, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder,'',$num); if (isset($catid)) @@ -168,27 +155,27 @@ if ($resql) print "</div><br>"; } + print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">'; + print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; + if ($fourn_id > 0) print '<input type="hidden" name="fourn_id" value="'.$fourn_id.'">'; + print '<input type="hidden" name="sortfield" value="'.$sortfield.'">'; + print '<input type="hidden" name="sortorder" value="'.$sortorder.'">'; + print '<input type="hidden" name="type" value="'.$type.'">'; print '<table class="liste" width="100%">'; // Lignes des titres print "<tr class=\"liste_titre\">"; - print_liste_field_titre($langs->trans("Ref"),"liste.php", "p.ref",$param,"","",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("RefSupplierShort"),"liste.php", "ppf.ref_fourn",$param,"","",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Label"),"liste.php", "p.label",$param,"","",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Supplier"),"liste.php", "ppf.fk_soc",$param,"","",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("BuyingPrice"),"liste.php", "ppf.price",$param,"",'align="right"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("QtyMin"),"liste.php", "ppf.quantity",$param,"",'align="right"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("UnitPrice"),"liste.php", "ppf.unitprice",$param,"",'align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"], "p.ref",$param,"","",$sortfield,$sortorder); + print_liste_field_titre($langs->trans("RefSupplierShort"),$_SERVER["PHP_SELF"], "ppf.ref_fourn",$param,"","",$sortfield,$sortorder); + print_liste_field_titre($langs->trans("Label"),$_SERVER["PHP_SELF"], "p.label",$param,"","",$sortfield,$sortorder); + print_liste_field_titre($langs->trans("Supplier"),$_SERVER["PHP_SELF"], "ppf.fk_soc",$param,"","",$sortfield,$sortorder); + print_liste_field_titre($langs->trans("BuyingPrice"),$_SERVER["PHP_SELF"], "ppf.price",$param,"",'align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("QtyMin"),$_SERVER["PHP_SELF"], "ppf.quantity",$param,"",'align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("UnitPrice"),$_SERVER["PHP_SELF"], "ppf.unitprice",$param,"",'align="right"',$sortfield,$sortorder); print "</tr>\n"; // Lignes des champs de filtre - print '<form action="liste.php" method="post">'; - print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; - if ($fourn_id > 0) print '<input type="hidden" name="fourn_id" value="'.$fourn_id.'">'; - print '<input type="hidden" name="sortfield" value="'.$sortfield.'">'; - print '<input type="hidden" name="sortorder" value="'.$sortorder.'">'; - print '<input type="hidden" name="type" value="'.$type.'">'; print '<tr class="liste_titre">'; print '<td class="liste_titre">'; print '<input class="flat" type="text" name="sref" value="'.$sref.'" size="12">'; @@ -205,7 +192,6 @@ if ($resql) print '<input type="image" class="liste_titre" value="button_removefilter" name="button_removefilter" src="'.img_picto($langs->trans("Search"),'searchclear.png','','',1).'" value="'.dol_escape_htmltag($langs->trans("RemoveFilter")).'" title="'.dol_escape_htmltag($langs->trans("RemoveFilter")).'">'; print '</td>'; print '</tr>'; - print '</form>'; $oldid = ''; $var=True; @@ -245,7 +231,7 @@ if ($resql) print "</table>"; - + print '</form>'; } else { diff --git a/htdocs/holiday/class/holiday.class.php b/htdocs/holiday/class/holiday.class.php index dc949344ee6c6f6363c1cda38ece55ba508c2e2f..024ab5c30a942139c50fb7684ae2f30f60aeae2c 100644 --- a/htdocs/holiday/class/holiday.class.php +++ b/htdocs/holiday/class/holiday.class.php @@ -1,8 +1,8 @@ <?php -/* Copyright (C) 2011 Dimitri Mouillard <dmouillard@teclib.com> - * Copyright (C) 2012 Laurent Destailleur <eldy@users.sourceforge.net> - * Copyright (C) 2012 Regis Houssin <regis.houssin@capnetworks.com> - * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro> +/* Copyright (C) 2011 Dimitri Mouillard <dmouillard@teclib.com> + * Copyright (C) 2012-2014 Laurent Destailleur <eldy@users.sourceforge.net> + * Copyright (C) 2012 Regis Houssin <regis.houssin@capnetworks.com> + * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro> * * 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 @@ -87,7 +87,7 @@ class Holiday extends CommonObject $this->updateSoldeCP(); // Vérifie le nombre d'utilisateur et mets à jour si besoin - $this->verifNbUsers($this->countActiveUsers(),$this->getConfCP('nbUser')); + $this->verifNbUsers($this->countActiveUsersWithoutCP(),$this->getConfCP('nbUser')); return 1; } @@ -923,13 +923,13 @@ class Holiday extends CommonObject dol_syslog(get_class($this).'::updateSoldeCP sql='.$sql2); $result= $this->db->query($sql2); - + if ($result) return 1; else return -1; } - + return 0; - } + } else { // Mise à jour pour un utilisateur @@ -942,7 +942,7 @@ class Holiday extends CommonObject dol_syslog(get_class($this).'::updateSoldeCP sql='.$sql); $result = $this->db->query($sql); - + if ($result) return 1; else return -1; } @@ -1061,7 +1061,7 @@ class Holiday extends CommonObject $sql = "SELECT u.rowid"; $sql.= " FROM ".MAIN_DB_PREFIX."user as u"; - $sql.= " WHERE statut > '0'"; + $sql.= " WHERE statut > 0"; dol_syslog(get_class($this)."::fetchUsers sql=".$sql, LOG_DEBUG); $resql=$this->db->query($sql); @@ -1143,7 +1143,7 @@ class Holiday extends CommonObject $sql = "SELECT u.rowid, u.lastname, u.firstname"; $sql.= " FROM ".MAIN_DB_PREFIX."user as u"; - $sql.= " WHERE statut > '0'"; + $sql.= " WHERE statut > 0"; dol_syslog(get_class($this)."::fetchUsers sql=".$sql, LOG_DEBUG); $resql=$this->db->query($sql); @@ -1229,7 +1229,23 @@ class Holiday extends CommonObject $sql = "SELECT count(u.rowid) as compteur"; $sql.= " FROM ".MAIN_DB_PREFIX."user as u"; - $sql.= " WHERE statut > '0'"; + $sql.= " WHERE u.statut > 0"; + + $result = $this->db->query($sql); + $objet = $this->db->fetch_object($result); + return $objet->compteur; + + } + /** + * Compte le nombre d'utilisateur actifs dans Dolibarr sans CP + * + * @return int retourne le nombre d'utilisateur + */ + function countActiveUsersWithoutCP() { + + $sql = "SELECT count(u.rowid) as compteur"; + $sql.= " FROM ".MAIN_DB_PREFIX."user as u LEFT OUTER JOIN ".MAIN_DB_PREFIX."holiday_users hu ON (hu.fk_user=u.rowid)"; + $sql.= " WHERE u.statut > 0 AND hu.fk_user IS NULL "; $result = $this->db->query($sql); $objet = $this->db->fetch_object($result); @@ -1240,17 +1256,17 @@ class Holiday extends CommonObject /** * Compare le nombre d'utilisateur actif de Dolibarr à celui des utilisateurs des congés payés * - * @param int $userDolibarr nombre d'utilisateur actifs dans Dolibarr - * @param int $userCP nombre d'utilisateur actifs dans le module congés payés + * @param int $userDolibarrWithoutCP Number of active users in Dolibarr without holidays + * @param int $userCP Number of active users into table of holidays * @return void */ - function verifNbUsers($userDolibarr,$userCP) { + function verifNbUsers($userDolibarrWithoutCP,$userCP) { if (empty($userCP)) $userCP=0; dol_syslog(get_class($this).'::verifNbUsers userDolibarr='.$userDolibarr.' userCP='.$userCP); - // Si il y a plus d'utilisateur Dolibarr que dans le module CP - if ($userDolibarr > $userCP) + // On vérifie les users Dolibarr sans CP + if ($userDolibarrWithoutCP > 0) { $this->updateConfCP('nbUser',$userDolibarr); @@ -1311,7 +1327,7 @@ class Holiday extends CommonObject $obj = $this->db->fetch_object($resql); - // On ajoute l'utilisateur + // On supprime l'utilisateur $this->deleteCPuser($obj->fk_user); $i++; @@ -1654,7 +1670,7 @@ class Holiday extends CommonObject $sql.= " cpl.new_solde"; $sql.= " FROM ".MAIN_DB_PREFIX."holiday_logs as cpl"; - $sql.= " WHERE cpl.rowid > '0'"; // Hack pour la recherche sur le tableau + $sql.= " WHERE cpl.rowid > 0"; // To avoid error with other search and criteria // Filtrage de séléction if(!empty($filter)) { diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 0e41bdf1ac6b2c60ccc012b75cd152e8d48dc006..19192574369cc6f33f819f95f59e388bdbf801e9 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1269,7 +1269,7 @@ PerfDolibarr=Performance setup/optimizing report YouMayFindPerfAdviceHere=You will find on this page some checks or advices related to performance. NotInstalled=Not installed, so your server is not slow down by this. ApplicativeCache=Applicative cache -MemcachedNotAvailable=No applicative cache found. You can enhance performance by installing a cache server Memcached and a module able to use this cache server. More information here http://wiki.dolibarr.org/index.php/Module_MemCached_EN. Note that a lot of web hosting provider does not provide such cache server. +MemcachedNotAvailable=No applicative cache found. You can enhance performance by installing a cache server Memcached and a module able to use this cache server.<br>More information here <a href="http://wiki.dolibarr.org/index.php/Module_MemCached_EN">http://wiki.dolibarr.org/index.php/Module_MemCached_EN</a>.<br>Note that a lot of web hosting provider does not provide such cache server. OPCodeCache=OPCode cache NoOPCodeCacheFound=No OPCode cache found. May be you use another OPCode cache than XCache or eAccelerator (good), may be you don't have OPCode cache (very bad). HTTPCacheStaticResources=HTTP cache for static resources (css, img, javascript) diff --git a/htdocs/langs/en_US/cashdesk.lang b/htdocs/langs/en_US/cashdesk.lang index ea617c195839ddad973dfc69919ce8c8a05d35e5..22cc717df1a8539bb64a900db1f50ccf9e67fc9f 100644 --- a/htdocs/langs/en_US/cashdesk.lang +++ b/htdocs/langs/en_US/cashdesk.lang @@ -36,4 +36,5 @@ BankToPay=Charge Account ShowCompany=Show company ShowStock=Show warehouse DeleteArticle=Click to remove this article -FilterRefOrLabelOrBC=Search (Ref/Label) \ No newline at end of file +FilterRefOrLabelOrBC=Search (Ref/Label) +UserNeedPermissionToEditStockToUsePos=You ask to decrease stock on invoice creation, so user that use POS need to have permission to edit stock. \ No newline at end of file diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index da25c0dedc5d2fc22624cf96e115d1d13612c942..96fdf76379b5abba6397ec9bc60f95280bfbf4f4 100644 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -173,8 +173,8 @@ CustomCode=Customs code CountryOrigin=Origin country HiddenIntoCombo=Hidden into select lists Nature=Nature -ProductCodeModel=Product code template -ServiceCodeModel=Service code template +ProductCodeModel=Product ref template +ServiceCodeModel=Service ref template AddThisProductCard=Create product card HelpAddThisProductCard=This option allows you to create or clone a product if it does not exist. AddThisServiceCard=Create service card @@ -217,4 +217,4 @@ DefinitionOfBarCodeForThirdpartyNotComplete=Definition of type or value of bar c BarCodeDataForProduct=Barcode information of product %s : BarCodeDataForThirdparty=Barcode information of thirdparty %s : BarcodeStickersMask=xxx - \ No newline at end of file + diff --git a/htdocs/langs/en_US/stocks.lang b/htdocs/langs/en_US/stocks.lang index 4d55ae663e18beb93bf3c905e7c9c4349ac348c0..032412cc322f58e8220d99af3ca61bc72cb1486f 100644 --- a/htdocs/langs/en_US/stocks.lang +++ b/htdocs/langs/en_US/stocks.lang @@ -94,14 +94,20 @@ DesiredStock=Desired stock StockToBuy=To order Replenishment=Replenishment ReplenishmentOrders=Replenishment orders -UseVirtualStock=Use virtual stock instead of physical stock +VirtualDiffersFromPhysical=According to increase/decrease stock options, physical stock and virtual stock (physical + current orders) may differs +UseVirtualStockByDefault=Use virtual stock by default, instead of physical stock, for replenishment feature +UseVirtualStock=Use virtual stock +UsePhysicalStock=Use physical stock +CurentSelectionMode=Curent selection mode +CurentlyUsingVirtualStock=Virtual stock +CurentlyUsingPhysicalStock=Physical stock RuleForStockReplenishment=Rule for stocks replenishment SelectProductWithNotNullQty=Select at least one product with a qty not null and a supplier AlertOnly= Alerts only WarehouseForStockDecrease=The warehouse <b>%s</b> will be used for stock decrease WarehouseForStockIncrease=The warehouse <b>%s</b> will be used for stock increase ForThisWarehouse=For this warehouse -ReplenishmentStatusDesc=This is list of all product with a physical stock lower than desired stock (or alert value if checkbox "alert only" is checked) and suggest you to create supplier orders to fill the difference. +ReplenishmentStatusDesc=This is list of all product with a stock lower than desired stock (or lower than alert value if checkbox "alert only" is checked), and suggest you to create supplier orders to fill the difference. ReplenishmentOrdersDesc=This is list of all opened supplier orders Replenishments=Replenishments NbOfProductBeforePeriod=Quantity of product %s in stock before selected period (< %s) diff --git a/htdocs/langs/fr_FR/cashdesk.lang b/htdocs/langs/fr_FR/cashdesk.lang index ceab9ef95d1c8f365e85e98648f593f500b93ce9..5dd2fe6ec577cdee2c92429ec40856c68334fb1d 100644 --- a/htdocs/langs/fr_FR/cashdesk.lang +++ b/htdocs/langs/fr_FR/cashdesk.lang @@ -37,3 +37,4 @@ ShowCompany=Voir société ShowStock=Voir entrepôt DeleteArticle=Cliquez pour enlever cet article FilterRefOrLabelOrBC=Recherche (Ref/Lib.) +UserNeedPermissionToEditStockToUsePos=La configuration du module stock demande une réduction du stock sur facturation, aussi l'utilisateur du Point De Vente doit avoir les droits de modifier les stocks \ No newline at end of file diff --git a/htdocs/langs/nl_BE/stocks.lang b/htdocs/langs/nl_BE/stocks.lang index 80d59ecce98457d7404880301cbe27b4b2bed6ea..d44fbff57aff03b11ebc6f1146a4e28cb1e2ce1d 100644 --- a/htdocs/langs/nl_BE/stocks.lang +++ b/htdocs/langs/nl_BE/stocks.lang @@ -51,7 +51,7 @@ StockLimitShort=Limiet StockLimit=Voorraad limiet voor signaleringen PhysicalStock=Fysieke voorraad RealStock=Reële voorraad -TheoreticalStock=Therocial voorraad +TheoreticalStock=Virtuele voorraad VirtualStock=Virtuele voorraad MininumStock=Minimumvoorraad StockUp=Voorraad op diff --git a/htdocs/margin/agentMargins.php b/htdocs/margin/agentMargins.php index 811052f7a9384ba8126047578153ad7289c868ce..41deb207e1c46a870e01a5c2512f6cf041cc29be 100644 --- a/htdocs/margin/agentMargins.php +++ b/htdocs/margin/agentMargins.php @@ -56,9 +56,9 @@ $pagenext = $page + 1; $startdate=$enddate=''; if (!empty($_POST['startdatemonth'])) - $startdate = date('Y-m-d', dol_mktime(12, 0, 0, $_POST['startdatemonth'], $_POST['startdateday'], $_POST['startdateyear'])); + $startdate = dol_mktime(12, 0, 0, $_POST['startdatemonth'], $_POST['startdateday'], $_POST['startdateyear']); if (!empty($_POST['enddatemonth'])) - $enddate = date('Y-m-d', dol_mktime(12, 0, 0, $_POST['enddatemonth'], $_POST['enddateday'], $_POST['enddateyear'])); + $enddate = dol_mktime(12, 0, 0, $_POST['enddatemonth'], $_POST['enddateday'], $_POST['enddateyear']); /* * View @@ -90,16 +90,16 @@ print $form->select_dolusers($agentid,'agentid',1); print '</td></tr>'; // Start date -print '<td>'.$langs->trans('StartDate').'</td>'; +print '<td>'.$langs->trans('StartDate').' ('.$langs->trans("DateValidation").')</td>'; print '<td width="20%">'; $form->select_date($startdate,'startdate','','',1,"sel",1,1); print '</td>'; -print '<td width="20%">'.$langs->trans('EndDate').'</td>'; +print '<td width="20%">'.$langs->trans('EndDate').' ('.$langs->trans("DateValidation").')</td>'; print '<td width="20%">'; $form->select_date($enddate,'enddate','','',1,"sel",1,1); print '</td>'; print '<td style="text-align: center;">'; -print '<input type="submit" class="button" value="'.$langs->trans('Launch').'" />'; +print '<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans('Launch')).'" />'; print '</td></tr>'; print "</table>"; print '</form>'; @@ -131,9 +131,9 @@ if ($agentid > 0) { $sql .= " AND sc.fk_user = ".$agentid; } if (!empty($startdate)) - $sql.= " AND f.datef >= '".$startdate."'"; + $sql.= " AND f.datef >= '".$db->idate($startdate)."'"; if (!empty($enddate)) - $sql.= " AND f.datef <= '".$enddate."'"; + $sql.= " AND f.datef <= '".$db->idate($enddate)."'"; $sql .= " AND d.buy_price_ht IS NOT NULL"; if (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1) $sql .= " AND d.buy_price_ht <> 0"; $sql.= " GROUP BY s.rowid, s.nom, s.code_client, s.client, u.rowid, u.login, u.lastname, u.firstname"; diff --git a/htdocs/margin/customerMargins.php b/htdocs/margin/customerMargins.php index 2f1ca0f953ccdf60cf9d26e4b022ae447d941a0c..eeff645a6d0ff868c7e735e62b0d87662624916e 100644 --- a/htdocs/margin/customerMargins.php +++ b/htdocs/margin/customerMargins.php @@ -49,9 +49,9 @@ $pagenext = $page + 1; $startdate=$enddate=''; if (!empty($_POST['startdatemonth'])) - $startdate = date('Y-m-d', dol_mktime(12, 0, 0, $_POST['startdatemonth'], $_POST['startdateday'], $_POST['startdateyear'])); + $startdate = dol_mktime(12, 0, 0, $_POST['startdatemonth'], $_POST['startdateday'], $_POST['startdateyear']); if (!empty($_POST['enddatemonth'])) - $enddate = date('Y-m-d', dol_mktime(12, 0, 0, $_POST['enddatemonth'], $_POST['enddateday'], $_POST['enddateyear'])); + $enddate = dol_mktime(12, 0, 0, $_POST['enddatemonth'], $_POST['enddateday'], $_POST['enddateyear']); /* * View @@ -119,33 +119,39 @@ if (! $sortfield) } // Start date -print '<td>'.$langs->trans('StartDate').'</td>'; +print '<td>'.$langs->trans('StartDate').' ('.$langs->trans("DateValidation").')</td>'; print '<td width="20%">'; $form->select_date($startdate,'startdate','','',1,"sel",1,1); print '</td>'; -print '<td width="20%">'.$langs->trans('EndDate').'</td>'; +print '<td width="20%">'.$langs->trans('EndDate').' ('.$langs->trans("DateValidation").')</td>'; print '<td width="20%">'; $form->select_date($enddate,'enddate','','',1,"sel",1,1); print '</td>'; print '<td style="text-align: center;">'; -print '<input type="submit" class="button" value="'.$langs->trans('Launch').'" />'; +print '<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans('Launch')).'" />'; print '</td></tr>'; +print "</table>"; + +print '<br>'; + +print '<table class="border" width="100%">'; + // Total Margin -print '<tr style="font-weight: bold"><td>'.$langs->trans("TotalMargin").'</td><td colspan="4">'; +print '<tr><td width="20%">'.$langs->trans("TotalMargin").'</td><td colspan="4">'; print '<span id="totalMargin"></span>'; // set by jquery (see below) print '</td></tr>'; // Margin Rate if (! empty($conf->global->DISPLAY_MARGIN_RATES)) { - print '<tr style="font-weight: bold"><td>'.$langs->trans("MarginRate").'</td><td colspan="4">'; + print '<tr><td width="20%">'.$langs->trans("MarginRate").'</td><td colspan="4">'; print '<span id="marginRate"></span>'; // set by jquery (see below) print '</td></tr>'; } // Mark Rate if (! empty($conf->global->DISPLAY_MARK_RATES)) { - print '<tr style="font-weight: bold"><td>'.$langs->trans("MarkRate").'</td><td colspan="4">'; + print '<tr><td width="20%">'.$langs->trans("MarkRate").'</td><td colspan="4">'; print '<span id="markRate"></span>'; // set by jquery (see below) print '</td></tr>'; } @@ -167,11 +173,11 @@ $sql.= " AND f.fk_statut > 0"; $sql.= " AND s.entity = ".$conf->entity; $sql.= " AND d.fk_facture = f.rowid"; if ($client) - $sql.= " AND f.fk_soc = $socid"; + $sql.= " AND f.fk_soc = ".$socid; if (!empty($startdate)) - $sql.= " AND f.datef >= '".$startdate."'"; + $sql.= " AND f.datef >= '".$db->idate($startdate)."'"; if (!empty($enddate)) - $sql.= " AND f.datef <= '".$enddate."'"; + $sql.= " AND f.datef <= '".$db->idate($enddate)."'"; $sql .= " AND d.buy_price_ht IS NOT NULL"; if (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1) $sql .= " AND d.buy_price_ht <> 0"; @@ -210,7 +216,7 @@ if ($result) $cumul_achat = 0; $cumul_vente = 0; - + $rounding = min($conf->global->MAIN_MAX_DECIMALS_UNIT,$conf->global->MAIN_MAX_DECIMALS_TOT); if ($num > 0) @@ -284,7 +290,7 @@ if ($result) $markRate = ($cumul_vente != 0)?(100 * $totalMargin / $cumul_vente):''; } - print '<tr '.$bc[$var].' style="border-top: 1px solid #ccc; font-weight: bold">'; + print '<tr class="liste_total">'; if ($client) print '<td colspan=2>'; else @@ -316,11 +322,9 @@ $db->close(); <script type="text/javascript"> $(document).ready(function() { - $("div.fiche form input.button[type=submit]").hide(); - - $("#socid").change(function() { - $("div.fiche form").submit(); - }); + $("#socid").change(function() { + $("div.fiche form").submit(); + }); $("#totalMargin").html("<?php echo price($totalMargin, null, null, null, null, $rounding); ?>"); $("#marginRate").html("<?php echo (($marginRate === '')?'n/a':price($marginRate, null, null, null, null, $rounding)."%"); ?>"); diff --git a/htdocs/margin/productMargins.php b/htdocs/margin/productMargins.php index f16cb126e87b927ccd81de6acbbc17802ed12d55..8e129e58b6e7b2cd77919aebee5e1e0575bfdc62 100644 --- a/htdocs/margin/productMargins.php +++ b/htdocs/margin/productMargins.php @@ -71,9 +71,10 @@ $pagenext = $page + 1; $startdate=$enddate=''; if (!empty($_POST['startdatemonth'])) - $startdate = date('Y-m-d', dol_mktime(12, 0, 0, $_POST['startdatemonth'], $_POST['startdateday'], $_POST['startdateyear'])); + $startdate = dol_mktime(12, 0, 0, $_POST['startdatemonth'], $_POST['startdateday'], $_POST['startdateyear']); if (!empty($_POST['enddatemonth'])) - $enddate = date('Y-m-d', dol_mktime(12, 0, 0, $_POST['enddatemonth'], $_POST['enddateday'], $_POST['enddateyear'])); + $enddate = dol_mktime(12, 0, 0, $_POST['enddatemonth'], $_POST['enddateday'], $_POST['enddateyear']); + /* * View @@ -121,33 +122,39 @@ else { } // Start date -print '<td>'.$langs->trans('StartDate').'</td>'; +print '<td>'.$langs->trans('StartDate').' ('.$langs->trans("DateValidation").')</td>'; print '<td width="20%">'; $form->select_date($startdate,'startdate','','',1,"sel",1,1); print '</td>'; -print '<td width="20%">'.$langs->trans('EndDate').'</td>'; +print '<td width="20%">'.$langs->trans('EndDate').' ('.$langs->trans("DateValidation").')</td>'; print '<td width="20%">'; $form->select_date($enddate,'enddate','','',1,"sel",1,1); print '</td>'; print '<td style="text-align: center;">'; -print '<input type="submit" class="button" value="'.$langs->trans('Launch').'" />'; +print '<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans('Launch')).'" />'; print '</td></tr>'; +print "</table>"; + +print '<br>'; + +print '<table class="border" width="100%">'; + // Total Margin -print '<tr style="font-weight: bold"><td>'.$langs->trans("TotalMargin").'</td><td colspan="4">'; +print '<tr><td width="20%">'.$langs->trans("TotalMargin").'</td><td colspan="4">'; print '<span id="totalMargin"></span>'; // set by jquery (see below) print '</td></tr>'; // Margin Rate if (! empty($conf->global->DISPLAY_MARGIN_RATES)) { - print '<tr style="font-weight: bold"><td>'.$langs->trans("MarginRate").'</td><td colspan="4">'; + print '<tr><td width="20%">'.$langs->trans("MarginRate").'</td><td colspan="4">'; print '<span id="marginRate"></span>'; // set by jquery (see below) print '</td></tr>'; } // Mark Rate if (! empty($conf->global->DISPLAY_MARK_RATES)) { - print '<tr style="font-weight: bold"><td>'.$langs->trans("MarkRate").'</td><td colspan="4">'; + print '<tr><td width="20%">'.$langs->trans("MarkRate").'</td><td colspan="4">'; print '<span id="markRate"></span>'; // set by jquery (see below) print '</td></tr>'; } @@ -174,9 +181,9 @@ $sql.= " AND d.fk_facture = f.rowid"; if ($id > 0) $sql.= " AND d.fk_product =".$id; if (!empty($startdate)) - $sql.= " AND f.datef >= '".$startdate."'"; + $sql.= " AND f.datef >= '".$db->idate($startdate)."'"; if (!empty($enddate)) - $sql.= " AND f.datef <= '".$enddate."'"; + $sql.= " AND f.datef <= '".$db->idate($enddate)."'"; $sql .= " AND d.buy_price_ht IS NOT NULL"; if (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1) $sql .= " AND d.buy_price_ht <> 0"; @@ -185,6 +192,7 @@ if ($id > 0) $sql.= " ORDER BY ".$sortfield." ".$sortorder; // TODO: calculate total to display then restore pagination //$sql.= $db->plimit($conf->liste_limit +1, $offset); + dol_syslog('margin::productMargins.php sql='.$sql,LOG_DEBUG); $result = $db->query($sql); if ($result) @@ -289,7 +297,7 @@ if ($result) $marginRate = ($cumul_achat != 0)?(100 * $totalMargin / $cumul_achat):''; $markRate = ($cumul_vente != 0)?(100 * $totalMargin / $cumul_vente):''; } - print '<tr '.$bc[$var].' style="border-top: 1px solid #ccc; font-weight: bold">'; + print '<tr class="liste_total">'; if ($id > 0) print '<td colspan=2>'; else diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 22a1277b9d5cf8bf08f7daa4d213bcd3c1685e1e..f5070cf3edad1879901be48389aef95d9c8471fe 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -349,7 +349,7 @@ class Product extends CommonObject $sql.= ", '".$this->accountancy_code_buy."'"; $sql.= ", '".$this->accountancy_code_sell."'"; $sql.= ", '".$this->canvas."'"; - $sql.= ", ".((! isset($this->finished) || $this->finished < 0)?'null':$this->finished); + $sql.= ", ".((! isset($this->finished) || $this->finished < 0 || $this->finished == '') ? 'null' : $this->finished); $sql.= ")"; dol_syslog(get_class($this)."::Create sql=".$sql); diff --git a/htdocs/product/stock/replenish.php b/htdocs/product/stock/replenish.php index 887a23ac0bc402a7d2a93b1ded0293d8f39068e1..b1c0e4a6041897731dbc21657335c19d7b96b59a 100644 --- a/htdocs/product/stock/replenish.php +++ b/htdocs/product/stock/replenish.php @@ -170,6 +170,19 @@ if ($action == 'order' && isset($_POST['valid'])) * View */ +$virtualdiffersfromphysical=0; +if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) + || ! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER) + ) $virtualdiffersfromphysical=1; // According to increase/decrease stock options, virtual and physical stock may differs. + +$usevirtualstock=-1; +if ($virtualdiffersfromphysical) +{ + $usevirtualstock=($conf->global->STOCK_USE_VIRTUAL_STOCK?1:0); + if (GETPOST('mode')=='virtual') $usevirtualstock=1; + if (GETPOST('mode')=='physical') $usevirtualstock=0; +} + $title = $langs->trans('Status'); $sql = 'SELECT p.rowid, p.ref, p.label, p.price,'; @@ -251,7 +264,20 @@ $head[1][2] = 'replenishorders'; dol_fiche_head($head, 'replenish', $langs->trans('Replenishment'), 0, 'stock'); -print $langs->trans("ReplenishmentStatusDesc").'<br><br>'; +print $langs->trans("ReplenishmentStatusDesc").'<br>'."\n"; +if ($usevirtualstock == 1) +{ + print $langs->trans("CurentSelectionMode").': '; + print $langs->trans("CurentlyUsingVirtualStock").' - '; + print '<a href="'.$_SERVER["PHP_SELF"].'?mode=physical">'.$langs->trans("UsePhysicalStock").'</a><br>'; +} +if ($usevirtualstock == 0) +{ + print $langs->trans("CurentSelectionMode").': '; + print $langs->trans("CurentlyUsingPhysicalStock").' - '; + print '<a href="'.$_SERVER["PHP_SELF"].'?mode=virtual">'.$langs->trans("UseVirtualStock").'</a><br>'; +} +print '<br>'."\n"; if ($sref || $snom || $sall || $salert || GETPOST('search', 'alpha')) { $filters = '&sref=' . $sref . '&snom=' . $snom; @@ -344,14 +370,11 @@ print_liste_field_titre( $sortfield, $sortorder ); -if ($conf->global->USE_VIRTUAL_STOCK) -{ - $stocklabel = $langs->trans('VirtualStock'); -} -else -{ - $stocklabel = $langs->trans('PhysicalStock'); -} + +$stocklabel = $langs->trans('Stock'); +if ($usevirtualstock == 1) $stocklabel = $langs->trans('VirtualStock'); +if ($usevirtualstock == 0) $stocklabel = $langs->trans('PhysicalStock'); + print_liste_field_titre( $stocklabel, $_SERVER["PHP_SELF"], @@ -449,9 +472,9 @@ while ($i < min($num, $limit)) $prod->type = $objp->fk_product_type; $ordered = ordered($prod->id); - if ($conf->global->USE_VIRTUAL_STOCK) + if ($usevirtualstock) { - //compute virtual stock + // If option to increase/decrease is not on an object validation, virtual stock may differs from physical stock. $prod->fetch($prod->id); $result=$prod->load_stats_commande(0, '1,2'); if ($result < 0) { @@ -609,4 +632,4 @@ function toggle(source) llxFooter(); $db->close(); -?> +?> \ No newline at end of file diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 479f211eaefb17d1cc18a915e8b6e53b420fbdb0..25fc77311ace635c63be0b5ea6361222fdd7a730 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -8,7 +8,7 @@ * Copyright (C) 2005 Lionel Cousteix <etm_ltd@tiscali.co.uk> * Copyright (C) 2011 Herve Prot <herve.prot@symeos.com> * Copyright (C) 2013 Philippe Grand <philippe.grand@atoo-net.com> - * Copyright (C) 2013 Alexandre Spangaro <alexandre.spangaro@gmail.com> + * Copyright (C) 2013 Alexandre Spangaro <alexandre.spangaro@gmail.com> * * 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 @@ -488,6 +488,7 @@ class User extends CommonObject * Clear all permissions array of user * * @return void + * @see getrights */ function clearrights() { @@ -503,6 +504,7 @@ class User extends CommonObject * * @param string $moduletag Limit permission for a particular module ('' by default means load all permissions) * @return void + * @see clearrights */ function getrights($moduletag='') { @@ -1013,7 +1015,7 @@ class User extends CommonObject { $newpass=$this->setPassword($user,$this->pass); if (is_numeric($newpass) && $newpass < 0) $result=-2; - + if ($result > 0 && $member->fk_soc) // If member is linked to a thirdparty { $sql = "UPDATE ".MAIN_DB_PREFIX."user"; diff --git a/test/phpunit/AllTests.php b/test/phpunit/AllTests.php index 7958fd5fe38c21000114d3c727e63e7a1841bc24..ae4691ae69499b96cde49dc60f7dad3e513dd533 100644 --- a/test/phpunit/AllTests.php +++ b/test/phpunit/AllTests.php @@ -171,6 +171,12 @@ class AllTests require_once dirname(__FILE__).'/ModulesTest.php'; // At end because it's the longer $suite->addTestSuite('ModulesTest'); + + // GUI + require_once dirname(__FILE__).'/FormAdminTest.php'; + $suite->addTestSuite('FormAdminTest'); + + return $suite; } } diff --git a/test/phpunit/FormAdminTest.php b/test/phpunit/FormAdminTest.php new file mode 100644 index 0000000000000000000000000000000000000000..363fd4acf2e07d423687be310966c697efffc30b --- /dev/null +++ b/test/phpunit/FormAdminTest.php @@ -0,0 +1,139 @@ +<?php +/* Copyright (C) 2010 Laurent Destailleur <eldy@users.sourceforge.net> + * + * 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 test/phpunit/FormAdminTest.php + * \ingroup test + * \brief PHPUnit test + * \remarks To run this script as CLI: phpunit filename.php + */ + +global $conf,$user,$langs,$db; +//define('TEST_DB_FORCE_TYPE','mysql'); // This is to force using mysql driver +require_once 'PHPUnit/Autoload.php'; +require_once dirname(__FILE__).'/../../htdocs/master.inc.php'; +require_once dirname(__FILE__).'/../../htdocs/core/class/html.formadmin.class.php'; + +if (empty($user->id)) +{ + print "Load permissions for admin user nb 1\n"; + $user->fetch(1); + $user->getrights(); +} +$conf->global->MAIN_DISABLE_ALL_MAILS=1; + + +/** + * Class for PHPUnit tests + * + * @backupGlobals disabled + * @backupStaticAttributes enabled + * @remarks backupGlobals must be disabled to have db,conf,user and lang not erased. + */ +class FormAdminTest extends PHPUnit_Framework_TestCase +{ + protected $savconf; + protected $savuser; + protected $savlangs; + protected $savdb; + + /** + * Constructor + * We save global variables into local variables + * + * @return FactureTest + */ + function __construct() + { + //$this->sharedFixture + global $conf,$user,$langs,$db; + $this->savconf=$conf; + $this->savuser=$user; + $this->savlangs=$langs; + $this->savdb=$db; + + print __METHOD__." db->type=".$db->type." user->id=".$user->id; + //print " - db ".$db->db; + print "\n"; + } + + // Static methods + public static function setUpBeforeClass() + { + global $conf,$user,$langs,$db; + $db->begin(); // This is to have all actions inside a transaction even if test launched without suite. + + print __METHOD__."\n"; + } + public static function tearDownAfterClass() + { + global $conf,$user,$langs,$db; + $db->rollback(); + + print __METHOD__."\n"; + } + + /** + * Init phpunit tests + * + * @return void + */ + protected function setUp() + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + print __METHOD__."\n"; + } + + /** + * End phpunit tests + * + * @return void + */ + protected function tearDown() + { + print __METHOD__."\n"; + } + + /** + * testFactureCreate + * + * @return int + */ + public function testSelectPaperFormat() + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + $localobject=new FormAdmin($this->savdb); + $result=$localobject->select_paper_format('','paperformat_id','A4'); + + $this->assertEquals($result, '<select class="flat" id="paperformat_id" name="paperformat_id"><option value="EUA4">Format A4 - 210x297 mm</option></select>'); + print __METHOD__." result=".$result."\n"; + return $result; + } + +} +?> \ No newline at end of file diff --git a/test/phpunit/FunctionsTest.php b/test/phpunit/FunctionsTest.php index c58da9efa388734ba646fa5fe1d91339e40755a2..caa798beb46c4edf1a91acd042af01d04ae46662 100755 --- a/test/phpunit/FunctionsTest.php +++ b/test/phpunit/FunctionsTest.php @@ -403,7 +403,13 @@ class FunctionsTest extends PHPUnit_Framework_TestCase { $input="x&<b>#</b>,\"'"; // " will be converted into ' $result=dol_escape_js($input); - $this->assertEquals("x&<b>#<\/b>,\'\'",$result); + $this->assertEquals("x&<b>#</b>,\'\'",$result,"Test mode=0"); + + $result=dol_escape_js($input,1); + $this->assertEquals("x&<b>#</b>,\"\'",$result,"Test mode=1"); + + $result=dol_escape_js($input,2); + $this->assertEquals("x&<b>#</b>,\\\"'",$result,"Test mode=2"); }