Example #1
0
 /**
  * Sobrecarga de métodos 'getter'.
  *
  * @param type string $name
  * @return type mixed
  */
 public function __get($name)
 {
     if ($name == "allowpp") {
         return Project\Account::getAllowpp($this->id);
     }
     if ($name == "budget") {
         return self::calcCosts($this->id);
     }
     return $this->{$name};
 }
Example #2
0
 public static function process($action = 'list', $id = null, $filters = array())
 {
     $errors = array();
     // reubicando aporte,
     if ($action == 'move') {
         // el aporte original
         $original = Model\Invest::get($id);
         $userData = Model\User::getMini($original->user);
         $projectData = Model\Project::getMini($original->project);
         //el original tiene que ser de tpv o cash y estar como 'cargo ejecutado'
         if ($original->method == 'paypal' || $original->status != 1) {
             Message::Error('No se puede reubicar este aporte!');
             throw new Redirection('/admin/accounts');
         }
         // generar aporte manual y caducar el original
         if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['move'])) {
             // si falta proyecto, error
             $projectNew = $_POST['project'];
             // @TODO a saber si le toca dinero de alguna convocatoria
             $campaign = null;
             $invest = new Model\Invest(array('amount' => $original->amount, 'user' => $original->user, 'project' => $projectNew, 'account' => $userData->email, 'method' => 'cash', 'status' => '1', 'invested' => date('Y-m-d'), 'charged' => $original->charged, 'anonymous' => $original->anonymous, 'resign' => $original->resign, 'admin' => $_SESSION['user']->id, 'campaign' => $campaign));
             //@TODO si el proyecto seleccionado
             if ($invest->save($errors)) {
                 //recompensas que le tocan (si no era resign)
                 if (!$original->resign) {
                     // sacar recompensas
                     $rewards = Model\Project\Reward::getAll($projectNew, 'individual');
                     foreach ($rewards as $rewId => $rewData) {
                         $invest->setReward($rewId);
                         //asignar
                     }
                 }
                 // cambio estado del aporte original a 'Reubicado' (no aparece en cofinanciadores)
                 // si tuviera que aparecer lo marcaríamos como caducado
                 if ($original->setStatus('5')) {
                     // Evento Feed
                     $log = new Feed();
                     $log->setTarget($projectData->id);
                     $log->populate('Aporte reubicado', '/admin/accounts', \vsprintf("%s ha aportado %s al proyecto %s en nombre de %s", array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('money', $_POST['amount'] . ' €'), Feed::item('project', $projectData->name, $projectData->id), Feed::item('user', $userData->name, $userData->id))));
                     $log->doAdmin('money');
                     unset($log);
                     Message::Info('Aporte reubicado correctamente');
                     throw new Redirection('/admin/accounts');
                 } else {
                     $errors[] = 'A fallado al cambiar el estado del aporte original (' . $original->id . ')';
                 }
             } else {
                 $errors[] = 'Ha fallado algo al reubicar el aporte';
             }
         }
         $viewData = array('folder' => 'accounts', 'file' => 'move', 'original' => $original, 'user' => $userData, 'project' => $projectData);
         return new View('view/admin/index.html.php', $viewData);
         // fin de la historia dereubicar
     }
     // cambiando estado del aporte aporte,
     if ($action == 'update') {
         // el aporte original
         $invest = Model\Invest::get($id);
         if (!$invest instanceof Model\Invest) {
             Message::Error('No tenemos registro del aporte ' . $id);
             throw new Redirection('/admin/accounts');
         }
         $status = Model\Invest::status();
         $new = isset($_POST['status']) ? $_POST['status'] : null;
         if ($invest->issue && $_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['update']) && $_POST['resolve'] == 1) {
             Model\Invest::unsetIssue($id);
             Model\Invest::setDetail($id, 'issue-solved', 'La incidencia se ha dado por resuelta por el usuario ' . $_SESSION['user']->name);
             Message::Info('La incidencia se ha dado por resuelta');
         }
         if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['update']) && isset($new) && isset($status[$new])) {
             if ($new != $invest->status) {
                 if (Model\Invest::query("UPDATE invest SET status=:status WHERE id=:id", array(':id' => $id, ':status' => $new))) {
                     Model\Invest::setDetail($id, 'status-change' . rand(0, 9999), 'El admin ' . $_SESSION['user']->name . ' ha cambiado el estado del apote a ' . $status[$new]);
                     Message::Info('Se ha actualizado el estado del aporte');
                 } else {
                     Message::Error('Ha fallado al actualizar el estado del aporte');
                 }
             } else {
                 Message::Error('No se ha cambiado el estado');
             }
             throw new Redirection('/admin/accounts/details/' . $id);
         }
         return new View('view/admin/index.html.php', array('folder' => 'accounts', 'file' => 'update', 'invest' => $invest, 'status' => $status));
         // fin de la historia actualizar estado
     }
     // resolviendo incidencias
     if ($action == 'solve') {
         // el aporte original
         $invest = Model\Invest::get($id);
         if (!$invest instanceof Model\Invest) {
             Message::Error('No tenemos registro del aporte ' . $id);
             throw new Redirection('/admin/accounts');
         }
         $projectData = Model\Project::getMini($invest->project);
         $errors = array();
         // primero cancelar
         switch ($invest->method) {
             case 'paypal':
                 $err = array();
                 if (Paypal::cancelPreapproval($invest, $err)) {
                     $errors[] = 'Preaproval paypal cancelado.';
                     $log_text = "El admin %s ha cancelado aporte y preapproval de %s de %s mediante PayPal (id: %s) al proyecto %s del dia %s";
                 } else {
                     $txt_errors = implode('; ', $err);
                     $errors[] = 'Fallo al cancelar el preapproval en paypal: ' . $txt_errors;
                     $log_text = "El admin %s ha fallado al cancelar el aporte de %s de %s mediante PayPal (id: %s) al proyecto %s del dia %s. <br />Se han dado los siguientes errores: {$txt_errors}";
                     if ($invest->cancel()) {
                         $errors[] = 'Aporte cancelado';
                     } else {
                         $errors[] = 'Fallo al cancelar el aporte';
                     }
                 }
                 break;
             case 'tpv':
                 $err = array();
                 if (Tpv::cancelPreapproval($invest, $err)) {
                     $txt_errors = implode('; ', $err);
                     $errors[] = 'Aporte cancelado correctamente. ' . $txt_errors;
                     $log_text = "El admin %s ha anulado el cargo tpv de %s de %s mediante TPV (id: %s) al proyecto %s del dia %s";
                 } else {
                     $txt_errors = implode('; ', $err);
                     $errors[] = 'Fallo en la operación. ' . $txt_errors;
                     $log_text = "El admin %s ha fallado al solicitar la cancelación del cargo tpv de %s de %s mediante TPV (id: %s) al proyecto %s del dia %s. <br />Se han dado los siguientes errores: {$txt_errors}";
                 }
                 break;
             case 'cash':
                 if ($invest->cancel()) {
                     $log_text = "El admin %s ha cancelado aporte manual de %s de %s (id: %s) al proyecto %s del dia %s";
                     $errors[] = 'Aporte cancelado';
                 } else {
                     $log_text = "El admin %s ha fallado al cancelar el aporte manual de %s de %s (id: %s) al proyecto %s del dia %s. ";
                     $errors[] = 'Fallo al cancelar el aporte';
                 }
                 break;
         }
         // Evento Feed
         $log = new Feed();
         $log->setTarget($projectData->id);
         $log->populate('Cargo cancelado manualmente (admin)', '/admin/accounts', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('user', $userData->name, $userData->id), Feed::item('money', $invest->amount . ' &euro;'), Feed::item('system', $invest->id), Feed::item('project', $projectData->name, $projectData->id), Feed::item('system', date('d/m/Y', strtotime($invest->invested))))));
         $log->doAdmin();
         unset($log);
         // luego resolver
         if ($invest->solve($errors)) {
             // Evento Feed
             $log = new Feed();
             $log->setTarget($projectData->id);
             $log->populate('Incidencia resuelta (admin)', '/admin/accounts', \vsprintf("El admin %s ha dado por resuelta la incidencia con el botón \"Nos han hecho la transferencia\" para el aporte %s", array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('system', $id, 'accounts/details/' . $id))));
             $log->doAdmin('admin');
             unset($log);
             Message::Info('La incidencia se ha dado por resuelta, el aporte se ha pasado a manual y cobrado');
             throw new Redirection('/admin/accounts');
         } else {
             // Evento Feed
             $log = new Feed();
             $log->setTarget($projectData->id);
             $log->populate('Fallo al resolver incidencia (admin)', '/admin/accounts', \vsprintf("Al admin %s le ha fallado el botón \"Nos han hecho la transferencia\" para el aporte %s", array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('system', $id, 'accounts/details/' . $id))));
             $log->doAdmin('admin');
             unset($log);
             Message::Error('Ha fallado al resolver la incidencia: ' . implode(',', $errors));
             throw new Redirection('/admin/accounts/details/' . $id);
         }
     }
     // aportes manuales, cargamos la lista completa de usuarios, proyectos y campañas
     if ($action == 'add') {
         // listado de proyectos en campaña
         $projects = Model\Project::active(false, true);
         // usuarios
         $users = Model\User::getAllMini();
         // campañas
         //@CALLSYS
         $calls = array();
         // generar aporte manual
         if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['add'])) {
             $userData = Model\User::getMini($_POST['user']);
             $projectData = Model\Project::getMini($_POST['project']);
             $invest = new Model\Invest(array('amount' => $_POST['amount'], 'user' => $userData->id, 'project' => $projectData->id, 'account' => $userData->email, 'method' => 'cash', 'status' => '1', 'invested' => date('Y-m-d'), 'charged' => date('Y-m-d'), 'anonymous' => $_POST['anonymous'], 'resign' => 1, 'admin' => $_SESSION['user']->id));
             //@CALLSYS
             if ($invest->save($errors)) {
                 // Evento Feed
                 $log = new Feed();
                 $log->setTarget($projectData->id);
                 $log->populate('Aporte manual (admin)', '/admin/accounts', \vsprintf("%s ha aportado %s al proyecto %s en nombre de %s", array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('money', $_POST['amount'] . ' &euro;'), Feed::item('project', $projectData->name, $projectData->id), Feed::item('user', $userData->name, $userData->id))));
                 $log->doAdmin('money');
                 unset($log);
                 Model\Invest::setDetail($invest->id, 'admin-created', 'Este aporte ha sido creado manualmente por el admin ' . $_SESSION['user']->name);
                 Message::Info('Aporte manual creado correctamente, seleccionar recompensa y dirección de entrega.');
                 throw new Redirection('/admin/rewards/edit/' . $invest->id);
             } else {
                 $errors[] = 'Ha fallado algo al crear el aporte manual';
             }
         }
         $viewData = array('folder' => 'accounts', 'file' => 'add', 'autocomplete' => true, 'users' => $users, 'projects' => $projects, 'calls' => $calls);
         return new View('view/admin/index.html.php', $viewData);
         // fin de la historia
     }
     // Informe de la financiación de un proyecto
     if ($action == 'report') {
         // estados de aporte
         $project = Model\Project::get($id);
         if (!$project instanceof Model\Project) {
             Message::Error('Instancia de proyecto no valida');
             throw new Redirection('/admin/accounts');
         }
         $invests = Model\Invest::getAll($id);
         $project->investors = Model\Invest::investors($id, false, true);
         $users = $project->agregateInvestors();
         $investStatus = Model\Invest::status();
         // Datos para el informe de transacciones correctas
         $Data = Model\Invest::getReportData($project->id, $project->status, $project->round, $project->passed);
         return new View('view/admin/index.html.php', array('folder' => 'accounts', 'file' => 'report', 'invests' => $invests, 'project' => $project, 'status' => $status, 'users' => $users, 'investStatus' => $investStatus, 'Data' => $Data));
     }
     // cancelar aporte antes de ejecución, solo aportes no cargados
     if ($action == 'cancel') {
         $invest = Model\Invest::get($id);
         if (!$invest instanceof Model\Invest) {
             Message::Error('No tenemos objeto para el aporte ' . $id);
             throw new Redirection('/admin/accounts');
         }
         $project = Model\Project::get($invest->project);
         $userData = Model\User::get($invest->user);
         if ($project->status > 3 && $project->status < 6) {
             $errors[] = 'No debería poderse cancelar un aporte cuando el proyecto ya está financiado. Si es imprescindible, hacerlo desde el panel de paypal o tpv';
             break;
         }
         switch ($invest->method) {
             case 'paypal':
                 $err = array();
                 if (Paypal::cancelPreapproval($invest, $err)) {
                     $errors[] = 'Preaproval paypal cancelado.';
                     $log_text = "El admin %s ha cancelado aporte y preapproval de %s de %s mediante PayPal (id: %s) al proyecto %s del dia %s";
                 } else {
                     $txt_errors = implode('; ', $err);
                     $errors[] = 'Fallo al cancelar el preapproval en paypal: ' . $txt_errors;
                     $log_text = "El admin %s ha fallado al cancelar el aporte de %s de %s mediante PayPal (id: %s) al proyecto %s del dia %s. <br />Se han dado los siguientes errores: {$txt_errors}";
                     if ($invest->cancel()) {
                         $errors[] = 'Aporte cancelado';
                     } else {
                         $errors[] = 'Fallo al cancelar el aporte';
                     }
                 }
                 break;
             case 'tpv':
                 $err = array();
                 if (Tpv::cancelPreapproval($invest, $err)) {
                     $txt_errors = implode('; ', $err);
                     $errors[] = 'Aporte cancelado correctamente. ' . $txt_errors;
                     $log_text = "El admin %s ha anulado el cargo tpv de %s de %s mediante TPV (id: %s) al proyecto %s del dia %s";
                 } else {
                     $txt_errors = implode('; ', $err);
                     $errors[] = 'Fallo en la operación. ' . $txt_errors;
                     $log_text = "El admin %s ha fallado al solicitar la cancelación del cargo tpv de %s de %s mediante TPV (id: %s) al proyecto %s del dia %s. <br />Se han dado los siguientes errores: {$txt_errors}";
                 }
                 break;
             case 'cash':
                 if ($invest->cancel()) {
                     $log_text = "El admin %s ha cancelado aporte manual de %s de %s (id: %s) al proyecto %s del dia %s";
                     $errors[] = 'Aporte cancelado';
                 } else {
                     $log_text = "El admin %s ha fallado al cancelar el aporte manual de %s de %s (id: %s) al proyecto %s del dia %s. ";
                     $errors[] = 'Fallo al cancelar el aporte';
                 }
                 break;
         }
         // Evento Feed
         $log = new Feed();
         $log->setTarget($project->id);
         $log->populate('Cargo cancelado manualmente (admin)', '/admin/accounts', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('user', $userData->name, $userData->id), Feed::item('money', $invest->amount . ' &euro;'), Feed::item('system', $invest->id), Feed::item('project', $project->name, $project->id), Feed::item('system', date('d/m/Y', strtotime($invest->invested))))));
         $log->doAdmin();
         Model\Invest::setDetail($invest->id, 'manually-canceled', $log->html);
         unset($log);
     }
     // ejecutar cargo ahora!!, solo aportes no ejecutados
     // si esta pendiente, ejecutar el cargo ahora (como si fuera final de ronda), deja pendiente el pago secundario
     if ($action == 'execute' && $invest->status == 0) {
         $invest = Model\Invest::get($id);
         if (!$invest instanceof Model\Invest) {
             Message::Error('No tenemos objeto para el aporte ' . $id);
             throw new Redirection('/admin/accounts');
         }
         $project = Model\Project::get($invest->project);
         $userData = Model\User::get($invest->user);
         switch ($invest->method) {
             case 'paypal':
                 // a ver si tiene cuenta paypal
                 $projectAccount = Model\Project\Account::get($invest->project);
                 if (empty($projectAccount->paypal)) {
                     // Erroraco!
                     $errors[] = 'El proyecto no tiene cuenta paypal!!, ponersela en la seccion Contrato del dashboard del autor';
                     $log_text = null;
                     // Evento Feed
                     $log = new Feed();
                     $log->setTarget($project->id);
                     $log->populate('proyecto sin cuenta paypal (admin)', '/admin/projects', \vsprintf('El proyecto %s aun no ha puesto su %s !!!', array(Feed::item('project', $project->name, $project->id), Feed::item('relevant', 'cuenta PayPal'))));
                     $log->doAdmin('project');
                     unset($log);
                     break;
                 }
                 $invest->account = $projectAccount->paypal;
                 if (Paypal::pay($invest, $errors)) {
                     $errors[] = 'Cargo paypal correcto';
                     $log_text = "El admin %s ha ejecutado el cargo a %s por su aporte de %s mediante PayPal (id: %s) al proyecto %s del dia %s";
                     $invest->status = 1;
                     // si era incidencia la desmarcamos
                     if ($invest->issue) {
                         Model\Invest::unsetIssue($invest->id);
                         Model\Invest::setDetail($invest->id, 'issue-solved', 'La incidencia se ha dado por resuelta al ejecutar el aporte manualmente por el admin ' . $_SESSION['user']->name);
                     }
                 } else {
                     $txt_errors = implode('; ', $errors);
                     $errors[] = 'Fallo al ejecutar cargo paypal: ' . $txt_errors . '<strong>POSIBLE INCIDENCIA NO COMUNICADA Y APORTE NO CANCELADO, HAY QUE TRATARLA MANUALMENTE</strong>';
                     $log_text = "El admin %s ha fallado al ejecutar el cargo a %s por su aporte de %s mediante PayPal (id: %s) al proyecto %s del dia %s. <br />Se han dado los siguientes errores: {$txt_errors}";
                 }
                 break;
             case 'tpv':
                 if (Tpv::pay($invest, $errors)) {
                     $errors[] = 'Cargo sermepa correcto';
                     $log_text = "El admin %s ha ejecutado el cargo a %s por su aporte de %s mediante TPV (id: %s) al proyecto %s del dia %s";
                     $invest->status = 1;
                 } else {
                     $txt_errors = implode('; ', $errors);
                     $errors[] = 'Fallo al ejecutar cargo sermepa: ' . $txt_errors;
                     $log_text = "El admin %s ha fallado al ejecutar el cargo a %s por su aporte de %s mediante TPV (id: %s) al proyecto %s del dia %s <br />Se han dado los siguientes errores: {$txt_errors}";
                 }
                 break;
             case 'cash':
                 $invest->setStatus('1');
                 $errors[] = 'Aporte al contado, nada que ejecutar.';
                 $log_text = "El admin %s ha dado por ejecutado el aporte manual a nombre de %s por la cantidad de %s (id: %s) al proyecto %s del dia %s";
                 $invest->status = 1;
                 break;
         }
         if (!empty($log_text)) {
             // Evento Feed
             $log = new Feed();
             $log->setTarget($project->id);
             $log->populate('Cargo ejecutado manualmente (admin)', '/admin/accounts', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('user', $userData->name, $userData->id), Feed::item('money', $invest->amount . ' &euro;'), Feed::item('system', $invest->id), Feed::item('project', $project->name, $project->id), Feed::item('system', date('d/m/Y', strtotime($invest->invested))))));
             $log->doAdmin();
             Model\Invest::setDetail($invest->id, 'manually-executed', $log->html);
             unset($log);
         }
     }
     // visor de logs
     if ($action == 'viewer') {
         return new View('view/admin/index.html.php', array('folder' => 'accounts', 'file' => 'viewer'));
     }
     if ($action == 'resign' && !empty($id) && $_GET['token'] == md5('resign')) {
         if ($invest->setResign(true)) {
             Model\Invest::setDetail($invest->id, 'manually-resigned', 'Se ha marcado como donativo independientemente de las recompensas');
             throw new Redirection('/admin/accounts/detail/' . $invest->id);
         } else {
             $errors[] = 'Ha fallado al marcar donativo';
         }
     }
     if (!empty($errors)) {
         Message::Error(implode('<br />', $errors));
     }
     // tipos de aporte
     $methods = Model\Invest::methods();
     // estados del proyecto
     $status = Model\Project::status();
     $procStatus = Model\Project::procStatus();
     // estados de aporte
     $investStatus = Model\Invest::status();
     // listado de proyectos
     $projects = Model\Invest::projects();
     // usuarios cofinanciadores
     $users = Model\Invest::users(true);
     // campañas que tienen aportes
     $calls = Model\Invest::calls();
     // extras
     $types = array('donative' => 'Solo los donativos', 'anonymous' => 'Solo los anónimos', 'manual' => 'Solo los manuales', 'campaign' => 'Solo con riego');
     // filtros de revisión de proyecto
     $review = array('collect' => 'Recaudado', 'paypal' => 'Rev. PayPal', 'tpv' => 'Rev. TPV', 'online' => 'Pagos Online');
     $issue = array('show' => 'Solamente las incidencias', 'hide' => 'Ocultar las incidencias');
     /// detalles de una transaccion
     if ($action == 'details') {
         $invest = Model\Invest::get($id);
         $project = Model\Project::get($invest->project);
         $userData = Model\User::get($invest->user);
         return new View('view/admin/index.html.php', array('folder' => 'accounts', 'file' => 'details', 'invest' => $invest, 'project' => $project, 'user' => $userData, 'details' => $details, 'status' => $status, 'investStatus' => $investStatus));
     }
     // listado de aportes
     if ($filters['filtered'] == 'yes') {
         $list = Model\Invest::getList($filters, null, 999);
     } else {
         $list = array();
     }
     $viewData = array('folder' => 'accounts', 'file' => 'list', 'list' => $list, 'filters' => $filters, 'users' => $users, 'projects' => $projects, 'calls' => $calls, 'review' => $review, 'methods' => $methods, 'types' => $types, 'status' => $status, 'procStatus' => $procStatus, 'issue' => $issue, 'investStatus' => $investStatus);
     return new View('view/admin/index.html.php', $viewData);
 }
