From 7a0f35165ece83fd75d6036e9806313f446a3240 Mon Sep 17 00:00:00 2001
From: David Beniamine <david.beniamine@tetras-libre.fr>
Date: Tue, 12 Sep 2023 12:00:57 +0200
Subject: [PATCH] Dolibarr phpcs rules

---
 phpcs.xml | 435 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 435 insertions(+)
 create mode 100644 phpcs.xml

diff --git a/phpcs.xml b/phpcs.xml
new file mode 100644
index 0000000..e78438d
--- /dev/null
+++ b/phpcs.xml
@@ -0,0 +1,435 @@
+<?xml version="1.0"?>
+<!DOCTYPE ruleset SYSTEM "ruleset.dtd">
+<ruleset name="Dolibarr">
+	<description>Dolibarr coding standard.</description>
+	<arg name="tab-width" value="4"/>
+
+	<exclude-pattern type="relative">build/html</exclude-pattern>
+	<exclude-pattern type="relative">build/aps</exclude-pattern>
+	<exclude-pattern type="relative">dev/tools/test/namespacemig</exclude-pattern>
+	<!-- <exclude-pattern type="relative">dev/initdata/dbf/includes</exclude-pattern> -->
+	<exclude-pattern type="relative">documents</exclude-pattern>
+	<exclude-pattern type="relative">htdocs/core/class/lessc.class.php</exclude-pattern>
+	<exclude-pattern type="relative">htdocs/custom</exclude-pattern>
+	<exclude-pattern type="relative">htdocs/includes</exclude-pattern>
+	<exclude-pattern type="relative">htdocs/install/doctemplates/websites</exclude-pattern>
+	<exclude-pattern type="relative">htdocs/conf.php</exclude-pattern>
+	<exclude-pattern type="relative">*/nltechno*</exclude-pattern>
+	<exclude-pattern type="relative">*/htdocs/includes</exclude-pattern>
+	<exclude-pattern type="relative">source</exclude-pattern>
+	<exclude-pattern type="relative">.git</exclude-pattern>
+
+	<!-- List of all tests -->
+
+
+	<!-- Rules from Internal Standard -->
+
+	<rule ref="Internal.NoCodeFound" />
+
+
+	<!-- Rules from Generic Standard -->
+
+	<!-- We want to allow empty statement: It allows to put some code comments into the else for examples -->
+	<rule ref="Generic.CodeAnalysis.EmptyStatement">
+        <exclude name="Generic.CodeAnalysis.EmptyStatement.DetectedIf"/>
+        <exclude name="Generic.CodeAnalysis.EmptyStatement.DetectedElse"/>
+        <exclude name="Generic.CodeAnalysis.EmptyStatement.DetectedElseif"/>
+        <exclude name="Generic.CodeAnalysis.EmptyStatement.DetectedCatch"/>
+        <exclude name="Generic.CodeAnalysis.EmptyStatement.DetectedForeach"/>
+    </rule>
+
+    <rule ref="Generic.CodeAnalysis.ForLoopShouldBeWhileLoop" />
+    <rule ref="Generic.CodeAnalysis.ForLoopWithTestFunctionCall" />
+
+    <rule ref="Generic.CodeAnalysis.JumbledIncrementer" />
+
+    <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement" />
+
+    <rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier" />
+
+    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter" />
+    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter.Found">
+		<severity>0</severity>
+    </rule>
+    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed">
+		<severity>0</severity>
+    </rule>
+    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed">
+		<severity>0</severity>
+    </rule>
+    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass">
+		<severity>0</severity>
+    </rule>
+    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassAfterLastUsed">
+		<severity>0</severity>
+    </rule>
+    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed">
+		<severity>0</severity>
+    </rule>
+
+
+    <!-- Warnings on TODO -->
+    <!-- Disabled: We want to keep TODO as normal
+    <rule ref="Generic.Commenting.Todo" />
+    -->
+
+
+    <!-- PHP code MUST use only UTF-8 without BOM. -->
+    <rule ref="Generic.Files.ByteOrderMark"/>
+
+	<!-- Lines can be 85 chars long, but never show errors -->
+	<rule ref="Generic.Files.LineLength">
+		<properties>
+			<property name="lineLimit" value="500" />
+			<property name="absoluteLineLimit" value="0" />
+		</properties>
+	</rule>
+
+	<!-- Use Unix newlines -->
+	<rule ref="Generic.Files.LineEndings">
+		<properties>
+			<property name="eolChar" value="\n" />
+		</properties>
+	</rule>
+
+
+    <!-- Disallow several statements on same line -->
+
+	<!-- Warning if action on same line than if -->
+	<!-- Disabled: We want to allow this for better code compacity and readability
+		<rule ref="Generic.ControlStructures.InlineControlStructure">
+		<properties>
+			<property name="error" value="false"/>
+		</properties>
+		</rule>
+	-->
+	<!--  We want to allow 'if () { ...small code... }' on same line for better code compacity and readability -->
+	<!-- <rule ref="Generic.Formatting.DisallowMultipleStatements">
+		<severity>0</severity>
+	</rule> -->
+
+
+	<!-- Check assignement have the = align on each line. Have 20 chars padding maximum and always show as errors -->
+	<!--  Disabled: Report some false warning
+		<rule ref="Generic.Formatting.MultipleStatementAlignment">
+		<properties>
+		<property name="maxPadding" value="20"/>
+		<property name="ignoreMultiLine" value="true"/>
+		</properties>
+		</rule>
+	-->
+
+	<rule ref="Generic.Formatting.SpaceAfterCast" />
+
+    <rule ref="Generic.Functions.CallTimePassByReference" />
+
+	<rule ref="Generic.Functions.FunctionCallArgumentSpacing" />
+
+    <!-- Disallow several spaces after comma -->
+	<!-- We want to allow this because we want to be able to align params on several similare functions on different lines -->
+	<rule ref="Generic.Functions.FunctionCallArgumentSpacing.TooMuchSpaceAfterComma">
+		<severity>0</severity>
+	</rule>
+
+    <!-- Tweaks to metrics -->
+    <rule ref="Generic.Metrics.CyclomaticComplexity">
+        <properties>
+            <property name="complexity" value="250" />
+            <property name="absoluteComplexity" value="300" />
+        </properties>
+    </rule>
+    <rule ref="Generic.Metrics.NestingLevel">
+        <properties>
+            <property name="nestingLevel" value="12" />
+            <property name="absoluteNestingLevel" value="50" />
+        </properties>
+    </rule>
+
+	<rule ref="Generic.NamingConventions.ConstructorName" />
+	<!-- Check if we use PHP4 constructor instead of __construct() -->
+	<rule ref="Generic.NamingConventions.ConstructorName.OldStyle" />
+
+	<rule ref="Generic.NamingConventions.UpperCaseConstantName" />
+
+    <rule ref="Generic.PHP.DeprecatedFunctions" />
+    <rule ref="Generic.PHP.DeprecatedFunctions.Deprecated">
+        <severity>0</severity>
+    </rule>
+
+	<rule ref="Generic.PHP.DisallowShortOpenTag" />
+
+    <rule ref="Generic.PHP.ForbiddenFunctions" />
+
+    <!-- Warning when using @ before functions -->
+    <!-- We want this. Some features need this -->
+    <rule ref="Generic.PHP.NoSilencedErrors">
+        <severity>0</severity>
+    </rule>
+
+	<!-- Say if null, true, false must be uppercase (Rule 2.5 of PSR2 https://www.php-fig.org/psr/psr-2/) -->
+	<rule ref="Generic.PHP.LowerCaseConstant" />
+
+	<rule ref="Generic.Strings.UnnecessaryStringConcat" />
+
+	<rule ref="Generic.Strings.UnnecessaryStringConcat.Found">
+	</rule>
+
+	<!-- Disallow usage of space -->
+	<rule ref="Generic.WhiteSpace.DisallowSpaceIndent" />
+
+	<!-- Check indent are done with spaces and with correct number -->
+	<!-- Disabled as this does not support tab -->
+	<!-- <rule ref="Generic.WhiteSpace.ScopeIndent" /> -->
+
+	<rule ref="Generic.WhiteSpace.ScopeIndent">
+	  <properties>
+	    <property name="indent" value="4"/>
+	    <property name="tabIndent" value="true"/>
+	  </properties>
+	</rule>
+
+    <!-- Check for duplicate class names -->
+    <!-- Disabled: We need this for dependency injection.
+    <rule ref="Generic.Classes.DuplicateClassName" />
+    -->
+
+
+ 	<!-- Rules from Squiz Standard -->
+
+    <rule ref="Squiz.WhiteSpace.ScopeClosingBrace.Indent" />
+
+    <!-- There MUST NOT be trailing whitespace at the end of non-blank lines. -->
+    <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace">
+        <properties>
+            <property name="ignoreBlankLines" value="false"/>
+        </properties>
+    </rule>
+    <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.StartFile" />
+    <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.EndFile" />
+    <!-- Disabled: We want to have 2 empty line as separator sometimes -->
+    <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.EmptyLines" >
+        <severity>0</severity>
+    </rule>
+
+    <rule ref="Squiz.WhiteSpace.ControlStructureSpacing.SpacingAfterOpen" />
+    <rule ref="Squiz.WhiteSpace.ControlStructureSpacing.SpacingBeforeClose" />
+
+    <rule ref="Squiz.ControlStructures.ControlSignature.SpaceAfterCloseParenthesis" />
+    <rule ref="Squiz.ControlStructures.ControlSignature.SpaceAfterCloseBrace" />
+    <rule ref="Squiz.ControlStructures.ControlSignature.SpaceAfterKeyword" />
+
+    <rule ref="Squiz.ControlStructures.ForEachLoopDeclaration.SpaceAfterOpen" />
+    <rule ref="Squiz.ControlStructures.ForEachLoopDeclaration.SpaceBeforeClose" />
+
+    <rule ref="Squiz.Functions.MultiLineFunctionDeclaration" />
+	<rule ref="Squiz.Functions.MultiLineFunctionDeclaration.SpaceAfterFunction">
+	</rule>
+    <rule ref="Squiz.Functions.FunctionDeclarationArgumentSpacing">
+        <properties>
+            <property name="equalsSpacing" value="1"/>
+        </properties>
+    </rule>
+    <rule ref="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingAfterHint">
+        <severity>0</severity>
+    </rule>
+    <rule ref="Squiz.Scope.MethodScope.Missing" />
+
+
+    <!-- Rules from PEAR Standard -->
+
+    <rule ref="PEAR.Classes.ClassDeclaration" />
+
+    <rule ref="PEAR.Commenting.ClassComment" />
+
+    <rule ref="PEAR.Commenting.ClassComment.Missing" />
+
+    <rule ref="PEAR.Commenting.ClassComment.MissingTag" />
+
+    <rule ref="PEAR.Commenting.ClassComment.MissingAuthorTag">
+        <severity>0</severity>
+    </rule>
+
+    <rule ref="PEAR.Commenting.ClassComment.MissingCategoryTag">
+        <severity>0</severity>
+    </rule>
+    <rule ref="PEAR.Commenting.ClassComment.MissingLicenseTag">
+        <severity>0</severity>
+    </rule>
+    <rule ref="PEAR.Commenting.ClassComment.MissingLinkTag">
+        <severity>0</severity>
+    </rule>
+    <rule ref="PEAR.Commenting.ClassComment.MissingPackageTag">
+        <severity>0</severity>
+    </rule>
+
+    <rule ref="PEAR.Commenting.FunctionComment" />
+
+    <rule ref="PEAR.Commenting.FunctionComment.Empty" />
+
+    <rule ref="PEAR.Commenting.FunctionComment.SpacingAfterParamType" />
+
+    <rule ref="PEAR.Commenting.FunctionComment.SpacingAfterParamName">
+        <severity>0</severity>
+    </rule>
+    <rule ref="PEAR.Commenting.FunctionComment.SpacingAfterParamType">
+        <severity>0</severity>
+    </rule>
+
+    <rule ref="PEAR.Commenting.FunctionComment.ReturnNotRequired" />
+
+    <rule ref="PEAR.Commenting.FunctionComment.WrongStyle" />
+
+    <rule ref="PEAR.Commenting.FunctionComment.SpacingBeforeParamType">
+        <severity>0</severity>
+    </rule>
+    <rule ref="PEAR.Commenting.FunctionComment.SpacingAfterLongType">
+        <severity>0</severity>
+    </rule>
+    <rule ref="PEAR.Commenting.FunctionComment.SpacingAfterLongName">
+        <severity>0</severity>
+    </rule>
+    <rule ref="PEAR.Commenting.FunctionComment.SpacingAfterParams">
+        <severity>0</severity>
+    </rule>
+    <rule ref="PEAR.Commenting.FunctionComment.ParameterCommentsNotAligned">
+        <severity>0</severity>
+    </rule>
+    <rule ref="PEAR.Commenting.FunctionComment.ParameterNamesNotAligned">
+        <severity>0</severity>
+    </rule>
+
+    <rule ref="PEAR.Commenting.InlineComment" />
+
+	<!-- Check position of { after a control structure like if (), while (), etc... -->
+	<!--
+	<rule ref="PEAR.ControlStructures.ControlSignature" />
+	-->
+
+	<!-- <rule ref="PEAR.ControlStructures.MultiLineCondition" /> -->
+
+	<!-- Test if () are removed for includes -->
+	<rule ref="PEAR.Files.IncludingFile" />
+
+	<!-- We disable this: We must be able to make require inside if -->
+    <rule ref="PEAR.Files.IncludingFile.UseInclude">
+        <severity>0</severity>
+    </rule>
+
+    <!-- We disable this. We must be allowed to use strict require instead of non strict include anywhere -->
+    <rule ref="PEAR.Files.IncludingFile.UseIncludeOnce">
+        <severity>0</severity>
+    </rule>
+
+    <rule ref="PEAR.Files.IncludingFile.UseRequire">
+     	<severity>0</severity>
+    </rule>
+
+    <!-- We disable this: We want to allow include_once -->
+    <rule ref="PEAR.Files.IncludingFile.UseRequireOnce">
+        <severity>0</severity>
+    </rule>
+
+	<rule ref="PEAR.Formatting.MultiLineAssignment" />
+
+	<rule ref="PEAR.Functions.FunctionCallSignature" />
+
+    <!-- We disable this: It returns a lot of false positive -->
+    <rule ref="PEAR.Functions.FunctionCallSignature.CloseBracketLine">
+        <severity>0</severity>
+    </rule>
+
+    <!-- We disable this: We want to allow small function on 1 line -->
+    <rule ref="PEAR.Functions.FunctionCallSignature.ContentAfterOpenBracket">
+        <severity>0</severity>
+    </rule>
+
+	<rule ref="PEAR.Functions.FunctionCallSignature.EmptyLine" />
+
+	<!-- We disable this: Too many false positive -->
+	<rule ref="PEAR.Functions.FunctionCallSignature.Indent">
+		<severity>0</severity>
+	</rule>
+
+    <rule ref="PEAR.Functions.FunctionCallSignature.SpaceBeforeOpenBracket" />
+    <rule ref="PEAR.Functions.FunctionCallSignature.SpaceAfterCloseBracket" />
+
+	<rule ref="PEAR.Functions.ValidDefaultValue" />
+
+	<rule ref="PEAR.NamingConventions.ValidClassName" />
+	<rule ref="PEAR.NamingConventions.ValidClassName.Invalid">
+        <severity>0</severity>
+	</rule>
+
+	<!-- We disable this: there is a lot of existing method not starting with a capital letter (class modXxxx, ...) -->
+	<rule ref="PEAR.NamingConventions.ValidClassName.StartWithCapital">
+		<severity>0</severity>
+	</rule>
+	<!-- some phpcs have a typo error in rule, so we add it this rule too with term "Captial" instead of "Capital" -->
+	<rule ref="PEAR.NamingConventions.ValidClassName.StartWithCaptial">
+        <severity>0</severity>
+	</rule>
+
+	<rule ref="PEAR.NamingConventions.ValidFunctionName" />
+	<rule ref="PEAR.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore" />
+
+	<!-- We disable this: there is a lot of existing function not starting with a capital letter (class modXxxx, ...) -->
+	<rule ref="PEAR.NamingConventions.ValidFunctionName.FunctionNameInvalid">
+        <severity>0</severity>
+	</rule>
+	<rule ref="PEAR.NamingConventions.ValidFunctionName.FunctionNoCapital">
+        <severity>0</severity>
+	</rule>
+	<!-- some phpcs have a typo error in rule, so we add it this rule too with term "Captial" instead of "Capital" -->
+	<rule ref="PEAR.NamingConventions.ValidFunctionName.FunctionNoCaptial">
+        <severity>0</severity>
+	</rule>
+
+    <!--<rule ref="PEAR.NamingConventions.ValidFunctionName.NotCamelCaps">
+        <severity>0</severity>
+    </rule>-->
+	<!--<rule ref="PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps">
+        <severity>0</severity>
+	</rule>-->
+
+	<!-- We disable this: We don't want to have private methods prefixed with an underscore -->
+	<rule ref="PEAR.NamingConventions.ValidFunctionName.PrivateNoUnderscore">
+        <severity>0</severity>
+	</rule>
+
+	<rule ref="PEAR.NamingConventions.ValidVariableName" />
+
+	<!-- This is not in PSR2 -->
+	<!-- We disable this: We don't want to have private methods prefixed with an underscore -->
+	<rule ref="PEAR.NamingConventions.ValidVariableName.PrivateNoUnderscore">
+        <severity>0</severity>
+    </rule>
+
+	<rule ref="PEAR.WhiteSpace.ObjectOperatorIndent" />
+
+	<!-- Need to be commented to be disabled
+	<rule ref="PEAR.WhiteSpace.ScopeClosingBrace">
+        <severity>0</severity>
+    </rule>
+    <rule ref="PEAR.WhiteSpace.ScopeClosingBrace.Line">
+        <severity>0</severity>
+    </rule>
+	-->
+
+    <!-- Already found as a Generic rule -->
+	<!-- <rule ref="PEAR.WhiteSpace.ScopeIndent" /> -->
+
+
+	<!--  Rules PSR 2 -->
+    <rule ref="PSR2.Classes.ClassDeclaration" />
+    <rule ref="PSR2.Methods.FunctionClosingBrace" />
+    <rule ref="PSR2.ControlStructures.ElseIfDeclaration.NotAllowed" />
+    <rule ref="PSR2.Classes.ClassDeclaration" />
+    <rule ref="PSR2.Methods.FunctionClosingBrace" />
+    <rule ref="PSR2.Files.EndFileNewline.TooMany" />
+	<rule ref="PSR2.Files.EndFileNewline.NoneFound" />
+	<rule ref="PSR2.Methods.FunctionCallSignature.SpaceBeforeOpenBracket" />
+	<rule ref="PSR2.Classes.PropertyDeclaration.VarUsed" />
+    <!-- The closing ?> tag MUST be omitted from files containing only PHP. -->
+    <rule ref="PSR2.Files.ClosingTag"/>
+
+</ruleset>
-- 
GitLab