datapolicycron.class.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. <?php
  2. /* Copyright (C) 2018 Nicolas ZABOURI <info@inovea-conseil.com>
  3. * Copyright (C) 2018-2020 Frédéric France <frederic.france@netlogic.fr>
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  17. */
  18. /**
  19. * \file htdocs/datapolicy/class/datapolicycron.class.php
  20. * \ingroup datapolicy
  21. * \brief File for cron task of module DataPolicy
  22. */
  23. /**
  24. * Class DataPolicyCron
  25. */
  26. class DataPolicyCron
  27. {
  28. /**
  29. * Constructor
  30. *
  31. * @param DoliDB $db Database handler
  32. */
  33. public function __construct($db)
  34. {
  35. $this->db = $db;
  36. }
  37. /**
  38. * Function exec
  39. * CAN BE A CRON TASK
  40. *
  41. * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK)
  42. */
  43. public function cleanDataForDataPolicy()
  44. {
  45. global $conf, $langs, $user;
  46. $langs->load('datapolicy@datapolicy');
  47. $error = 0;
  48. $errormsg = '';
  49. $nbupdated = $nbdeleted = 0;
  50. // FIXME Exclude data from the selection if there is at least 1 invoice.
  51. $arrayofparameters = array(
  52. 'DATAPOLICY_TIERS_CLIENT' => array(
  53. 'sql' => "
  54. SELECT s.rowid FROM ".MAIN_DB_PREFIX."societe as s
  55. WHERE s.entity = %d
  56. AND s.client = 1
  57. AND s.fournisseur = 0
  58. AND s.tms < DATE_SUB(NOW(), INTERVAL %d MONTH)
  59. AND NOT EXISTS (
  60. SELECT id FROM ".MAIN_DB_PREFIX."actioncomm as a WHERE a.fk_soc = s.rowid AND a.tms > DATE_SUB(NOW(), INTERVAL %d MONTH)
  61. )
  62. AND NOT EXISTS (
  63. SELECT rowid FROM ".MAIN_DB_PREFIX."facture as f WHERE f.fk_soc = s.rowid
  64. )
  65. ",
  66. "class" => "Societe",
  67. "file" => DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php',
  68. 'fields_anonym' => array(
  69. 'name' => 'MAKEANONYMOUS',
  70. 'name_bis' => '',
  71. 'name_alias' => '',
  72. 'address' => '',
  73. 'town' => '',
  74. 'zip' => '',
  75. 'phone' => '',
  76. 'email' => '',
  77. 'url' => '',
  78. 'fax' => '',
  79. 'state' => '',
  80. 'country' => '',
  81. 'state_id' => '',
  82. 'socialnetworks' => '',
  83. 'country_id' => '',
  84. )
  85. ),
  86. 'DATAPOLICY_TIERS_PROSPECT' => array(
  87. 'sql' => "
  88. SELECT s.rowid FROM ".MAIN_DB_PREFIX."societe as s
  89. WHERE s.entity = %d
  90. AND s.client = 2
  91. AND s.fournisseur = 0
  92. AND s.tms < DATE_SUB(NOW(), INTERVAL %d MONTH)
  93. AND NOT EXISTS (
  94. SELECT id FROM ".MAIN_DB_PREFIX."actioncomm as a WHERE a.fk_soc = s.rowid AND a.tms > DATE_SUB(NOW(), INTERVAL %d MONTH)
  95. )
  96. AND NOT EXISTS (
  97. SELECT rowid FROM ".MAIN_DB_PREFIX."facture as f WHERE f.fk_soc = s.rowid
  98. )
  99. ",
  100. "class" => "Societe",
  101. "file" => DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php',
  102. 'fields_anonym' => array(
  103. 'name' => 'MAKEANONYMOUS',
  104. 'name_bis' => '',
  105. 'name_alias' => '',
  106. 'address' => '',
  107. 'town' => '',
  108. 'zip' => '',
  109. 'phone' => '',
  110. 'email' => '',
  111. 'url' => '',
  112. 'fax' => '',
  113. 'state' => '',
  114. 'country' => '',
  115. 'state_id' => '',
  116. 'socialnetworks' => '',
  117. 'country_id' => '',
  118. )
  119. ),
  120. 'DATAPOLICY_TIERS_PROSPECT_CLIENT' => array(
  121. 'sql' => "
  122. SELECT s.rowid FROM ".MAIN_DB_PREFIX."societe as s
  123. WHERE s.entity = %d
  124. AND s.client = 3
  125. AND s.fournisseur = 0
  126. AND s.tms < DATE_SUB(NOW(), INTERVAL %d MONTH)
  127. AND NOT EXISTS (
  128. SELECT id FROM ".MAIN_DB_PREFIX."actioncomm as a WHERE a.fk_soc = s.rowid AND a.tms > DATE_SUB(NOW(), INTERVAL %d MONTH)
  129. )
  130. AND NOT EXISTS (
  131. SELECT rowid FROM ".MAIN_DB_PREFIX."facture as f WHERE f.fk_soc = s.rowid
  132. )
  133. ",
  134. "class" => "Societe",
  135. "file" => DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php',
  136. 'fields_anonym' => array(
  137. 'name' => 'MAKEANONYMOUS',
  138. 'name_bis' => '',
  139. 'name_alias' => '',
  140. 'address' => '',
  141. 'town' => '',
  142. 'zip' => '',
  143. 'phone' => '',
  144. 'email' => '',
  145. 'url' => '',
  146. 'fax' => '',
  147. 'state' => '',
  148. 'country' => '',
  149. 'state_id' => '',
  150. 'socialnetworks' => '',
  151. 'country_id' => '',
  152. )
  153. ),
  154. 'DATAPOLICY_TIERS_NIPROSPECT_NICLIENT' => array(
  155. 'sql' => "
  156. SELECT s.rowid FROM ".MAIN_DB_PREFIX."societe as s
  157. WHERE s.entity = %d
  158. AND s.client = 0
  159. AND s.fournisseur = 0
  160. AND s.tms < DATE_SUB(NOW(), INTERVAL %d MONTH)
  161. AND NOT EXISTS (
  162. SELECT id FROM ".MAIN_DB_PREFIX."actioncomm as a WHERE a.fk_soc = s.rowid AND a.tms > DATE_SUB(NOW(), INTERVAL %d MONTH)
  163. )
  164. AND NOT EXISTS (
  165. SELECT rowid FROM ".MAIN_DB_PREFIX."facture as f WHERE f.fk_soc = s.rowid
  166. )
  167. ",
  168. "class" => "Societe",
  169. "file" => DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php',
  170. 'fields_anonym' => array(
  171. 'name' => 'MAKEANONYMOUS',
  172. 'name_bis' => '',
  173. 'name_alias' => '',
  174. 'address' => '',
  175. 'town' => '',
  176. 'zip' => '',
  177. 'phone' => '',
  178. 'email' => '',
  179. 'url' => '',
  180. 'fax' => '',
  181. 'state' => '',
  182. 'country' => '',
  183. 'state_id' => '',
  184. 'socialnetworks' => '',
  185. 'country_id' => '',
  186. )
  187. ),
  188. 'DATAPOLICY_TIERS_FOURNISSEUR' => array(
  189. 'sql' => "
  190. SELECT s.rowid FROM ".MAIN_DB_PREFIX."societe as s
  191. WHERE s.entity = %d
  192. AND s.fournisseur = 1
  193. AND s.tms < DATE_SUB(NOW(), INTERVAL %d MONTH)
  194. AND NOT EXISTS (
  195. SELECT id FROM ".MAIN_DB_PREFIX."actioncomm as a WHERE a.fk_soc = s.rowid AND a.tms > DATE_SUB(NOW(), INTERVAL %d MONTH)
  196. )
  197. AND NOT EXISTS (
  198. SELECT rowid FROM ".MAIN_DB_PREFIX."facture as f WHERE f.fk_soc = s.rowid
  199. )
  200. ",
  201. "class" => "Societe",
  202. "file" => DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php',
  203. 'fields_anonym' => array(
  204. 'name' => 'MAKEANONYMOUS',
  205. 'name_bis' => '',
  206. 'name_alias' => '',
  207. 'address' => '',
  208. 'town' => '',
  209. 'zip' => '',
  210. 'phone' => '',
  211. 'email' => '',
  212. 'url' => '',
  213. 'fax' => '',
  214. 'state' => '',
  215. 'country' => '',
  216. 'state_id' => '',
  217. 'socialnetworks' => '',
  218. 'country_id' => '',
  219. )
  220. ),
  221. 'DATAPOLICY_CONTACT_CLIENT' => array(
  222. 'sql' => "
  223. SELECT c.rowid FROM ".MAIN_DB_PREFIX."socpeople as c
  224. INNER JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = c.fk_soc
  225. WHERE c.entity = %d
  226. AND c.tms < DATE_SUB(NOW(), INTERVAL %d MONTH)
  227. AND s.client = 1
  228. AND s.fournisseur = 0
  229. AND NOT EXISTS (
  230. SELECT id FROM ".MAIN_DB_PREFIX."actioncomm as a WHERE a.fk_contact = c.rowid AND a.tms > DATE_SUB(NOW(), INTERVAL %d MONTH)
  231. )
  232. AND NOT EXISTS (
  233. SELECT rowid FROM ".MAIN_DB_PREFIX."facture as f WHERE f.fk_soc = s.rowid
  234. )
  235. ",
  236. "class" => "Contact",
  237. "file" => DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php',
  238. 'fields_anonym' => array(
  239. 'lastname' => 'MAKEANONYMOUS',
  240. 'firstname' => '',
  241. 'civility_id' => '',
  242. 'poste' => '',
  243. 'address' => '',
  244. 'town' => '',
  245. 'zip' => '',
  246. 'phone_pro' => '',
  247. 'phone_perso' => '',
  248. 'phone_mobile' => '',
  249. 'email' => '',
  250. 'url' => '',
  251. 'fax' => '',
  252. 'state' => '',
  253. 'country' => '',
  254. 'state_id' => '',
  255. 'socialnetworks' => '',
  256. 'country_id' => '',
  257. )
  258. ),
  259. 'DATAPOLICY_CONTACT_PROSPECT' => array(
  260. 'sql' => "
  261. SELECT c.rowid FROM ".MAIN_DB_PREFIX."socpeople as c
  262. INNER JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = c.fk_soc
  263. WHERE c.entity = %d
  264. AND c.tms < DATE_SUB(NOW(), INTERVAL %d MONTH)
  265. AND s.client = 2
  266. AND s.fournisseur = 0
  267. AND NOT EXISTS (
  268. SELECT id FROM ".MAIN_DB_PREFIX."actioncomm as a WHERE a.fk_contact = c.rowid AND a.tms > DATE_SUB(NOW(), INTERVAL %d MONTH)
  269. )
  270. AND NOT EXISTS (
  271. SELECT rowid FROM ".MAIN_DB_PREFIX."facture as f WHERE f.fk_soc = s.rowid
  272. )
  273. ",
  274. "class" => "Contact",
  275. "file" => DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php',
  276. 'fields_anonym' => array(
  277. 'lastname' => 'MAKEANONYMOUS',
  278. 'firstname' => '',
  279. 'civility_id' => '',
  280. 'poste' => '',
  281. 'address' => '',
  282. 'town' => '',
  283. 'zip' => '',
  284. 'phone_pro' => '',
  285. 'phone_perso' => '',
  286. 'phone_mobile' => '',
  287. 'email' => '',
  288. 'url' => '',
  289. 'fax' => '',
  290. 'state' => '',
  291. 'country' => '',
  292. 'state_id' => '',
  293. 'socialnetworks' => '',
  294. 'country_id' => '',
  295. )
  296. ),
  297. 'DATAPOLICY_CONTACT_PROSPECT_CLIENT' => array(
  298. 'sql' => "
  299. SELECT c.rowid FROM ".MAIN_DB_PREFIX."socpeople as c
  300. INNER JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = c.fk_soc
  301. WHERE c.entity = %d
  302. AND c.tms < DATE_SUB(NOW(), INTERVAL %d MONTH)
  303. AND s.client = 3
  304. AND s.fournisseur = 0
  305. AND NOT EXISTS (
  306. SELECT id FROM ".MAIN_DB_PREFIX."actioncomm as a WHERE a.fk_contact = c.rowid AND a.tms > DATE_SUB(NOW(), INTERVAL %d MONTH)
  307. )
  308. AND NOT EXISTS (
  309. SELECT rowid FROM ".MAIN_DB_PREFIX."facture as f WHERE f.fk_soc = s.rowid
  310. )
  311. ",
  312. "class" => "Contact",
  313. "file" => DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php',
  314. 'fields_anonym' => array(
  315. 'lastname' => 'MAKEANONYMOUS',
  316. 'firstname' => '',
  317. 'civility_id' => '',
  318. 'poste' => '',
  319. 'address' => '',
  320. 'town' => '',
  321. 'zip' => '',
  322. 'phone_pro' => '',
  323. 'phone_perso' => '',
  324. 'phone_mobile' => '',
  325. 'email' => '',
  326. 'url' => '',
  327. 'fax' => '',
  328. 'state' => '',
  329. 'country' => '',
  330. 'state_id' => '',
  331. 'socialnetworks' => '',
  332. 'country_id' => '',
  333. )
  334. ),
  335. 'DATAPOLICY_CONTACT_NIPROSPECT_NICLIENT' => array(
  336. 'sql' => "
  337. SELECT c.rowid FROM ".MAIN_DB_PREFIX."socpeople as c
  338. INNER JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = c.fk_soc
  339. WHERE c.entity = %d
  340. AND c.tms < DATE_SUB(NOW(), INTERVAL %d MONTH)
  341. AND s.client = 0
  342. AND s.fournisseur = 0
  343. AND NOT EXISTS (
  344. SELECT id FROM ".MAIN_DB_PREFIX."actioncomm as a WHERE a.fk_contact = c.rowid AND a.tms > DATE_SUB(NOW(), INTERVAL %d MONTH)
  345. )
  346. AND NOT EXISTS (
  347. SELECT rowid FROM ".MAIN_DB_PREFIX."facture as f WHERE f.fk_soc = s.rowid
  348. )
  349. ",
  350. "class" => "Contact",
  351. "file" => DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php',
  352. 'fields_anonym' => array(
  353. 'lastname' => 'MAKEANONYMOUS',
  354. 'firstname' => '',
  355. 'civility_id' => '',
  356. 'poste' => '',
  357. 'address' => '',
  358. 'town' => '',
  359. 'zip' => '',
  360. 'phone_pro' => '',
  361. 'phone_perso' => '',
  362. 'phone_mobile' => '',
  363. 'email' => '',
  364. 'url' => '',
  365. 'fax' => '',
  366. 'state' => '',
  367. 'country' => '',
  368. 'state_id' => '',
  369. 'socialnetworks' => '',
  370. 'country_id' => '',
  371. )
  372. ),
  373. 'DATAPOLICY_CONTACT_FOURNISSEUR' => array(
  374. 'sql' => "
  375. SELECT c.rowid FROM ".MAIN_DB_PREFIX."socpeople as c
  376. INNER JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = c.fk_soc
  377. WHERE c.entity = %d
  378. AND c.tms < DATE_SUB(NOW(), INTERVAL %d MONTH)
  379. AND s.fournisseur = 1
  380. AND NOT EXISTS (
  381. SELECT id FROM ".MAIN_DB_PREFIX."actioncomm as a WHERE a.fk_contact = c.rowid AND a.tms > DATE_SUB(NOW(), INTERVAL %d MONTH)
  382. )
  383. AND NOT EXISTS (
  384. SELECT rowid FROM ".MAIN_DB_PREFIX."facture as f WHERE f.fk_soc = s.rowid
  385. )
  386. ",
  387. "class" => "Contact",
  388. "file" => DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php',
  389. 'fields_anonym' => array(
  390. 'lastname' => 'MAKEANONYMOUS',
  391. 'firstname' => '',
  392. 'civility_id' => '',
  393. 'poste' => '',
  394. 'address' => '',
  395. 'town' => '',
  396. 'zip' => '',
  397. 'phone_pro' => '',
  398. 'phone_perso' => '',
  399. 'phone_mobile' => '',
  400. 'email' => '',
  401. 'url' => '',
  402. 'fax' => '',
  403. 'state' => '',
  404. 'country' => '',
  405. 'state_id' => '',
  406. 'socialnetworks' => '',
  407. 'country_id' => '',
  408. )
  409. ),
  410. 'DATAPOLICY_ADHERENT' => array(
  411. 'sql' => "
  412. SELECT a.rowid FROM ".MAIN_DB_PREFIX."adherent as a
  413. WHERE a.entity = %d
  414. AND a.tms < DATE_SUB(NOW(), INTERVAL %d MONTH)
  415. AND NOT EXISTS (
  416. SELECT id FROM ".MAIN_DB_PREFIX."actioncomm as a WHERE a.fk_element = a.rowid AND a.tms > DATE_SUB(NOW(), INTERVAL %d MONTH) AND a.elementtype LIKE 'member'
  417. )
  418. ",
  419. "class" => "Adherent",
  420. "file" => DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php',
  421. 'fields_anonym' => array(
  422. 'lastname' => 'MAKEANONYMOUS',
  423. 'firstname' => 'MAKEANONYMOUS',
  424. 'civility_id' => '',
  425. 'societe' => '',
  426. 'address' => '',
  427. 'town' => '',
  428. 'zip' => '',
  429. 'phone' => '',
  430. 'phone_perso' => '',
  431. 'phone_mobile' => '',
  432. 'email' => '',
  433. 'url' => '',
  434. 'fax' => '',
  435. 'state' => '',
  436. 'country' => '',
  437. 'state_id' => '',
  438. 'socialnetworks' => '',
  439. 'country_id' => '',
  440. )
  441. ),
  442. );
  443. $this->db->begin();
  444. foreach ($arrayofparameters as $key => $params) {
  445. if (getDolGlobalInt($key) > 0) {
  446. $sql = sprintf($params['sql'], (int) $conf->entity, (int) getDolGlobalInt($key), (int) getDolGlobalInt($key));
  447. $resql = $this->db->query($sql);
  448. if ($resql && $this->db->num_rows($resql) > 0) {
  449. $num = $this->db->num_rows($resql);
  450. $i = 0;
  451. require_once $params['file'];
  452. $object = new $params['class']($this->db);
  453. while ($i < $num && !$error) {
  454. $obj = $this->db->fetch_object($resql);
  455. $object->fetch($obj->rowid);
  456. $object->id = $obj->rowid;
  457. $action = 'anonymize'; // TODO Offer also action "delete" in setup of module
  458. if ($action == 'anonymize') {
  459. if ($object->isObjectUsed($obj->rowid) == 0) { // If object to clean is used
  460. foreach ($params['fields_anonym'] as $fields => $val) {
  461. if ($val == 'MAKEANONYMOUS') {
  462. $object->$fields = $fields.'-anonymous-'.$obj->rowid;
  463. } else {
  464. $object->$fields = $val;
  465. }
  466. }
  467. $result = $object->update($obj->rowid, $user);
  468. if ($result > 0) {
  469. $errormsg = $object->error;
  470. $error++;
  471. }
  472. $nbupdated++;
  473. }
  474. }
  475. if ($action == 'delete') { // If object to clean is not used
  476. if ($object->element == 'adherent') {
  477. $result = $object->delete($obj->rowid, $user);
  478. } else {
  479. $result = $object->delete($user);
  480. }
  481. if ($result < 0) {
  482. $errormsg = $object->error;
  483. $error++;
  484. }
  485. $nbdeleted++;
  486. }
  487. $i++;
  488. }
  489. }
  490. }
  491. }
  492. $this->db->commit();
  493. if (!$error) {
  494. $this->output = $nbupdated.' record updated, '.$nbdeleted.' record deleted';
  495. } else {
  496. $this->error = $errormsg;
  497. }
  498. return 0;
  499. }
  500. }