Example #3
0
 private function process_userPersonal(&$project, &$errors)
 {
     if (!isset($_POST['process_userPersonal'])) {
         return false;
     }
     // campos que guarda este paso
     $fields = array('contract_name', 'contract_nif', 'contract_email', 'phone', 'contract_birthdate', 'address', 'zipcode', 'location', 'country');
     $personalData = array();
     foreach ($fields as $field) {
         if (isset($_POST[$field])) {
             $project->{$field} = $_POST[$field];
             $personalData[$field] = $_POST[$field];
         }
     }
     if (!$_POST['secondary_address']) {
         $project->post_address = null;
         $project->post_zipcode = null;
         $project->post_location = null;
         $project->post_country = null;
     }
     // actualizamos estos datos en los personales del usuario
     if (!empty($personalData)) {
         Model\User::setPersonal($project->owner, $personalData, true);
     }
     // cuentas bancarias
     $ppacc = !empty($_POST['paypal']) ? $_POST['paypal'] : '';
     $bankacc = !empty($_POST['bank']) ? $_POST['bank'] : '';
     // primero checkeamos si la cuenta Paypal es tipo email
     if (!Check::mail($ppacc)) {
         $project->errors['userPersonal']['paypal'] = Text::get('validate-project-paypal_account');
     } else {
         $project->okeys['userPersonal']['paypal'] = true;
     }
     $accounts = Model\Project\Account::get($project->id);
     $accounts->paypal = $ppacc;
     $accounts->bank = $bankacc;
     $accounts->save($project->errors['userPersonal']);
     return true;
 }
