diff --git a/Resources/mailing/es/face_to_face_event.yml b/Resources/mailing/es/face_to_face_event.yml new file mode 100644 index 0000000000..1bcacae9e0 --- /dev/null +++ b/Resources/mailing/es/face_to_face_event.yml @@ -0,0 +1,13 @@ +group: tips +name: 'Face to face event' +purpose: 'Mail template to be sent to owner of a project to recommend creating a face to face event' +type: 'md' +title: "Convierte tu presencialidad a donaciones" +text: > + ¡Hola de nuevo %USERNAME%! + ¿Cómo está yendo todo? + Quizás has pensado en hacer difusión presencial: en tu local, en tu pueblo, en tu barrio,, o quizás aprovechar una feria, un evento o un espacio físico que te hayan cedido otros. ¡Es una oportunidad genial para difundir tu iniciativa y tu campaña de crowdfunding! + *Consejo 1*: Piensa que además de captar su interés en persona, tendrás también que *dirigirles a tu página de Goteo*. Cuanto más fácil les hagas ese camino, mejor. Piensa en imprimir cartelería, y sobre todo, incluye el enlace a tu página de Goteo o, mejor, directamente un *código QR*. + *Consejo 2*: Si te encuentras con el problema de que tu comunidad no está acostumbrada al entorno digital, tienes que ser muy didáctico y paciente. Puedes compartir nuestro [Tutorial Paso a Paso para donar](https://fundacion.goteo.org/blog/tutorial-paso-a-paso-para-aportar-a-un-proyecto), o incluso recorrer junto con esta(s) persona(s) tu página de Goteo y enséñales tú mismo, desde tu dispositivo, lo fácil que es donar a través de Goteo. + ¡Ánimo! + El equipo de Goteo. diff --git a/Resources/mailing/es/invest_in_social_networks.yml b/Resources/mailing/es/invest_in_social_networks.yml new file mode 100644 index 0000000000..4774946b46 --- /dev/null +++ b/Resources/mailing/es/invest_in_social_networks.yml @@ -0,0 +1,11 @@ +group: tips +name: 'Invest in Social Networks' +purpose: 'Mail template to be sent to owner of a project to recommend investing in social networks' +type: 'md' +title: "Invierte en redes" +text: > + Hola %USERNAME%, + ¿Cuál es la red social que mejor te está funcionando? ¿Cuál ha sido el post que más interacciones ha tenido? Si no te has parado a analizar, es el momento. Una campaña de crowdfunding te puede servir para reafirmar tu estilo comunicativo. + Consejo: Te recomendamos que pruebes a promocionar algunos de tus posts en redes. Por muy poco dinero y segmentando bien por territorios y/o públicos, quizás llegues a nueva gente de una forma inesperada. Es buen momento ahora, sobre todo si tu campaña lleva más del 50-60% recaudado. Los nuevos públicos tienen más opciones de sumarse si ven que la campaña tira bien por si sola. + Pequeña cita por aquí: “Los ganadores no son los mejores sino los que dominan el juego” Roberto Serra. + El equipo de Goteo diff --git a/Resources/mailing/es/online_event.yml b/Resources/mailing/es/online_event.yml new file mode 100644 index 0000000000..f286a731c0 --- /dev/null +++ b/Resources/mailing/es/online_event.yml @@ -0,0 +1,13 @@ +group: tips +name: 'Online event' +purpose: 'Mail template to be sent to owner of a project to recommend creating an online event' +type: 'md' +title: "Convoca un evento online de recaudación" +text: > + ¡Hola de nuevo %USERNAME%! + Ya son %AMOUNT% euros recaudados, ¡venga! + A estas alturas ya estamos más que acostumbradas a los eventos online, ¿has pensado en sacarle partido para tu crowdfunding? + *Consejo*: ¿Por qué no organizar una pequeña charla con varios invitados (beneficiarios, colaboradores, proyectos similares, expertos, etc.) para *dialogar de una problemática común relacionada con %PROJECTNAME%*, y hablar del compromiso social que os mueve? Funciona muy bien cuando se aprovecha la diversidad de experiencias y puntos de vista de los participantes, moderando el debate con unas preguntas abiertas. Es una *excusa perfecta* para presentar vuestro proyecto y seguir difundiendo vuestro crowdfunding ;-)) + *Ejemplo*: La campaña de [Climática](https://www.goteo.org/project/climatica) por ejemplo, organizó en su recta final de campaña una [gala de remontada retransmitida en directo](https://www.youtube.com/watch?v=glgXJER_6ZY). ¡Por lo pelos celebran el mínimo en directo! + Una cita inspiradora: “El agua habla sin cesar y nunca se repite” (Octavio Paz). + El equipo de Goteo diff --git a/Resources/mailing/es/press.yml b/Resources/mailing/es/press.yml new file mode 100644 index 0000000000..1bd2adb27c --- /dev/null +++ b/Resources/mailing/es/press.yml @@ -0,0 +1,15 @@ +group: tips +name: 'Invest in Social Networks' +purpose: 'Mail template to be sent to owner of a project to recommend broadcasting in the media' +type: 'md' +title: "Trucos para dar difusión en prensa" +text: > + Hola %USERNAME%, + Seguro que has pensado en utilizar la prensa para difundir tu crowdfunding. A ver si estos pequeños trucos te sirven: + *1- Busca los medios y los periodistas adecuados:* Si tu proyecto es local, seguramente te será fácil tener acceso a la prensa escrita, radio o televisión que cubre las noticias de la zona. ¡Fenomenal si es el caso! Sino, no te cortes en buscar esos contactos que vayan a darte acceso. Por otro lado, también puedes buscar prensa especializada en las temáticas relacionadas con tu proyecto. Y si quieres probar con prensa más generalista, ayuda mucho que tengas ya identificados las secciones de redacción o incluso a los periodistas que se enfocan en tus temas. Una buena búsqueda en internet o redes te puede dar buenas pistas ;-) + *2- No hables directamente del crowdfunding, habla primero de tu proyecto:* Recuerda que para un periodista, un crowdfunding en sí no suele ser noticia. Así que empieza por contar la historia que hay detrás de tu proyecto, su misión, su compromiso social. También es importante que resaltes lo innovador del proyecto, el valor añadido que aporta al contexto en el que se encuentra y a la sociedad. Y sobre todo transmite la pasión y compromiso de todo el equipo impulsor. Después y a raíz de eso, presenta el crowdfunding y llama a la donación, y menciona cuántos días de campaña te quedan ;-P ¡Ah! Por supuesto asegúrate de que tu página de Goteo queda indicada en la pieza informativa. + *3- Encuentra el mejor momento:* Para que la publicación en prensa luego tenga impacto en tu campaña, es importante que se produzca cuando la recaudación ya esté bien avanzada, para que pueda producirse el efecto llamada. Con por ejemplo 50-60% del objetivo mínimo recaudado, ya podrías atraer a nuevos públicos que se verían atraídos por el hecho de que es un proyecto que funciona bien y ya ha atraído a mucha más gente. + *Ejemplo:* A Abueland le salió genial. Mira la pieza que sacaron unos informativos de televisión regional: https://twitter.com/RTVEclm/status/1443601278408400900 + ¡Esperamos haberte ayudado! + El equipo de Goteo. + diff --git a/src/Goteo/Console/EventListener/ConsoleWatcherListener.php b/src/Goteo/Console/EventListener/ConsoleWatcherListener.php index 20ca4bdf9b..85c631376b 100644 --- a/src/Goteo/Console/EventListener/ConsoleWatcherListener.php +++ b/src/Goteo/Console/EventListener/ConsoleWatcherListener.php @@ -204,18 +204,19 @@ public function onProjectActive(FilterProjectEvent $event) { case 3: // Una acción a diario, por pequeña que sea case 4: // Llama a todas las puertas case 5: // Busca dónde está tu comunidad - case 8: // Agradece en público e individualmente $this->send($project, "tip_$days_active", ['owner']); break; + case 8: + case 25: + $this->send($project, "tip_8", ['owner']); + break; + // periodico condicional case 6: // Publica novedades! // y se repite cada 6 días (fechas libres) mientras no haya posts - case 12: case 18: - case 24: - case 30: - case 36: + case 28: // si ya hay novedades, nada if (Blog::hasUpdates($project->id)) { $this->info("Project already has blog updates", [$project, 'days_active' => $days_active, 'days_funded' => $days_funded]); @@ -228,11 +229,7 @@ public function onProjectActive(FilterProjectEvent $event) { // comprobación periódica pero solo un envío case 7: // Apóyate en quienes te van apoyando, si más de 20 cofinanciadores // o en cuanto llegue a 20 backers (en fechas libres) - case 14: - case 17: - case 21: - case 24: - case 27: + case 26: if ($project->num_investors >= 20) { $this->send($project, "20_backers", ['owner']); } else { @@ -270,12 +267,7 @@ function ($a, $b) { case 11: // Refresca tu mensaje de motivacion - // si no tiene video motivacional - if (empty($project->video)) { - $this->send($project, "tip_11", ['owner']); - } else { - $this->warning("Not sending message to project as already has motivational video", [$project, 'days_active' => $days_active, 'days_funded' => $days_funded]); - } + $this->send($project, "tip_11", ['owner']); break; case 15: // Sigue los avances y calcula lo que falta @@ -287,7 +279,7 @@ function ($a, $b) { } break; - case 25: // No bajes la guardia! + case 20: // No bajes la guardia! // si no ha llegado al mínimo if ($project->amount < $project->mincost) { $this->send($project, "two_weeks", ['owner']); @@ -305,7 +297,7 @@ function ($a, $b) { } break; - case 38: // Al proyecto le faltan 2 días para archivarse + case 36: // Al proyecto le faltan 4 días para archivarse // si no ha llegado al mínimo pero está por encima del 70% if ($project->amount < $project->mincost && $project->percent >= 70) { $this->send($project, "2_days", ['owner']); @@ -315,60 +307,26 @@ function ($a, $b) { break; // Extra - case 26: // Send information about contract in order to prepare documentacion - $this->info("Sending information about contract", [$project, 'days_active' => $days_active, 'days_funded' => $days_funded]); - $this->send($project, "14_days", ['owner']); - break; - } + case 27: // Send information about contract in order to prepare documentacion + $this->info("Sending information about contract", [$project, 'days_active' => $days_active, 'days_funded' => $days_funded]); + $this->send($project, "14_days", ['owner']); + break; - // Avisos periodicos - // si lleva más de 15 días: si no se han publicado novedades en la última semana - // Ojo! que si no ha enviado ninguna no lanza este sino la de cada 6 días - if (!$blog_tip_sent && $days_active > 15) { - // veamos si ya le avisamos hace una semana - // Si ya se mandó esta plantilla (al llegar a los 20 por primera vez) no se envía de nuevo - $sql = " - SELECT - id, - DATE_FORMAT( - from_unixtime(unix_timestamp(now()) - unix_timestamp(date)) - , '%j' - ) as days - FROM mail - WHERE mail.email = :email - AND mail.template = 23 - ORDER BY mail.date DESC - LIMIT 1"; - $query = Project::query($sql, array(':email' => $project->getOwner()->email)); - $lastsend = $query->fetchObject(); - if (!$lastsend->id || $lastsend->days > 7) { - // veamos cuanto hace de la última novedad - $sql = " - SELECT - DATE_FORMAT( - from_unixtime(unix_timestamp(now()) - unix_timestamp(date)) - , '%j' - ) as days - FROM post - INNER JOIN blog - ON post.blog = blog.id - AND blog.type = 'project' - AND blog.owner = :project - WHERE post.publish = 1 - ORDER BY post.date DESC - LIMIT 1"; - $query = Project::query($sql, array(':project' => $project->id)); - $lastUpdate = $query->fetchColumn(0); - if ($lastUpdate > 7) { - $this->send($project, "no_updates", ['owner']); - } elseif (is_numeric($lastUpdate)) { - $this->warning("Not sending message to project published news less than one week ago", [$project, 'days_active' => $days_active, 'days_funded' => $days_funded]); - } else { - $this->warning("Not sending message to project without any news", [$project, 'days_active' => $days_active, 'days_funded' => $days_funded]); - } - } else { - $this->warning("Not sending message to project already advised less than one week ago", [$project, 'days_active' => $days_active, 'days_funded' => $days_funded]); - } + case 17: + $this->send($project, "face_to_face_event", ['owner']); + break; + + case 22: + $this->send($project, "online_event", ['owner']); + break; + + case 24: + $this->send($project, "press", ['owner']); + break; + + case 30: + $this->send($project, "invest_in_social_networks", ['owner']); + break; } } diff --git a/src/Goteo/Console/UsersSend.php b/src/Goteo/Console/UsersSend.php index 55c06c37b9..a8795d7ad4 100644 --- a/src/Goteo/Console/UsersSend.php +++ b/src/Goteo/Console/UsersSend.php @@ -64,74 +64,75 @@ public static function toOwner ($type, Project $project) { $consultants = current(self::$consultants); } - + $search = []; + $replace = []; /// tipo de envio switch ($type) { // Estos son avisos de final de ronda case 'unique_pass': // template 20, proyecto finaliza la única ronda - $tpl = 60; + $tpl = Template::OWNER_PROJECT_SINGLE_ROUND; $search = array('%USERNAME%', '%PROJECTNAME%', '%REWARDSURL%'); $replace = array($project->user->name, $project->name, self::getURL() . '/dashboard/projects/rewards'); break; case 'r1_pass': // template 20, proyecto supera la primera ronda - $tpl = 20; + $tpl = Template::OWNER_PROJECT_1_ROUND; $search = array('%USERNAME%', '%PROJECTNAME%', '%WIDGETURL%'); $replace = array($project->user->name, $project->name, self::getURL() . '/dashboard/projects/widgets'); break; case 'fail': // template 21, caduca sin conseguir el mínimo - $tpl = 21; + $tpl = Template::OWNER_PROJECT_FAILED; $search = array('%USERNAME%', '%PROJECTNAME%', '%SUMMARYURL%'); $replace = array($project->user->name, $project->name, self::getURL() . '/dashboard/projects/summary'); break; case 'r2_pass': // template 22, finaliza segunda ronda - $tpl = 22; + $tpl = Template::OWNER_PROJECT_2_ROUND; $search = array('%USERNAME%', '%PROJECTNAME%', '%REWARDSURL%'); $replace = array($project->user->name, $project->name, self::getURL() . '/dashboard/projects/rewards'); break; // Estos son avisos de auto-tips de /cron/daily case '8_days': // template 13, cuando faltan 8 días y no ha conseguido el mínimo - $tpl = 13; - $search = array('%USERNAME%', '%PROJECTNAME%', '%WIDGETURL%'); - $replace = array($project->user->name, $project->name, self::getURL() . '/dashboard/projects/widgets'); + $tpl = Template::ADVISE_8_DAYS_TO_FAIL; + $search = ['%USERNAME%', '%PROJECTNAME%', '%WIDGETURL%', '%DATE_PROJECT_PASSES%', '%NOMBREASESOR%']; + $replace = [$project->user->name, $project->name, self::getURL() . '/dashboard/projects/widgets', $project->getWhenWillPass(), $consultants]; break; case '2_days': // template 14, cuando faltan 2 días y no ha conseguido el mínimo - $tpl = 14; - $search = array('%USERNAME%', '%PROJECTNAME%', '%WIDGETURL%'); - $replace = array($project->user->name, $project->name, self::getURL() . '/dashboard/projects/widgets'); + $tpl = Template::ADVISE_2_DAYS_TO_FAIL; + $search = ['%USERNAME%', '%PROJECTNAME%']; + $replace = [$project->user->name, $project->name]; break; - case '14_days': // info about required contract documentation + case '14_days': // info about required contract documentation $tpl = Template::CONTRACT_PREVIOUS_INFORMATION; $search = array('%USERNAME%', '%PROJECTNAME%'); $replace = array($project->user->name, $project->name); break; case 'two_weeks': // template 19, "no bajes la guardia!" 25 días de campaña - $tpl = 19; + $tpl = Template::ADVISE_25_DAY; $search = array('%USERNAME%', '%PROJECTNAME%', '%WIDGETURL%'); $replace = array($project->user->name, $project->name, self::getURL() . '/dashboard/projects/widgets'); break; case 'no_updates': // template 23, 3 meses sin novedades - $tpl = 23; + $tpl = Template::ADVISE_16_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%UPDATESURL%'); $replace = array($project->user->name, $project->name, self::getURL() . '/dashboard/projects/updates'); break; case 'any_update': // template 24, no hay posts de novedades - $tpl = 24; + $tpl = Template::ADVISE_6_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%UPDATESURL%', '%NOVEDADES%'); $replace = array($project->user->name, $project->name, self::getURL() . '/dashboard/projects/updates', self::getURL().'/project/'.$project->id.'/updates'); break; case '1d_after': // template 55, dia siguiente de financiado - $tpl = 55; + $tpl = Template::CONTRACT; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%'); $replace = array($project->user->name, $project->name, self::getURL().'/dashboard/project/'.$project->id.'/contract'); break; @@ -149,26 +150,26 @@ public static function toOwner ($type, Project $project) { break; case '2m_after': // template 25, dos meses despues de financiado - $tpl = 25; + $tpl = Template::ADVISE_2_MONTHS; $search = array('%USERNAME%', '%PROJECTNAME%', '%REWARDSURL%'); $replace = array($project->user->name, $project->name, self::getURL() . '/dashboard/projects/rewards'); break; case '8m_after': // template 52, ocho meses despues de financiado - $tpl = 52; + $tpl = Template::OWNER_REWARD_REMINDER; $search = array('%USERNAME%', '%PROJECTNAME%', '%COMMONSURL%'); $replace = array($project->user->name, $project->name, self::getURL() . '/dashboard/projects/shared-materials'); break; case '20_backers': // template 46, "Apóyate en quienes te van apoyando " (en cuanto se llega a los 20 backers - $tpl = 46; + $tpl = Template::ADVISE_7_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%NUMBACKERS%'); $replace = array($project->user->name, $project->name, self::getURL().'/project/'.$project->id, $project->num_investors); break; case 'project_to_review': // template 8, "Confirmacion de proyecto enviado". template 62, "Al enviar tras la negociación" // tener en cuenta si están enviando el draft o la negociación - $tpl = ($project->draft) ? 8 : 62; + $tpl = ($project->draft) ? Template::PROJECT_SENT_CONFIRM : Template::OWNER_PROJECT_REVIEWED; $search = array('%PROJECTNAME%', '%USERNAME%', '%PROJECTURL%', '%PROJECTEDITURL%', '%NOMBREASESOR%'); $replace = array($project->name, $project->user->name, self::getURL().'/project/'.$project->id, self::getURL().'/project/edit/'.$project->id, $consultants); @@ -183,7 +184,7 @@ public static function toOwner ($type, Project $project) { break; case 'tip_0': - $tpl = 57; + $tpl = Template::ADVISE_0_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%NOMBREASESOR%'); $replace = array($project->user->name, $project->name, self::getURL().'/project/'.$project->id, $consultants); @@ -191,65 +192,88 @@ public static function toOwner ($type, Project $project) { // consejos normales case 'tip_1': // template 41, "Difunde, difunde, difunde" - $tpl = 41; + $tpl = Template::ADVISE_1_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%PORCENTAJE%'); $replace = array($project->user->name, $project->name, self::getURL().'/project/'.$project->id, $project->percent); break; case 'tip_2': // template 42, "Comienza por lo más próximo" - $tpl = 42; + $tpl = Template::ADVISE_2_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%PORCENTAJE%'); $replace = array($project->user->name, $project->name, self::getURL().'/project/'.$project->id, $project->percent); break; case 'tip_3': // template 43, "Una acción a diario, por pequeña que sea" - $tpl = 43; + $tpl = Template::ADVISE_3_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%AMOUNT%'); $replace = array($project->user->name, $project->name, self::getURL().'/project/'.$project->id, $project->amount); break; case 'tip_4': // template 44, "Llama a todas las puertas" - $tpl = 44; + $tpl = Template::ADVISE_4_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%BACKERSURL%'); $replace = array($project->user->name, $project->name, self::getURL().'/project/'.$project->id, self::getURL().'/project/'.$project->id.'/supporters'); break; case 'tip_5': // template 45, "Busca dónde está tu comunidad" - $tpl = 45; + $tpl = Template::ADVISE_5_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%AMOUNT%', '%NUMBACKERS%'); $replace = array($project->user->name, $project->name, self::getURL().'/project/'.$project->id, $project->amount, $project->num_investors); break; case 'tip_8': // template 47, "Agradece en público e individualmente" - $tpl = 47; + $tpl = Template::ADVISE_8_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%MESSAGESURL%'); $replace = array($project->user->name, $project->name, self::getURL().'/project/'.$project->id, self::getURL().'/project/'.$project->id.'/messages'); break; case 'tip_9': // template 48, "Busca prescriptores e implícalos" - $tpl = 48; + $tpl = Template::ADVISE_9_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%PORCENTAJE%'); $replace = array($project->user->name, $project->name, self::getURL().'/project/'.$project->id, $project->percent); break; case 'tip_10': // template 49, "Luce tus recompensas y retornos" - $tpl = 49; + $tpl = Template::ADVISE_10_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%LOWREWARD%', '%HIGHREWARD%'); $replace = array($project->user->name, $project->name, self::getURL().'/project/'.$project->id, $project->lower, $project->higher); break; case 'tip_11': // template 50, "Refresca tu mensaje de motivacion" - $tpl = 50; + $tpl = Template::ADVISE_11_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%'); $replace = array($project->user->name, $project->name, self::getURL().'/project/'.$project->id); break; case 'tip_15': // template 51, "Sigue los avances y calcula lo que falta" - $tpl = 51; + $tpl = Template::ADVISE_15_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%DIASCAMPAÑA%', '%DAYSTOGO%'); $replace = array($project->user->name, $project->name, self::getURL().'/project/'.$project->id, $project->days, $project->days); break; + case 'face_to_face_event': + $tpl = Template::FACE_TO_FACE_EVENT; + $search = array('%USERNAME%'); + $replace = array($project->user->name); + break; + + case 'online_event': + $tpl = Template::ONLINE_EVENT; + $search = ['%USERNAME%', '%AMOUNT%', '%PROJECTNAME%']; + $replace = [$project->user->name, $project->amount, $project->name]; + break; + + case 'press': + $tpl = Template::PRESS; + $search = ['%USERNAME%']; + $replace = [$project->user->name]; + break; + + case 'invest_in_social_networks': + $tpl = Template::INVEST_IN_SOCIAL_NETWORKS; + $search = ['%USERNAME%']; + $replace = [$project->user->name]; + break; } @@ -326,7 +350,7 @@ public static function toConsultants ($type, $project) { /// tipo de envio switch ($type) { case 'commons': // template 56, "Mensaje al asesor de un proyecto 10 meses despues de financiado sin haber cumplido" - $tpl = 56; + $tpl = Template::CONSULTANT_PROJECT_REWARD_FAIL; $contact = Model\Project::getContact($project->id); $info_html = new View('admin/commons/contact.html.php', array('contact' => $contact)); @@ -337,14 +361,14 @@ public static function toConsultants ($type, $project) { break; case 'tip_0': - $tpl = 57; + $tpl = Template::ADVISE_0_DAYS; $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%NOMBREASESOR%'); $replace = array($project->user->name, $project->name, self::getURL().'/project/'.$project->id, implode(', ', $consultants)); break; case 'rewardfulfilled': // template 58, "Aviso a asesores cuando un impulsor indica la url de retorno colectivo" - $tpl = 58; + $tpl = Template::CONSULTANT_PROJECT_PUBLIC_REWARD_FILL; $commons_url = self::getURL() . '/admin/commons/view/' . $project->id; $reward = Model\Project\Reward::get($_POST['reward']); @@ -355,14 +379,14 @@ public static function toConsultants ($type, $project) { break; case 'project_to_review_consultant': // template 59, "Aviso a asesores cuando un impulsor envia el proyecto a revisión" - $tpl = 59; + $tpl = Template::CONSULTANT_PROJECT_VALIDATE; $search = array('%PROJECTNAME%', '%USERNAME%', '%PROJECTURL%', '%PROJECTEDITURL%', '%COMMENT%'); $replace = array($project->name, $project->user->name, self::getURL().'/project/'.$project->id, self::getURL().'/project/edit/'.$project->id, $project->comment); break; case 'project_preform_to_review_consultant': // template 63, "Aviso a asesores cuando un impulsor envia el proyecto a revisión desde preform" - $tpl = 63; + $tpl = Template::CONSULTANT_PROJECT_SENT; // get the project configuration $conf = Model\Project\Conf::get($project->id); @@ -445,36 +469,36 @@ static public function toInvestors ($type, Project $project, array $invest_statu // - Separamos los replaces de contenido de los replaces individuales (%USERNAME%) switch ($type) { case 'unique_pass': // template 61, finaliza única ronda - $tpl = 61; + $tpl = Template::DONORS_PROJECT_SINGLE_ROUND; $search = array('%PROJECTNAME%', '%PROJECTURL%'); $replace = array($project->name, self::getURL() . '/project/' . $project->id); break; case 'r1_pass': // template 15, proyecto supera la primera ronda - $tpl = 15; + $tpl = Template::DONORS_PROJECT_1_ROUND; $search = array('%PROJECTNAME%', '%PROJECTURL%'); $replace = array($project->name, self::getURL() . '/project/' . $project->id); break; case 'fail': // template 17, proyecto no consigue el mínimo - $tpl = 17; + $tpl = Template::DONORS_PROJECT_FAILED; $search = array('%PROJECTNAME%', '%DISCOVERURL%'); $replace = array($project->name, self::getURL() . '/discover'); break; case 'r2_pass': // template 16, finaliza segunda ronda - $tpl = 16; + $tpl = Template::DONORS_PROJECT_2_ROUND; $search = array('%PROJECTNAME%', '%PROJECTURL%'); $replace = array($project->name, self::getURL() . '/project/' . $project->id); break; case 'update': // template 18, publica novedad - $tpl = 18; + $tpl = Template::DONORS_PROJECT_NEWS; $post_url = self::getURL().'/project/'.$project->id.'/updates/'.$post->id; // contenido del post $template_type = Template::get($tpl)->type; - $post_content = "**{$post->title}** + $post_content = "**{$post->title}** " . Text::recorta($post->text, 500); // y preparar los enlaces para compartir en redes sociales diff --git a/src/Goteo/Model/Project.php b/src/Goteo/Model/Project.php index 40cc1958dd..3f9c83ec85 100644 --- a/src/Goteo/Model/Project.php +++ b/src/Goteo/Model/Project.php @@ -787,6 +787,26 @@ function getCategories() { return $this->categoriesArray; } + function getWhenWillPass() + { + if (!empty($this->published)) { + $ptime = strtotime($this->published); + $this->willpass = date('Y-m-d', \mktime(0, 0, 0, date('m', $ptime), date('d', $ptime)+$this->days_round1, date('Y', $ptime))); + } + + return $this->willpass; + } + + function getWhenWillFinish() + { + if (!empty($this->published)) { + $ptime = strtotime($this->published); + $this->willfinish = date('Y-m-d', \mktime(0, 0, 0, date('m', $ptime), date('d', $ptime)+$this->days_total, date('Y', $ptime))); + } + + return $this->willfinish; + } + /** * get a readable description of the amount of days left for the project */ diff --git a/src/Goteo/Model/Template.php b/src/Goteo/Model/Template.php index 36fd8de5d6..e32d4a7c37 100644 --- a/src/Goteo/Model/Template.php +++ b/src/Goteo/Model/Template.php @@ -14,12 +14,13 @@ use Goteo\Application\Exception\ModelNotFoundException; use Goteo\Application\Lang; use Goteo\Application\App; +use Goteo\Core\Model; use Symfony\Component\Yaml\Yaml; /* * Clase para gestionar las plantillas de los emails automáticos */ -class Template extends \Goteo\Core\Model { +class Template extends Model { const MESSAGE_CONTACT = 1; // Mensaje de contacto const MESSAGE_DONORS = 2; // DEPRECATED Mensaje a los cofinanciadores DEPRECATED for MESSAGE_PROJECT_THREAD @@ -117,8 +118,10 @@ class Template extends \Goteo\Core\Model { const DONOR_CHANGE_STATUS_VALIDATED = 'donor_change_status_validated'; const DONOR_CHANGE_STATUS_DECLARED = 'donor_change_status_declared'; const DONOR_CHANGE_STATUS_REJECTED = 'donor_change_status_rejected'; - - + const FACE_TO_FACE_EVENT = 'face_to_face_event'; + const ONLINE_EVENT = 'online_event'; + const PRESS = 'press'; + const INVEST_IN_SOCIAL_NETWORKS = 'invest_in_social_networks'; public $id,