Commit d653b27fef7fd3ed9aacc6309a977edf58044efb

Authored by Thibaud Ajas
1 parent a3751795

Correction de fautes de français, correction de bugs, màj de la base de données,…

… les noms des maériels sont maintenant en rouge dans la liste lorsque la date de garantie est dépassée et la date elle même est rouge dans la fiche détaillées du matériel
Showing 50 changed files with 2115 additions and 343 deletions   Show diff stats
composer.json
... ... @@ -15,7 +15,7 @@
15 15 "require-dev": {
16 16 "psy/psysh": "@stable",
17 17 "cakephp/bake": "~1.1",
18   - "phpunit/phpunit": "^4.8"
  18 + "phpunit/phpunit": "^5.7"
19 19 },
20 20 "suggest": {
21 21 "phpunit/phpunit": "Allows automated tests to be run without system-wide install.",
... ...
composer.lock
... ... @@ -4,8 +4,8 @@
4 4 "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5 5 "This file is @generated automatically"
6 6 ],
7   - "hash": "f3c40c441166c950fe8099531a9d5970",
8   - "content-hash": "5701970d465c36d8bd0d3846ff00efec",
  7 + "hash": "89645e7a585f3dc620817a0408eb0ede",
  8 + "content-hash": "ab13ce1b88067ed3a8ee3bb1578dac09",