Example #4
0
 public static function process($action = 'list', $id = null, $filters = array())
 {
     $log_text = null;
     $errors = array();
     // multiples usos
     $nodes = array();
     if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['id'])) {
         $projData = Model\Project::get($_POST['id']);
         if (empty($projData->id)) {
             Message::Error('El proyecto ' . $_POST['id'] . ' no existe');
             throw new Redirection('/admin/projects/images/' . $id);
         }
         if (isset($_POST['save-dates'])) {
             $fields = array('created', 'updated', 'published', 'success', 'closed', 'passed');
             $set = '';
             $values = array(':id' => $projData->id);
             foreach ($fields as $field) {
                 if ($set != '') {
                     $set .= ", ";
                 }
                 $set .= "`{$field}` = :{$field} ";
                 if (empty($_POST[$field]) || $_POST[$field] == '0000-00-00') {
                     $_POST[$field] = null;
                 }
                 $values[":{$field}"] = $_POST[$field];
             }
             try {
                 $sql = "UPDATE project SET " . $set . " WHERE id = :id";
                 if (Model\Project::query($sql, $values)) {
                     $log_text = 'El admin %s ha <span class="red">tocado las fechas</span> del proyecto ' . $projData->name . ' %s';
                 } else {
                     $log_text = 'Al admin %s le ha <span class="red">fallado al tocar las fechas</span> del proyecto ' . $projData->name . ' %s';
                 }
             } catch (\PDOException $e) {
                 Message::Error(Text::_("No se ha guardado correctamente. ") . $e->getMessage());
             }
         } elseif (isset($_POST['save-accounts'])) {
             $accounts = Model\Project\Account::get($projData->id);
             $accounts->bank = $_POST['bank'];
             $accounts->bank_owner = $_POST['bank_owner'];
             $accounts->paypal = $_POST['paypal'];
             $accounts->paypal_owner = $_POST['paypal_owner'];
             if ($accounts->save($errors)) {
                 Message::Info(Text::_('Se han actualizado las cuentas del proyecto ') . $projData->name);
             } else {
                 Message::Error(implode('<br />', $errors));
             }
         } elseif ($action == 'images') {
             $todook = true;
             if (!empty($_POST['move'])) {
                 $direction = $_POST['action'];
                 Model\Project\Image::$direction($id, $_POST['move'], $_POST['section']);
             }
             foreach ($_POST as $key => $value) {
                 $parts = explode('_', $key);
                 if ($parts[1] == 'image' && in_array($parts[0], array('section', 'url'))) {
                     if (Model\Project\Image::update($id, $parts[2], $parts[0], $value)) {
                         // OK
                     } else {
                         $todook = false;
                         Message::Error(Text::_('No se ha podido actualizar campo') . " {$parts[0]} -> {$value}");
                     }
                 }
             }
             if ($todook) {
                 Message::Info(Text::_('Se han actualizado los datos'));
             }
             throw new Redirection('/admin/projects/images/' . $id);
         } elseif ($action == 'rebase') {
             $todook = true;
             if ($_POST['proceed'] == 'rebase' && !empty($_POST['newid'])) {
                 $newid = $_POST['newid'];
                 // pimero miramos que no hay otro proyecto con esa id
                 $test = Model\Project::getMini($newid);
                 if ($test->id == $newid) {
                     Message::Error(Text::_('Ya hay un proyecto con ese Id.'));
                     throw new Redirection('/admin/projects/rebase/' . $id);
                 }
                 if ($projData->status >= 3 && $_POST['force'] != 1) {
                     Message::Error(Text::_('El proyecto no está ni en Edición ni en Revisión, no se modifica nada.'));
                     throw new Redirection('/admin/projects/rebase/' . $id);
                 }
                 if ($projData->rebase($newid)) {
                     Message::Info(Text::_('Verificar el proyecto') . ' -> <a href="' . SITE_URL . '/project/' . $newid . '" target="_blank">' . $projData->name . '</a>');
                     throw new Redirection('/admin/projects');
                 } else {
                     Message::Info(Text::_('Ha fallado algo en el rebase, verificar el proyecto') . ' -> <a href="' . SITE_URL . '/project/' . $projData->id . '" target="_blank">' . $projData->name . ' (' . $id . ')</a>');
                     throw new Redirection('/admin/projects/rebase/' . $id);
                 }
             }
         }
     }
     /*
      * switch action,
      * proceso que sea,
      * redirect
      *
      */
     if (isset($id)) {
         $project = Model\Project::get($id);
     }
     switch ($action) {
         case 'review':
             // pasar un proyecto a revision
             if ($project->ready($errors)) {
                 $redir = '/admin/reviews/add/' . $project->id;
                 $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Revision</span>';
             } else {
                 $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Revision</span>';
             }
             break;
         case 'publish':
             // poner un proyecto en campa�a
             if ($project->publish($errors)) {
                 $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">en Campa�a</span>';
             } else {
                 $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">en Campa�a</span>';
             }
             break;
         case 'cancel':
             // descartar un proyecto por malo
             if ($project->cancel($errors)) {
                 $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Descartado</span>';
             } else {
                 $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Descartado</span>';
             }
             break;
         case 'enable':
             // si no esta en edicion, recuperarlo
             if ($project->enable($errors)) {
                 $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Edicion</span>';
             } else {
                 $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Edicion</span>';
             }
             break;
         case 'fulfill':
             // marcar que el proyecto ha cumplido con los retornos colectivos
             if ($project->satisfied($errors)) {
                 $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Retorno cumplido</span>';
             } else {
                 $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Retorno cumplido</span>';
             }
             break;
         case 'unfulfill':
             // dar un proyecto por financiado manualmente
             if ($project->rollback($errors)) {
                 $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Financiado</span>';
             } else {
                 $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Financiado</span>';
             }
             break;
     }
     if (isset($log_text)) {
         // Evento Feed
         $log = new Feed();
         $log->setTarget($project->id);
         $log->populate(Text::_('Cambio estado/fechas/cuentas/nodo de un proyecto desde el admin'), '/admin/projects', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('project', $project->name, $project->id))));
         $log->doAdmin('admin');
         Message::Info($log->html);
         if (!empty($errors)) {
             Message::Error(implode('<br />', $errors));
         }
         if ($action == 'publish') {
             // si es publicado, hay un evento publico
             $log->populate($project->name, '/project/' . $project->id, Text::html('feed-new_project'), $project->gallery[0]->id);
             $log->doPublic('projects');
         }
         unset($log);
         if (empty($redir)) {
             throw new Redirection('/admin/projects/list');
         } else {
             throw new Redirection($redir);
         }
     }
     if ($action == 'report') {
         // informe financiero
         // Datos para el informe de transacciones correctas
         $Data = Model\Invest::getReportData($project->id, $project->status, $project->round, $project->passed);
         return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'report', 'project' => $project, 'Data' => $Data));
     }
     if ($action == 'dates') {
         // cambiar fechas
         return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'dates', 'project' => $project));
     }
     if ($action == 'accounts') {
         $accounts = Model\Project\Account::get($project->id);
         // cambiar fechas
         return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'accounts', 'project' => $project, 'accounts' => $accounts));
     }
     if ($action == 'images') {
         // imagenes
         $images = array();
         // secciones
         $sections = Model\Project\Image::sections();
         foreach ($sections as $sec => $secName) {
             $secImages = Model\Project\Image::get($project->id, $sec);
             foreach ($secImages as $img) {
                 $images[$sec][] = $img;
             }
         }
         return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'images', 'project' => $project, 'images' => $images, 'sections' => $sections));
     }
     if ($action == 'move') {
         // cambiar el nodo
         return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'move', 'project' => $project, 'nodes' => $nodes));
     }
     if ($action == 'rebase') {
         // cambiar la id
         return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'rebase', 'project' => $project));
     }
     // Rechazo express
     if ($action == 'reject') {
         if (empty($project)) {
             Message::Error(Text::_('No hay proyecto sobre el que operar'));
         } else {
             // Obtenemos la plantilla para asunto y contenido
             $template = Template::get(40);
             // Sustituimos los datos
             $subject = str_replace('%PROJECTNAME%', $project->name, $template->title);
             $search = array('%USERNAME%', '%PROJECTNAME%');
             $replace = array($project->user->name, $project->name);
             $content = \str_replace($search, $replace, $template->text);
             // iniciamos mail
             $mailHandler = new Mail();
             $mailHandler->to = $project->user->email;
             $mailHandler->toName = $project->user->name;
             $mailHandler->subject = $subject;
             $mailHandler->content = $content;
             $mailHandler->html = true;
             $mailHandler->template = $template->id;
             if ($mailHandler->send()) {
                 Message::Info('Se ha enviado un email a <strong>' . $project->user->name . '</strong> a la dirección <strong>' . $project->user->email . '</strong>');
             } else {
                 Message::Error('Ha fallado al enviar el mail a <strong>' . $project->user->name . '</strong> a la dirección <strong>' . $project->user->email . '</strong>');
             }
             unset($mailHandler);
         }
         throw new Redirection('/admin/projects/list');
     }
     if (!empty($filters['filtered'])) {
         $projects = Model\Project::getList($filters, $_SESSION['admin_node']);
     } else {
         $projects = array();
     }
     $status = Model\Project::status();
     $categories = Model\Project\Category::getAll();
     //@CONTRACTSYS
     $calls = array();
     // la lista de nodos la hemos cargado arriba
     $orders = array('name' => Text::_('Nombre'), 'updated' => Text::_('Enviado a revision'));
     return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'list', 'projects' => $projects, 'filters' => $filters, 'status' => $status, 'categories' => $categories, 'calls' => $calls, 'nodes' => $nodes, 'orders' => $orders));
 }
