Merge branch 'develop' of git@github.com:Dolibarr/dolibarr.git into develop

This commit is contained in:
Laurent Destailleur 2024-04-07 12:26:49 +02:00
commit 3fad52815a
6 changed files with 5423 additions and 240 deletions

View file

@ -170,7 +170,7 @@ echo "Setting up Dolibarr '$INSTALL_FORCED_FILE' to test installation"
# Ensure we catch errors
set +e
{
echo '<?php '
echo '<?php'
echo 'error_reporting(E_ALL);'
echo '$'force_install_noedit=2';'
if [ "$DB" = 'mysql' ] || [ "$DB" = 'mariadb' ]; then

File diff suppressed because it is too large Load diff

View file

@ -327,6 +327,8 @@ return [
.'dummy' // @phpstan-ignore-line
.'|htdocs/.*/canvas/.*/tpl/.*.tpl.php' // @phpstan-ignore-line
.'|htdocs/modulebuilder/template/.*' // @phpstan-ignore-line
// Included as stub (better analysis)
.'|htdocs/includes/nusoap/.*' // @phpstan-ignore-line
// Included as stub (old version + incompatible typing hints)
.'|htdocs/includes/restler/.*' // @phpstan-ignore-line
// Included as stub (did not seem properly analysed by phan without it)
@ -365,7 +367,7 @@ return [
// can also be written as 'vendor/phan/phan/.phan/plugins/AlwaysReturnPlugin.php'
'DeprecateAliasPlugin',
//'EmptyMethodAndFunctionPlugin',
'InvalidVariableIssetPlugin',
// 'InvalidVariableIssetPlugin',
//'MoreSpecificElementTypePlugin',
'NoAssertPlugin',
'NotFullyQualifiedUsagePlugin',
@ -416,214 +418,29 @@ return [
'suppress_issue_types' => [
// Dolibarr uses a lot of internal deprecated stuff, not reporting
'PhanDeprecatedProperty',
// 'PhanDeprecatedFunction',
//'PhanCompatibleNegativeStringOffset',
// 'PhanPluginDuplicateExpressionAssignment',
// Nulls are likely mostly false positives
'PhanPluginConstantVariableNull',
'PhanTypeObjectUnsetDeclaredProperty',
// 'PhanPluginComparisonNotStrictForScalar',
'PhanPluginNonBoolBranch',
'PhanPluginShortArray',
'PhanPluginNumericalComparison',
'PhanPluginUnknownObjectMethodCall',
'PhanPluginNonBoolInLogicalArith',
'PhanCompatibleNegativeStringOffset', // return false positive
'PhanPluginWhitespaceTab', // Dolibarr used tabs
'PhanPluginCanUsePHP71Void', // Dolibarr is maintaining 7.0 compatibility
'PhanPluginShortArray', // Dolibarr uses array()
'PhanPluginShortArrayList', // Dolibarr uses array()
// Fixers From PHPDocToRealTypesPlugin:
'PhanPluginCanUseParamType', // Fixer - Report/Add types in the function definition (function abc(string $var) (adds string)
'PhanPluginCanUseReturnType', // Fixer - Report/Add return types in the function definition (function abc(string $var) (adds string)
'PhanPluginCanUseNullableParamType', // Fixer - Report/Add nullable parameter types in the function definition
'PhanPluginCanUseNullableReturnType', // Fixer - Report/Add nullable return types in the function definition
// 'PhanPluginNotFullyQualifiedFunctionCall',
'PhanPluginConstantVariableScalar',
// 'PhanPluginNoCommentOnPublicProperty',
'PhanPluginUnknownPropertyType',
// 'PhanPluginUnknownMethodParamType',
// 'PhanPluginNotFullyQualifiedOptimizableFunctionCall',
// 'PhanPluginUnknownMethodReturnType',
'PhanPluginUnknownArrayMethodParamType',
'PhanPluginWhitespaceTab', // Dolibarr uses tabs
// 'PhanPluginWhitespaceTrailing',
// 'PhanPluginCanUsePHP71Void',
'PhanPluginUnknownArrayMethodReturnType',
// 'PhanTypeMismatchArgumentInternal',
'PhanTypeMismatchArgumentNullableInternal',
'PhanPluginNonBoolBranch', // Not essential - 31240+ occurrences
'PhanPluginNumericalComparison', // Not essential - 19870+ occurrences
'PhanTypeMismatchArgument', // Not essential - 12300+ occurrences
'PhanPluginNonBoolInLogicalArith', // Not essential - 11040+ occurrences
'PhanPluginConstantVariableScalar', // Not essential - 5180+ occurrences
'PhanPluginDuplicateAdjacentStatement',
'PhanTypeInvalidLeftOperandOfNumericOp',
'PhanTypeMismatchProperty',
// 'PhanPluginNoCommentOnPublicMethod',
'PhanRedefinedClassReference',
// 'PhanPluginNoCommentOnClass',
// 'PhanPluginNotFullyQualifiedGlobalConstant',
// 'PhanTypeMismatchDefault',
// 'PhanPluginPHPDocHashComment',
'PhanPluginShortArrayList',
'PhanPluginUnknownArrayPropertyType',
'PhanTypeInvalidDimOffset',
// 'PhanPluginNoCommentOnProtectedProperty',
// 'PhanPluginDescriptionlessCommentOnPublicMethod',
// 'PhanPluginUnknownClosureParamType',
// 'PhanPluginUnknownClosureReturnType',
// 'PhanPluginNoCommentOnProtectedMethod',
// 'PhanTypeArraySuspicious',
// 'PhanTypeMismatchPropertyProbablyReal',
// 'PhanPluginNoCommentOnPrivateMethod',
'PhanPluginUnknownArrayFunctionReturnType',
// 'PhanTypeInvalidLeftOperandOfAdd',
// 'PhanPluginNoCommentOnPrivateProperty',
// 'PhanPluginNoCommentOnFunction',
'PhanPluginUnknownArrayFunctionParamType',
// 'PhanPluginDescriptionlessCommentOnPublicProperty',
// 'PhanPluginUnknownFunctionParamType', // Finds certain errors in PHPdoc typing
// 'PhanTypeSuspiciousStringExpression',
// 'PhanPluginRedundantAssignment',
'PhanTypeExpectedObjectPropAccess',
// 'PhanTypeInvalidRightOperandOfNumericOp',
// 'PhanPluginInlineHTML',
// 'PhanPluginInlineHTMLTrailing',
// 'PhanPluginUnknownFunctionReturnType',
// 'PhanPluginDescriptionlessCommentOnProtectedProperty',
'PhanPluginRedundantAssignmentInGlobalScope',
// 'PhanTypeMismatchDeclaredParamNullable',
// 'PhanTypeInvalidRightOperandOfAdd',
// 'PhanPluginDescriptionlessCommentOnPrivateProperty',
// 'PhanUndeclaredVariableDim', // Array initialisation on undeclared var: $abc['x']='ab'
// 'PhanTypeInvalidPropertyName',
'PhanPluginDuplicateCatchStatementBody',
'PhanPluginUndeclaredVariableIsset',
// 'PhanTypeInvalidUnaryOperandIncOrDec',
// 'PhanPluginDescriptionlessCommentOnClass',
'PhanPluginEmptyStatementIf',
// 'PhanUndeclaredStaticMethod',
// 'PhanPluginDescriptionlessCommentOnPrivateMethod',
// 'PhanPluginPrintfIncompatibleArgumentType',
'PhanPossiblyNullTypeMismatchProperty',
'PhanRedefineClass',
'PhanRedefineFunction',
// 'PhanTypeInvalidLeftOperandOfBitwiseOp',
// 'PhanTypeMismatchDimAssignment',
// 'PhanPluginDescriptionlessCommentOnProtectedMethod',
// 'PhanPluginPrintfIncompatibleArgumentTypeWeak',
// 'PhanUndeclaredVariableAssignOp',
// 'PhanTypeExpectedObjectOrClassName',
'PhanEmptyFQSENInClasslike',
// 'PhanTypeMismatchArgumentInternalReal',
// 'PhanUnextractableAnnotationElementName',
// 'PhanCommentParamWithoutRealParam',
// 'PhanRedefinedExtendedClass',
'PhanTypeComparisonFromArray',
'PhanPluginConstantVariableBool',
// 'PhanPluginPrintfVariableFormatString',
'PhanTypeMismatchDimFetch',
'PhanTypeMismatchDimFetchNullable',
'PhanTypeSuspiciousNonTraversableForeach',
'PhanEmptyForeach',
'PhanTypeInvalidRightOperandOfBitwiseOp',
// 'PhanPluginDuplicateConditionalUnnecessary',
// 'PhanTraitParentReference',
'PhanPluginBothLiteralsBinaryOp',
// 'PhanTypeMismatchDeclaredParam',
// 'PhanCommentDuplicateMagicMethod',
// 'PhanParamSpecial1',
// 'PhanPluginInlineHTMLLeading',
// 'PhanPluginUseReturnValueInternalKnown',
// 'PhanRedefinedInheritedInterface',
// 'PhanTypeComparisonToArray',
'PhanTypeConversionFromArray',
// 'PhanTypeInvalidLeftOperandOfIntegerOp',
// 'PhanTypeMismatchArgumentInternalProbablyReal',
// 'PhanTypeMismatchBitwiseBinaryOperands',
'PhanTypeMismatchDimEmpty',
// 'PhanTypeSuspiciousEcho',
// 'PhanNoopBinaryOperator',
// 'PhanTypeInvalidBitwiseBinaryOperator',
// 'PhanPluginDescriptionlessCommentOnFunction',
// 'PhanPluginPHPDocInWrongComment',
'PhanRedefineClassInternal',
// 'PhanTypeInvalidThrowsIsInterface',
// 'PhanPluginRedundantAssignmentInLoop',
// 'PhanInvalidCommentForDeclarationType',
// 'PhanParamSignatureMismatchInternal',
// 'PhanParamSignatureMismatch',
// 'PhanPluginEmptyStatementForeachLoop',
// 'PhanCompatibleDimAlternativeSyntax',
'PhanInvalidFQSENInClasslike',
// 'PhanMismatchVariadicComment',
// 'PhanNoopConstant',
// 'PhanPluginUnknownArrayClosureParamType',
// 'PhanTypeInstantiateAbstractStatic',
'PhanEmptyForeachBody',
// 'PhanPluginEmptyStatementWhileLoop',
// 'PhanSyntaxReturnValueInVoid',
// 'PhanTypeInstantiateTraitStaticOrSelf',
// 'PhanUndeclaredInvokeInCallable',
// 'PhanNoopProperty',
// 'PhanNoopVariable',
// 'PhanPluginPrintfUnusedArgument',
// 'PhanSyntaxReturnExpectedValue',
// 'PhanAccessClassInternal',
// 'PhanCompatibleAccessMethodOnTraitDefinition',
// 'PhanNoopSwitchCases',
// 'PhanNoopTernary',
// 'PhanNoopUnaryOperator',
// 'PhanParamNameIndicatingUnusedInClosure',
// 'PhanParamSignatureRealMismatchTooFewParametersInternal',
// 'PhanPluginEmptyStatementSwitch',
'PhanPossiblyUnsetPropertyOfThis',
// 'PhanTypeInvalidLeftOperand',
// 'PhanTypeInvalidRightOperand',
// 'PhanTypeInvalidRightOperandOfIntegerOp',
'PhanTypeMismatchArgumentReal',
// 'PhanTypeMismatchDeclaredReturnNullable',
// 'PhanUndeclaredThis',
// 'PhanPluginMixedKeyNoKey',
'PhanPluginDuplicateConditionalNullCoalescing', // Suggests to optimize to ??
//'PhanUnreferencedClosure', // False positives seen with closures in arrays, TODO: move closure checks closer to what is done by unused variable plugin
//'PhanPluginNoCommentOnProtectedMethod',
//'PhanPluginDescriptionlessCommentOnProtectedMethod',
//'PhanPluginNoCommentOnPrivateMethod',
//'PhanPluginDescriptionlessCommentOnPrivateMethod',
//'PhanPluginDescriptionlessCommentOnPrivateProperty',
// TODO: Fix edge cases in --automatic-fix for PhanPluginRedundantClosureComment
//'PhanPluginRedundantClosureComment',
// 'PhanPluginPossiblyStaticPublicMethod',
//'PhanPluginPossiblyStaticProtectedMethod',
// The types of ast\Node->children are all possibly unset.
'PhanTypePossiblyInvalidDimOffset', // Also checks optional array keys and requires that they are checked for existence.
'PhanUndeclaredGlobalVariable',
'PhanUndeclaredProperty',
// 'PhanPluginPrintfNotPercent', // Detects fishy stuff with '%' format and suggests %%
'PhanPossiblyUndeclaredGlobalVariable',
// 'PhanPluginPossiblyStaticProtectedMethod',
// 'PhanTypeMismatchReturn',
// 'PhanPluginMoreSpecificActualReturnType',
// 'PhanTypeMismatchReturnProbablyReal',
'PhanPossiblyUndeclaredVariable',
'PhanTypeMismatchArgument',
// 'PhanPluginUnreachableCode',
// 'PhanTypeMismatchArgumentInternal',
// 'PhanPluginAlwaysReturnMethod',
// 'PhanUndeclaredClassMethod',
'PhanUndeclaredMethod',
'PhanTypeMismatchArgumentProbablyReal',
'PhanPluginDuplicateExpressionAssignmentOperation', // Suggestions for optimisation
// 'PhanTypeMismatchPropertyDefault',
// 'PhanPluginAlwaysReturnMethod',
// 'PhanPluginMissingReturnMethod',
// 'PhanUndeclaredTypeReturnType',
// 'PhanUndeclaredClassProperty',
'PhanTypeArraySuspiciousNullable',
// 'PhanPluginInconsistentReturnMethod',
'PhanTypeExpectedObjectPropAccessButGotNull',
// 'PhanUndeclaredClassAttribute',
// 'PhanNonClassMethodCall',
// 'PhanPluginNoAssert',
// 'PhanTypeMismatchReturnSuperType',
// 'PhanTypeMismatchArgumentSuperType',
'PhanPluginDuplicateConditionalTernaryDuplication',
'PhanPluginDuplicateConditionalTernaryDuplication', // 2750+ occurrences
'PhanPluginDuplicateConditionalNullCoalescing', // Not essential - 990+ occurrences
'PhanPluginRedundantAssignmentInGlobalScope', // Not essential, a lot of false warning
'PhanPluginDuplicateCatchStatementBody', // Requires PHP7.1 - 50+ occurrences
],
// You can put relative paths to internal stubs in this config option.
// Phan will continue using its detailed type annotations,

File diff suppressed because it is too large Load diff

View file

@ -45,7 +45,7 @@ class ExtraFields
public $db;
/**
* @var array<string,array{label:array<string,string>,type:array<string,string>,size:array<string,string>,default:array<string,string>,computed:array<string,string>,unique:array<string,int>,required:array<string,int>,param:array<string,mixed>,perms:array<string,mixed[]>,list:array<string,int|string>,pos:array<string,int>,totalizable:array<string,int>,help:array<string,string>,printable:array<string,int>,enabled:array<string,int>,langfile:array<string,string>,css:array<string,string>,csslist:array<string,string>,hidden:array<string,int>,mandatoryfieldsofotherentities:array<string,string>}> New array to store extrafields definition
* @var array<string,array{label:array<string,string>,type:array<string,string>,size:array<string,string>,default:array<string,string>,computed:array<string,string>,unique:array<string,int>,required:array<string,int>,param:array<string,mixed>,perms:array<string,mixed[]>,list:array<string,int|string>,pos:array<string,int>,totalizable:array<string,int>,help:array<string,string>,printable:array<string,int>,enabled:array<string,int>,langfile:array<string,string>,css:array<string,string>,csslist:array<string,string>,hidden:array<string,int>,mandatoryfieldsofotherentities:array<string,string>,loaded?:int,count:int}> New array to store extrafields definition Note: count set as present to avoid static analysis notices
*/
public $attributes;
@ -830,7 +830,7 @@ class ExtraFields
*
* @param string $elementtype Type of element ('all' = all or $object->table_element like 'adherent', 'commande', 'thirdparty', 'facture', 'propal', 'product', ...).
* @param boolean $forceload Force load of extra fields whatever is status of cache.
* @return array Array of attributes keys+label for all extra fields.
* @return array{}|array{label:array<string,string>,type:array<string,string>,size:array<string,string>,default:array<string,string>,computed:array<string,string>,unique:array<string,int>,required:array<string,int>,param:array<string,mixed>,perms:array<string,mixed[]>,list:array<string,int>|array<string,string>,pos:array<string,int>,totalizable:array<string,int>,help:array<string,string>,printable:array<string,int>,enabled:array<string,int>,langfile:array<string,string>,css:array<string,string>,csslist:array<string,string>,hidden:array<string,int>,mandatoryfieldsofotherentities?:array<string,string>,loaded?:int,count:int} Array of attributes keys+label for all extra fields. Note: count set as present to avoid static analysis notices
*/
public function fetch_name_optionals_label($elementtype, $forceload = false)
{
@ -884,6 +884,7 @@ class ExtraFields
$array_name_label[$tab->name] = $tab->label;
}
$this->attributes[$tab->elementtype]['type'][$tab->name] = $tab->type;
$this->attributes[$tab->elementtype]['label'][$tab->name] = $tab->label;
$this->attributes[$tab->elementtype]['size'][$tab->name] = $tab->size;

View file

@ -22,7 +22,7 @@ require_once DOL_DOCUMENT_ROOT.'/supplier_proposal/class/supplier_proposal.class
/**
* API class for orders
* API class for supplier proposal
*
* @access protected
* @class DolibarrApiAccess {@requires user,external}