PageRenderTime 43ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/controller/cron/send.php

https://github.com/alugo/Goteo
PHP | 330 lines | 236 code | 45 blank | 49 comment | 23 complexity | f702808eb8a92919be3f2c0016725508 MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /*
  3. * Copyright (C) 2012 Platoniq y Fundación Fuentes Abiertas (see README for details)
  4. * This file is part of Goteo.
  5. *
  6. * Goteo is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU Affero General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * Goteo is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU Affero General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Affero General Public License
  17. * along with Goteo. If not, see <http://www.gnu.org/licenses/agpl.txt>.
  18. *
  19. */
  20. namespace Goteo\Controller\Cron {
  21. use Goteo\Model,
  22. Goteo\Core\Redirection,
  23. Goteo\Library\Text,
  24. Goteo\Library\Feed,
  25. Goteo\Library\Template,
  26. Goteo\Library\Mail,
  27. Goteo\Core\Error;
  28. class Send {
  29. /**
  30. * Al autor del proyecto, se encarga de substituir variables en plantilla
  31. *
  32. * @param $type string
  33. * @param $project Object
  34. * @return bool
  35. */
  36. public static function toOwner ($type, $project) {
  37. $tpl = null;
  38. /// tipo de envio
  39. switch ($type) {
  40. // Estos son avisos de final de ronda
  41. case 'r1_pass': // template 20, proyecto supera la primera ronda
  42. $tpl = 20;
  43. $search = array('%USERNAME%', '%PROJECTNAME%', '%WIDGETURL%');
  44. $replace = array($project->user->name, $project->name, SITE_URL . '/dashboard/projects/widgets');
  45. break;
  46. case 'fail': // template 21, caduca sin conseguir el mínimo
  47. $tpl = 21;
  48. $search = array('%USERNAME%', '%PROJECTNAME%', '%SUMMARYURL%');
  49. $replace = array($project->user->name, $project->name, SITE_URL . '/dashboard/projects/summary');
  50. break;
  51. case 'r2_pass': // template 22, finaliza segunda ronda
  52. $tpl = 22;
  53. $search = array('%USERNAME%', '%PROJECTNAME%', '%REWARDSURL%');
  54. $replace = array($project->user->name, $project->name, SITE_URL . '/dashboard/projects/rewards');
  55. break;
  56. // Estos son avisos de auto-tips de /cron/daily
  57. case '8_days': // template 13, cuando faltan 8 días y no ha conseguido el mínimo
  58. $tpl = 13;
  59. $search = array('%USERNAME%', '%PROJECTNAME%', '%WIDGETURL%');
  60. $replace = array($project->user->name, $project->name, SITE_URL . '/dashboard/projects/widgets');
  61. break;
  62. case '2_days': // template 14, cuando faltan 2 días y no ha conseguido el mínimo
  63. $tpl = 14;
  64. $search = array('%USERNAME%', '%PROJECTNAME%', '%WIDGETURL%');
  65. $replace = array($project->user->name, $project->name, SITE_URL . '/dashboard/projects/widgets');
  66. break;
  67. case 'two_weeks': // template 19, "no bajes la guardia!" 25 días de campaña
  68. $tpl = 19;
  69. $search = array('%USERNAME%', '%PROJECTNAME%', '%WIDGETURL%');
  70. $replace = array($project->user->name, $project->name, SITE_URL . '/dashboard/projects/widgets');
  71. break;
  72. case 'no_updates': // template 23, 3 meses sin novedades
  73. $tpl = 23;
  74. $search = array('%USERNAME%', '%PROJECTNAME%', '%UPDATESURL%');
  75. $replace = array($project->user->name, $project->name, SITE_URL . '/dashboard/projects/updates');
  76. break;
  77. case 'any_update': // template 24, no hay posts de novedades
  78. $tpl = 24;
  79. $search = array('%USERNAME%', '%PROJECTNAME%', '%UPDATESURL%', '%NOVEDADES%');
  80. $replace = array($project->user->name, $project->name, SITE_URL . '/dashboard/projects/updates', SITE_URL.'/project/'.$project->id.'/updates');
  81. break;
  82. case '2m_after': // template 25, dos meses despues de financiado
  83. $tpl = 25;
  84. $search = array('%USERNAME%', '%PROJECTNAME%', '%REWARDSURL%');
  85. $replace = array($project->user->name, $project->name, SITE_URL . '/dashboard/projects/rewards');
  86. break;
  87. case '8m_after': // template 52, ocho meses despues de financiado
  88. $tpl = 52;
  89. $search = array('%USERNAME%', '%PROJECTNAME%', '%COMMONSURL%');
  90. $replace = array($project->user->name, $project->name, SITE_URL . '/dashboard/projects/commons');
  91. break;
  92. case '20_backers': // template 46, "Apóyate en quienes te van apoyando " (en cuanto se llega a los 20 backers
  93. $tpl = 46;
  94. $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%NUMBACKERS%');
  95. $replace = array($project->user->name, $project->name, SITE_URL.'/project/'.$project->id, $project->num_investors);
  96. break;
  97. // consejos normales
  98. case 'tip_1': // template 41, "Difunde, difunde, difunde"
  99. $tpl = 41;
  100. $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%PORCENTAJE%');
  101. $replace = array($project->user->name, $project->name, SITE_URL.'/project/'.$project->id, $project->percent);
  102. break;
  103. case 'tip_2': // template 42, "Comienza por lo más próximo"
  104. $tpl = 42;
  105. $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%PORCENTAJE%');
  106. $replace = array($project->user->name, $project->name, SITE_URL.'/project/'.$project->id, $project->percent);
  107. break;
  108. case 'tip_3': // template 43, "Una acción a diario, por pequeña que sea"
  109. $tpl = 43;
  110. $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%AMOUNT%');
  111. $replace = array($project->user->name, $project->name, SITE_URL.'/project/'.$project->id, $project->invested);
  112. break;
  113. case 'tip_4': // template 44, "Llama a todas las puertas"
  114. $tpl = 44;
  115. $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%BACKERSURL%');
  116. $replace = array($project->user->name, $project->name, SITE_URL.'/project/'.$project->id, SITE_URL.'/project/'.$project->id.'/supporters');
  117. break;
  118. case 'tip_5': // template 45, "Busca dónde está tu comunidad"
  119. $tpl = 45;
  120. $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%AMOUNT%', '%NUMBACKERS%');
  121. $replace = array($project->user->name, $project->name, SITE_URL.'/project/'.$project->id, $project->invested, $project->num_investors);
  122. break;
  123. case 'tip_8': // template 47, "Agradece en público e individualmente"
  124. $tpl = 47;
  125. $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%MESSAGESURL%');
  126. $replace = array($project->user->name, $project->name, SITE_URL.'/project/'.$project->id, SITE_URL.'/project/'.$project->id.'/messages');
  127. break;
  128. case 'tip_9': // template 48, "Busca prescriptores e implícalos"
  129. $tpl = 48;
  130. $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%PORCENTAJE%');
  131. $replace = array($project->user->name, $project->name, SITE_URL.'/project/'.$project->id, $project->percent);
  132. break;
  133. case 'tip_10': // template 49, "Luce tus recompensas y retornos"
  134. $tpl = 49;
  135. $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%LOWREWARD%', '%HIGHREWARD%');
  136. $replace = array($project->user->name, $project->name, SITE_URL.'/project/'.$project->id, $project->lower, $project->higher);
  137. break;
  138. case 'tip_11': // template 50, "Refresca tu mensaje de motivacion"
  139. $tpl = 50;
  140. $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%');
  141. $replace = array($project->user->name, $project->name, SITE_URL.'/project/'.$project->id);
  142. break;
  143. case 'tip_15': // template 51, "Sigue los avances y calcula lo que falta"
  144. $tpl = 51;
  145. $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%DIASCAMPAÑA%', '%DAYSTOGO%');
  146. $replace = array($project->user->name, $project->name, SITE_URL.'/project/'.$project->id, $project->days, $project->days);
  147. break;
  148. }
  149. if (!empty($tpl)) {
  150. $errors = array();
  151. // Obtenemos la plantilla para asunto y contenido
  152. $template = Template::get($tpl);
  153. // Sustituimos los datos
  154. $subject = str_replace('%PROJECTNAME%', $project->name, $template->title);
  155. $content = \str_replace($search, $replace, $template->text);
  156. // iniciamos mail
  157. $mailHandler = new Mail();
  158. $mailHandler->to = $project->user->email;
  159. $mailHandler->toName = $project->user->name;
  160. // monitorización solo para 'quien-manda'
  161. if ($project->id == 'quien-manda' || $project->id == 'guifi-net-extremadura')
  162. $mailHandler->bcc = array('enric@goteo.org', 'maria@goteo.org', 'olivier@goteo.org', 'jcanaves@doukeshi.org', 'info@goteo.org');
  163. if ($project->id == 'cervecita-fresca')
  164. $mailHandler->bcc = array('jcanaves@doukeshi.org');
  165. if ($project->id == 'keinuka')
  166. $mailHandler->bcc = array('rosa@euskadi.goteo.org', 'jcanaves@doukeshi.org');
  167. // si es un proyecto de nodo: reply al mail del nodo
  168. // si es de centra: reply a MAIL_GOTEO
  169. $mailHandler->reply = (!empty($project->nodeData->email)) ? $project->nodeData->email : \GOTEO_CONTACT_MAIL;
  170. $mailHandler->subject = $subject;
  171. $mailHandler->content = $content;
  172. $mailHandler->html = true;
  173. $mailHandler->template = $template->id;
  174. if ($mailHandler->send($errors)) {
  175. return true;
  176. } else {
  177. echo \trace($errors);
  178. @mail(\GOTEO_FAIL_MAIL,
  179. 'Fallo al enviar email automaticamente al autor ' . SITE_URL,
  180. 'Fallo al enviar email automaticamente al autor: <pre>' . print_r($mailHandler, 1). '</pre>');
  181. }
  182. }
  183. return false;
  184. }
  185. /* A los cofinanciadores
  186. * Se usa tambien para notificar cuando un proyecto publica una novedad.
  187. * Por eso añadimos el tercer parámetro, para recibir los datos del post
  188. */
  189. static public function toInvestors ($type, $project, $post = null) {
  190. // notificación
  191. $notif = $type == 'update' ? 'updates' : 'rounds';
  192. $anyfail = false;
  193. $tpl = null;
  194. // para cada inversor que no tenga bloqueado esta notificacion
  195. $sql = "
  196. SELECT
  197. invest.user as id,
  198. user.name as name,
  199. user.email as email,
  200. invest.method as method,
  201. IFNULL(user.lang, 'es') as lang
  202. FROM invest
  203. INNER JOIN user
  204. ON user.id = invest.user
  205. AND user.active = 1
  206. LEFT JOIN user_prefer
  207. ON user_prefer.user = invest.user
  208. WHERE invest.project = ?
  209. AND invest.status IN ('0', '1', '3', '4')
  210. AND (user_prefer.{$notif} = 0 OR user_prefer.{$notif} IS NULL)
  211. GROUP BY user.id
  212. ";
  213. if ($query = Model\Invest::query($sql, array($project->id))) {
  214. foreach ($query->fetchAll(\PDO::FETCH_OBJ) as $investor) {
  215. /// tipo de envio
  216. switch ($type) {
  217. case 'r1_pass': // template 15, proyecto supera la primera ronda
  218. $tpl = 15;
  219. $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%');
  220. $replace = array($investor->name, $project->name, SITE_URL . '/project/' . $project->id);
  221. break;
  222. case 'fail': // template 17 (paypalistas) / 35 (tpvistas) , caduca sin conseguir el mínimo
  223. $tpl = ($investor->method == 'paypal') ? 17 : 35;
  224. $search = array('%USERNAME%', '%PROJECTNAME%', '%DISCOVERURL%');
  225. $replace = array($investor->name, $project->name, SITE_URL . '/discover');
  226. break;
  227. case 'r2_pass': // template 16, finaliza segunda ronda
  228. $tpl = 16;
  229. $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%');
  230. $replace = array($investor->name, $project->name, SITE_URL . '/project/' . $project->id);
  231. break;
  232. case 'update': // template 18, publica novedad
  233. $tpl = 18;
  234. $search = array('%USERNAME%', '%PROJECTNAME%', '%UPDATEURL%', '%POST%', '%SHAREFACEBOOK%', '%SHARETWITTER%');
  235. $post_url = SITE_URL.'/project/'.$project->id.'/updates/'.$post->id;
  236. // contenido del post
  237. $post_content = "<p><strong>{$post->title}</strong><br />". nl2br( Text::recorta($post->text, 500) ) ."</p>";
  238. // y preparar los enlaces para compartir en redes sociales
  239. $share_urls = Text::shareLinks($post_url, $post->title);
  240. $replace = array($investor->name, $project->name, $post_url, $post_content, $share_urls['facebook'], $share_urls['twitter']);
  241. break;
  242. }
  243. if (!empty($tpl)) {
  244. // Obtenemos la plantilla para asunto y contenido
  245. // en el idioma del usuario
  246. $template = Template::get($tpl, $investor->lang);
  247. // Sustituimos los datos
  248. if (!empty($post)) {
  249. $subject = str_replace(array('%PROJECTNAME%', '%OWNERNAME%', '%P_TITLE%')
  250. , array($project->name, $project->user->name, $post->title)
  251. , $template->title);
  252. } else {
  253. $subject = str_replace('%PROJECTNAME%', $project->name, $template->title);
  254. }
  255. $content = \str_replace($search, $replace, $template->text);
  256. // iniciamos mail
  257. $mailHandler = new Mail();
  258. $mailHandler->to = $investor->email;
  259. $mailHandler->toName = $investor->name;
  260. $mailHandler->subject = $subject;
  261. $mailHandler->content = $content;
  262. $mailHandler->html = true;
  263. $mailHandler->template = $template->id;
  264. if ($mailHandler->send()) {
  265. } else {
  266. $anyfail = true;
  267. @mail(\GOTEO_FAIL_MAIL,
  268. 'Fallo al enviar email automaticamente al cofinanciador ' . SITE_URL,
  269. 'Fallo al enviar email automaticamente al cofinanciador: <pre>' . print_r($mailHandler, 1). '</pre>');
  270. }
  271. unset($mailHandler);
  272. }
  273. }
  274. // fin bucle inversores
  275. } else {
  276. echo '<p>'.str_replace('?', $project->id, $sql).'</p>';
  277. $anyfail = true;
  278. }
  279. if ($anyfail)
  280. return false;
  281. else
  282. return true;
  283. }
  284. }
  285. }