9 9 "packages": [
10 10 {
11 11 "name": "aura/installer-default",
... ... @@ -825,16 +825,16 @@
825 825 },
826 826 {
827 827 "name": "symfony/yaml",
828   - "version": "v3.2.7",
  828 + "version": "v3.2.8",
829 829 "source": {
830 830 "type": "git",
831 831 "url": "https://github.com/symfony/yaml.git",
832   - "reference": "62b4cdb99d52cb1ff253c465eb1532a80cebb621"
  832 + "reference": "acec26fcf7f3031e094e910b94b002fa53d4e4d6"
833 833 },
834 834 "dist": {
835 835 "type": "zip",
836   - "url": "https://api.github.com/repos/symfony/yaml/zipball/62b4cdb99d52cb1ff253c465eb1532a80cebb621",
837   - "reference": "62b4cdb99d52cb1ff253c465eb1532a80cebb621",
  836 + "url": "https://api.github.com/repos/symfony/yaml/zipball/acec26fcf7f3031e094e910b94b002fa53d4e4d6",
  837 + "reference": "acec26fcf7f3031e094e910b94b002fa53d4e4d6",
838 838 "shasum": ""
839 839 },
840 840 "require": {
... ... @@ -876,7 +876,7 @@
876 876 ],
877 877 "description": "Symfony Yaml Component",
878 878 "homepage": "https://symfony.com",
879   - "time": "2017-03-20 09:45:15"
  879 + "time": "2017-05-01 14:55:58"
880 880 }
881 881 ],
882 882 "packages-dev": [
... ... @@ -1101,6 +1101,48 @@
1101 1101 "time": "2015-04-20 18:58:01"
1102 1102 },
1103 1103 {
  1104 + "name": "myclabs/deep-copy",
  1105 + "version": "1.6.1",
  1106 + "source": {
  1107 + "type": "git",
  1108 + "url": "https://github.com/myclabs/DeepCopy.git",
  1109 + "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102"
  1110 + },
  1111 + "dist": {
  1112 + "type": "zip",
  1113 + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102",
  1114 + "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102",
  1115 + "shasum": ""
  1116 + },
  1117 + "require": {
  1118 + "php": ">=5.4.0"
  1119 + },
  1120 + "require-dev": {
  1121 + "doctrine/collections": "1.*",
  1122 + "phpunit/phpunit": "~4.1"
  1123 + },
  1124 + "type": "library",
  1125 + "autoload": {
  1126 + "psr-4": {
  1127 + "DeepCopy\\": "src/DeepCopy/"
  1128 + }
  1129 + },
  1130 + "notification-url": "https://packagist.org/downloads/",
  1131 + "license": [
  1132 + "MIT"
  1133 + ],
  1134 + "description": "Create deep copies (clones) of your objects",
  1135 + "homepage": "https://github.com/myclabs/DeepCopy",
  1136 + "keywords": [
  1137 + "clone",
  1138 + "copy",
  1139 + "duplicate",
  1140 + "object",
  1141 + "object graph"
  1142 + ],
  1143 + "time": "2017-04-12 18:52:22"
  1144 + },
  1145 + {
1104 1146 "name": "nikic/php-parser",
1105 1147 "version": "v2.1.0",
1106 1148 "source": {
... ... @@ -1362,39 +1404,40 @@
1362 1404 },
1363 1405 {
1364 1406 "name": "phpunit/php-code-coverage",
1365   - "version": "2.2.4",
  1407 + "version": "4.0.8",
1366 1408 "source": {
1367 1409 "type": "git",
1368 1410 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
1369   - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
  1411 + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
1370 1412 },
1371 1413 "dist": {
1372 1414 "type": "zip",
1373   - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
1374   - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
  1415 + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
  1416 + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
1375 1417 "shasum": ""
1376 1418 },
1377 1419 "require": {
1378   - "php": ">=5.3.3",
1379   - "phpunit/php-file-iterator": "~1.3",
1380   - "phpunit/php-text-template": "~1.2",
1381   - "phpunit/php-token-stream": "~1.3",
1382   - "sebastian/environment": "^1.3.2",
1383   - "sebastian/version": "~1.0"
  1420 + "ext-dom": "*",
  1421 + "ext-xmlwriter": "*",
  1422 + "php": "^5.6 || ^7.0",
  1423 + "phpunit/php-file-iterator": "^1.3",
  1424 + "phpunit/php-text-template": "^1.2",
  1425 + "phpunit/php-token-stream": "^1.4.2 || ^2.0",
  1426 + "sebastian/code-unit-reverse-lookup": "^1.0",
  1427 + "sebastian/environment": "^1.3.2 || ^2.0",
  1428 + "sebastian/version": "^1.0 || ^2.0"
1384 1429 },
1385 1430 "require-dev": {
1386   - "ext-xdebug": ">=2.1.4",
1387   - "phpunit/phpunit": "~4"
  1431 + "ext-xdebug": "^2.1.4",
  1432 + "phpunit/phpunit": "^5.7"
1388 1433 },
1389 1434 "suggest": {
1390   - "ext-dom": "*",
1391   - "ext-xdebug": ">=2.2.1",
1392   - "ext-xmlwriter": "*"
  1435 + "ext-xdebug": "^2.5.1"
1393 1436 },
1394 1437 "type": "library",
1395 1438 "extra": {
1396 1439 "branch-alias": {
1397   - "dev-master": "2.2.x-dev"
  1440 + "dev-master": "4.0.x-dev"
1398 1441 }
1399 1442 },
1400 1443 "autoload": {
... ... @@ -1420,7 +1463,7 @@
1420 1463 "testing",
1421 1464 "xunit"
1422 1465 ],
1423   - "time": "2015-10-06 15:47:00"
  1466 + "time": "2017-04-02 07:44:40"
1424 1467 },
1425 1468 {
1426 1469 "name": "phpunit/php-file-iterator",
... ... @@ -1610,40 +1653,50 @@
1610 1653 },
1611 1654 {
1612 1655 "name": "phpunit/phpunit",
1613   - "version": "4.8.35",
  1656 + "version": "5.7.19",
1614 1657 "source": {
1615 1658 "type": "git",
1616 1659 "url": "https://github.com/sebastianbergmann/phpunit.git",
1617   - "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87"
  1660 + "reference": "69c4f49ff376af2692bad9cebd883d17ebaa98a1"
1618 1661 },
1619 1662 "dist": {
1620 1663 "type": "zip",
1621   - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/791b1a67c25af50e230f841ee7a9c6eba507dc87",
1622   - "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87",
  1664 + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/69c4f49ff376af2692bad9cebd883d17ebaa98a1",
  1665 + "reference": "69c4f49ff376af2692bad9cebd883d17ebaa98a1",
1623 1666 "shasum": ""
1624 1667 },
1625 1668 "require": {
1626 1669 "ext-dom": "*",
1627 1670 "ext-json": "*",
1628   - "ext-pcre": "*",
1629   - "ext-reflection": "*",
1630   - "ext-spl": "*",
1631   - "php": ">=5.3.3",
1632   - "phpspec/prophecy": "^1.3.1",
1633   - "phpunit/php-code-coverage": "~2.1",
  1671 + "ext-libxml": "*",
  1672 + "ext-mbstring": "*",
  1673 + "ext-xml": "*",
  1674 + "myclabs/deep-copy": "~1.3",
  1675 + "php": "^5.6 || ^7.0",
  1676 + "phpspec/prophecy": "^1.6.2",
  1677 + "phpunit/php-code-coverage": "^4.0.4",
1634 1678 "phpunit/php-file-iterator": "~1.4",
1635 1679 "phpunit/php-text-template": "~1.2",
1636 1680 "phpunit/php-timer": "^1.0.6",
1637   - "phpunit/phpunit-mock-objects": "~2.3",
1638   - "sebastian/comparator": "~1.2.2",
  1681 + "phpunit/phpunit-mock-objects": "^3.2",
  1682 + "sebastian/comparator": "^1.2.4",
1639 1683 "sebastian/diff": "~1.2",
1640   - "sebastian/environment": "~1.3",
1641   - "sebastian/exporter": "~1.2",
1642   - "sebastian/global-state": "~1.0",
1643   - "sebastian/version": "~1.0",
  1684 + "sebastian/environment": "^1.3.4 || ^2.0",
  1685 + "sebastian/exporter": "~2.0",
  1686 + "sebastian/global-state": "^1.1",
  1687 + "sebastian/object-enumerator": "~2.0",
  1688 + "sebastian/resource-operations": "~1.0",
  1689 + "sebastian/version": "~1.0.3|~2.0",
1644 1690 "symfony/yaml": "~2.1|~3.0"
1645 1691 },
  1692 + "conflict": {
  1693 + "phpdocumentor/reflection-docblock": "3.0.2"
  1694 + },
  1695 + "require-dev": {
  1696 + "ext-pdo": "*"
  1697 + },
1646 1698 "suggest": {
  1699 + "ext-xdebug": "*",
1647 1700 "phpunit/php-invoker": "~1.1"
1648 1701 },
1649 1702 "bin": [
... ... @@ -1652,7 +1705,7 @@
1652 1705 "type": "library",
1653 1706 "extra": {
1654 1707 "branch-alias": {
1655   - "dev-master": "4.8.x-dev"
  1708 + "dev-master": "5.7.x-dev"
1656 1709 }
1657 1710 },
1658 1711 "autoload": {
... ... @@ -1678,30 +1731,33 @@
1678 1731 "testing",
1679 1732 "xunit"
1680 1733 ],
1681   - "time": "2017-02-06 05:18:07"
  1734 + "time": "2017-04-03 02:22:27"
1682 1735 },
1683 1736 {
1684 1737 "name": "phpunit/phpunit-mock-objects",
1685   - "version": "2.3.8",
  1738 + "version": "3.4.3",
1686 1739 "source": {
1687 1740 "type": "git",
1688 1741 "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
1689   - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
  1742 + "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24"
1690 1743 },
1691 1744 "dist": {
1692 1745 "type": "zip",
1693   - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
1694   - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
  1746 + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24",
  1747 + "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24",
1695 1748 "shasum": ""
1696 1749 },
1697 1750 "require": {
1698 1751 "doctrine/instantiator": "^1.0.2",
1699   - "php": ">=5.3.3",
1700   - "phpunit/php-text-template": "~1.2",
1701   - "sebastian/exporter": "~1.2"
  1752 + "php": "^5.6 || ^7.0",
  1753 + "phpunit/php-text-template": "^1.2",
  1754 + "sebastian/exporter": "^1.2 || ^2.0"
  1755 + },
  1756 + "conflict": {
  1757 + "phpunit/phpunit": "<5.4.0"
1702 1758 },
1703 1759 "require-dev": {
1704   - "phpunit/phpunit": "~4.4"
  1760 + "phpunit/phpunit": "^5.4"
1705 1761 },
1706 1762 "suggest": {
1707 1763 "ext-soap": "*"
... ... @@ -1709,7 +1765,7 @@
1709 1765 "type": "library",
1710 1766 "extra": {
1711 1767 "branch-alias": {
1712   - "dev-master": "2.3.x-dev"
  1768 + "dev-master": "3.2.x-dev"
1713 1769 }
1714 1770 },
1715 1771 "autoload": {
... ... @@ -1734,7 +1790,7 @@
1734 1790 "mock",
1735 1791 "xunit"
1736 1792 ],
1737   - "time": "2015-10-02 06:51:40"
  1793 + "time": "2016-12-08 20:27:08"
1738 1794 },
1739 1795 {
1740 1796 "name": "psy/psysh",
... ... @@ -1809,6 +1865,51 @@
1809 1865 "time": "2016-03-09 05:03:14"
1810 1866 },
1811 1867 {
  1868 + "name": "sebastian/code-unit-reverse-lookup",
  1869 + "version": "1.0.1",
  1870 + "source": {
  1871 + "type": "git",
  1872 + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
  1873 + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
  1874 + },
  1875 + "dist": {
  1876 + "type": "zip",
  1877 + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
  1878 + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
  1879 + "shasum": ""
  1880 + },
  1881 + "require": {
  1882 + "php": "^5.6 || ^7.0"
  1883 + },
  1884 + "require-dev": {
  1885 + "phpunit/phpunit": "^5.7 || ^6.0"
  1886 + },
  1887 + "type": "library",
  1888 + "extra": {
  1889 + "branch-alias": {
  1890 + "dev-master": "1.0.x-dev"
  1891 + }
  1892 + },
  1893 + "autoload": {
  1894 + "classmap": [
  1895 + "src/"
  1896 + ]
  1897 + },
  1898 + "notification-url": "https://packagist.org/downloads/",
  1899 + "license": [
  1900 + "BSD-3-Clause"
  1901 + ],
  1902 + "authors": [
  1903 + {
  1904 + "name": "Sebastian Bergmann",
  1905 + "email": "sebastian@phpunit.de"
  1906 + }
  1907 + ],
  1908 + "description": "Looks up which function or method a line of code belongs to",
  1909 + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
  1910 + "time": "2017-03-04 06:30:41"
  1911 + },
  1912 + {
1812 1913 "name": "sebastian/comparator",
1813 1914 "version": "1.2.4",
1814 1915 "source": {
... ... @@ -1926,28 +2027,28 @@
1926 2027 },
1927 2028 {
1928 2029 "name": "sebastian/environment",
1929   - "version": "1.3.8",
  2030 + "version": "2.0.0",
1930 2031 "source": {
1931 2032 "type": "git",
1932 2033 "url": "https://github.com/sebastianbergmann/environment.git",
1933   - "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea"
  2034 + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
1934 2035 },
1935 2036 "dist": {
1936 2037 "type": "zip",
1937   - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea",
1938   - "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea",
  2038 + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
  2039 + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
1939 2040 "shasum": ""
1940 2041 },
1941 2042 "require": {
1942   - "php": "^5.3.3 || ^7.0"
  2043 + "php": "^5.6 || ^7.0"
1943 2044 },
1944 2045 "require-dev": {
1945   - "phpunit/phpunit": "^4.8 || ^5.0"
  2046 + "phpunit/phpunit": "^5.0"
1946 2047 },
1947 2048 "type": "library",
1948 2049 "extra": {
1949 2050 "branch-alias": {
1950   - "dev-master": "1.3.x-dev"
  2051 + "dev-master": "2.0.x-dev"
1951 2052 }
1952 2053 },
1953 2054 "autoload": {
... ... @@ -1972,25 +2073,25 @@
1972 2073 "environment",
1973 2074 "hhvm"
1974 2075 ],
1975   - "time": "2016-08-18 05:49:44"
  2076 + "time": "2016-11-26 07:53:53"
1976 2077 },
1977 2078 {
1978 2079 "name": "sebastian/exporter",
1979   - "version": "1.2.2",
  2080 + "version": "2.0.0",
1980 2081 "source": {
1981 2082 "type": "git",
1982 2083 "url": "https://github.com/sebastianbergmann/exporter.git",
1983   - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
  2084 + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
1984 2085 },
1985 2086 "dist": {
1986 2087 "type": "zip",
1987   - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
1988   - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
  2088 + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
  2089 + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
1989 2090 "shasum": ""
1990 2091 },
1991 2092 "require": {
1992 2093 "php": ">=5.3.3",
1993   - "sebastian/recursion-context": "~1.0"
  2094 + "sebastian/recursion-context": "~2.0"
1994 2095 },
1995 2096 "require-dev": {
1996 2097 "ext-mbstring": "*",
... ... @@ -1999,7 +2100,7 @@
1999 2100 "type": "library",
2000 2101 "extra": {
2001 2102 "branch-alias": {
2002   - "dev-master": "1.3.x-dev"
  2103 + "dev-master": "2.0.x-dev"
2003 2104 }
2004 2105 },
2005 2106 "autoload": {
... ... @@ -2039,7 +2140,7 @@
2039 2140 "export",
2040 2141 "exporter"
2041 2142 ],
2042   - "time": "2016-06-17 09:04:28"
  2143 + "time": "2016-11-19 08:54:04"
2043 2144 },
2044 2145 {
2045 2146 "name": "sebastian/global-state",
... ... @@ -2093,17 +2194,63 @@
2093 2194 "time": "2015-10-12 03:26:01"
2094 2195 },
2095 2196 {
  2197 + "name": "sebastian/object-enumerator",
  2198 + "version": "2.0.1",
  2199 + "source": {
  2200 + "type": "git",
  2201 + "url": "https://github.com/sebastianbergmann/object-enumerator.git",
  2202 + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
  2203 + },
  2204 + "dist": {
  2205 + "type": "zip",
  2206 + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
  2207 + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
  2208 + "shasum": ""
  2209 + },
  2210 + "require": {
  2211 + "php": ">=5.6",
  2212 + "sebastian/recursion-context": "~2.0"
  2213 + },
  2214 + "require-dev": {
  2215 + "phpunit/phpunit": "~5"
  2216 + },
  2217 + "type": "library",
  2218 + "extra": {
  2219 + "branch-alias": {
  2220 + "dev-master": "2.0.x-dev"
  2221 + }
  2222 + },
  2223 + "autoload": {
  2224 + "classmap": [
  2225 + "src/"
  2226 + ]
  2227 + },
  2228 + "notification-url": "https://packagist.org/downloads/",
  2229 + "license": [
  2230 + "BSD-3-Clause"
  2231 + ],
  2232 + "authors": [
  2233 + {
  2234 + "name": "Sebastian Bergmann",
  2235 + "email": "sebastian@phpunit.de"
  2236 + }
  2237 + ],
  2238 + "description": "Traverses array structures and object graphs to enumerate all referenced objects",
  2239 + "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
  2240 + "time": "2017-02-18 15:18:39"
  2241 + },
  2242 + {
2096 2243 "name": "sebastian/recursion-context",
2097   - "version": "1.0.5",
  2244 + "version": "2.0.0",
2098 2245 "source": {
2099 2246 "type": "git",
2100 2247 "url": "https://github.com/sebastianbergmann/recursion-context.git",
2101   - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7"
  2248 + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
2102 2249 },
2103 2250 "dist": {
2104 2251 "type": "zip",
2105   - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7",
2106   - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7",
  2252 + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
  2253 + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
2107 2254 "shasum": ""
2108 2255 },
2109 2256 "require": {
... ... @@ -2115,7 +2262,7 @@
2115 2262 "type": "library",
2116 2263 "extra": {
2117 2264 "branch-alias": {
2118   - "dev-master": "1.0.x-dev"
  2265 + "dev-master": "2.0.x-dev"
2119 2266 }
2120 2267 },
2121 2268 "autoload": {
... ... @@ -2143,23 +2290,73 @@
2143 2290 ],
2144 2291 "description": "Provides functionality to recursively process PHP variables",
2145 2292 "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2146   - "time": "2016-10-03 07:41:43"
  2293 + "time": "2016-11-19 07:33:16"
  2294 + },
  2295 + {
  2296 + "name": "sebastian/resource-operations",
  2297 + "version": "1.0.0",
  2298 + "source": {
  2299 + "type": "git",
  2300 + "url": "https://github.com/sebastianbergmann/resource-operations.git",
  2301 + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
  2302 + },
  2303 + "dist": {
  2304 + "type": "zip",
  2305 + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
  2306 + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
  2307 + "shasum": ""
  2308 + },
  2309 + "require": {
  2310 + "php": ">=5.6.0"
  2311 + },
  2312 + "type": "library",
  2313 + "extra": {
  2314 + "branch-alias": {
  2315 + "dev-master": "1.0.x-dev"
  2316 + }
  2317 + },
  2318 + "autoload": {
  2319 + "classmap": [
  2320 + "src/"
  2321 + ]
  2322 + },
  2323 + "notification-url": "https://packagist.org/downloads/",
  2324 + "license": [
  2325 + "BSD-3-Clause"
  2326 + ],
  2327 + "authors": [
  2328 + {
  2329 + "name": "Sebastian Bergmann",
  2330 + "email": "sebastian@phpunit.de"
  2331 + }
  2332 + ],
  2333 + "description": "Provides a list of PHP built-in functions that operate on resources",
  2334 + "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
  2335 + "time": "2015-07-28 20:34:47"
2147 2336 },
2148 2337 {
2149 2338 "name": "sebastian/version",
2150   - "version": "1.0.6",
  2339 + "version": "2.0.1",
2151 2340 "source": {
2152 2341 "type": "git",
2153 2342 "url": "https://github.com/sebastianbergmann/version.git",
2154   - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
  2343 + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
2155 2344 },
2156 2345 "dist": {
2157 2346 "type": "zip",
2158   - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
2159   - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
  2347 + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
  2348 + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
2160 2349 "shasum": ""
2161 2350 },
  2351 + "require": {
  2352 + "php": ">=5.6"
  2353 + },
2162 2354 "type": "library",
  2355 + "extra": {
  2356 + "branch-alias": {
  2357 + "dev-master": "2.0.x-dev"
  2358 + }
  2359 + },
2163 2360 "autoload": {
2164 2361 "classmap": [
2165 2362 "src/"
... ... @@ -2178,7 +2375,7 @@
2178 2375 ],
2179 2376 "description": "Library that helps with managing the version number of Git-hosted PHP projects",
2180 2377 "homepage": "https://github.com/sebastianbergmann/version",
2181   - "time": "2015-06-21 13:59:46"
  2378 + "time": "2016-10-03 07:35:21"
2182 2379 },
2183 2380 {
2184 2381 "name": "symfony/var-dumper",
... ...
database/labinvent_2.1_12-05-16.sql
... ... @@ -362,6 +362,7 @@ CREATE TABLE IF NOT EXISTS `configurations` (
362 362 `numero_labo_sans_annee` tinyint(1) DEFAULT NULL,
363 363 `date_commande_facultative` tinyint(1) DEFAULT NULL,
364 364 `taille_max_doc` int (15) DEFAULT '8000000',
  365 + `aff_par_defaut` smallint(6) NOT NULL DEFAULT 20,
365 366 PRIMARY KEY (`id`),
366 367 UNIQUE KEY `nom_UNIQUE` (`nom`)
367 368 );
... ... @@ -446,10 +447,47 @@ Insert into type_documents(nom) values (&#39;Certificat de conformité&#39;);
446 447 Insert into type_documents(nom) values ('Manuel d\'utilisation');
447 448  
448 449 -- Insertion par défaut pour la table configuration
449   -Insert into `configurations`(`nom`, `mode_install`, `mode_debug`, `use_ldap`, `host_ldap`, `port_ldap`, `authentificationType_ldap`, `baseDn_ldap`, `filter_ldap`, `labName`, `labNameShort`, `labPresent`, `labUmr`, `hasPrinter`, `emailGuest1`, `emailGuest2`, `emailGuest3`) values ('default', '1', '0', '0', '', '', 'xxx', '', '', 'LABONAME', 'LABO', 'du ', '', '0', '', '', '');
  450 +Insert into `configurations`(
  451 +`nom`,
  452 +`mode_install`,
  453 +`mode_debug`,
  454 +`use_ldap`,
  455 +`host_ldap`,
  456 +`port_ldap`,
  457 +`authentificationType_ldap`,
  458 +`baseDn_ldap`,
  459 +`filter_ldap`,
  460 +`labName`,
  461 +`labNameShort`,
  462 +`labPresent`,
  463 +`labUmr`,
  464 +`hasPrinter`,
  465 +`envoi_mail_management_dev`
  466 +`emailGuest1`,
  467 +`emailGuest2`,
  468 +`emailGuest3`)
  469 +values (
  470 +'default',
  471 +'1',
  472 +'0',
  473 +'0',
  474 +'',
  475 +'',
  476 +'xxx',
  477 +'',
  478 +'',
  479 +'LABONAME',
  480 +'LABO',
  481 +'du ',
  482 +'',
  483 +'0',
  484 +'0',
  485 +'',
  486 +'',
  487 +'');
450 488  
451 489  
452 490  
453 491 /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
454 492 /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
455 493 -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
  494 +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
456 495 \ No newline at end of file
... ...
database/update/script_sql/db-update-2017-04-25.sql
1 1 use database;
2 2  
3   -ALTER TABLE `configurations` ADD `aff_par_default` smallint(6) DEFAULT 20;
  3 +ALTER TABLE `configurations` ADD `aff_par_defaut` SMALLINT NOT NULL DEFAULT '20';
... ...
src/Controller/AppController.php
... ... @@ -180,9 +180,11 @@ class AppController extends Controller
180 180 $this->set('idGmNa', TableRegistry::get('GroupesMetiers')->find()->where(['nom =' => 'N/A'])->first()['id']);
181 181 $this->set('idGtNa', TableRegistry::get('GroupesThematiques')->find()->where(['nom =' => 'N/A'])->first()['id']);
182 182  
183   - $displayElement = function ($nom, $valeur) {
  183 + $displayElement = function ($nom, $valeur, $params="") {
  184 + $balise = ($params != "") ? '<td '.$params.'>' : '<td>';
  185 + // Ca c'est parce que sinon y'a au moins deux tests qui passent pas, a cause de l'espace dans la balise ...
184 186 if ($valeur != "")
185   - echo '<tr><td><strong>'.$nom.' </strong></td><td>'.$valeur.'</td></tr>';
  187 + echo '<tr><td><strong>'.$nom.' </strong></td>'.$balise.$valeur.'</td></tr>';
186 188 };
187 189 $this->set('displayElement', $displayElement);
188 190  
... ...
src/Controller/MaterielsController.php
... ... @@ -2,6 +2,7 @@
2 2 namespace App\Controller;
3 3  
4 4 use App\Controller\AppController;
  5 +use Cake\Core\Configure;
5 6 use Cake\ORM\TableRegistry;
6 7 use Cake\Mailer\Email;
7 8  
... ... @@ -171,10 +172,12 @@ class MaterielsController extends AppController
171 172 */
172 173 public function index()
173 174 {
  175 + // Remplacement de $this->passedArgs[0] (deprecated)
  176 + // Par $this->request->params['pass'][0]
174 177 $condition = '';
175   - if (isset($this->passedArgs[0])) {
176   - $condition = ['Materiels.status =' => $this->passedArgs[0]];
177   - $this->set('STATUS', $this->passedArgs[0]);
  178 + if (isset($this->request->params['pass'][0])) {
  179 + $condition = ['Materiels.status =' => $this->request->params['pass'][0]];
  180 + $this->set('STATUS', $this->request->params['pass'][0]);
178 181 }
179 182  
180 183 $GM = $this->request->query('GM');
... ... @@ -315,7 +318,7 @@ class MaterielsController extends AppController
315 318 }
316 319  
317 320  
318   - //return $this->redirect(['action' => 'view', $materiel->id]);
  321 + return $this->redirect(['action' => 'view', $materiel->id]);
319 322 } else {
320 323 $this->Flash->error(__('Le matériel n\'a pas pu être ajouté.'));
321 324 }
... ... @@ -339,8 +342,8 @@ class MaterielsController extends AppController
339 342  
340 343 $mail_responsable = TableRegistry::get('Users')->find()->select('email')->where(['username =' => $this->LdapAuth->user($this->request->session()->read('authType'))[0]])->first()['email'];
341 344  
342   - if(isset($this->request->params[0])) {
343   - $cpMateriel = $this->Materiels->get($this->request->params[0]);
  345 + if(isset($this->request->params['pass'][0])) {
  346 + $cpMateriel = $this->Materiels->get($this->request->params['pass'][0]);
344 347 $this->set('cpMateriel', $cpMateriel);
345 348 }
346 349  
... ... @@ -892,10 +895,10 @@ class MaterielsController extends AppController
892 895 }
893 896  
894 897  
895   - else if (isset($this->passedArgs[0])) {
  898 + else if (isset($this->request->params['pass'][0])) {
896 899  
897 900 $this->myDebug("OTHER CASE 3");
898   - $what = $this->passedArgs[0];
  901 + $what = $this->request->params['pass'][0];
899 902 if ($what == 'search') {
900 903 $materiels = $this->request->session()->read("result");
901 904 }
... ...
src/Controller/MaterielsController.php~ 0 → 100644
... ... @@ -0,0 +1,1453 @@
  1 +<?php
  2 +namespace App\Controller;
  3 +
  4 +use App\Controller\AppController;
  5 +use Cake\Core\Configure;
  6 +use Cake\ORM\TableRegistry;
  7 +use Cake\Mailer\Email;
  8 +
  9 +/**
  10 + * Materiels Controller
  11 + *
  12 + * @property \App\Model\Table\MaterielsTable $Materiels
  13 + */
  14 +class MaterielsController extends AppController
  15 +{
  16 +
  17 + private $NOTARCHIVED = ['CREATED', 'VALIDATED', 'TOBEARCHIVED'];
  18 + public $role;
  19 +
  20 + /**
  21 + * @param $user
  22 + *
  23 + * Give authorization for materiels
  24 + *
  25 + * @return boolean
  26 + */
  27 + public function isAuthorized($user)
  28 + {
  29 + $configuration = TableRegistry::get('Configurations')->find()->where(['id =' => 1])->first();
  30 + $role = TableRegistry::get('Users')->find()->where(['username' => $user[$configuration->authentificationType_ldap][0]])->first()['role'];
  31 + $this->role = $role;
  32 + $action = $this->request->params['action'];
  33 +
  34 +
  35 + if ($action == 'edit') {
  36 + $id = (int)$this->passedArgs[0];
  37 +
  38 + if($this->isCreated($id) || $this->isValidated($id)) {
  39 + if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0].' '.$user['givenname'][0])) {
  40 + return true;
  41 + }
  42 + else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) {
  43 + return true;
  44 + }
  45 + else if ($this->userHasRole('Administration')) {
  46 + return true;
  47 + }
  48 + }
  49 + if($this->userHasRole('Administration Plus')) {
  50 + return true;
  51 + }
  52 + }
  53 +
  54 + if ($action == 'delete') {
  55 + $id = (int)$this->passedArgs[0];
  56 +
  57 + if($this->isCreated($id)) {
  58 + if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0].' '.$user['givenname'][0])) {
  59 + return true;
  60 + }
  61 + else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) {
  62 + return true;
  63 + }
  64 + else if ($this->userHasRole('Administration')) {
  65 + return true;
  66 + }
  67 + }
  68 + }
  69 +
  70 + if ($action == 'statusValidated') {
  71 + $id = (int)$this->passedArgs[0];
  72 + if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) {
  73 + if($this->isCreated($id)) {
  74 + return true;
  75 + }
  76 + }
  77 + else if ($this->userHasRole('Administration')) {
  78 + if($this->isCreated($id)) {
  79 + return true;
  80 + }
  81 + }
  82 + }
  83 +
  84 + if ($action == 'statusToBeArchived') {
  85 + $id = (int)$this->passedArgs[0];
  86 + if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) {
  87 + if($this->isValidated($id)) {
  88 + return true;
  89 + }
  90 + }
  91 + else if ($this->userHasRole('Administration')) {
  92 + if($this->isValidated($id)) {
  93 + return true;
  94 + }
  95 + }
  96 + }
  97 +
  98 + if ($action == 'statusArchived') {
  99 + $id = (int)$this->passedArgs[0];
  100 + if ($this->userHasRole('Administration')) {
  101 + if($this->isToBeArchived($id)) {
  102 + if($role == 'Super Administrateur') {
  103 + return false;
  104 + }
  105 + else {
  106 + return true;
  107 + }
  108 + }
  109 + }
  110 + }
  111 +
  112 + if ($action == 'export') {
  113 + if ($this->userHasRole('Responsable')) {
  114 + return true;
  115 + }
  116 + }
  117 +
  118 + if (in_array($action, ['execActions', 'setLabelIsPlaced', 'setLabelIsPlacedOrNotPlaced', 'setLabelIsNotPlaced', 'printLabelRuban'])) {
  119 + if ($this->userHasRole('Administration')) {
  120 + return true;
  121 + }
  122 + }
  123 +
  124 +
  125 +
  126 + return parent::isAuthorized($user);
  127 + }
  128 +
  129 + public function isOwnedBy($id, $nomCreateur)
  130 + {
  131 + return ($this->Materiels->exists(['id' => $id, 'nom_createur' => $nomCreateur]) || $this->Materiels->exists(['id' => $id, 'nom_responsable' => $nomCreateur]));
  132 + }
  133 +
  134 + public function isRespGroup($id, $loginResponsable)
  135 + {
  136 + $u = TableRegistry::get('Users')->find()->where(['username' => $loginResponsable])->first();
  137 +
  138 + if(isset($u['groupes_metier_id']) && $u['groupes_metier_id'] != TableRegistry::get('GroupesMetiers')->find()->where(['nom =' => 'N/A'])->first()['id']) {
  139 + return ($this->Materiels->exists(['id' => $id, 'groupes_metier_id' => $u['groupes_metier_id']]));
  140 + }
  141 + else if (isset($u['groupe_thematique_id']) && $u['groupe_thematique_id'] != TableRegistry::get('GroupesThematiques')->find()->where(['nom =' => 'N/A'])->first()['id']) {
  142 + return ($this->Materiels->exists(['id' => $id, 'groupes_thematique_id' => $u['groupe_thematique_id']]));
  143 + }
  144 + else {
  145 + return false;
  146 + }
  147 + }
  148 +
  149 + public function isCreated($id)
  150 + {
  151 + return $this->Materiels->exists(['id' => $id, 'status' => 'CREATED']);
  152 + }
  153 + public function isValidated($id)
  154 + {
  155 + return $this->Materiels->exists(['id' => $id, 'status' => 'VALIDATED']);
  156 + }
  157 + public function isToBeArchived($id)
  158 + {
  159 + return $this->Materiels->exists(['id' => $id, 'status' => 'TOBEARCHIVED']);
  160 + }
  161 + public function isArchived($id)
  162 + {
  163 + return $this->Materiels->exists(['id' => $id, 'status' => 'ARCHIVED']);
  164 + }
  165 +
  166 +
  167 +
  168 + /**
  169 + * Index method
  170 + *
  171 + * @return \Cake\Network\Response|null
  172 + */
  173 + public function index()
  174 + {
  175 + // Remplacement de $this->passedArgs[0] (deprecated)
  176 + // Par $this->passedArgs[0]
  177 + $condition = '';
  178 + if (isset($this->passedArgs[0])) {
  179 + $condition = ['Materiels.status =' => $this->passedArgs[0]];
  180 + $this->set('STATUS', $this->passedArgs[0]);
  181 + }
  182 +
  183 + $GM = $this->request->query('GM');
  184 + $GT = $this->request->query('GT');
  185 + if(isset($GM) || isset($GT)) {
  186 + if(isset($GM) && $GM != TableRegistry::get('GroupesMetiers')->find()->where(['nom =' => 'N/A'])->first()['id']) {
  187 + $condition = ['Materiels.groupes_metier_id =' => $GM, 'Materiels.status !=' => 'ARCHIVED'];
  188 + }
  189 + else if (isset($GT) && $GT != TableRegistry::get('GroupesThematiques')->find()->where(['nom =' => 'N/A'])->first()['id']) {
  190 + $condition = ['Materiels.groupes_thematique_id =' => $GT, 'Materiels.status !=' => 'ARCHIVED'];
  191 + }
  192 + else {
  193 + $condition = ['Materiels.id =' => 0];
  194 + }
  195 + }
  196 +
  197 + $GMV = $this->request->query('GMV');
  198 + $GTV = $this->request->query('GTV');
  199 + if(isset($GMV) || isset($GTV)) {
  200 + if(isset($GMV) && $GMV != TableRegistry::get('GroupesMetiers')->find()->where(['nom =' => 'N/A'])->first()['id']) {
  201 + $condition = ['Materiels.groupes_metier_id =' => $GMV, 'Materiels.status =' => 'CREATED', 'Materiels.status !=' => 'ARCHIVED'];
  202 + }
  203 + else if (isset($GTV) && $GTV != TableRegistry::get('GroupesThematiques')->find()->where(['nom =' => 'N/A'])->first()['id']) {
  204 + $condition = ['Materiels.groupes_metier_id =' => $GTV, 'Materiels.status =' => 'CREATED', 'Materiels.status !=' => 'ARCHIVED'];
  205 + }
  206 + else {
  207 + $condition = ['Materiels.id =' => 0];
  208 + }
  209 + }
  210 +
  211 +
  212 + $MY = $this->request->query('MY');
  213 + if(isset($MY)) {
  214 + if(in_array($this->role, ['Utilisateur', 'Responsable'])) {
  215 + $condition = ['Materiels.nom_responsable =' => $this->request->query('MY'), 'Materiels.status !=' => 'ARCHIVED'];
  216 + } else {
  217 + $condition = ['Materiels.nom_responsable =' => $this->request->query('MY')];
  218 + }
  219 +
  220 + }
  221 +
  222 +
  223 + if(in_array($this->role, ['Utilisateur', 'Responsable']) && $condition == '') {
  224 + $condition = ['Materiels.status !=' => 'ARCHIVED'];
  225 + }
  226 +
  227 + $config = TableRegistry::get('Configurations')->find()->where(['id =' => 1])->first();
  228 + $limit = $config['aff_par_defaut'];
  229 +
  230 + $this->paginate = [
  231 + 'limit' => $limit,
  232 + 'contain' => ['SurCategories', 'Categories', 'SousCategories', 'GroupesThematiques', 'GroupesMetiers', 'Organismes', 'Sites'],
  233 + 'order' => ['Materiels.numero_laboratoire' => 'desc']
  234 + ];
  235 +
  236 + $materiels = $this->paginate($this->Materiels->find('all', ['conditions' => $condition]));
  237 +
  238 + $this->set('nbMateriels', $this->Materiels->find('all', ['conditions' => $condition])->count());
  239 +
  240 +
  241 + $this->set(compact('materiels'));
  242 + $this->set('_serialize', ['materiels']);
  243 + }
  244 +
  245 + /**
  246 + * View method
  247 + *
  248 + * @param string|null $id Materiel id.
  249 + * @return \Cake\Network\Response|null
  250 + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
  251 + */
  252 + public function view($id = null)
  253 + {
  254 + $materiel = $this->Materiels->get($id, [
  255 + 'contain' => ['SurCategories', 'Categories', 'SousCategories', 'GroupesThematiques', 'GroupesMetiers', 'Organismes', 'Sites', 'Documents', 'Emprunts', 'Suivis']
  256 + ]);
  257 +
  258 + $sites = TableRegistry::get('Sites');
  259 + $typeSuivis = TableRegistry::get('TypeSuivis');
  260 + $typeDocuments = TableRegistry::get('TypeDocuments');
  261 +
  262 + if($materiel->photo_id != null) {
  263 + $imgMateriel = $materiel->photo_id.'.'.TableRegistry::get('Documents')->get($materiel->photo_id)->get('type_doc');
  264 + $this->set('imgMateriel', $imgMateriel);
  265 + }
  266 +
  267 + $this->set('sites', $sites);
  268 + $this->set('typeSuivis', $typeSuivis);
  269 + $this->set('typeDocuments', $typeDocuments);
  270 +
  271 + $this->set('materiel', $materiel);
  272 + $this->set('_serialize', ['materiel']);
  273 + }
  274 +
  275 + /**
  276 + * Add method
  277 + *
  278 + * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise.
  279 + */
  280 + public function add()
  281 + {
  282 + $materiel = $this->Materiels->newEntity();
  283 + if ($this->request->is('post')) {
  284 + $materiel = $this->Materiels->patchEntity($materiel, $this->request->data);
  285 + if ($this->Materiels->save($materiel)) {
  286 + $this->Flash->success(__('Le matériel a bien été ajouté.'));
  287 +
  288 + $this->sendEmailToManagement($materiel->id);
  289 +
  290 + if($materiel->nom_createur != $materiel->nom_responsable) {
  291 + $this->sendEmailToCreate($materiel->id);
  292 + }
  293 +
  294 + $message = $materiel->get('nom_createur').' a ajouté le matériel "'.$materiel->get('designation').'" ('.$materiel->numero_laboratoire.')';
  295 +
  296 + //Envoi mail responsable
  297 + $mailsResp = TableRegistry::get('Users')->find()->select('email')->where(['role =' => 'Responsable', 'groupes_metier_id =' => $materiel->get('groupes_metier_id')])->orWhere(['role =' => 'Responsable', 'groupe_thematique_id =' => $materiel->get('groupes_thematique_id')])->toArray();
  298 + $mails = [];
  299 + for($i = 0; $i < sizeof($mailsResp); $i++) {
  300 + $mails[$i] = $mailsResp[$i]['email'];
  301 + }
  302 + $this->sendEmailTo('Ajout d\'un matériel', $message, $mails);
  303 +
  304 + //Envoi mail administratif
  305 + //$mailsResp = TableRegistry::get('Users')->find()->select('email')->where(['role =' => 'Administration Plus'])->orWhere(['role =' => 'Administration'])->toArray();
  306 + $mailsResp = TableRegistry::get('Users')->find()->select('email')->where(['role =' => 'Administration Plus'])->toArray();
  307 + $mails = [];
  308 + for($i = 0; $i < sizeof($mailsResp); $i++) {
  309 + $mails[$i] = $mailsResp[$i]['email'];
  310 + }
  311 +
  312 +
  313 + // Rajout condition d'envoi de mail ou pas
  314 + $configuration = TableRegistry::get('Configurations')->find()->where(['id =' => 1])->first();
  315 +
  316 + if(!$configuration['envoi_mail_management_dev']){ // Si false, on envoie les mails, sinon on les envoie pas
  317 + $this->sendEmailTo('Ajout d\'un matériel', $message, $mails);
  318 + }
  319 +
  320 +
  321 + return $this->redirect(['action' => 'view', $materiel->id]);
  322 + } else {
  323 + $this->Flash->error(__('Le matériel n\'a pas pu être ajouté.'));
  324 + }
  325 + }
  326 +
  327 + $surCategories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SurCategories.nom']);
  328 + $categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Categories.nom']);
  329 + $sousCategories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SousCategories.nom']);
  330 + $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom']);
  331 + $groupesMetiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom']);
  332 + $organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Organismes.nom']);
  333 + $sites = $this->Materiels->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Sites.nom']);
  334 +
  335 + $users = TableRegistry::get('LdapConnections')->getListUsers();
  336 + //tri des utilisateurs par nom
  337 + sort($users);
  338 + $utilisateurs = [];
  339 + for($i = 0; $i < sizeof($users); $i++) {
  340 + $utilisateurs[$users[$i]] = $users[$i];
  341 + }
  342 +
  343 + $mail_responsable = TableRegistry::get('Users')->find()->select('email')->where(['username =' => $this->LdapAuth->user($this->request->session()->read('authType'))[0]])->first()['email'];
  344 +
  345 + if(isset($this->passedArgs[0])) {
  346 + $cpMateriel = $this->Materiels->get($this->passedArgs[0]);
  347 + $this->set('cpMateriel', $cpMateriel);
  348 + }
  349 +
  350 + $this->set(compact('materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable'));
  351 + $this->set('_serialize', ['materiel']);
  352 +
  353 + }
  354 +
  355 + /**
  356 + * Edit method
  357 + *
  358 + * @param string|null $id Materiel id.
  359 + * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise.
  360 + * @throws \Cake\Network\Exception\NotFoundException When record not found.
  361 + */
  362 + public function edit($id = null)
  363 + {
  364 + $materiel = $this->Materiels->get($id, [
  365 + 'contain' => []
  366 + ]);
  367 + if ($this->request->is(['patch', 'post', 'put'])) {
  368 + $materiel = $this->Materiels->patchEntity($materiel, $this->request->data);
  369 + if ($this->Materiels->save($materiel)) {
  370 + $this->Flash->success(__('Le matériel a bien été édité.'));
  371 + $this->sendEmailToManagement($id);
  372 + if($materiel->nom_modificateur != $materiel->nom_responsable) {
  373 + $message = $materiel->get('nom_modificateur').' a édité le matériel "'.$materiel->get('designation').'" ('.$materiel->numero_laboratoire.')';
  374 + $this->sendEmailTo('Modification d\'un matériel', $message, [$materiel->get('email_responsable')]);
  375 + }
  376 + return $this->redirect(['action' => 'view', $id]);
  377 + } else {
  378 + $this->Flash->error(__('Le matériel n\'a pas pu être édité.'));
  379 + }
  380 + }
  381 + $surCategories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SurCategories.nom']);
  382 + $categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Categories.nom']);
  383 + $sousCategories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SousCategories.nom']);
  384 + $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom']);
  385 + $groupesMetiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom']);
  386 + $organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Organismes.nom']);
  387 + $sites = $this->Materiels->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Sites.nom']);
  388 +
  389 + $users = TableRegistry::get('LdapConnections')->getListUsers();
  390 + //tri des utilisateurs par nom
  391 + sort($users);
  392 + $utilisateurs = [];
  393 + for($i = 0; $i < sizeof($users); $i++) {
  394 + $utilisateurs[$users[$i]] = $users[$i];
  395 + }
  396 +
  397 + if(!empty($materiel->get('nom_responsable'))){
  398 + if(!in_array($materiel->get('nom_responsable'), $utilisateurs)){
  399 + $nom_ancien_responsable = $materiel->get('nom_responsable');
  400 + $this->set(compact('nom_ancien_responsable'));
  401 + }
  402 + }
  403 + $mail_responsable = TableRegistry::get('Users')->find()->select('email')->where(['username =' => $this->LdapAuth->user($this->request->session()->read('authType'))[0]])->first()['email'];
  404 +
  405 + //Fonction utilisé dans la vue, déclaré ici pour éviter les problèmes de tests
  406 + $isReadonlyField = function ($fieldName, $myReadonlyFields) {
  407 + if (! empty ( $myReadonlyFields ) && $myReadonlyFields [0] == '*') {
  408 + $modifiableFields = $myReadonlyFields;
  409 + array_shift ( $modifiableFields );
  410 + return ! in_array ( $fieldName, $modifiableFields );
  411 + }
  412 + return in_array ( $fieldName, $myReadonlyFields );
  413 + };
  414 + $this->set('isReadonlyField', $isReadonlyField);
  415 +
  416 + $this->set('IS_CREATED', $materiel->status == 'CREATED');
  417 + $this->set('IS_VALIDATED', $materiel->status == 'VALIDATED');
  418 + $this->set('IS_ARCHIVED_OR_TOBE', in_array ( $materiel->status, ['TOBEARCHIVED','ARCHIVED']));
  419 +
  420 + $this->set(compact('materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable'));
  421 + $this->set('_serialize', ['materiel']);
  422 + }
  423 +
  424 +
  425 + /**
  426 + * Administrer method
  427 + *
  428 + * @param string|null $id Materiel id.
  429 + * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise.
  430 + * @throws \Cake\Network\Exception\NotFoundException When record not found.
  431 + */
  432 + public function administrer($id = null)
  433 + {
  434 + $materiel = $this->Materiels->get($id, [
  435 + 'contain' => []
  436 + ]);
  437 + if ($this->request->is(['patch', 'post', 'put'])) {
  438 + $materiel = $this->Materiels->patchEntity($materiel, $this->request->data);
  439 + if ($this->Materiels->save($materiel, ['checkRules' => false])) {
  440 + $this->Flash->success(__('Le matériel a bien été édité.'));
  441 + return $this->redirect(['action' => 'view', $id]);
  442 + } else {
  443 + $this->Flash->error(__('Le matériel n\'a pas pu être édité.'));
  444 + }
  445 + }
  446 + $surCategories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SurCategories.nom']);
  447 + $categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Categories.nom']);
  448 + $sousCategories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SousCategories.nom']);
  449 + $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom']);
  450 + $groupesMetiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom']);
  451 + $organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Organismes.nom']);
  452 + $sites = $this->Materiels->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Sites.nom']);
  453 +
  454 + $users = TableRegistry::get('LdapConnections')->getListUsers();
  455 + //tri des utilisateurs par nom
  456 + sort($users);
  457 + $utilisateurs = [];
  458 + for($i = 0; $i < sizeof($users); $i++) {
  459 + $utilisateurs[$users[$i]] = $users[$i];
  460 + }
  461 +
  462 + if(!empty($materiel->get('nom_responsable'))){
  463 + if(!in_array($materiel->get('nom_responsable'), $utilisateurs)){
  464 + $nom_ancien_responsable = $materiel->get('nom_responsable');
  465 + $this->set(compact('nom_ancien_responsable'));
  466 + }
  467 + }
  468 + $mail_responsable = TableRegistry::get('Users')->find()->select('email')->where(['username =' => $this->LdapAuth->user($this->request->session()->read('authType'))[0]])->first()['email'];
  469 +
  470 + $this->set('IS_CREATED', $materiel->status == 'CREATED');
  471 + $this->set('IS_VALIDATED', $materiel->status == 'VALIDATED');
  472 + $this->set('IS_ARCHIVED_OR_TOBE', in_array ( $materiel->status, ['TOBEARCHIVED','ARCHIVED']));
  473 +
  474 + $this->set(compact('materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable'));
  475 + $this->set('_serialize', ['materiel']);
  476 + }
  477 +
  478 +
  479 + /**
  480 + * Delete method
  481 + *
  482 + * @param string|null $id Materiel id.
  483 + * @return \Cake\Network\Response|null Redirects to index.
  484 + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
  485 + */
  486 + public function delete($id = null)
  487 + {
  488 + //$this->request->allowMethod(['post', 'delete']);
  489 + $materiel = $this->Materiels->get($id);
  490 + if ($this->Materiels->delete($materiel)) {
  491 + $this->Flash->success(__('Le matériel a bien été supprimé.'));
  492 + $this->sendEmailToManagement($id);
  493 + } else {
  494 + $this->Flash->error(__('Le matériel n\'a pas pu être supprimé.'));
  495 + }
  496 + return $this->redirect(['action' => 'index']);
  497 + }
  498 +
  499 + /**
  500 + * StatusSetTo method
  501 + *
  502 + * @param string $newStatus
  503 + * @param string $message
  504 + * @param string $id
  505 + * @param string $from
  506 + * @return \Cake\Network\Response|NULL
  507 + */
  508 + private function statusSetTo($newStatus, $message, $id = null, $from = 'index') {
  509 + $materiel = $this->Materiels->get($id)->set('status', $newStatus);
  510 +
  511 + if($newStatus == 'ARCHIVED') {
  512 + $materiel->set('date_archivage', date('Y-m-d'));
  513 + }
  514 +
  515 + if($newStatus == 'VALIDATED') {
  516 + if(!isset($materiel->nom_responsable) || !isset($materiel->fournisseur) || !isset($materiel->numero_commande) || !isset($materiel->organisme_id) || !isset($materiel->date_reception) || !isset($materiel->prix_ht)) {
  517 + $this->Flash->error('Pour valider un matériel, les champs suivants ne doivent pas être vide : Nom propriétaire, Fournisseur, Numéro de commande, Organisme, prix et date de reception');
  518 + return $this->redirect(['action' => 'edit', $id]);
  519 + }
  520 + $message = 'Le matériel "'.$materiel->get('designation').'" ('.$materiel->numero_laboratoire.') a été validé.';
  521 + $this->sendEmailTo('Validation d\'un matériel', $message, [$materiel->get('email_responsable')]);
  522 + }
  523 +
  524 + if ($this->Materiels->save($materiel, ['checkRules' => false, 'checkExisting' => false])) {
  525 + $this->Flash->success(__($message));
  526 + $this->sendEmailToManagement($id);
  527 + }
  528 + else {
  529 + $this->Flash->error(__('Le statut n\'a pas pu être édité.'));
  530 + }
  531 +
  532 + if($from == 'index') return $this->redirect(['action'=>$from]);
  533 + else return $this->redirect(['action'=>$from, $id]);
  534 + }
  535 +
  536 + /**
  537 + * StatusValidated method
  538 + *
  539 + * @param string $id
  540 + * @param string $from
  541 + */
  542 + public function statusValidated($id = null, $from = 'index') {
  543 + $this->statusSetTo('VALIDATED', 'Le matériel a bien été validé', $id, $from);
  544 + }
  545 +
  546 + /**
  547 + * StatusToBeArchived method
  548 + *
  549 + * @param string $id
  550 + * @param string $from
  551 + */
  552 + public function statusToBeArchived($id = null, $from = 'index') {
  553 + $this->statusSetTo('TOBEARCHIVED', 'La sortie d\'inventaire a bien été demandée', $id, $from);
  554 + }
  555 +
  556 + /**
  557 + * StatusArchived method
  558 + *
  559 + * @param string $id
  560 + * @param string $from
  561 + */
  562 + public function statusArchived($id = null, $from = 'index') {
  563 + $this->statusSetTo('ARCHIVED', 'Le matériel a bien été sorti de l\'inventaire', $id, $from);
  564 + }
  565 +
  566 + /**
  567 + * GetConditionForField method
  568 + *
  569 + * @param unknown $fieldName
  570 + * @return string[]|NULL
  571 + */
  572 + private function getConditionForField($fieldName) {
  573 + $searchFieldName = 's_' . $fieldName;
  574 + if ( isset($this->request->data[$searchFieldName]) && ($this->request->data[$searchFieldName] != '')) return ["Materiels.$fieldName LIKE" => '%'.$this->request->data[$searchFieldName].'%'];
  575 + return NULL;
  576 + }
  577 +
  578 + /**
  579 + * GetConditionForFieldNumber method
  580 + *
  581 + * @param unknown $fieldName
  582 + * @return $string[]|NULL
  583 + */
  584 + private function getConditionForFieldNumber($fieldName) {
  585 + $searchFieldName = 's_' . $fieldName;
  586 + if ( isset($this->request->data[$searchFieldName]) && ($this->request->data[$searchFieldName] != '')) return ["Materiels.$fieldName =" => $this->request->data[$searchFieldName]];
  587 + return NULL;
  588 + }
  589 +
  590 + /**
  591 + * Find method
  592 + */
  593 + public function find() {
  594 +
  595 + $s_sur_categories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SurCategories.nom']);
  596 + $s_categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Categories.nom']);
  597 + $s_sous_categories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SousCategories.nom']);
  598 + $s_groupes_thematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom']);
  599 + $s_groupes_metiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom']);
  600 + $s_organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Organismes.nom']);
  601 +
  602 + $categories = $this->Materiels->Categories;
  603 +
  604 + $this->set(compact('s_sur_categories', 's_categories', 's_sous_categories', 's_groupes_thematiques', 's_groupes_metiers', 's_organismes', 'categories'));
  605 +
  606 + $resultTri = $this->request->session()->read("resultTri");
  607 +
  608 + if(!(in_array($this->role, ['Administration', 'Administration Plus', 'Super Administrateur']))) {
  609 + $conditionNotArchived = ['Materiels.status !=' => 'ARCHIVED'];
  610 + }else {
  611 + $conditionNotArchived = '';
  612 + }
  613 +
  614 + // some data POSTED (au moins le champ de recherche generale) ?
  615 + if ( isset($this->request->data['s_all']) || isset($this->request->data['s_all_2']) || isset($this->request->data['s_designation'])) {
  616 + $generalFieldConditions = NULL;
  617 + // if general field set (s_all), then set general request for it
  618 + if (isset($this->request->data['s_all'])) {
  619 + $all = $this->request->data['s_all'];
  620 + $generalFieldConditions = ['OR' => [
  621 + 'Materiels.designation LIKE' => '%'.$all.'%',
  622 + 'Materiels.numero_laboratoire LIKE' => '%'.$all.'%',
  623 + 'Materiels.numero_inventaire_organisme LIKE' => '%'.$all.'%',
  624 + 'Materiels.numero_inventaire_old LIKE' => '%'.$all.'%',
  625 + 'Materiels.numero_commande LIKE' => '%'.$all.'%',
  626 + 'Materiels.description LIKE' => '%'.$all.'%',
  627 + 'Materiels.fournisseur LIKE' => '%'.$all.'%',
  628 + 'Materiels.nom_responsable LIKE' => '%'.$all.'%',
  629 + 'Materiels.email_responsable LIKE' => '%'.$all.'%',
  630 + 'Materiels.code_comptable LIKE' => '%'.$all.'%',
  631 + 'Materiels.numero_serie LIKE' => '%'.$all.'%',
  632 + 'Materiels.date_acquisition LIKE' => '%'.$all.'%',
  633 + 'Materiels.date_reception LIKE' => '%'.$all.'%',
  634 + ]];
  635 + }
  636 + if (isset($this->request->data['s_all_2'])) {
  637 + $all = $this->request->data['s_all_2'];
  638 + $generalFieldConditions = ['OR' => [
  639 + 'Materiels.designation LIKE' => '%'.$all.'%',
  640 + 'Materiels.numero_laboratoire LIKE' => '%'.$all.'%',
  641 + 'Materiels.numero_inventaire_organisme LIKE' => '%'.$all.'%',
  642 + 'Materiels.numero_inventaire_old LIKE' => '%'.$all.'%',
  643 + 'Materiels.numero_commande LIKE' => '%'.$all.'%',
  644 + 'Materiels.description LIKE' => '%'.$all.'%',
  645 + 'Materiels.fournisseur LIKE' => '%'.$all.'%',
  646 + 'Materiels.nom_responsable LIKE' => '%'.$all.'%',
  647 + 'Materiels.email_responsable LIKE' => '%'.$all.'%',
  648 + 'Materiels.code_comptable LIKE' => '%'.$all.'%',
  649 + 'Materiels.numero_serie LIKE' => '%'.$all.'%',
  650 + 'Materiels.date_acquisition LIKE' => '%'.$all.'%',
  651 + 'Materiels.date_reception LIKE' => '%'.$all.'%',
  652 + ]];
  653 + }
  654 + $specificFieldsConditions = NULL;
  655 + // au moins un champ specifique rempli ?
  656 + if ( isset($this->request->data['s_designation']) ) {
  657 + // Materiel type
  658 + $matostype = $this->request->data['s_matostype'];
  659 + $matostypeRequest = NULL;
  660 +
  661 + switch ($matostype) {
  662 + // Administratif
  663 + case 'A':
  664 + $matostypeRequest['Materiels.materiel_administratif ='] = '1';
  665 + break;
  666 + // Technique
  667 + case 'T':
  668 + $matostypeRequest['Materiels.materiel_technique ='] = '1';
  669 + break;
  670 + // Admin et Tech
  671 + case 'AT':
  672 + $matostypeRequest['Materiels.materiel_administratif ='] = '1';
  673 + $matostypeRequest['Materiels.materiel_technique ='] = '1';
  674 + break;
  675 + // Admin ONLY
  676 + case 'AO':
  677 + $matostypeRequest['Materiels.materiel_administratif ='] = '1';
  678 + $matostypeRequest['Materiels.materiel_technique ='] = '0';
  679 + break;
  680 + // Tech ONLY
  681 + case 'TO':
  682 + $matostypeRequest['Materiels.materiel_administratif ='] = '0';
  683 + $matostypeRequest['Materiels.materiel_technique ='] = '1';
  684 + break;
  685 + }
  686 +
  687 + $periode_acquisitionRequest = NULL;
  688 + $date_acquisition = NULL;
  689 + if ($this->request->data['s_periode_acquisition1'] != '')
  690 + $periode_acquisitionRequest['Materiels.date_acquisition >='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->data['s_periode_acquisition1'])));
  691 + if ($this->request->data['s_periode_acquisition2'] != '')
  692 + $periode_acquisitionRequest['Materiels.date_acquisition <='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->data['s_periode_acquisition2'])));
  693 + if ($this->request->data['s_date_acquisition'] != '')
  694 + $date_acquisition['Materiels.date_acquisition LIKE'] = '%'.date('Y-m-d', strtotime(str_replace('/', '-', $this->request->data['s_date_acquisition']))).'%';
  695 +
  696 + $montantRequest = [];
  697 + if ($this->request->data['s_prix_ht_inf'] != '')
  698 + $montantRequest['Materiels.prix_ht <='] = $this->request->data['s_prix_ht_inf'];
  699 + if ($this->request->data['s_prix_ht_sup'] != '')
  700 + $montantRequest['Materiels.prix_ht >='] = $this->request->data['s_prix_ht_sup'];
  701 +
  702 + $specificFieldsConditions = [
  703 + 'Materiels.designation LIKE' => '%'.$this->request->data['s_designation'].'%',
  704 + 'Materiels.numero_laboratoire LIKE' => '%'.$this->request->data['s_numero_laboratoire'].'%',
  705 + $this->getConditionForField('numero_commande'),
  706 + $date_acquisition,
  707 + $periode_acquisitionRequest,
  708 + $this->getConditionForFieldNumber('prix_ht'),
  709 + $montantRequest,
  710 + $this->getConditionForFieldNumber('sur_categorie_id'),
  711 + $this->getConditionForFieldNumber('categorie_id'),
  712 + $this->getConditionForFieldNumber('sous_categorie_id'),
  713 + $this->getConditionForField('nom_responsable'),
  714 + $this->getConditionForField('numero_inventaire_organisme'),
  715 + $this->getConditionForField('numero_inventaire_old'),
  716 + $this->getConditionForFieldNumber('groupes_metier_id'),
  717 + $this->getConditionForFieldNumber('groupes_thematique_id'),
  718 +
  719 + $this->getConditionForFieldNumber('organisme_id'),
  720 + $matostypeRequest,
  721 + ];
  722 + if($this->request->data['s_status'] != '') {
  723 + array_push($specificFieldsConditions, ['Materiels.status =' => $this->request->data['s_status']]);
  724 + }
  725 + }
  726 +
  727 + // CONSTRUCTION DE LA REQUETE SQL COMPLETE = $specificFieldsConditions OR $generalFieldConditions (mais entre chaque champ, c'est un AND)
  728 + // by default, no sort
  729 +
  730 + if (isset($this->request->data['s_all_2']) && $this->request->data['s_all_2'] != '') {
  731 + $conditions = [$generalFieldConditions, $conditionNotArchived];
  732 + }
  733 + else if (isset($this->request->data['s_all']) && $this->request->data['s_all'] != '') {
  734 + $conditions = [$generalFieldConditions, $conditionNotArchived];
  735 + }
  736 + else {
  737 + $conditions = [$specificFieldsConditions, $conditionNotArchived];
  738 + }
  739 +
  740 + $lastResults = $this->Materiels->find('all', ['limit' => 1000, 'conditions' => $conditions]);
  741 +
  742 + $this->paginate = ['limit' => 1000];
  743 + $_results = $this->paginate($lastResults);
  744 + $this->set(compact('_results'));
  745 +
  746 + //pour l'export
  747 + $this->request->session()->write("result", $lastResults->toArray());
  748 +
  749 + } // end if()
  750 + else if (isset($resultTri) && strstr($this->request->here(), 'sort') != false && strstr($this->request->here(), 'direction') != false) {
  751 + $findedMateriel = [];
  752 +
  753 + foreach($resultTri as $r) {
  754 + array_push($findedMateriel, $r->id);
  755 + }
  756 + $res = $this->Materiels->find('all', ['limit' => 1000]);
  757 + for($i = 0; $i < sizeof($findedMateriel); $i++) {
  758 + $res->orWhere(['id =' => $findedMateriel[$i]]);
  759 + }
  760 +
  761 + $this->paginate = ['limit' => 1000];
  762 + $_results = $this->paginate($res);
  763 + $this->set(compact('_results'));
  764 +
  765 + //pour l'export
  766 + $this->request->session()->write("result", $res->toArray());
  767 + }
  768 + }
  769 +
  770 + /**
  771 + group update status + exportAll
  772 + */
  773 + public function execActions() {
  774 + if (isset($this->request->data['updateSelectedStatus'])) {
  775 + $this->updateSelectedStatus();
  776 + }
  777 + else {
  778 + $this->export();
  779 + }
  780 + }
  781 +
  782 +
  783 + /**
  784 + * group update status (selected from materiels/index)
  785 + */
  786 + private function updateSelectedStatus() {
  787 +
  788 + if (isset($this->request->data) && sizeof($this->request->data) > 0) {
  789 + $this->myDebug("IN UPDATE");
  790 + $this->myDebug($this->request->data);
  791 + $what = $this->request->data['what'];
  792 + $nb = 0;
  793 +
  794 + if ( in_array($what,$this->NOTARCHIVED) ) {
  795 + foreach ($this->request->data as $id => $value) : if ($value == 1) {
  796 + switch ($what) {
  797 + case 'CREATED': $new = 'VALIDATED'; break;
  798 + case 'VALIDATED': $new = 'TOBEARCHIVED'; break;
  799 + case 'TOBEARCHIVED': $new = 'ARCHIVED';
  800 + break;
  801 + }
  802 + //if mode_debug desactivate
  803 + if (!$this->isLabinventDebugMode()) {
  804 + $materiel = $this->Materiels->get($id)->set('status', $new);
  805 + $this->Materiels->save($materiel, ['checkRules' => false, 'checkExisting' => false]);
  806 + }
  807 + $nb++;
  808 + } endforeach;
  809 + if ($nb != 0) $this->Flash->success(__($nb.' matériel(s) mis à jour'));
  810 + $this->myDebug("Nb matos = ".$nb);
  811 +
  812 + if(!$this->isLabinventDebugMode()) return $this->redirect(['action' => 'index', $what]);
  813 + }
  814 + }
  815 + }
  816 +
  817 + /**
  818 + *
  819 + * Export method
  820 + *
  821 + * Generation d'un fichier .csv comportant la date du jour
  822 + *
  823 + * CSV export of the list of materiels
  824 + * This action is called from 3 different sources :
  825 + * - tools
  826 + * - materiels/find
  827 + * - materiels/index (from the 2 submit green buttons named "Exporter la liste...")
  828 + *
  829 + * Optional parameter "what:value" may be passed when calling this action, and is read from $this->params['named']['what']
  830 + * ex : materiels/export/what:toValidate
  831 + *
  832 + */
  833 + public function export() {
  834 +
  835 + $materiels = NULL;
  836 + $surCategories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray();
  837 + $categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray();
  838 + $sousCategories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray();
  839 + $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray();
  840 + $groupesMetiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray();
  841 + $organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray();
  842 + $sites = $this->Materiels->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray();
  843 +
  844 + $what = '';
  845 +
  846 + $this->myDebug($this->request->data);
  847 +
  848 + if ( isset($this->request->data['export'])) {
  849 + $this->myDebug("IN EXPORT");
  850 + $what = $this->request->data['what'];
  851 +
  852 + $selectedMateriels = [];
  853 + $i = 0;
  854 + $data = $this->request->data;
  855 + foreach ($data as $val) {
  856 + if ($val == 1) {
  857 + $selectedMateriels[$i] = key($data);
  858 + $i++;
  859 + }
  860 + next($data);
  861 + }
  862 +
  863 + $this->myDebug($selectedMateriels);
  864 +
  865 + if (sizeof($selectedMateriels) > 0) {
  866 +
  867 + $materiels = $this->Materiels->find('all')->where(['Materiels.id' => $selectedMateriels[0]]);
  868 +
  869 + for ($j = 0; $j < sizeof($selectedMateriels); $j++) {
  870 + $materiels->orWhere(['Materiels.id' => $selectedMateriels[$j]]);
  871 + }
  872 +
  873 + $this->myDebug($materiels);
  874 + }
  875 +
  876 + }
  877 +
  878 + else if (isset($this->request->data['exportAll'])) {
  879 + $this->myDebug("IN EXPORTALL");
  880 +
  881 + if (isset($this->request->data['what'])) {
  882 + $what=$this->request->data['what'];
  883 + $status=$what;
  884 + $materiels = $this->Materiels->find('all', ['conditions' => ['Materiels.status =' => $status]]);
  885 + }
  886 + else {
  887 + $status = 'ARCHIVED';
  888 + $materiels = $this->Materiels->find('all', ['conditions' => ['Materiels.status !=' => $status]]);
  889 + }
  890 +
  891 + $this->myDebug("what is ".$what);
  892 + $this->myDebug("statut is ".$status);
  893 +
  894 +
  895 + }
  896 +
  897 +
  898 + else if (isset($this->passedArgs[0])) {
  899 +
  900 + $this->myDebug("OTHER CASE 3");
  901 + $what = $this->passedArgs[0];
  902 + if ($what == 'search') {
  903 + $materiels = $this->request->session()->read("result");
  904 + }
  905 +
  906 + }
  907 +
  908 + else {
  909 + $this->myDebug("OTHER CASE 4");
  910 + $materiels = $this->Materiels->find('all', ['conditions' => ['Materiels.status !=' => 'ARCHIVED']]);
  911 + }
  912 +
  913 + $this->myDebug("Nb matos = ".count($materiels));
  914 + $this->myDebug($materiels, true);
  915 +
  916 +
  917 +
  918 + ini_set('max_execution_time', 600);
  919 +
  920 + $filename = 'export_'.date("Y-m-d") . '.csv';
  921 + $csv_file = fopen('php://output', 'w');
  922 +
  923 + $this->response->header(['Content-type: application/csv', 'Content-Disposition: attachment; filename="'.$filename.'"']);
  924 + $this->response->sendHeaders();
  925 +
  926 + $header_row = [
  927 + "id", "Designation", "Sur-categorie", "Categorie", "Sous-categorie", "Numero interne", "Description", "Organisme",
  928 + "Mat. administratif", "Mat. technique", "Statut", "Date d'acquisition", "Date de reception", "Fournisseur", "Prix HT",
  929 + "EOTP", "Numero de commande", "Code comptable", "Numero de serie", "Grp. thematique", "Grp. metier",
  930 + "Numero inventaire organisme", "Ancien Numero inventaire", "Site stockage", "Nom responsable", "Email responsable"];
  931 +
  932 + fputcsv($csv_file, $header_row, ';');
  933 +
  934 + foreach($materiels as $result) {
  935 + $row = [
  936 + utf8_encode($result->id),
  937 + $result->designation,
  938 + ];
  939 +
  940 + if(isset($surCategories[$result->sur_categorie_id])) {
  941 + array_push($row, $surCategories[$result->sur_categorie_id]);
  942 + }
  943 + else {
  944 + array_push($row, "");
  945 + }
  946 +
  947 + if(isset($categories[$result->categorie_id])) {
  948 + array_push($row, $categories[$result->categorie_id]);
  949 + }
  950 + else {
  951 + array_push($row, "");
  952 + }
  953 +
  954 + if(isset($sousCategories[$result->sous_categorie_id])) {
  955 + array_push($row, $sousCategories[$result->sous_categorie_id]);
  956 + }
  957 + else {
  958 + array_push($row, "");
  959 + }
  960 +
  961 + array_push($row, $result->numero_laboratoire);
  962 + array_push($row, $result->description);
  963 +
  964 + if(isset($organismes[$result->organisme_id])) {
  965 + array_push($row, $organismes[$result->organisme_id]);
  966 + }
  967 + else {
  968 + array_push($row, "");
  969 + }
  970 +
  971 + array_push($row, $result->materiel_administratif);
  972 + array_push($row, $result->materiel_technique);
  973 + array_push($row, $result->status);
  974 + array_push($row, $result->date_acquisition);
  975 + array_push($row, $result->date_reception);
  976 + array_push($row, $result->fournisseur);
  977 + array_push($row, $result->prix_ht);
  978 + array_push($row, $result->eotp);
  979 + array_push($row, $result->numero_commande);
  980 + array_push($row, $result->code_comptable);
  981 + array_push($row, $result->numero_serie);
  982 +
  983 + if(isset($groupesThematiques[$result->groupes_thematique_id])) {
  984 + array_push($row, $groupesThematiques[$result->groupes_thematique_id]);
  985 + }
  986 + else {
  987 + array_push($row, "");
  988 + }
  989 + if(isset($groupesMetiers[$result->groupes_metier_id])) {
  990 + array_push($row, $groupesMetiers[$result->groupes_metier_id]);
  991 + }
  992 + else {
  993 + array_push($row, "");
  994 + }
  995 +
  996 + array_push($row, $result->numero_inventaire_organisme);
  997 + array_push($row, $result->numero_inventaire_old);
  998 +
  999 + if(isset($sites[$result->site_id])) {
  1000 + array_push($row, $sites[$result->site_id].'-'.$result->lieu_detail);
  1001 + }
  1002 + else {
  1003 + array_push($row, "");
  1004 + }
  1005 +
  1006 + array_push($row, $result->nom_responsable);
  1007 + array_push($row, $result->email_responsable);
  1008 +
  1009 + fputcsv($csv_file,$row,';','"');
  1010 +
  1011 + }
  1012 + sleep(3);
  1013 + fclose($csv_file);
  1014 +
  1015 + exit();
  1016 + //Sans le exit() ca ne fonctionne pas pour de petite liste, et dans tous les cas une ligne en javascript est écris si il n'y a pas exit()
  1017 +
  1018 + //La redirection suivante fonctionne parfaitement, mais inutile à cause du exit()
  1019 + /*
  1020 + if ($what != '' && $what != 'search') return $this->redirect(['action' => 'index', $what]);
  1021 + else if ($what == 'search') return $this->redirect('javascript:window.history.go(-3)');
  1022 + else return $this->redirect(['action' => 'index']);
  1023 + */
  1024 +
  1025 +
  1026 + }
  1027 +
  1028 +
  1029 + /**
  1030 + * SetLabelIsPlacedOrNotPlaced method
  1031 + *
  1032 + * @param string $id
  1033 + * @param string $from
  1034 + * @param string $printed
  1035 + * @return \Cake\Network\Response|NULL
  1036 + */
  1037 + public function setLabelIsPlacedOrNotPlaced($id,$from,$printed=TRUE) {
  1038 + $materiel = $this->Materiels->get($id)->set('etiquette', $printed);
  1039 +
  1040 + if ($this->Materiels->save($materiel, ['checkRules' => false, 'checkExisting' => false])) {
  1041 + $this->Flash->success(__('L\'étiquette a bien été éditer.'));
  1042 + // Envoi email seulement si etiquette posée
  1043 + if ($printed) {
  1044 + $this->sendEmailToManagement($id);
  1045 + }
  1046 + }
  1047 + else {
  1048 + $this->Flash->error(__('L\'étiquette n\'a pas pu être édité.'));
  1049 + }
  1050 +
  1051 + return $this->redirect($this->referer());
  1052 + }
  1053 +
  1054 + /**
  1055 + * SetLabelIsPlaced method
  1056 + *
  1057 + * @param string $id
  1058 + * @param string $from
  1059 + */
  1060 + public function setLabelIsPlaced($id,$from) {
  1061 + $this->setLabelIsPlacedOrNotPlaced($id, $from, TRUE);
  1062 + }
  1063 +
  1064 + /**
  1065 + * SetLabelIsNotPlaced method
  1066 + *
  1067 + * @param string $id
  1068 + * @param string $from
  1069 + */
  1070 + public function setLabelIsNotPlaced($id,$from) {
  1071 + $this->setLabelIsPlacedOrNotPlaced($id, $from, FALSE);
  1072 + }
  1073 +
  1074 +
  1075 + /**
  1076 + * PrintLabelRuban method
  1077 + *
  1078 + * @param string $id
  1079 + * @param string $from
  1080 + */
  1081 + public function printLabelRuban($id, $from='view') {
  1082 + $this->printLabel('ruban', $id, $from);
  1083 + }
  1084 +
  1085 + /**
  1086 + * PrintLabelEtiquette method
  1087 + *
  1088 + * @param string $id
  1089 + * @param string $from
  1090 + *
  1091 + public function printLabelEtiquette($id, $from='view') {
  1092 + $this->printLabel('etiquette', $id, $from);
  1093 + }*/
  1094 +
  1095 +
  1096 + /**
  1097 + * PrintLabel method
  1098 + *
  1099 + * @param string $type
  1100 + * @param string $id
  1101 + * @param string $from
  1102 + */
  1103 + private function printLabel($type='etiquette', $id, $from='view') {
  1104 +
  1105 + $materiel = $this->Materiels->get($id);
  1106 +
  1107 + $numeroLab = $materiel->numero_laboratoire;
  1108 +
  1109 + $organisme = $materiel->organisme_id;
  1110 +
  1111 + $numeroInventaireOrganisme = $materiel->numero_inventaire_organisme;
  1112 + $dateAcquisition = $materiel->date_acquisition;
  1113 +
  1114 + $filename = 'inventirap_label.label';
  1115 + $file = fopen('php://output', 'w');
  1116 + $this->response->header(['Content-type: application/xml', 'Content-Disposition: attachment; filename="'.$filename.'"']);
  1117 + $this->response->sendHeaders();
  1118 +
  1119 +
  1120 + /*
  1121 + * SIMPLE LABEL FOR PRINTER DYMO LabelWriter 450 : NO LOGO
  1122 + */
  1123 + /*
  1124 + '<?xml version="1.0" encoding="utf-8"?>
  1125 + <DieCutLabel Version="8.0" Units="twips">
  1126 + <PaperOrientation>Landscape</PaperOrientation>
  1127 + <Id>MultiPurpose11355</Id>
  1128 + <PaperName>11355 Multi-Purpose</PaperName>
  1129 + <DrawCommands>
  1130 + <RoundRectangle X="0" Y="0" Width="1080" Height="2880" Rx="180" Ry="180"/>
  1131 + </DrawCommands>
  1132 + <ObjectInfo>
  1133 + <TextObject>
  1134 + <Name>TEXTE</Name>
  1135 + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1136 + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/>
  1137 + <LinkedObjectName></LinkedObjectName>
  1138 + <Rotation>Rotation0</Rotation>
  1139 + <IsMirrored>False</IsMirrored>
  1140 + <IsVariable>False</IsVariable>
  1141 + <HorizontalAlignment>Left</HorizontalAlignment>
  1142 + <VerticalAlignment>Middle</VerticalAlignment>
  1143 + <TextFitMode>None</TextFitMode>
  1144 + <UseFullFontHeight>True</UseFullFontHeight>
  1145 + <Verticalized>False</Verticalized>
  1146 + <StyledText>
  1147 + <Element>
  1148 + <String>'
  1149 + ."$numeroLab"."\n"
  1150 + ."$dateAcquisition"."\n"
  1151 + ."$organisme"."\n"
  1152 + .'</String>
  1153 + <Attributes>
  1154 + <Font Family="Lucida Grande" Size="10" Bold="False" Italic="False" Underline="False" Strikeout="False"/>
  1155 + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1156 + </Attributes>
  1157 + </Element>
  1158 + </StyledText>
  1159 + </TextObject>
  1160 + <Bounds X="326.4" Y="57.59995" Width="2467.2" Height="940.8"/>
  1161 + </ObjectInfo>
  1162 + </DieCutLabel>'
  1163 + ."\n"
  1164 + */
  1165 +
  1166 + /*
  1167 + * ETIQUETTE (19x51 mm)
  1168 + *
  1169 + * LABEL FOR PRINTER DYMO LabelWriter 450 : WITH LOGO
  1170 + */
  1171 + if ($type == 'etiquette') fputs($file,
  1172 +
  1173 + '<?xml version="1.0" encoding="utf-8"?>
  1174 + <DieCutLabel Version="8.0" Units="twips">
  1175 + <PaperOrientation>Landscape</PaperOrientation>
  1176 + <Id>MultiPurpose11355</Id>
  1177 + <PaperName>11355 Multi-Purpose</PaperName>
  1178 + <DrawCommands>
  1179 + <RoundRectangle X="0" Y="0" Width="1080" Height="2880" Rx="180" Ry="180"/>
  1180 + </DrawCommands>
  1181 + <ObjectInfo>
  1182 + <TextObject>
  1183 + <Name>TEXTE</Name>
  1184 + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1185 + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/>
  1186 + <LinkedObjectName></LinkedObjectName>
  1187 + <Rotation>Rotation0</Rotation>
  1188 + <IsMirrored>False</IsMirrored>
  1189 + <IsVariable>False</IsVariable>
  1190 + <HorizontalAlignment>Left</HorizontalAlignment>
  1191 + <VerticalAlignment>Middle</VerticalAlignment>
  1192 + <TextFitMode>ShrinkToFit</TextFitMode>
  1193 + <UseFullFontHeight>True</UseFullFontHeight>
  1194 + <Verticalized>False</Verticalized>
  1195 + <StyledText>
  1196 + <Element>
  1197 + <String>'
  1198 +
  1199 + ."$numeroLab"."\n"
  1200 + ."$dateAcquisition"."\n"
  1201 + ."$organisme".($numeroInventaireOrganisme?'-'."$numeroInventaireOrganisme":'')
  1202 + .'</String>
  1203 + <Attributes>'
  1204 + .'<Font Family="Arial" Size="48" Bold="False" Italic="False" Underline="False" Strikeout="False"/>
  1205 + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1206 + </Attributes>
  1207 + </Element>
  1208 + </StyledText>
  1209 + </TextObject>'
  1210 + .'<Bounds X="326.4" Y="120.6717" Width="1596.468" Height="844.4843"/>
  1211 + </ObjectInfo>
  1212 + <ObjectInfo>
  1213 + <ImageObject>
  1214 + <Name>GRAPHISME</Name>
  1215 + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1216 + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/>
  1217 + <LinkedObjectName></LinkedObjectName>
  1218 + <Rotation>Rotation0</Rotation>
  1219 + <IsMirrored>False</IsMirrored>
  1220 + <IsVariable>False</IsVariable>'
  1221 + .'<Image>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</Image>
  1222 + <ScaleMode>Uniform</ScaleMode>
  1223 + <BorderWidth>0</BorderWidth>
  1224 + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1225 + <HorizontalAlignment>Right</HorizontalAlignment>'
  1226 + .'<VerticalAlignment>Center</VerticalAlignment>
  1227 + </ImageObject>'
  1228 + .'<Bounds X="2146.378" Y="267.5423" Width="544.0805" Height="629.0975"/>
  1229 + </ObjectInfo>
  1230 + </DieCutLabel>'
  1231 + ."\n"
  1232 +
  1233 + ); // fputs (etiquette)
  1234 +
  1235 +
  1236 + /*
  1237 + * RUBAN (12mm)
  1238 + *
  1239 + * LABEL FOR PRINTER DYMO LabelManager PnP : 2 lines WITH LOGO
  1240 + */
  1241 + if ($type == 'ruban') fputs($file,
  1242 +
  1243 + '<?xml version="1.0" encoding="utf-8"?>
  1244 + <ContinuousLabel Version="8.0" Units="twips">
  1245 + <PaperOrientation>Landscape</PaperOrientation>
  1246 + <Id>Tape12mm</Id>
  1247 + <PaperName>12mm</PaperName>
  1248 + <LengthMode>Auto</LengthMode>
  1249 + <LabelLength>0</LabelLength>
  1250 + <RootCell>
  1251 + <Length>0</Length>
  1252 + <LengthMode>Auto</LengthMode>
  1253 + <BorderWidth>0</BorderWidth>
  1254 + <BorderStyle>Solid</BorderStyle>
  1255 + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1256 + <SubcellsOrientation>Horizontal</SubcellsOrientation>
  1257 + <Subcells>
  1258 + <Cell>
  1259 + <TextObject>
  1260 + <Name>TEXTE_1</Name>
  1261 + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1262 + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/>
  1263 + <LinkedObjectName></LinkedObjectName>
  1264 + <Rotation>Rotation0</Rotation>
  1265 + <IsMirrored>False</IsMirrored>
  1266 + <IsVariable>False</IsVariable>
  1267 + <HorizontalAlignment>Left</HorizontalAlignment>
  1268 + <VerticalAlignment>Middle</VerticalAlignment>
  1269 + <TextFitMode>ShrinkToFit</TextFitMode>
  1270 + <UseFullFontHeight>True</UseFullFontHeight>
  1271 + <Verticalized>False</Verticalized>
  1272 + <StyledText>
  1273 + <Element>
  1274 + <String>'
  1275 + .trim("$numeroLab / "."$organisme")."\n"
  1276 + ."$dateAcquisition " .trim($numeroInventaireOrganisme?'/ '."$numeroInventaireOrganisme":'')
  1277 + .'</String>
  1278 + <Attributes>
  1279 + <Font Family="Arial" Size="24" Bold="True" Italic="False" Underline="False" Strikeout="False"/>
  1280 + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1281 + </Attributes>
  1282 + </Element>
  1283 + </StyledText>
  1284 + </TextObject>
  1285 + <ObjectMargin Left="200" Right="200" Top="0" Bottom="0"/>
  1286 + <Length>2606.94</Length>
  1287 + <LengthMode>Fixed</LengthMode>
  1288 + <BorderWidth>0</BorderWidth>
  1289 + <BorderStyle>Solid</BorderStyle>
  1290 + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1291 + </Cell>
  1292 + <Cell>
  1293 + <ImageObject>
  1294 + <Name>GRAPHISME</Name>
  1295 + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1296 + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/>
  1297 + <LinkedObjectName></LinkedObjectName>
  1298 + <Rotation>Rotation0</Rotation>
  1299 + <IsMirrored>False</IsMirrored>
  1300 + <IsVariable>False</IsVariable>
  1301 + <Image>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</Image>'
  1302 + .'<ScaleMode>Uniform</ScaleMode>
  1303 + <BorderWidth>0</BorderWidth>
  1304 + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1305 + <HorizontalAlignment>Right</HorizontalAlignment>
  1306 + <VerticalAlignment>Center</VerticalAlignment>
  1307 + </ImageObject>
  1308 + <ObjectMargin Left="200" Right="200" Top="0" Bottom="0"/>
  1309 + <Length>863.9999</Length>
  1310 + <LengthMode>Auto</LengthMode>
  1311 + <BorderWidth>0</BorderWidth>
  1312 + <BorderStyle>Solid</BorderStyle>
  1313 + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1314 + </Cell>
  1315 + </Subcells>
  1316 + </RootCell>
  1317 + </ContinuousLabel>'
  1318 + ."\n"
  1319 +
  1320 + ); // fputs (ruban 2 lines)
  1321 +
  1322 +
  1323 +
  1324 + /*
  1325 + * RUBAN
  1326 + *
  1327 + * LABEL FOR PRINTER DYMO LabelMznzhrt PnP : 3 lines WITH LOGO
  1328 + */
  1329 + if ($type == 'ruban3lines') fputs($file,
  1330 +
  1331 + '<?xml version="1.0" encoding="utf-8"?>
  1332 + <ContinuousLabel Version="8.0" Units="twips">
  1333 + <PaperOrientation>Landscape</PaperOrientation>'
  1334 + /*
  1335 + // 9mm
  1336 + <Id>Tape9mm</Id>
  1337 + <PaperName>9mm</PaperName>
  1338 + */
  1339 + // 12mm
  1340 + .'<Id>Tape12mm</Id>
  1341 + <PaperName>12mm</PaperName>
  1342 + <LengthMode>Auto</LengthMode>
  1343 + <LabelLength>0</LabelLength>
  1344 + <RootCell>
  1345 + <Length>0</Length>
  1346 + <LengthMode>Auto</LengthMode>
  1347 + <BorderWidth>0</BorderWidth>
  1348 + <BorderStyle>Solid</BorderStyle>
  1349 + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1350 + <SubcellsOrientation>Horizontal</SubcellsOrientation>
  1351 + <Subcells>
  1352 + <Cell>
  1353 + <TextObject>
  1354 + <Name>TEXTE</Name>
  1355 + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1356 + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/>
  1357 + <LinkedObjectName></LinkedObjectName>
  1358 + <Rotation>Rotation0</Rotation>
  1359 + <IsMirrored>False</IsMirrored>
  1360 + <IsVariable>False</IsVariable>
  1361 + <HorizontalAlignment>Left</HorizontalAlignment>
  1362 + <VerticalAlignment>Middle</VerticalAlignment>
  1363 + <TextFitMode>AlwaysFit</TextFitMode>
  1364 + <UseFullFontHeight>True</UseFullFontHeight>
  1365 + <Verticalized>False</Verticalized>
  1366 + <StyledText>
  1367 + <Element>
  1368 + <String>'
  1369 + ."$numeroLab"."\n"
  1370 + ."$organisme".($numeroInventaireOrganisme?'-'."$numeroInventaireOrganisme":'')."\n"
  1371 + ."$dateAcquisition"
  1372 + .'</String>
  1373 + <Attributes>
  1374 + <Font Family="Arial" Size="11" Bold="True" Italic="False" Underline="False" Strikeout="False"/>
  1375 + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1376 + </Attributes>
  1377 + </Element>
  1378 + </StyledText>
  1379 + </TextObject>
  1380 + <ObjectMargin Left="200" Right="200" Top="0" Bottom="0"/>
  1381 + <Length>1477.513</Length>
  1382 + <LengthMode>Fixed</LengthMode>
  1383 + <BorderWidth>0</BorderWidth>
  1384 + <BorderStyle>Solid</BorderStyle>
  1385 + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1386 + </Cell>
  1387 + <Cell>
  1388 + <ImageObject>
  1389 + <Name>GRAPHISME</Name>
  1390 + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1391 + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/>
  1392 + <LinkedObjectName></LinkedObjectName>
  1393 + <Rotation>Rotation0</Rotation>
  1394 + <IsMirrored>False</IsMirrored>
  1395 + <IsVariable>False</IsVariable>
  1396 + <Image>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</Image>
  1397 + <ScaleMode>Uniform</ScaleMode>
  1398 + <BorderWidth>0</BorderWidth>
  1399 + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1400 + <HorizontalAlignment>Right</HorizontalAlignment>
  1401 + <VerticalAlignment>Center</VerticalAlignment>
  1402 + </ImageObject>
  1403 + <ObjectMargin Left="200" Right="200" Top="0" Bottom="0"/>
  1404 + <Length>800</Length>
  1405 + <LengthMode>Auto</LengthMode>
  1406 + <BorderWidth>0</BorderWidth>
  1407 + <BorderStyle>Solid</BorderStyle>
  1408 + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/>
  1409 + </Cell>
  1410 + </Subcells>
  1411 + </RootCell>
  1412 + </ContinuousLabel>'
  1413 + ."\n"
  1414 +
  1415 + ); // fputs (ruban 3 lines)
  1416 +
  1417 + sleep(3);
  1418 + fclose($file);
  1419 + exit();
  1420 +
  1421 +
  1422 + }
  1423 +
  1424 + // called from Javascript (Ajax)
  1425 + public function getDateGarantie($dateORjour, $dureeORmois, $uniteORannee, $duree = null, $unite = null) {
  1426 +
  1427 + if($duree != null && $unite != null) {
  1428 + $date = $dateORjour.'-'.$dureeORmois.'-'.$uniteORannee;
  1429 + } else {
  1430 + $date = $dateORjour;
  1431 + $duree = $dureeORmois;
  1432 + $unite = $uniteORannee;
  1433 + }
  1434 +
  1435 + $date_next = date_create_from_format('d-m-Y', $date);
  1436 +
  1437 + switch($unite) {
  1438 + case "Mois":
  1439 + date_add($date_next, date_interval_create_from_date_string($duree.' months'));
  1440 + break;
  1441 + case "Ans":
  1442 + date_add($date_next, date_interval_create_from_date_string($duree.' years'));
  1443 + break;
  1444 + }
  1445 +
  1446 + $this->set ('date', date_format($date_next, 'd-m-Y'));
  1447 +
  1448 +
  1449 + $this->viewBuilder()->layout = 'ajax';
  1450 + }
  1451 +
  1452 +
  1453 +}