Example #5
0
 *
 *  Goteo is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Affero General Public License for more details.
 *
 *  You should have received a copy of the GNU Affero General Public License
 *  along with Goteo.  If not, see <http://www.gnu.org/licenses/agpl.txt>.
 *
 */
use Goteo\Core\View, Goteo\Library\Text, Goteo\Model\Project\Account;
$project = $this['project'];
if (!$project instanceof Goteo\Model\Project) {
    return;
}
$accounts = Account::get($project->id);
?>
<!--
<div class="widget projects">
    <h2 class="title">Acuerdo</h2>
</div>
-->

<div class="widget projects">
    <h2 class="title">Cuentas bancarias del proyecto</h2>
<form method="post" action="/dashboard/projects/contract/save" >
    <input type="hidden" name="project" value="<?php 
echo $project->id;
?>
" />
<p>
Example #6
0
File: cron.php Project: kenjs/Goteo
 public function dopay($project)
 {
     die('Ya no realizamos pagos secundarios mediante sistema');
     if (\defined('CRON_EXEC')) {
         die('Este proceso no necesitamos lanzarlo automaticamente');
     }
     @mail(\GOTEO_FAIL_MAIL, 'Se ha lanzado el cron ' . __FUNCTION__ . ' en ' . SITE_URL, 'Se ha lanzado manualmente el cron ' . __FUNCTION__ . ' para el proyecto ' . $project . ' en ' . SITE_URL . ' a las ' . date('H:i:s') . ' Usuario ' . $_SESSION['user']->id);
     // a ver si existe el bloqueo
     $block_file = GOTEO_PATH . 'logs/cron-' . __FUNCTION__ . '.block';
     if (file_exists($block_file)) {
         echo 'Ya existe un archivo de log ' . date('Ymd') . '_' . __FUNCTION__ . '.log<br />';
         $block_content = \file_get_contents($block_file);
         echo 'El contenido del bloqueo es: ' . $block_content;
         // lo escribimos en el log
         $log_file = GOTEO_PATH . 'logs/cron/' . date('Ymd') . '_' . __FUNCTION__ . '.log';
         \file_put_contents($log_file, \ob_get_contents(), FILE_APPEND);
         \chmod($log_file, 0777);
         /*
                         @mail(\GOTEO_FAIL_MAIL, 'Cron '. __FUNCTION__ .' bloqueado en ' . SITE_URL,
            'Se ha encontrado con que el cron '. __FUNCTION__ .' está bloqueado el '.date('d-m-Y').' a las ' . date ('H:i:s') . '
                El contenido del bloqueo es: '. $block_content);
         */
         die;
     } else {
         $block = 'Bloqueo ' . $block_file . ' activado el ' . date('d-m-Y') . ' a las ' . date('H:i:s') . '<br />';
         if (\file_put_contents($block_file, $block, FILE_APPEND)) {
             \chmod($block_file, 0777);
             echo $block;
         } else {
             echo 'No se ha podido crear el archivo de bloqueo<br />';
             @mail(\GOTEO_FAIL_MAIL, 'Cron ' . __FUNCTION__ . ' no se ha podido bloquear en ' . SITE_URL, 'No se ha podido crear el archivo ' . $block_file . ' el ' . date('d-m-Y') . ' a las ' . date('H:i:s'));
         }
     }
     $projectData = Model\Project::getMini($project);
     // necesitamos la cuenta del proyecto y que sea la misma que cuando el preapproval
     $projectAccount = Model\Project\Account::get($project);
     if (empty($projectAccount->paypal)) {
         // iniciamos mail
         $mailHandler = new Mail();
         $mailHandler->to = \GOTEO_MAIL;
         $mailHandler->toName = 'Goteo.org';
         $mailHandler->subject = 'El proyecto ' . $projectData->name . ' no tiene cuenta PayPal';
         $mailHandler->content = 'Hola Goteo, el proyecto ' . $projectData->name . ' no tiene cuenta PayPal y se estaba intentando realizar pagos secundarios.';
         $mailHandler->html = false;
         $mailHandler->template = null;
         $mailHandler->send();
         unset($mailHandler);
         die('El proyecto ' . $projectData->name . ' no tiene la cuenta PayPal!!');
     }
     // tratamiento de aportes pendientes
     $query = Model\Project::query("\n                SELECT  *\n                FROM  invest\n                WHERE   invest.status = 1\n                AND     invest.method = 'paypal'\n                AND     invest.project = ?\n                ", array($project));
     $invests = $query->fetchAll(\PDO::FETCH_CLASS, '\\Goteo\\Model\\Invest');
     echo 'Vamos a tratar ' . count($invests) . ' aportes para el proyecto ' . $projectData->name . '<br />';
     foreach ($invests as $key => $invest) {
         $errors = array();
         $userData = Model\User::getMini($invest->user);
         echo 'Tratando: Aporte (id: ' . $invest->id . ') de ' . $userData->name . ' [' . $userData->email . ']<br />';
         if (Paypal::doPay($invest, $errors)) {
             echo 'Aporte (id: ' . $invest->id . ') pagado al proyecto. Ver los detalles en la <a href="/admin/accounts/details/' . $invest->id . '">gestion de transacciones</a><br />';
             $log_text = Text::_("Se ha realizado el pago de %s PayPal al proyecto %s por el aporte de %s (id: %s) del dia %s");
             Model\Invest::setDetail($invest->id, 'payed', 'Se ha realizado el pago secundario al proyecto. Proceso cron/doPay');
         } else {
             echo 'Fallo al pagar al proyecto el aporte (id: ' . $invest->id . '). Ver los detalles en la <a href="/admin/accounts/details/' . $invest->id . '">gestion de transacciones</a><br />' . implode('<br />', $errors);
             $log_text = Text::_("Ha fallado al realizar el pago de %s PayPal al proyecto %s por el aporte de %s (id: %s) del dia %s");
             Model\Invest::setDetail($invest->id, 'pay-failed', 'Fallo al realizar el pago secundario: ' . implode('<br />', $errors) . '. Proceso cron/doPay');
         }
         // Evento Feed
         $log = new Feed();
         $log->setTarget($projectData->id);
         $log->populate('Pago al proyecto encadenado-secundario (cron)', '/admin/accounts', \vsprintf($log_text, array(Feed::item('money', $invest->amount . ' &yen;'), Feed::item('project', $projectData->name, $project), Feed::item('user', $userData->name, $userData->id), Feed::item('system', $invest->id), Feed::item('system', date('d/m/Y', strtotime($invest->invested))))));
         $log->doAdmin();
         unset($log);
         echo '<hr />';
     }
     // desbloqueamos
     if (unlink($block_file)) {
         echo 'Cron ' . __FUNCTION__ . ' desbloqueado<br />';
     } else {
         echo 'ALERT! Cron ' . __FUNCTION__ . ' no se ha podido desbloquear<br />';
         if (file_exists($block_file)) {
             echo 'El archivo ' . $block_file . ' aun existe!<br />';
         } else {
             echo 'No hay archivo de bloqueo ' . $block_file . '!<br />';
         }
     }
     // recogemos el buffer para grabar el log
     $log_file = GOTEO_PATH . 'logs/cron/' . date('Ymd') . '_' . __FUNCTION__ . '.log';
     \file_put_contents($log_file, \ob_get_contents(), FILE_APPEND);
     \chmod($log_file, 0777);
 }