... ...
src/Model/Table/CategoriesTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
4   -use App\Model\Entity\Category;
5   -use Cake\ORM\Query;
6 4 use Cake\ORM\RulesChecker;
7 5 use Cake\ORM\Table;
8 6 use Cake\Validation\Validator;
... ...
src/Model/Table/ConfigurationsTable.php
... ... @@ -2,7 +2,6 @@
2 2 namespace App\Model\Table;
3 3  
4 4 use App\Model\Entity\Configuration;
5   -use Cake\ORM\Query;
6 5 use Cake\ORM\RulesChecker;
7 6 use Cake\ORM\Table;
8 7 use Cake\Validation\Validator;
... ...
src/Model/Table/DocumentsTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
4   -use App\Model\Entity\Document;
5   -use Cake\ORM\Query;
6 4 use Cake\ORM\RulesChecker;
7 5 use Cake\ORM\Table;
8 6 use Cake\Validation\Validator;
... ...
src/Model/Table/EmpruntsTable.php
... ... @@ -2,12 +2,11 @@
2 2 namespace App\Model\Table;
3 3  
4 4 use App\Model\Entity\Emprunt;
5   -use Cake\ORM\Query;
6 5 use Cake\ORM\RulesChecker;
7 6 use Cake\ORM\Table;
8   -use Cake\Validation\Validator;
9 7 use Cake\ORM\toArray;
10 8 use Cake\Validation\Validation;
  9 +use Cake\Validation\Validator;
11 10  
12 11  
13 12 /**
... ...
src/Model/Table/GroupesMetiersTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
4   -use App\Model\Entity\GroupesMetier;
5   -use Cake\ORM\Query;
6   -use Cake\ORM\RulesChecker;
7 4 use Cake\ORM\Table;
8 5 use Cake\Validation\Validator;
9 6  
... ...
src/Model/Table/GroupesThematiquesTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
4   -use App\Model\Entity\GroupesThematique;
5   -use Cake\ORM\Query;
6   -use Cake\ORM\RulesChecker;
7 4 use Cake\ORM\Table;
8 5 use Cake\Validation\Validator;
9 6  
... ...
src/Model/Table/MaterielsTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
4   -use App\Model\Entity\Materiel;
5   -use Cake\ORM\Query;
6 4 use Cake\ORM\RulesChecker;
7 5 use Cake\ORM\Table;
8 6 use Cake\Validation\Validator;
9 7 use Cake\ORM\TableRegistry;
  8 +use Cake\I18n\Time;
  9 +use Cake\I18n\Date;
10 10  
11 11 /**
12 12 * Materiels Model
... ... @@ -84,6 +84,14 @@ class MaterielsTable extends AppTable
84 84 */
85 85 public function validationDefault(Validator $validator)
86 86 {
  87 + $dateValide = function($entity) {
  88 + $time = Time::now(); // On récupère la date et l'heure actuelles
  89 + $today = (new date("$time->year-$time->month-$time->day"))->format('Ymd'); // On extrait la date on la formatte en un format comparable de type 20171231
  90 + $timeEntity = new time($entity);
  91 + $dateEntity = (new date("$timeEntity->year-$timeEntity->month-$timeEntity->day"))->format('Ymd');
  92 + return ($today >= $dateEntity);
  93 + };
  94 +
87 95 $validator
88 96 ->integer('id')
89 97 ->allowEmpty('id', 'create');
... ... @@ -120,12 +128,19 @@ class MaterielsTable extends AppTable
120 128 $configuration = TableRegistry::get('Configurations')->find()->where(['id =' => 1])->first();
121 129 if($configuration->date_commande_facultative) {
122 130 $validator
123   - ->allowEmpty('date_acquisition');
  131 + ->allowEmpty('date_acquisition')
  132 + ->add('date_acquisition', 'custom', [ // Ajouté par Thibault Ajas, le 28/04/2017
  133 + 'rule' => $dateValide,
  134 + 'message' => 'La date n\'est pas valide'
  135 + ]);
124 136 }
125 137 else {
126 138 $validator
127   - ->notEmpty('date_acquisition', 'Ce champ doit être rempli')
128   - ->date('date_acquisition', 'dmy', null);
  139 + ->notEmpty('date_acquisition', 'Ce champ doit être rempli')
  140 + ->add('date_acquisition', 'custom', [ // Ajouté par Thibault Ajas, le 28/04/2017
  141 + 'rule' => $dateValide,
  142 + 'message' => 'La date n\'est pas valide'
  143 + ]);
129 144 }
130 145  
131 146  
... ...
src/Model/Table/OrganismesTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
4   -use App\Model\Entity\Organisme;
5   -use Cake\ORM\Query;
6   -use Cake\ORM\RulesChecker;
7 4 use Cake\ORM\Table;
8 5 use Cake\Validation\Validator;
9 6  
... ...
src/Model/Table/SitesTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
4   -use App\Model\Entity\Site;
5   -use Cake\ORM\Query;
6   -use Cake\ORM\RulesChecker;
7 4 use Cake\ORM\Table;
8 5 use Cake\Validation\Validator;
9 6  
... ...
src/Model/Table/SousCategoriesTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
4   -use App\Model\Entity\SousCategory;
5   -use Cake\ORM\Query;
6 4 use Cake\ORM\RulesChecker;
7 5 use Cake\ORM\Table;
8 6 use Cake\Validation\Validator;
... ...
src/Model/Table/SuivisTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
4   -use App\Model\Entity\Suivi;
5   -use Cake\ORM\Query;
6 4 use Cake\ORM\RulesChecker;
7 5 use Cake\ORM\Table;
8 6 use Cake\Validation\Validator;
... ...
src/Model/Table/SurCategoriesTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
4   -use App\Model\Entity\SurCategory;
5   -use Cake\ORM\Query;
6 4 use Cake\ORM\RulesChecker;
7 5 use Cake\ORM\Table;
8 6 use Cake\Validation\Validator;
... ...
src/Model/Table/TypeDocumentsTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
4   -use App\Model\Entity\TypeDocument;
5   -use Cake\ORM\Query;
6   -use Cake\ORM\RulesChecker;
7 4 use Cake\ORM\Table;
8 5 use Cake\Validation\Validator;
9 6  
... ...
src/Model/Table/TypeSuivisTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
4   -use App\Model\Entity\TypeSuivi;
5   -use Cake\ORM\Query;
6   -use Cake\ORM\RulesChecker;
7 4 use Cake\ORM\Table;
8 5 use Cake\Validation\Validator;
9 6  
... ...
src/Model/Table/UsersTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
4   -use App\Model\Entity\User;
5   -use Cake\ORM\Query;
6 4 use Cake\ORM\RulesChecker;
7 5 use Cake\ORM\Table;
8   -use Cake\Validation\Validator;
9 6 use Cake\ORM\TableRegistry;
  7 +use Cake\Validation\Validator;
10 8  
11 9 /**
12 10 * Users Model
... ...
src/Template/Categories/index.ctp
1 1  
2 2 <div class="categories index">
3 3 <?php echo '<h2><i class="icon-list"></i> Liste des catégories</h2>'; ?>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <thead>
6 6 <tr>
7 7 <th class="actions"><?= __('') ?></th>
... ...
src/Template/Documents/index.ctp
1 1  
2 2 <div class="documents index">
3 3 <?php echo '<h2><i class="icon-list"></i> Liste des documents</h2>'; ?>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <thead>
6 6 <tr>
7 7 <th class="actions"><?= __('') ?></th>
... ...
src/Template/Emprunts/index.ctp
1 1  
2 2 <div class="emprunts index">
3 3 <?php echo '<h2><i class="icon-list"></i> Liste des emprunts ('.$nbEmprunts.')</h2>'; ?>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <thead>
6 6 <tr>
7 7 <th class="actions"><?= __('') ?></th>
... ...
src/Template/GroupesMetiers/index.ctp
1 1  
2 2 <div class="groupesMetiers index">
3 3 <?php echo '<h2><i class="icon-list"></i> Liste des '.$configuration->nom_groupe_metier.'</h2>'; ?>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <thead>
6 6 <tr>
7 7 <th class="actions"><?= __('') ?></th>
... ...
src/Template/GroupesThematiques/index.ctp
1 1  
2 2 <div class="groupesThematiques index">
3 3 <?php echo '<h2><i class="icon-list"></i> Liste des '.$configuration->nom_groupe_thematique.'s</h2>'; ?>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <thead>
6 6 <tr>
7 7 <th class="actions"><?= __('') ?></th>
... ...
src/Template/Materiels/find.ctp
... ... @@ -3,23 +3,23 @@
3 3 <h2>
4 4 <i class="icon-search"></i> Recherche de matériel
5 5 </h2>
6   -<?php
7   -$r = isset ($_results);
8   -
9   -if ($r) {
10   - echo '<div class="actions" style="margin-bottom: 20px; width: 100%; float: none; padding: 10px 0;">';
11   - echo $this->Html->link ( '<i class="icon-file"></i> Exporter la liste', [
12   - 'controller' => 'Materiels',
13   - 'action' => 'export',
14   - 'search'
15   - ], [
16   - 'title' => 'Editer le résultat de la recherche',
17   - 'style' => 'margin-right: 15px',
18   - 'escape' => false
19   - ]);
20   - echo '</div>';
21   -}
22   -?>
  6 + <?php
  7 + $r = isset ($_results);
  8 +
  9 + if ($r) {
  10 + echo '<div class="actions" style="margin-bottom: 20px; width: 100%; float: none; padding: 10px 0;">';
  11 + echo $this->Html->link ( '<i class="icon-file"></i> Exporter la liste', [
  12 + 'controller' => 'Materiels',
  13 + 'action' => 'export',
  14 + 'search'
  15 + ], [
  16 + 'title' => 'Editer le résultat de la recherche',
  17 + 'style' => 'margin-right: 15px',
  18 + 'escape' => false
  19 + ]);
  20 + echo '</div>';
  21 + }
  22 + ?>
23 23  
24 24 <h3 id="t_filter" style="cursor: pointer;">
25 25 <i
... ... @@ -28,170 +28,171 @@ if ($r) {
28 28 style="text-decoration: underline;">Filtres</span>
29 29 </h3>
30 30  
31   - <div id="filter" <?php if ($r) echo 'style="display: none;"'; ?>><?php
32   - if (isset ( $_results ))
33   - $selected = [];
34   - else
35   - $selected = [
36   - 'selected' => ''
37   - ];
38   -
39   -
40   - // FORMULAIRE DE RECHERCHE
41   - echo $this->Form->create();
42   -
43   - // -------Bouton recherche Haut---------
44   - echo $this->Form->submit ( 'Rechercher', ['style' => 'width: 20%']);
45   -
46   - // Designation
47   - echo $this->Form->input ( 's_designation', ['label' => 'Désignation']);
48   -
49   - // Matériel administratif et/ou technique
50   - $typeOptions = [];
51   - echo $this->Form->input ( 's_matostype', [
52   - 'label' => 'Type',
53   - 'empty' => 'Tous',
54   - 'options' => [
55   - 'A' => 'Administratif',
56   - 'T' => 'Technique',
57   - 'AT' => 'Administratif et Technique',
58   - 'AO' => 'Administratif seulement',
59   - 'TO' => 'Technique seulement'
60   - ],
61   - 'style' => 'width: 280px'
62   - ]);
63   -
64   - // DOMAINE
65   - echo $this->Form->input ( 's_sur_categorie_id', [
66   - 'label' => 'Domaine',
67   - 'empty' => 'Tous',
68   - $selected,
69   - 'options' => $s_sur_categories,
70   - 'style' => 'width: 200px'
71   - ]);
72   -
73   - // CATEGORIES
74   - // by default, ALL categs
75   - $categs = $s_categories;
76   -
77   - // if a domaine is selected, reduce the categories list to this domaine
78   - if (isset ( $this->request->data['s_sur_categorie_id'] ) && ($this->request->data['s_sur_categorie_id'] != '')) {
79   - $categs = $categs->where(['sur_categorie_id =' => $this->request->data['s_sur_categorie_id']]);
80   - }
81   -
82   - echo $this->Form->input ( 's_categorie_id', [
83   - 'label' => 'Catégorie',
84   - 'empty' => 'Toutes',
85   - 'style' => 'width: 200px',
86   - 'options' => $categs
87   - ]);
88   -
89   - // SOUS-CATEGORIES
90   - // by default, list is empty
91   - $souscategs = [];
92   - // if a categ is selected, update sous-categs list for this categ (only)
93   - if (isset ( $this->request->data['s_categorie_id'] ) && ($this->request->data['s_categorie_id'] != '')) {
94   - $souscategs = $s_sous_categories;
95   - $souscategs = $souscategs->where(['categorie_id' => $this->request->data['s_categorie_id']]);
96   - }
97   -
98   - echo $this->Form->input ( 's_sous_categorie_id', [
99   - 'label' => 'Sous-catégorie',
100   - 'empty' => 'Toutes',
101   - 'style' => 'width: 200px',
102   - 'options' => $souscategs
103   - ]);
104   -
105   - $options = [
106   - 'CREATED' => 'Créé',
107   - 'VALIDATED' => 'Validé',
108   - 'TOBEARCHIVED' => 'À archiver',
109   - ];
110   - if(in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur'])) {
111   - $options['ARCHIVED'] = 'Archivé';
112   - }
113   - // STATUT
114   - echo $this->Form->input ( 's_status', [
115   - 'label' => 'Statut',
116   - 'empty' => 'Tous',
117   - $selected,
118   - 'options' => $options,
119   - 'style' => 'width: 200px'
120   - ]);
121   -
122   - // Groupe metier et thematique
123   - echo $this->Form->input ( 's_groupes_metier_id', [
124   - 'label' => $configuration->nom_groupe_metier,
125   - 'empty' => 'Tous',
126   - $selected,
127   - 'options' => $s_groupes_metiers,
128   - 'style' => 'width: 200px'
129   - ]);
130   - echo $this->Form->input ( 's_groupes_thematique_id', [
131   - 'label' => $configuration->nom_groupe_thematique,
132   - 'empty' => 'Tous',
133   - $selected,
134   - 'options' => $s_groupes_thematiques,
135   - 'style' => 'width: 200px'
136   - ]);
137   -
138   - // Autres champs
139   - echo $this->Form->input ( 's_numero_commande', [
140   - 'label' => 'N° BC'
141   - ]);
142   - echo $this->Form->input ( 's_numero_laboratoire', [
143   - 'label' => 'N° interne (labo)'
144   - ]);
145   -
146   - //ORGANISME
147   - $orgas = $s_organismes;
148   - echo $this->Form->input ( 's_organisme_id', [
149   - 'label' => 'Organisme',
150   - 'empty' => 'Toutes',
151   - 'style' => 'width: 200px',
152   - 'options' => $orgas
153   - ]);
154   -
155   - echo $this->Form->input ( 's_nom_responsable', [
156   - 'label' => 'Nom du propriétaire'
157   - ]);
158   - echo $this->Form->input ( 's_numero_inventaire_organisme', [
159   - 'label' => 'N° inventaire organisme'
160   - ]);
161   - echo $this->Form->input ( 's_numero_inventaire_old', [
162   - 'label' => 'N° inventaire (ancien)'
163   - ]);
  31 + <div id="filter" <?php if ($r) echo 'style="display: none;"'; ?>>
  32 + <?php
  33 + if (isset ( $_results ))
  34 + $selected = [];
  35 + else
  36 + $selected = [
  37 + 'selected' => ''
  38 + ];
164 39  
165   - // Date acquisition
166   - echo "<u>DATE d'achat:</u>";
167   - echo $this->Form->input ( 's_date_acquisition', [
168   - 'placeholder' => 'Cliquez pour selectionner une date',
169   - 'label' => '- Date exacte',
170   - 'class' => 'datepicker'
171   - ]);
172   - echo $this->Form->input ( 's_periode_acquisition1', [
173   - 'placeholder' => 'Cliquez pour selectionner une date',
174   - 'label' => '- Date Début',
175   - 'class' => 'datepicker'
176   - ]);
177   - echo $this->Form->input ( 's_periode_acquisition2', [
178   - 'placeholder' => 'Cliquez pour selectionner une date',
179   - 'label' => '- Date Fin',
180   - 'class' => 'datepicker'
181   - ]);
182   -
183   - echo "<u>MONTANT :</u>";
184   - echo $this->Form->input ( 's_prix_ht', ['label' => '- Montant exact']);
185   - echo $this->Form->input ( 's_prix_ht_sup', ['label' => '- Montant sup. ou égal à']);
186   - echo $this->Form->input ( 's_prix_ht_inf', ['label' => '- Montant inf. ou égal à']);
  40 +
  41 + // FORMULAIRE DE RECHERCHE
  42 + echo $this->Form->create();
  43 +
  44 + // -------Bouton recherche Haut---------
  45 + echo $this->Form->submit ( 'Rechercher', ['style' => 'width: 20%']);
  46 +
  47 + // Designation
  48 + echo $this->Form->input ( 's_designation', ['label' => 'Désignation']);
  49 +
  50 + // Matériel administratif et/ou technique
  51 + $typeOptions = [];
  52 + echo $this->Form->input ( 's_matostype', [
  53 + 'label' => 'Type',
  54 + 'empty' => 'Tous',
  55 + 'options' => [
  56 + 'A' => 'Administratif',
  57 + 'T' => 'Technique',
  58 + 'AT' => 'Administratif et Technique',
  59 + 'AO' => 'Administratif seulement',
  60 + 'TO' => 'Technique seulement'
  61 + ],
  62 + 'style' => 'width: 280px'
  63 + ]);
  64 +
  65 + // DOMAINE
  66 + echo $this->Form->input ( 's_sur_categorie_id', [
  67 + 'label' => 'Domaine',
  68 + 'empty' => 'Tous',
  69 + $selected,
  70 + 'options' => $s_sur_categories,
  71 + 'style' => 'width: 200px'
  72 + ]);
  73 +
  74 + // CATEGORIES
  75 + // by default, ALL categs
  76 + $categs = $s_categories;
  77 +
  78 + // if a domaine is selected, reduce the categories list to this domaine
  79 + if (isset ( $this->request->data['s_sur_categorie_id'] ) && ($this->request->data['s_sur_categorie_id'] != '')) {
  80 + $categs = $categs->where(['sur_categorie_id =' => $this->request->data['s_sur_categorie_id']]);
  81 + }
  82 +
  83 + echo $this->Form->input ( 's_categorie_id', [
  84 + 'label' => 'Catégorie',
  85 + 'empty' => 'Toutes',
  86 + 'style' => 'width: 200px',
  87 + 'options' => $categs
  88 + ]);
  89 +
  90 + // SOUS-CATEGORIES
  91 + // by default, list is empty
  92 + $souscategs = [];
  93 + // if a categ is selected, update sous-categs list for this categ (only)
  94 + if (isset ( $this->request->data['s_categorie_id'] ) && ($this->request->data['s_categorie_id'] != '')) {
  95 + $souscategs = $s_sous_categories;
  96 + $souscategs = $souscategs->where(['categorie_id' => $this->request->data['s_categorie_id']]);
  97 + }
  98 +
  99 + echo $this->Form->input ( 's_sous_categorie_id', [
  100 + 'label' => 'Sous-catégorie',
  101 + 'empty' => 'Toutes',
  102 + 'style' => 'width: 200px',
  103 + 'options' => $souscategs
  104 + ]);
  105 +
  106 + $options = [
  107 + 'CREATED' => 'Créé',
  108 + 'VALIDATED' => 'Validé',
  109 + 'TOBEARCHIVED' => 'À archiver',
  110 + ];
  111 + if(in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur'])) {
  112 + $options['ARCHIVED'] = 'Archivé';
  113 + }
  114 + // STATUT
  115 + echo $this->Form->input ( 's_status', [
  116 + 'label' => 'Statut',
  117 + 'empty' => 'Tous',
  118 + $selected,
  119 + 'options' => $options,
  120 + 'style' => 'width: 200px'
  121 + ]);
  122 +
  123 + // Groupe metier et thematique
  124 + echo $this->Form->input ( 's_groupes_metier_id', [
  125 + 'label' => $configuration->nom_groupe_metier,
  126 + 'empty' => 'Tous',
  127 + $selected,
  128 + 'options' => $s_groupes_metiers,
  129 + 'style' => 'width: 200px'
  130 + ]);
  131 + echo $this->Form->input ( 's_groupes_thematique_id', [
  132 + 'label' => $configuration->nom_groupe_thematique,
  133 + 'empty' => 'Tous',
  134 + $selected,
  135 + 'options' => $s_groupes_thematiques,
  136 + 'style' => 'width: 200px'
  137 + ]);
  138 +
  139 + // Autres champs
  140 + echo $this->Form->input ( 's_numero_commande', [
  141 + 'label' => 'N° BC'
  142 + ]);
  143 + echo $this->Form->input ( 's_numero_laboratoire', [
  144 + 'label' => 'N° interne (labo)'
  145 + ]);
187 146  
188   - // CHAMP DE RECHERCHE GENERIQUE
189   - echo $this->Form->input ( 's_all', ['label' => 'TOUS LES CHAMPS' ]);
  147 + //ORGANISME
  148 + $orgas = $s_organismes;
  149 + echo $this->Form->input ( 's_organisme_id', [
  150 + 'label' => 'Organisme',
  151 + 'empty' => 'Toutes',
  152 + 'style' => 'width: 200px',
  153 + 'options' => $orgas
  154 + ]);
190 155  
191   - // -------Bouton recherche Bas---------
192   - echo $this->Form->submit('Rechercher', ['style' => 'width: 20%']);
193   - echo '<br/><br/><br/>';
194   - ?>
  156 + echo $this->Form->input ( 's_nom_responsable', [
  157 + 'label' => 'Nom du propriétaire'
  158 + ]);
  159 + echo $this->Form->input ( 's_numero_inventaire_organisme', [
  160 + 'label' => 'N° inventaire organisme'
  161 + ]);
  162 + echo $this->Form->input ( 's_numero_inventaire_old', [
  163 + 'label' => 'N° inventaire (ancien)'
  164 + ]);
  165 +
  166 + // Date acquisition
  167 + echo "<u>DATE d'achat:</u>";
  168 + echo $this->Form->input ( 's_date_acquisition', [
  169 + 'placeholder' => 'Cliquez pour selectionner une date',
  170 + 'label' => '- Date exacte',
  171 + 'class' => 'datepicker'
  172 + ]);
  173 + echo $this->Form->input ( 's_periode_acquisition1', [
  174 + 'placeholder' => 'Cliquez pour selectionner une date',
  175 + 'label' => '- Date Début',
  176 + 'class' => 'datepicker'
  177 + ]);
  178 + echo $this->Form->input ( 's_periode_acquisition2', [
  179 + 'placeholder' => 'Cliquez pour selectionner une date',
  180 + 'label' => '- Date Fin',
  181 + 'class' => 'datepicker'
  182 + ]);
  183 +
  184 + echo "<u>MONTANT :</u>";
  185 + echo $this->Form->input ( 's_prix_ht', ['label' => '- Montant exact']);
  186 + echo $this->Form->input ( 's_prix_ht_sup', ['label' => '- Montant sup. ou égal à']);
  187 + echo $this->Form->input ( 's_prix_ht_inf', ['label' => '- Montant inf. ou égal à']);
  188 +
  189 + // CHAMP DE RECHERCHE GENERIQUE
  190 + echo $this->Form->input ( 's_all', ['label' => 'TOUS LES CHAMPS' ]);
  191 +
  192 + // -------Bouton recherche Bas---------
  193 + echo $this->Form->submit('Rechercher', ['style' => 'width: 20%']);
  194 + echo '<br/><br/><br/>';
  195 + ?>
195 196 </div>
196 197 <!-- RESULT DISPLAY -->
197 198 <h3 id="t_result" style="cursor: pointer;">
... ... @@ -206,7 +207,7 @@ if ($r) {
206 207 $this->request->session()->write("resultTri", $_results);
207 208  
208 209 ?>
209   - <table cellpadding="0" cellspacing="0">
  210 + <table style="border-collapse: separate; border-spacing: 0;">
210 211 <thead>
211 212 <tr>
212 213 <th class="actions"><?= __('') ?></th>
... ...
src/Template/Materiels/index.ctp
  1 +<?php
  2 +use Cake\I18n\Time;
  3 +use Cake\I18n\Date;
  4 +?>
  5 +
  6 +
1 7 <div class="materiels index">
2 8 <?php echo '<h2><i class="icon-list"></i> Liste des matériels ('.$nbMateriels.')</h2>'; ?>
3 9  
... ... @@ -114,7 +120,7 @@ if (isset ( $STATUS )) {
114 120 }
115 121 ?>
116 122  
117   - <table cellpadding="0" cellspacing="0">
  123 + <table style="border-collapse: separate; border-spacing: 0;">
118 124 <thead>
119 125 <tr>
120 126 <?php if (isset($STATUS)) { echo '<th></th>'; }?>
... ... @@ -131,7 +137,26 @@ if (isset ( $STATUS )) {
131 137 </tr>
132 138 </thead>
133 139 <tbody>
  140 +
  141 + <?php
  142 + // Pour changer la couleur du nom du matos si la garantie est passée - Ajout par Thibault Ajas le 28/04/2017
  143 + $time = Time::now(); // On récupère la date et l'heure actuelles
  144 + $today = new date("$time->year-$time->month-$time->day"); // On extrait la date pour la vérification de fin de garantie
  145 + $today = $today->format('Ydm'); // On formatte la date initialement en 31-12-2000 (par exemple) en un format qui pourra etre comparé : 20001231
  146 + ?>
  147 +
134 148 <?php foreach ($materiels as $materiel): ?>
  149 +
  150 + <?php
  151 + if ($materiel->date_fin_garantie !== NULL) {
  152 + $timeFin = new time($materiel->date_fin_garantie);
  153 + $dateFin = new date("$timeFin->year-$timeFin->month-$timeFin->day");
  154 + $dateFin = $dateFin->format('Ydm');
  155 + }
  156 + if($materiel->date_fin_garantie !== NULL) $styleLien = ($today >= $dateFin) ? 'style="color: #FF0000"' : '' ; else $styleLien = '';
  157 + // Fin ajout - Utilisation de la variable $styleLien ligne 213
  158 + ?>
  159 +
135 160 <tr>
136 161 <?php if (isset($STATUS)) {
137 162 echo '<td class="smallText">'.$this->Form->checkbox($materiel->id, ['style' => 'margin: 3px','id' => $materiel->id]).'</td>' ;
... ... @@ -188,7 +213,7 @@ if (isset ( $STATUS )) {
188 213 }
189 214 ?>
190 215 </td>
191   - <td class="smallText"><?= $materiel->has('designation') ? $this->Html->link($materiel->designation, ['controller' => 'Materiels', 'action' => 'view', $materiel->id]) : '' ?></td>
  216 + <td class="smallText"><?= $materiel->has('designation') ? $this->Html->link($materiel->designation, ['controller' => 'Materiels', 'action' => 'view', $materiel->id],[$styleLien]) : '' ?></td>
192 217 <td class="smallText"><?= h($materiel->numero_laboratoire) ?></td>
193 218 <td class="smallText"><?= $materiel->has('category') ? h($materiel->category->nom) : '' ?></td>
194 219 <td class="smallText"><?= $materiel->has('organisme') ? h($materiel->organisme->nom) : '' ?></td>
... ... @@ -294,7 +319,9 @@ if (isset ( $STATUS )) {
294 319 'singularHumanName' => 'Matériel' ]) ?>
295 320 </div>
296 321  
297   -
  322 +
  323 +
  324 +
298 325 <script type="text/javascript">
299 326 function changeNbrMateriels(nbr) {
300 327 var urlDeBase = window.location.href.split("?");
... ...
src/Template/Materiels/view.ctp
1   -
  1 +<?php
  2 +use Cake\I18n\Time;
  3 +use Cake\I18n\Date;
  4 +?>
2 5 <div class="materiels view">
3 6  
4 7 <h2>
... ... @@ -18,7 +21,7 @@ if (h ( $materiel-&gt;status ) == &#39;ARCHIVED&#39;)
18 21 <?php if (h($materiel->status) == 'ARCHIVED') echo ' (Archivé)'; ?>
19 22 </span>
20 23 </h2>
21   - </br>
  24 + <br>
22 25 <div style="text-align: center;">
23 26 <?php
24 27  
... ... @@ -39,7 +42,7 @@ if (h ( $materiel-&gt;status ) == &#39;ARCHIVED&#39;)
39 42 ] );
40 43 echo '</div>';
41 44 ?>
42   - </br>
  45 + <br>
43 46  
44 47 <div class="actions"
45 48 style="margin-bottom: 20px; width: 100%; float: none; padding: 10px 0;">
... ... @@ -301,6 +304,21 @@ if (h ( $materiel-&gt;status ) == &#39;ARCHIVED&#39;)
301 304 <th></th>
302 305 </tr>
303 306  
  307 +
  308 + <?php
  309 + // Pour changer la couleur de la date de garantie si elle est passée - Ajout par Thibault Ajas le 02/05/2017
  310 + $time = Time::now(); // On récupère la date et l'heure actuelles
  311 + $today = new date("$time->year-$time->month-$time->day"); // On extrait la date pour la vérification de fin de garantie
  312 + $today = $today->format('Ydm'); // On formatte la date initialement en 31-12-2000 en un format qui pourra etre comparé : 20001231
  313 + if ($materiel->date_fin_garantie !== NULL) {
  314 + $timeFin = new time($materiel->date_fin_garantie);
  315 + $dateFin = new date("$timeFin->year-$timeFin->month-$timeFin->day");
  316 + $dateFin = $dateFin->format('Ydm');
  317 + }
  318 + if($materiel->date_fin_garantie !== NULL) $style = ($today >= $dateFin) ? 'style="color: #FF0000"' : '' ; else $style = '';
  319 + ?>
  320 +
  321 +
304 322 <?php
305 323 $type = "";
306 324 if (h ( $materiel->materiel_administratif ) == 1 && h ( $materiel->materiel_technique ) == 1) {
... ... @@ -312,7 +330,9 @@ if (h ( $materiel-&gt;status ) == &#39;ARCHIVED&#39;)
312 330 }
313 331  
314 332 echo '<tr><td><strong>'.__('Description').' </strong></td><td>'.nl2br($materiel->description).'</td></tr>';
315   -
  333 +
  334 + // La variable-fonction $displayElement est définie dans le fichier src/Controller/AppController.php
  335 +
316 336 $displayElement ( __ ( 'Materiel inventorié' ), $type );
317 337 $displayElement ( __ ( 'Organisme' ), $materiel->has ( 'organisme' ) ? h ( $materiel->organisme->nom ) : '' );
318 338 $displayElement ( __ ( 'Domaine' ), $materiel->has ( 'sur_category' ) ? h ( $materiel->sur_category->nom ) : '' );
... ... @@ -341,8 +361,8 @@ if (h ( $materiel-&gt;status ) == &#39;ARCHIVED&#39;)
341 361 if (! empty ( h ( $materiel->duree_garntie ) )) {
342 362 $displayElement ( __ ( 'Duree garantie' ), h ( $materiel->duree_garantie ) . ' ' . h ( $materiel->unite_duree_garantie ) );
343 363 }
344   - $displayElement ( __ ( 'Date fin de garantie' ), h ( $materiel->date_fin_garantie ) );
345   -
  364 + $displayElement ( __ ( 'Date fin de garantie' ), h ( $materiel->date_fin_garantie ), $style );
  365 +
346 366 $displayElement ( __ ( 'Statut' ), h ( $materiel->status ) );
347 367 if ($materiel->status == 'ARCHIVED') {
348 368 $displayElement ( __ ( 'Date d\'archivage' ), h ( $materiel->date_archivage ) );
... ...
src/Template/Organismes/index.ctp
1 1  
2 2 <div class="organismes index">
3 3 <?php echo '<h2><i class="icon-list"></i> Liste des organismes</h2>'; ?>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <thead>
6 6 <tr>
7 7 <th class="actions"><?= __('') ?></th>
... ...
src/Template/Pages/acls.ctp
... ... @@ -114,7 +114,7 @@
114 114 .WW8Num8z0 { font-family:Symbol; font-size:9pt; font-weight:normal; }
115 115 <!-- ODF styles with no properties representable as CSS -->
116 116 .Tableau2.13 .T10 .T11 .T12 .T19 .T2 .T20 .T21 .T22 .T23 .T24 .T3 .T8 .T9 .WW8Num8z1 .WW8Num8z2 .WW8Num8z3 .WW8Num8z4 .WW8Num8z5 .WW8Num8z6 .WW8Num8z7 .WW8Num8z8 .WW8Num9z0 .WW8Num9z1 .WW8Num9z2 .WW8Num9z3 .WW8Num9z4 .WW8Num9z5 .WW8Num9z6 .WW8Num9z7 .WW8Num9z8 { }
117   - </style></head><body dir="ltr" style="max-width:29.7cm;margin-top:1cm; margin-bottom:1cm; margin-left:1cm; margin-right:1.45cm; writing-mode:lr-tb; "><p class="P46">ACL (Access Control List)</p><p class="P11">(Etienne Pallier – 24/<span class="T22">06</span>/201<span class="T23">6</span>)</p><p class="P1"> </p><p class="P1"> </p><p class="P1"> </p><p class="P1">I – Cycle de vie du statut du matériel</p><p class="P1"> </p><p class="Standard"><span class="T5">Créer</span><span class="T2"> un matériel ==</span><span class="T9">&gt; passe alors en statut </span><span class="T7">CREATED ==&gt; </span><span class="T1">peut alors être éventuellement supprimé (mais ne pourra plus être supprimé ensuite)</span></p><p class="Standard"><span class="T7">Valider</span><span class="T9"> un matériel CREATED ==&gt; passe alors en statut </span><span class="T7">VALIDATED </span><span class="T9">(</span><span class="T11">resp et </span><span class="T9">admin only)</span></p><p class="P4"><span class="T7">Demander l'Archivage</span><span class="T9"> d'un materiel VALIDATED ==&gt; passe alors en statut </span><span class="T7">TOBEARCHIVED</span><span class="T9"> (resp et admin only)</span></p><p class="P4"><span class="T7">Sortir</span><span class="T9"> de l'inventaire (Valider une demande d'archivage d'un matériel TOBEARCHIVED) ==&gt; statut </span><span class="T7">ARCHIVED</span><span class="T9"> (admin only)</span></p><p class="P4"><span class="T7">Désarchiver</span><span class="T9"> un matériel ==&gt; repasse de TOBEARCHIVED ou ARCHIVED à </span><span class="T7">VALIDATED</span><span class="T9"> (admin only) </span></p><p class="P4"> </p><p class="P5">En résumé : </p><p class="P4"> </p><p class="P3">CREATED ==&gt;  VALIDATED ==&gt;  TOBEARCHIVED ==&gt;  ARCHIVED</p><p class="P2"><span class="T12">     </span><span class="T8">I                        /\                        I                                I</span></p><p class="P2"><span class="T12">    </span><span class="T8">V                                    I ------------------------        I ---------------------------------        I (adminplus only)</span></p><p class="P3">DELETED</p><p class="P2"> </p><p class="P2"> </p><p class="P2"> </p><p class="P1">II - Droits des utilisateurs selon leur profil</p><p class="P1"> </p><p class="P1">A – Globalement (principes généraux)</p><p class="P1"> </p><p class="P6">Un utilisateur non logué ne doit RIEN pouvoir faire. Seulement se loguer, c'est tout. Il n'a accès qu'à la page d'accueil (de login).</p><p class="P6">Une fois logué, un utilisateur a des droits différents selon son profil, globalement :</p><p class="P14"><span class="T2">- un </span><span class="T5">USER</span><span class="T2"> ne peut que créer un matériel, un suivi, ou un emprunt, consulter, et modifier (uniquement ce qu'il a créé lui-même)</span></p><p class="P18"><span class="T2">- un </span><span class="T5">RESPONSABLE</span><span class="T2"> a tous les droits sauf accès à certains champs et certaines vues réservées à l'administration (ADMIN). Il ne peut pas non plus archiver un matériel, mais seulement demander l'archivage (comme un USER)(uniquement ce </span><span class="T3">lié à son groupe métier ou thématiques</span><span class="T2">)</span></p><p class="P14"><span class="T2">- un </span><span class="T5">ADMIN</span><span class="T2">(istratif) a tous les droits (y-compris champs réservés à l'administration)</span></p><p class="P14"><span class="T2">- un </span><span class="T5">ADMINPLUS</span><span class="T2"> (administratif Plus) a tous les droits de ADMIN et en plus il peut modifier un matériel quelque soit son statut (y-compris TOBEARCHIVED et ARCHIVED), notamment il peut modifier le statut du matériel (pour le rétrograder)</span></p><p class="P14"><span class="T2">- un </span><span class="T5">SUPERADMIN</span><span class="T2"> a tous les droits : ceux d'ADMINPLUS et certains droits supplémentaires pour lui permettre des corrections d'erreur et la configuration de l'application (notamment l'administration des utilisateurs...)</span></p><p class="P15"> </p><p class="Standard"><span class="T2">Concernant les informations internes permettant de savoir </span><span class="T5">qui a fait quoi</span><span class="T2"> (mises en place en février 2014), elles ne sont bien sûr pas modifiables puisque gérées automatiquement par le système, mais sont visibles par tous excepté le profil USER.</span></p><p class="P1"/><p class="P7">B - sur la table MATERIEL</p><table border="0" cellspacing="0" cellpadding="0" class="Tableau2"><colgroup><col width="170"/><col width="170"/><col width="170"/><col width="170"/><col width="170"/><col width="170"/><col width="170"/></colgroup><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="Table_20_Contents"> </p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P41">ALL (TOUS)</p><p class="P43">(droits par defaut)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P40"><span class="T5">U</span><span class="T6">tilisateur </span><span class="T5"> </span><span class="T2">(quelconque)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P42">Responsable</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P42">Administration</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P42">Administration Plus</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_G1"><p class="P42">Super-Administrateur</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Read (un seul ou une liste)</p><p class="P45">(view ou index)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P25">Y</p><p class="Table_20_Contents"><span class="T14">champs caches:</span><span class="T13"> donnees admin</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P36">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P36">idem ALL</p></td><td rowspan="3" style="text-align:left;width:3.893cm; " class="Tableau2_E4"><p class="P23"><span class="T16">(idem Responsable </span><span class="T15">+  donnees admin</span><span class="T16">)</span></p><p class="P37"> </p><p class="P23"><span class="T13">En mode edit (update), si VALIDATED, on ajoute aux donnees </span><span class="T14">readonly</span><span class="T13"> les </span><span class="T14">donnees admin</span></p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_F3"><p class="P37">idem Admin</p></td><td rowspan="11" style="text-align:left;width:3.893cm; " class="Tableau2_G12"><p class="P37">idem Adminplus</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Create (1)</p><p class="P45">(add)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">Y</p><p class="P39"><span class="T14">champs caches</span><span class="T13">:</span></p><p class="P34">donnees admin + statut + etiquette </p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P36">Idem ALL</p><p class="P39"><span class="T14">champs readonly </span><span class="T13">:</span></p><p class="P34">nom_responsable</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_D4"><p class="P36">idem ALL</p><p class="P36">(+ etiquette)</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Update (1)</p><p class="P45">(edit)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">Y</p><p class="P33">ssi</p><p class="P39"><span class="T15">CREATED</span><span class="T16"> (tous les champs) </span></p><p class="P39"><span class="T13">ou </span><span class="T14">VALIDATED</span><span class="T13"> (quelques champs visibles sont </span><span class="T14">readonly</span><span class="T13">) (1)</span></p><p class="P34"> </p><p class="P39"><span class="T14">champs caches</span><span class="T13">:</span></p><p class="P34">donnees admin + statut + etiquette</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_C5"><p class="P36">idem ALL</p><p class="P22"><span class="T16">ssi </span><span class="T15">createur</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">idem Admin</p><p class="P23"><span class="T16">(</span><span class="T15">tous les statuts</span><span class="T16">)</span></p><p class="P23"><span class="T16">(+ champ </span><span class="T15">statut</span><span class="T16">)</span></p><p class="P23"> </p><p class="P23"><span class="T16">TOBEARCHIVED ou ARCHIVED: </span><span class="T15">seulement le statut</span></p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Delete</p><p class="P45">(delete)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">Y</p><p class="P29">ssi CREATED</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">idem ALL</p></td><td rowspan="3" style="text-align:left;width:3.893cm; " class="Tableau2_E7"><p class="P37">idem Responsable</p></td><td rowspan="4" style="text-align:left;width:3.893cm; " class="Tableau2_F8"><p class="P37">idem Admin</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Valider</p><p class="P45">(statusValidated)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P25">N</p><p class="P28">(resp+)</p></td><td rowspan="7" style="text-align:left;width:3.893cm; " class="Tableau2_C12"><p class="P36">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p><p class="P30">ssi</p><p class="P30">CREATED</p><p class="P37"> </p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Demander archivage</p><p class="P45">(statusToBeArchived)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P25">N</p><p class="P28">(resp+)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p><p class="P30">ssi</p><p class="P30">VALIDATED</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Sortir de l'inventaire</p><p class="P45"><span class="T12"> </span>(statusArchived)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(admin+)</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_D9"><p class="P37">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P35">Y</p><p class="P28">ssi</p><p class="P28">TOBEARCHIVED</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Desarchiver (2)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(adminplus+)</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_E10"><p class="P37">idem Responsable</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p><p class="P30">ssi</p><p class="P30">ARCHIVED ou</p><p class="P30">TOBEARCHIVED</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Exporter</p><p class="P45">(csv)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(resp+)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p></td><td rowspan="3" style="text-align:left;width:3.893cm; " class="Tableau2_F12"><p class="P37">idem Admin</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Montee de statut group<span class="T24">é</span>e</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(admin+)</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_D12"><p class="P37">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P38">Y</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Edition (4)</p><p class="P44">DOCUMENTS</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E12"><p class="P26">N</p><p class="P29">(admin+)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E12"><p class="P37">Y</p><p class="P31">- admission : ssi VALIDATED</p><p class="P31">- sortie : ssi TOBEARCHIVED ou ARCHIVED</p></td></tr><tr class="Tableau213"><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P68">Fiche Matériel </p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E13"><p class="P62">Y <span class="T25">(sans partie admin)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_C13"><p class="P49">Y <span class="T25">(sans partie admin)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_D13"><p class="P49">Y <span class="T25">(sans partie admin)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E13"><p class="P62">Y</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_F13"><p class="P49">Y</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_G13"><p class="P49">Y <span class="T25">(sans partie admin)</span></p></td></tr></table><p class="P7"> </p><p class="P7"> </p><p class="P6"> </p><p class="P10">Par défaut, le superadmin a TOUS les droits</p><p class="P10"> </p><p class="Standard"><span class="T15">Conventions d'écriture </span><span class="T16">: </span></p><p class="P14"><span class="T16">- r</span><span class="T15">esp+</span><span class="T16"> = possible pour un </span><span class="T15">Responsable et plus </span><span class="T16">(responsable, admin, adminplus, et superadmin)</span></p><p class="P14"><span class="T16">- </span><span class="T15">admin+</span><span class="T16"> = possible pour un </span><span class="T15">Admin</span><span class="T16"> </span><span class="T15">et plus </span><span class="T16">(admin, adminplus, et superadmin)</span></p><p class="P16">- ...</p><p class="P16"> </p><p class="Standard"><span class="T15">Notes </span><span class="T16">:</span></p><p class="P9"> </p><ol><li><p class="P47" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(1)</span><span class="T15">Droits en modification (edit) </span><span class="T16">:</span><span class="odfLiEnd"/> </p></li></ol><p class="P16">- Un simple « user » ne doit pas pouvoir modifier le responsable, ni le statut, ni l'étiquette, ni les données admin d'un matériel (en mode Création comme Modification)</p><p class="P16">- Un  «responsable » ne doit pas pouvoir modifier le statut, ni les données admin d'un matériel (en mode Création comme Modification)</p><p class="P16">- Les données admin ne sont accessibles qu'aux profils admin+</p><p class="P14"><span class="T16">- Le champ "</span><span class="T15">status</span><span class="T16">" n'est modifiable que par les profils adminplus+</span></p><p class="P14"><span class="T16">- Tout le monde peut modifier un matériel </span><span class="T15">VALIDATED </span><span class="T16">(</span><span class="T15">user </span><span class="T16">ne peut modifier que </span><span class="T15">ses</span><span class="T16"> matériels, </span><span class="T17">resp ne peut modifier que les matériels de son groupe thématique ou métier</span><span class="T16">),</span></p><p class="P14"><span class="T16">MAIS PAS</span><span class="T15"> certains champs</span><span class="T16"> qui sont </span><span class="T15">readonly</span><span class="T16"> (</span><span class="T18">sur_categorie_id', 'categorie_id', 'materiel_administratif', 'materiel_technique', 'date_acquisition', 'nom_responsable', 'fournisseur', 'organisme', 'prix_ht')</span></p><p class="P14"><span class="T16">Les seuls champs qu'on peut éditer sont donc : (</span><span class="T18">designation, sous_categorie, materiel_administratif, materiel_technique, description, etiquette, lieu_stockage, lieu_detail, numero_serie, groupes_thematique, groupes_metier),</span><span class="T16"><br/>- Seuls les profils </span><span class="T15">adminplus+</span><span class="T16"> peuvent modifier un matériel </span><span class="T15">TOBEARCHIVED, ou ARCHIVED </span><span class="T16">mais </span><span class="T15">UNIQUEMENT le champ "status" </span><span class="T16">(pour pouvoir rétrograder à CREATED ou VALIDATED)</span></p><p class="P14"><span class="T16">- Le seul moyen de modifier COMPLÈTEMENT un matériel VALIDATED, TOBEARCHIVED, ou ARCHIVED, <br/>c'est de </span><span class="T15">changer son statut</span><span class="T16">, en le rétrogradant à CREATED (seuls les profils adminplus+ peuvent le faire)</span></p><p class="P16"> </p><ol><li><p class="P47" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(2)</span><span class="T15">Désarchiver </span><span class="T16">: consiste à rétrograder un matériel ARCHIVED ou TOBEARCHIVED dans le statut VALIDATED ou CREATED (adminplus+ only) ; utile en cas d'erreur</span><span class="odfLiEnd"/> </p></li></ol><p class="P8"> </p><ol><li><p class="P47" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(3)</span><span class="T15">Montée de statut groupée : </span><span class="T16">seul ADMIN peut (exporter tout ou partie de la liste des matériels, et) </span><span class="T15">augmenter (+1) le statut d'un groupe de matériels</span><span class="T16">, depuis la vue « index » (vue spéciale pour ADMIN, avec des cases à cocher et boutons pour exporter ou faire évoluer le statut)</span><span class="odfLiEnd"/> </p></li></ol><p class="P8"> </p><ol><li><p class="P48" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(4)</span>Edition des documents :<span class="odfLiEnd"/> </p></li></ol><p class="P16">Admission : quand on "VALIDE" un matériel "CREATED", le statut passe en VALIDATED et le document d'admission est automatiquement édité</p><p class="P16">Sortie : quand on "ARCHIVE" un document "TOBEARCHIVED", le statut passe en ARCHIVED et le document de sortie est automatiquement édité</p><p class="P16">De plus :</p><p class="P16">- Bouton "Doc admission" affiché à partir du statut "VALIDATED"</p><p class="P16">- Bouton "Doc Sortie" affiché à partir du statut TOBEARCHIVED (et donc aussi pour ARCHIVED)</p><p class="P16">Enfin, Le doc de sortie doit être couplée avec la liste des matériels a archiver (TOBEARCHIVED) quand il y a une demande de sortie.</p><p class="P16"> </p><p class="P17"> </p><p class="P1">C - sur les différentes VUES liées au matériel</p><p class="Standard"> </p><p class="P6"><span class="T4">Page accueil </span>:</p><p class="P6"><span> Administration <span class="T20">&amp; Administration Plus </span>voit un menu avec 2 options :</span></p><ul><li><ul><li><ul><li><p class="P51" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels à valider »<span class="odfLiEnd"/> </p></li><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels à sortir de l'inventaire »<span class="odfLiEnd"/> </p></li></ul></li></ul><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0cm"><!-- --></span><span class="T21">Responsable </span>voit un menu avec <span class="T21">3</span> options :<span class="odfLiEnd"/> </p><ul><li><ul><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels <span class="T21">de mon groupe métier</span> »<span class="odfLiEnd"/> </p></li><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels <span class="T21">de mon groupe métier à valider</span> »<span class="odfLiEnd"/> </p></li><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« <span class="T21">Voir les suivis des matériels donc je suis responsable »</span><span class="odfLiEnd"/> </p></li></ul></li></ul></li></ul><p class="P1">Page Outils :</p><p class="P6">User n'a pas accès à cette page</p><p class="P6">Les autres ont quelques options</p><p class="P6">superadmin a ces options en plus :</p><ul><li><p class="P53" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Configuration générale de l'application<span class="odfLiEnd"/> </p></li><li><p class="P53" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Gérer les utilisateurs <span class="T20">privilégiés</span><span class="odfLiEnd"/> </p></li><li><p class="P53" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Passer en mode debug<span class="odfLiEnd"/> </p></li><li><p class="P54" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Passer en mode install<span class="odfLiEnd"/> </p></li></ul><p class="P6"> </p><p class="Standard"><span class="T5">Vue materiel/index (liste) </span><span class="T2">: limiter aux </span><span class="T5">matériels actifs</span><span class="T2"> (non archivés)</span></p><ul><li><ul><li><p class="P55" style="margin-left:0cm;"><span class="WW8Num1z0" style="display:block;float:left;min-width:0,635cm;">.</span>Admin<span class="T20">+ </span>voit des boutons pour filtrer par « tous », « à valider », « validés », « à sortir », « archivés »<span class="odfLiEnd"/> </p></li></ul></li></ul><p class="P6"> </p><p class="Standard"><span class="T5">Vue materiel/find </span><span class="T2">: limiter aux </span><span class="T5">matériels actifs</span><span class="T2"> (non archivés)</span></p><p class="P6"><span> Seul le<span class="T20">s</span> profil<span class="T20">s</span> Admin<span class="T20">+ </span>voit TOUS les matériels (y-compris archivés)</span></p><p class="P6"> </p><p class="P6"><span class="T4">Vue materiel/view </span>:</p><p class="P6"><span> boutons « Imprimer Etiquettes » : <span class="T20">resp+</span></span></p><p class="P6"> </p><p class="P6"><span class="T4">Vue materiel/edit </span>:</p><ul><li><p class="P56" style="margin-left:0cm;"><span class="WW8Num5z0" style="display:block;float:left;min-width:0,635cm;">.</span>Etiquette O/N (admin<span class="T20">+)</span><span class="odfLiEnd"/> </p></li><li><p class="P56" style="margin-left:0cm;"><span class="WW8Num5z0" style="display:block;float:left;min-width:0,635cm;">.</span>Statut (<span class="T20">superadmin+)</span><span class="odfLiEnd"/> </p></li><li><p class="P56" style="margin-left:0cm;"><span class="WW8Num5z0" style="display:block;float:left;min-width:0,635cm;">.</span>Informations administratives (admin<span class="T20">+)</span><span class="odfLiEnd"/> </p></li></ul><p class="P6"> </p><p class="P6"> </p><p class="P1"> </p><p class="P19">D - sur un SUIVI et un EMPRUNT</p><p class="P1"> </p><ul><li><p class="P57" style="margin-left:0cm;"><span class="WW8Num3z0" style="display:block;float:left;min-width:0,635cm;">.</span>Dans tous les cas, on ne doit pas pouvoir emprunter ou suivre un materiel non validé (CREATED)<span class="odfLiEnd"/> </p></li><li><p class="P57" style="margin-left:0cm;"><span class="WW8Num3z0" style="display:block;float:left;min-width:0,635cm;">.</span>User a les droits C, R, U (si créateur), D (si créateur)<span class="odfLiEnd"/> </p></li><li><p class="P57" style="margin-left:0cm;"><span class="WW8Num3z0" style="display:block;float:left;min-width:0,635cm;">.</span>Resp+ a les droits C, R, U, D<span class="odfLiEnd"/> </p></li></ul><p class="P4"><span class="T9">Un USER peut modifier/supprimer un emprunt dont il est soit le créateur soit l'emprunteur</span><span class="T19">.</span></p><p class="P12">Un USER qui créé un emprunt ne doit pas pouvoir changer le nom de l'emprunteur (par défaut, c'est lui). Ainsi, il pourra modifier/supprimer cette fiche au besoin plus tard. Par défaut donc, pour un user, emprunt.emprunteur=creator, materiel.responsable=creator</p><p class="P13">Tout le monde peut rechercher un suivi,</p><p class="P5"> </p><p class="P5"> </p><p class="P3">E - sur les UTILISATEURS</p><p class="P4"><span class="T9">Par défaut, superadmin a tous les droits, et les autres profils n'ont que le droit de lecture (</span><span class="T7">view </span><span class="T9">et </span><span class="T7">index</span><span class="T9">)</span></p><p class="P5"> </p><p class="P5"> </p><p class="P3">F - sur tous les autres objets métiers</p><p class="P5">Voici la liste des autres objets métiers :</p><ul><li><p class="P58" style="margin-left:0cm;"><span class="WW8Num7z0" style="display:block;float:left;min-width:0,635cm;">.</span>Catégories (et domaines et sous-catégories)<span class="odfLiEnd"/> </p></li></ul><ul><li><p class="P59" style="margin-left:0cm;"><span class="WW8Num6z0" style="display:block;float:left;min-width:0,635cm;">.</span>Groupes thématiques<span class="odfLiEnd"/> </p></li><li><p class="P59" style="margin-left:0cm;"><span class="WW8Num6z0" style="display:block;float:left;min-width:0,635cm;">.</span>Groupes métiers<span class="odfLiEnd"/> </p></li></ul><p class="P4"><span class="T9">Par défaut, pour tous ces objets, superadmin a tous les droits, admin</span><span class="T10">plus</span><span class="T9"> a tous les droits sauf « delete », et les autres profils n'ont que le droit de lecture (</span><span class="T7">view </span><span class="T9">et </span><span class="T7">index</span><span class="T9">)</span></p>
  117 + </style></head><body dir="ltr" style="max-width:29.7cm;margin-top:1cm; margin-bottom:1cm; margin-left:1cm; margin-right:1.45cm; writing-mode:lr-tb; "><p class="P46">ACL (Access Control List)</p><p class="P11">(Etienne Pallier – 24/<span class="T22">06</span>/201<span class="T23">6</span>)</p><p class="P1"> </p><p class="P1"> </p><p class="P1"> </p><p class="P1">I – Cycle de vie du statut du matériel</p><p class="P1"> </p><p class="Standard"><span class="T5">Créer</span><span class="T2"> un matériel ==</span><span class="T9">&gt; passe alors en statut </span><span class="T7">CREATED ==&gt; </span><span class="T1">peut alors être éventuellement supprimé (mais ne pourra plus être supprimé ensuite)</span></p><p class="Standard"><span class="T7">Valider</span><span class="T9"> un matériel CREATED ==&gt; passe alors en statut </span><span class="T7">VALIDATED </span><span class="T9">(</span><span class="T11">resp et </span><span class="T9">admin only)</span></p><p class="P4"><span class="T7">Demander l'Archivage</span><span class="T9"> d'un materiel VALIDATED ==&gt; passe alors en statut </span><span class="T7">TOBEARCHIVED</span><span class="T9"> (resp et admin only)</span></p><p class="P4"><span class="T7">Sortir</span><span class="T9"> de l'inventaire (Valider une demande d'archivage d'un matériel TOBEARCHIVED) ==&gt; statut </span><span class="T7">ARCHIVED</span><span class="T9"> (admin only)</span></p><p class="P4"><span class="T7">Désarchiver</span><span class="T9"> un matériel ==&gt; repasse de TOBEARCHIVED ou ARCHIVED à </span><span class="T7">VALIDATED</span><span class="T9"> (admin only) </span></p><p class="P4"> </p><p class="P5">En résumé : </p><p class="P4"> </p><p class="P3">CREATED ==&gt;  VALIDATED ==&gt;  TOBEARCHIVED ==&gt;  ARCHIVED</p><p class="P2"><span class="T12">     </span><span class="T8">I                        /\                        I                                I</span></p><p class="P2"><span class="T12">    </span><span class="T8">V                                    I ------------------------        I ---------------------------------        I (adminplus only)</span></p><p class="P3">DELETED</p><p class="P2"> </p><p class="P2"> </p><p class="P2"> </p><p class="P1">II - Droits des utilisateurs selon leur profil</p><p class="P1"> </p><p class="P1">A – Globalement (principes généraux)</p><p class="P1"> </p><p class="P6">Un utilisateur non logué ne doit RIEN pouvoir faire. Seulement se loguer, c'est tout. Il n'a accès qu'à la page d'accueil (de login).</p><p class="P6">Une fois logué, un utilisateur a des droits différents selon son profil, globalement :</p><p class="P14"><span class="T2">- un </span><span class="T5">USER</span><span class="T2"> ne peut que créer un matériel, un suivi, ou un emprunt, consulter, et modifier (uniquement ce qu'il a créé lui-même)</span></p><p class="P18"><span class="T2">- un </span><span class="T5">RESPONSABLE</span><span class="T2"> a tous les droits sauf accès à certains champs et certaines vues réservées à l'administration (ADMIN). Il ne peut pas non plus archiver un matériel, mais seulement demander l'archivage (comme un USER)(uniquement ce </span><span class="T3">lié à son groupe métier ou thématiques</span><span class="T2">)</span></p><p class="P14"><span class="T2">- un </span><span class="T5">ADMIN</span><span class="T2">(istratif) a tous les droits (y-compris champs réservés à l'administration)</span></p><p class="P14"><span class="T2">- un </span><span class="T5">ADMINPLUS</span><span class="T2"> (administratif Plus) a tous les droits de ADMIN et en plus il peut modifier un matériel quelque soit son statut (y-compris TOBEARCHIVED et ARCHIVED), notamment il peut modifier le statut du matériel (pour le rétrograder)</span></p><p class="P14"><span class="T2">- un </span><span class="T5">SUPERADMIN</span><span class="T2"> a tous les droits : ceux d'ADMINPLUS et certains droits supplémentaires pour lui permettre des corrections d'erreur et la configuration de l'application (notamment l'administration des utilisateurs...)</span></p><p class="P15"> </p><p class="Standard"><span class="T2">Concernant les informations internes permettant de savoir </span><span class="T5">qui a fait quoi</span><span class="T2"> (mises en place en février 2014), elles ne sont bien sûr pas modifiables puisque gérées automatiquement par le système, mais sont visibles par tous excepté le profil USER.</span></p><p class="P1"/><p class="P7">B - sur la table MATERIEL</p><table border="0" cellspacing="0" cellpadding="0" class="Tableau2"><colgroup><col width="170"/><col width="170"/><col width="170"/><col width="170"/><col width="170"/><col width="170"/><col width="170"/></colgroup><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="Table_20_Contents"> </p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P41">ALL (TOUS)</p><p class="P43">(droits par defaut)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P40"><span class="T5">U</span><span class="T6">tilisateur </span><span class="T5"> </span><span class="T2">(quelconque)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P42">Responsable</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P42">Administration</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P42">Administration Plus</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_G1"><p class="P42">Super-Administrateur</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Read (un seul ou une liste)</p><p class="P45">(view ou index)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P25">Y</p><p class="Table_20_Contents"><span class="T14">champs caches:</span><span class="T13"> donnees admin</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P36">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P36">idem ALL</p></td><td rowspan="3" style="text-align:left;width:3.893cm; " class="Tableau2_E4"><p class="P23"><span class="T16">(idem Responsable </span><span class="T15">+  donnees admin</span><span class="T16">)</span></p><p class="P37"> </p><p class="P23"><span class="T13">En mode edit (update), si VALIDATED, on ajoute aux donnees </span><span class="T14">readonly</span><span class="T13"> les </span><span class="T14">donnees admin</span></p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_F3"><p class="P37">idem Admin</p></td><td rowspan="11" style="text-align:left;width:3.893cm; " class="Tableau2_G12"><p class="P37">idem Adminplus</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Create (1)</p><p class="P45">(add)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">Y</p><p class="P39"><span class="T14">champs caches</span><span class="T13">:</span></p><p class="P34">donnees admin + statut + etiquette </p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P36">Idem ALL</p><p class="P39"><span class="T14">champs readonly </span><span class="T13">:</span></p><p class="P34">nom_responsable</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_D4"><p class="P36">idem ALL</p><p class="P36">(+ etiquette)</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Update (1)</p><p class="P45">(edit)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">Y</p><p class="P33">ssi</p><p class="P39"><span class="T15">CREATED</span><span class="T16"> (tous les champs) </span></p><p class="P39"><span class="T13">ou </span><span class="T14">VALIDATED</span><span class="T13"> (quelques champs visibles sont </span><span class="T14">readonly</span><span class="T13">) (1)</span></p><p class="P34"> </p><p class="P39"><span class="T14">champs caches</span><span class="T13">:</span></p><p class="P34">donnees admin + statut + etiquette</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_C5"><p class="P36">idem ALL</p><p class="P22"><span class="T16">ssi </span><span class="T15">createur</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">idem Admin</p><p class="P23"><span class="T16">(</span><span class="T15">tous les statuts</span><span class="T16">)</span></p><p class="P23"><span class="T16">(+ champ </span><span class="T15">statut</span><span class="T16">)</span></p><p class="P23"> </p><p class="P23"><span class="T16">TOBEARCHIVED ou ARCHIVED: </span><span class="T15">seulement le statut</span></p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Delete</p><p class="P45">(delete)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">Y</p><p class="P29">ssi CREATED</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">idem ALL</p></td><td rowspan="3" style="text-align:left;width:3.893cm; " class="Tableau2_E7"><p class="P37">idem Responsable</p></td><td rowspan="4" style="text-align:left;width:3.893cm; " class="Tableau2_F8"><p class="P37">idem Admin</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Valider</p><p class="P45">(statusValidated)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P25">N</p><p class="P28">(resp+)</p></td><td rowspan="7" style="text-align:left;width:3.893cm; " class="Tableau2_C12"><p class="P36">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p><p class="P30">ssi</p><p class="P30">CREATED</p><p class="P37"> </p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Demander archivage</p><p class="P45">(statusToBeArchived)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P25">N</p><p class="P28">(resp+)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p><p class="P30">ssi</p><p class="P30">VALIDATED</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Sortir de l'inventaire</p><p class="P45"><span class="T12"> </span>(statusArchived)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(admin+)</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_D9"><p class="P37">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P35">Y</p><p class="P28">ssi</p><p class="P28">TOBEARCHIVED</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Desarchiver (2)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(adminplus+)</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_E10"><p class="P37">idem Responsable</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p><p class="P30">ssi</p><p class="P30">ARCHIVED ou</p><p class="P30">TOBEARCHIVED</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Exporter</p><p class="P45">(csv)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(resp+)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p></td><td rowspan="3" style="text-align:left;width:3.893cm; " class="Tableau2_F12"><p class="P37">idem Admin</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Montee de statut group<span class="T24">é</span>e</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(admin+)</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_D12"><p class="P37">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P38">Y</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Edition (4)</p><p class="P44">DOCUMENTS</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E12"><p class="P26">N</p><p class="P29">(admin+)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E12"><p class="P37">Y</p><p class="P31">- admission : ssi VALIDATED</p><p class="P31">- sortie : ssi TOBEARCHIVED ou ARCHIVED</p></td></tr><tr class="Tableau213"><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P68">Fiche Matériel </p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E13"><p class="P62">Y <span class="T25">(sans partie admin)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_C13"><p class="P49">Y <span class="T25">(sans partie admin)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_D13"><p class="P49">Y <span class="T25">(sans partie admin)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E13"><p class="P62">Y</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_F13"><p class="P49">Y</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_G13"><p class="P49">Y <span class="T25">(sans partie admin)</span></p></td></tr></table><p class="P7"> </p><p class="P7"> </p><p class="P6"> </p><p class="P10">Par défaut, le superadmin a TOUS les droits</p><p class="P10"> </p><p class="Standard"><span class="T15">Conventions d'écriture </span><span class="T16">: </span></p><p class="P14"><span class="T16">- r</span><span class="T15">esp+</span><span class="T16"> = possible pour un </span><span class="T15">Responsable et plus </span><span class="T16">(responsable, admin, adminplus, et superadmin)</span></p><p class="P14"><span class="T16">- </span><span class="T15">admin+</span><span class="T16"> = possible pour un </span><span class="T15">Admin</span><span class="T16"> </span><span class="T15">et plus </span><span class="T16">(admin, adminplus, et superadmin)</span></p><p class="P16">- ...</p><p class="P16"> </p><p class="Standard"><span class="T15">Notes </span><span class="T16">:</span></p><p class="P9"> </p><ol><li><p class="P47" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(1)</span><span class="T15">Droits en modification (edit) </span><span class="T16">:</span><span class="odfLiEnd"></span> </p></li></ol><p class="P16">- Un simple « user » ne doit pas pouvoir modifier le responsable, ni le statut, ni l'étiquette, ni les données admin d'un matériel (en mode Création comme Modification)</p><p class="P16">- Un  «responsable » ne doit pas pouvoir modifier le statut, ni les données admin d'un matériel (en mode Création comme Modification)</p><p class="P16">- Les données admin ne sont accessibles qu'aux profils admin+</p><p class="P14"><span class="T16">- Le champ "</span><span class="T15">status</span><span class="T16">" n'est modifiable que par les profils adminplus+</span></p><p class="P14"><span class="T16">- Tout le monde peut modifier un matériel </span><span class="T15">VALIDATED </span><span class="T16">(</span><span class="T15">user </span><span class="T16">ne peut modifier que </span><span class="T15">ses</span><span class="T16"> matériels, </span><span class="T17">resp ne peut modifier que les matériels de son groupe thématique ou métier</span><span class="T16">),</span></p><p class="P14"><span class="T16">MAIS PAS</span><span class="T15"> certains champs</span><span class="T16"> qui sont </span><span class="T15">readonly</span><span class="T16"> (</span><span class="T18">sur_categorie_id', 'categorie_id', 'materiel_administratif', 'materiel_technique', 'date_acquisition', 'nom_responsable', 'fournisseur', 'organisme', 'prix_ht')</span></p><p class="P14"><span class="T16">Les seuls champs qu'on peut éditer sont donc : (</span><span class="T18">designation, sous_categorie, materiel_administratif, materiel_technique, description, etiquette, lieu_stockage, lieu_detail, numero_serie, groupes_thematique, groupes_metier),</span><span class="T16"><br/>- Seuls les profils </span><span class="T15">adminplus+</span><span class="T16"> peuvent modifier un matériel </span><span class="T15">TOBEARCHIVED, ou ARCHIVED </span><span class="T16">mais </span><span class="T15">UNIQUEMENT le champ "status" </span><span class="T16">(pour pouvoir rétrograder à CREATED ou VALIDATED)</span></p><p class="P14"><span class="T16">- Le seul moyen de modifier COMPLÈTEMENT un matériel VALIDATED, TOBEARCHIVED, ou ARCHIVED, <br/>c'est de </span><span class="T15">changer son statut</span><span class="T16">, en le rétrogradant à CREATED (seuls les profils adminplus+ peuvent le faire)</span></p><p class="P16"> </p><ol><li><p class="P47" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(2)</span><span class="T15">Désarchiver </span><span class="T16">: consiste à rétrograder un matériel ARCHIVED ou TOBEARCHIVED dans le statut VALIDATED ou CREATED (adminplus+ only) ; utile en cas d'erreur</span><span class="odfLiEnd"></span> </p></li></ol><p class="P8"> </p><ol><li><p class="P47" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(3)</span><span class="T15">Montée de statut groupée : </span><span class="T16">seul ADMIN peut (exporter tout ou partie de la liste des matériels, et) </span><span class="T15">augmenter (+1) le statut d'un groupe de matériels</span><span class="T16">, depuis la vue « index » (vue spéciale pour ADMIN, avec des cases à cocher et boutons pour exporter ou faire évoluer le statut)</span><span class="odfLiEnd"></span> </p></li></ol><p class="P8"> </p><ol><li><p class="P48" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(4)</span>Edition des documents :<span class="odfLiEnd"/> </p></li></ol><p class="P16">Admission : quand on "VALIDE" un matériel "CREATED", le statut passe en VALIDATED et le document d'admission est automatiquement édité</p><p class="P16">Sortie : quand on "ARCHIVE" un document "TOBEARCHIVED", le statut passe en ARCHIVED et le document de sortie est automatiquement édité</p><p class="P16">De plus :</p><p class="P16">- Bouton "Doc admission" affiché à partir du statut "VALIDATED"</p><p class="P16">- Bouton "Doc Sortie" affiché à partir du statut TOBEARCHIVED (et donc aussi pour ARCHIVED)</p><p class="P16">Enfin, Le doc de sortie doit être couplée avec la liste des matériels a archiver (TOBEARCHIVED) quand il y a une demande de sortie.</p><p class="P16"> </p><p class="P17"> </p><p class="P1">C - sur les différentes VUES liées au matériel</p><p class="Standard"> </p><p class="P6"><span class="T4">Page accueil </span>:</p><p class="P6"><span> Administration <span class="T20">&amp; Administration Plus </span>voit un menu avec 2 options :</span></p><ul><li><ul><li><ul><li><p class="P51" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels à valider »<span class="odfLiEnd"/> </p></li><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels à sortir de l'inventaire »<span class="odfLiEnd"/> </p></li></ul></li></ul><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0cm"><!-- --></span><span class="T21">Responsable </span>voit un menu avec <span class="T21">3</span> options :<span class="odfLiEnd"/> </p><ul><li><ul><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels <span class="T21">de mon groupe métier</span> »<span class="odfLiEnd"/> </p></li><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels <span class="T21">de mon groupe métier à valider</span> »<span class="odfLiEnd"/> </p></li><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« <span class="T21">Voir les suivis des matériels donc je suis responsable »</span><span class="odfLiEnd"/> </p></li></ul></li></ul></li></ul><p class="P1">Page Outils :</p><p class="P6">User n'a pas accès à cette page</p><p class="P6">Les autres ont quelques options</p><p class="P6">superadmin a ces options en plus :</p><ul><li><p class="P53" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Configuration générale de l'application<span class="odfLiEnd"></span> </p></li><li><p class="P53" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Gérer les utilisateurs <span class="T20">privilégiés</span><span class="odfLiEnd"/> </p></li><li><p class="P53" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Passer en mode debug<span class="odfLiEnd"/> </p></li><li><p class="P54" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Passer en mode install<span class="odfLiEnd"/> </p></li></ul><p class="P6"> </p><p class="Standard"><span class="T5">Vue materiel/index (liste) </span><span class="T2">: limiter aux </span><span class="T5">matériels actifs</span><span class="T2"> (non archivés)</span></p><ul><li><ul><li><p class="P55" style="margin-left:0cm;"><span class="WW8Num1z0" style="display:block;float:left;min-width:0,635cm;">.</span>Admin<span class="T20">+ </span>voit des boutons pour filtrer par « tous », « à valider », « validés », « à sortir », « archivés »<span class="odfLiEnd"/> </p></li></ul></li></ul><p class="P6"> </p><p class="Standard"><span class="T5">Vue materiel/find </span><span class="T2">: limiter aux </span><span class="T5">matériels actifs</span><span class="T2"> (non archivés)</span></p><p class="P6"><span> Seul le<span class="T20">s</span> profil<span class="T20">s</span> Admin<span class="T20">+ </span>voit TOUS les matériels (y-compris archivés)</span></p><p class="P6"> </p><p class="P6"><span class="T4">Vue materiel/view </span>:</p><p class="P6"><span> boutons « Imprimer Etiquettes » : <span class="T20">resp+</span></span></p><p class="P6"> </p><p class="P6"><span class="T4">Vue materiel/edit </span>:</p><ul><li><p class="P56" style="margin-left:0cm;"><span class="WW8Num5z0" style="display:block;float:left;min-width:0,635cm;">.</span>Etiquette O/N (admin<span class="T20">+)</span><span class="odfLiEnd"/> </p></li><li><p class="P56" style="margin-left:0cm;"><span class="WW8Num5z0" style="display:block;float:left;min-width:0,635cm;">.</span>Statut (<span class="T20">superadmin+)</span><span class="odfLiEnd"/> </p></li><li><p class="P56" style="margin-left:0cm;"><span class="WW8Num5z0" style="display:block;float:left;min-width:0,635cm;">.</span>Informations administratives (admin<span class="T20">+)</span><span class="odfLiEnd"/> </p></li></ul><p class="P6"> </p><p class="P6"> </p><p class="P1"> </p><p class="P19">D - sur un SUIVI et un EMPRUNT</p><p class="P1"> </p><ul><li><p class="P57" style="margin-left:0cm;"><span class="WW8Num3z0" style="display:block;float:left;min-width:0,635cm;">.</span>Dans tous les cas, on ne doit pas pouvoir emprunter ou suivre un materiel non validé (CREATED)<span class="odfLiEnd"/> </p></li><li><p class="P57" style="margin-left:0cm;"><span class="WW8Num3z0" style="display:block;float:left;min-width:0,635cm;">.</span>User a les droits C, R, U (si créateur), D (si créateur)<span class="odfLiEnd"/> </p></li><li><p class="P57" style="margin-left:0cm;"><span class="WW8Num3z0" style="display:block;float:left;min-width:0,635cm;">.</span>Resp+ a les droits C, R, U, D<span class="odfLiEnd"/> </p></li></ul><p class="P4"><span class="T9">Un USER peut modifier/supprimer un emprunt dont il est soit le créateur soit l'emprunteur</span><span class="T19">.</span></p><p class="P12">Un USER qui créé un emprunt ne doit pas pouvoir changer le nom de l'emprunteur (par défaut, c'est lui). Ainsi, il pourra modifier/supprimer cette fiche au besoin plus tard. Par défaut donc, pour un user, emprunt.emprunteur=creator, materiel.responsable=creator</p><p class="P13">Tout le monde peut rechercher un suivi,</p><p class="P5"> </p><p class="P5"> </p><p class="P3">E - sur les UTILISATEURS</p><p class="P4"><span class="T9">Par défaut, superadmin a tous les droits, et les autres profils n'ont que le droit de lecture (</span><span class="T7">view </span><span class="T9">et </span><span class="T7">index</span><span class="T9">)</span></p><p class="P5"> </p><p class="P5"> </p><p class="P3">F - sur tous les autres objets métiers</p><p class="P5">Voici la liste des autres objets métiers :</p><ul><li><p class="P58" style="margin-left:0cm;"><span class="WW8Num7z0" style="display:block;float:left;min-width:0,635cm;">.</span>Catégories (et domaines et sous-catégories)<span class="odfLiEnd"/> </p></li></ul><ul><li><p class="P59" style="margin-left:0cm;"><span class="WW8Num6z0" style="display:block;float:left;min-width:0,635cm;">.</span>Groupes thématiques<span class="odfLiEnd"/> </p></li><li><p class="P59" style="margin-left:0cm;"><span class="WW8Num6z0" style="display:block;float:left;min-width:0,635cm;">.</span>Groupes métiers<span class="odfLiEnd"/> </p></li></ul><p class="P4"><span class="T9">Par défaut, pour tous ces objets, superadmin a tous les droits, admin</span><span class="T10">plus</span><span class="T9"> a tous les droits sauf « delete », et les autres profils n'ont que le droit de lecture (</span><span class="T7">view </span><span class="T9">et </span><span class="T7">index</span><span class="T9">)</span></p>
118 118  
119 119 <div class="actions">
120 120 <?php echo $this->element('menu') ?>
... ...
src/Template/Pages/home.ctp
1 1 <?php
2 2  
3   -use Cake\Core\Configure;
  3 +
4 4  
5 5 //if (Configure::read('debug')) {
6 6 if ($configuration->mode_install) {
... ...
src/Template/Pages/home_install.ctp
... ... @@ -13,7 +13,6 @@
13 13 * @license http://www.opensource.org/licenses/mit-license.php MIT License
14 14 */
15 15 use Cake\Cache\Cache;
16   -use Cake\Core\Configure;
17 16 use Cake\Datasource\ConnectionManager;
18 17 use Cake\Error\Debugger;
19 18  
... ... @@ -39,7 +38,7 @@ $this-&gt;layout = false;
39 38 </header>
40 39 <div id="content">
41 40 <div class="row">
42   - <div class="columns large-12 ctp-warning checks", style="text-align: center">
  41 + <div class="columns large-12 ctp-warning checks" style="text-align: center">
43 42 <?php echo $this->Form->postLink("Stopper le mode installation", ['controller' => 'configurations', 'action'=>'installOff'], ['confirm' => __('Êtes-vous sur ?')]); ?>
44 43 </div>
45 44 <?php Debugger::checkSecurityKeys(); ?>
... ...
src/Template/Pages/tools.ctp
1 1  
2 2 <div class="index">
3 3 <h2><i class="icon-wrench"></i> Outils</h2>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <tr><th></th></tr>
6 6 <?php
7 7 if($role == 'Super Administrateur'):
... ...
src/Template/Pages/tools_cat.ctp
1 1  
2 2 <div class="index">
3 3 <h2><i class="icon-wrench"></i> Gérer les Catégories</h2>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <tr><th></th></tr>
6 6 <?php
7 7  
... ...
src/Template/Pages/tools_menu_cat.ctp
1 1  
2 2 <div class="index">
3 3 <h2><i class="icon-wrench"></i> Voir les liste des Catégories</h2>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <tr><th></th></tr>
6 6 <?php
7 7  
... ...
src/Template/Pages/tools_menu_sm.ctp
1 1 <div class="index">
2 2 <h2><i class="icon-wrench"></i> Voir les autres listes</h2>
3   -<table cellpadding="0" cellspacing="0">
  3 +<table style="border-collapse: separate; border-spacing: 0;">
4 4 <tr><th></th></tr>
5 5 <?php
6 6  
... ...
src/Template/Pages/tools_sm.ctp
1 1 <div class="index">
2 2 <h2><i class="icon-wrench"></i> Gérer le contenu variable de l'application</h2>
3   -<table cellpadding="0" cellspacing="0">
  3 +<table style="border-collapse: separate; border-spacing: 0;">
4 4 <tr><th></th></tr>
5 5 <?php
6 6  
... ...
src/Template/Sites/index.ctp
1 1  
2 2 <div class="sites index">
3 3 <?php echo '<h2><i class="icon-list"></i> Liste des sites</h2>'; ?>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <thead>
6 6 <tr>
7 7 <th class="actions"><?= __('') ?></th>
... ...
src/Template/SousCategories/index.ctp
1 1  
2 2 <div class="sousCategories index">
3 3 <?php echo '<h2><i class="icon-list"></i> Liste des sous-catégories</h2>'; ?>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <thead>
6 6 <tr>
7 7 <th class="actions"><?= __('') ?></th>
... ...
src/Template/Suivis/index.ctp
1 1  
2 2 <div class="suivis index">
3 3 <?php echo '<h2><i class="icon-list"></i> Liste des suivis ('.$nbSuivis.')</h2>'; ?>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <thead>
6 6 <tr>
7 7 <th class="actions"><?= __('') ?></th>
... ...
src/Template/SurCategories/index.ctp
1 1  
2 2 <div class="surCategories index">
3 3 <?php echo '<h2><i class="icon-list"></i> Liste des domaines</h2>'; ?>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <thead>
6 6 <tr>
7 7 <th class="actions"><?= __('') ?></th>
... ...
src/Template/TypeDocuments/index.ctp
1 1  
2 2 <div class="typeDocuments index">
3 3 <?php echo '<h2><i class="icon-list"></i> Liste des types de documents</h2>'; ?>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <thead>
6 6 <tr>
7 7 <th class="actions"><?= __('') ?></th>
... ...
src/Template/TypeSuivis/index.ctp
1 1  
2 2 <div class="typeSuivis index">
3 3 <?php echo '<h2><i class="icon-list"></i> Liste des types de suivis</h2>'; ?>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <thead>
6 6 <tr>
7 7 <th class="actions"><?= __('') ?></th>
... ...
src/Template/Users/index.ctp
1 1  
2 2 <div class="users index">
3 3 <?php echo '<h2><i class="icon-list"></i> Liste des utilisateurs privilégiés ('.$nbUsers.')</h2>'; ?>
4   - <table cellpadding="0" cellspacing="0">
  4 + <table style="border-collapse: separate; border-spacing: 0;">
5 5 <thead>
6 6 <tr>
7 7 <th class="actions"><?= __('') ?></th>
... ...
tests/Fixture/ConfigurationsFixture.php
... ... @@ -51,6 +51,7 @@ class ConfigurationsFixture extends TestFixture
51 51 'numero_labo_sans_annee' => ['type' => 'boolean', 'length' => null, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null],
52 52 'prix_inventaire_administratif' => ['type' => 'integer', 'length' => 10, 'null' => true, 'default' => 800, 'comment' => '', 'precision' => null],
53 53 'taille_max_doc' => ['type' => 'integer', 'length' => 15, 'null' => true, 'default' => 8000000, 'comment' => '', 'precision' => null],
  54 + 'aff_par_defaut' => ['type' => 'integer', 'length' => 6, 'null' => false, 'default' => 20, 'comment' => '', 'precision' => null],
54 55 '_constraints' => [
55 56 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
56 57 'nom_UNIQUE' => ['type' => 'unique', 'columns' => ['nom'], 'length' => []],
... ...
tests/TestCase/Controller/MaterielsControllerTest.php
... ... @@ -296,7 +296,7 @@ class MaterielsControllerTest extends IntegrationTestCase
296 296 ];
297 297 $this->post('/materiels/edit/2', $data);
298 298 $this->get('/materiels/index');
299   - $this->assertResponseContains("Test 6", "Le matériel n'a pas était édité correctement");
  299 + $this->assertResponseContains("Test 6", "Le matériel n'a pas été édité correctement");
300 300 // $this->assertResponseNotContains("Test 2", "Le matériel n'a pas était édité correctement");
301 301  
302 302 $data2 = [
... ... @@ -560,7 +560,8 @@ class MaterielsControllerTest extends IntegrationTestCase
560 560 $this->assertResponseContains("TEST COPIE MATERIEL", "La copie du materiel ne se fait pas correctement.");
561 561  
562 562 }
563   -
  563 + */
  564 +
564 565 /**
565 566 *
566 567 * Test updateStatutCreated
... ...
vendor/webmozart/assert/.composer-auth.json 0 → 100644
... ... @@ -0,0 +1,7 @@
  1 +{
  2 + "github-oauth": {
  3 + "github.com": "PLEASE DO NOT USE THIS TOKEN IN YOUR OWN PROJECTS/FORKS",
  4 + "github.com": "This token is reserved for testing the webmozart/* repositories",
  5 + "github.com": "a9debbffdd953ee9b3b82dbc3b807cde2086bb86"
  6 + }
  7 +}
... ...
vendor/webmozart/assert/appveyor.yml 0 → 100644
... ... @@ -0,0 +1,40 @@
  1 +build: false
  2 +platform: x86
  3 +clone_folder: c:\projects\webmozart\assert
  4 +
  5 +branches:
  6 + only:
  7 + - master
  8 +
  9 +cache:
  10 + - c:\php -> appveyor.yml
  11 +
  12 +init:
  13 + - SET PATH=c:\php;%PATH%
  14 + - SET COMPOSER_NO_INTERACTION=1
  15 + - SET PHP=1
  16 +
  17 +install:
  18 + - IF EXIST c:\php (SET PHP=0) ELSE (mkdir c:\php)
  19 + - cd c:\php
  20 + - IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-7.0.0-nts-Win32-VC14-x86.zip
  21 + - IF %PHP%==1 7z x php-7.0.0-nts-Win32-VC14-x86.zip -y >nul
  22 + - IF %PHP%==1 del /Q *.zip
  23 + - IF %PHP%==1 echo @php %%~dp0composer.phar %%* > composer.bat
  24 + - IF %PHP%==1 copy /Y php.ini-development php.ini
  25 + - IF %PHP%==1 echo max_execution_time=1200 >> php.ini
  26 + - IF %PHP%==1 echo date.timezone="UTC" >> php.ini
  27 + - IF %PHP%==1 echo extension_dir=ext >> php.ini
  28 + - IF %PHP%==1 echo extension=php_curl.dll >> php.ini
  29 + - IF %PHP%==1 echo extension=php_openssl.dll >> php.ini
  30 + - IF %PHP%==1 echo extension=php_mbstring.dll >> php.ini
  31 + - IF %PHP%==1 echo extension=php_fileinfo.dll >> php.ini
  32 + - appveyor DownloadFile https://getcomposer.org/composer.phar
  33 + - cd c:\projects\webmozart\assert
  34 + - mkdir %APPDATA%\Composer
  35 + - IF %APPVEYOR_REPO_NAME%==webmozart/assert copy /Y .composer-auth.json %APPDATA%\Composer\auth.json
  36 + - composer update --prefer-dist --no-progress --ansi
  37 +
  38 +test_script:
  39 + - cd c:\projects\webmozart\assert
  40 + - vendor\bin\phpunit.bat --verbose
... ...