File: /home/artinside/sites.artinside.com.br/mainpro/source/App/Admin/Enrolments.php
<?php
namespace Source\App\Admin;
use Source\Core\Session;
use Source\Models\Activity;
use Source\Models\Auth;
use Source\Models\Client;
use Source\Models\CourseDocuments;
use Source\Models\Enrolment;
use Source\Models\Files;
use Source\Models\Newsletter;
use Source\Support\Pager;
use Source\Support\Upload;
/**
* Class Enrolments
* @package Source\App\Admin
*/
class Enrolments extends Admin
{
/**
* Order constructor.
*/
public function __construct($router)
{
parent::__construct();
$this->view->addData("router", $router);
}
/**
* @param array|null $data
*/
public function invoice(?array $data): void
{
$enrolment = (new Enrolment())->findById((int)$data['order_id']);
$percentual = $this->verifyPercentual($enrolment->course_id, $enrolment->id);
if ($percentual >= 100 and $enrolment->document_complete != 1) {
$enrolment->document_complete = 1;
$enrolment->save();
}
if (!$enrolment) {
redirect("admin/error/404");
}
$origin = 'enrolment';
$activity = (new Activity())->find("item_id = :itemid AND origin = :origin", "itemid={$data['order_id']}&origin={$origin}");
$head = $this->seo->render(
CONF_SITE_NAME . " | Pedido",
CONF_SITE_DESC,
url("/admin"),
url("/admin/assets/images/image.jpg"),
false
);
echo $this->view->render("widgets/enrolment/invoice", [
"app" => "enrolment/invoice",
"head" => $head,
"enrolment" => $enrolment,
"activity" => $activity->order("id DESC")->fetch(true),
"documents" => (new CourseDocuments())->find("course_id = :cid", "cid={$enrolment->course_id}")->fetch(true),
"percentual" => $percentual
]);
}
/**
* @param array|null $data
*/
public function documentSent(?array $data): void
{
if (isset($data) and $data["action"] == "create") {
if (!isset($_FILES) or empty($_FILES)) {
$json["message"] = $this->message->info("Selecionar um arquivo")->flash();
$json["reload"] = true;
echo json_encode($json);
return;
}
if (!empty($_FILES["file"])) {
if ($_FILES["file"]["size"] / 1000 > 10500) {
$json["message"] = $this->message->warning("Tamanho máximo permitido 10MB favor enviar um arquivo menor")->flash();
$json["reload"] = true;
echo json_encode($json);
return;
}
$verify = (new Files())->find("enrolment_id = :eid AND document_id = :did", "eid={$data['enrolment_id']}&did={$data['document_id']}");
$doc = $_FILES["file"];
$upload = new Upload();
$title = "arquivo-" . $data["document_id"] . "-" . $data["enrolment_id"];
$send = $upload->file($doc, $title);
if (!$send) {
$json["message"] = $upload->message()->render();
echo json_encode($json);
return;
}
if ($verify->count() != 0) {
$id = $verify->fetch()->id;
$files = (new Files())->findById($id);
if ($files->file && file_exists(__DIR__ . "/../../../" . CONF_UPLOAD_DIR . "/{$files->file}")) {
unlink(__DIR__ . "/../../../" . CONF_UPLOAD_DIR . "/{$files->file}");
}
} else {
$files = new Files();
}
$files->document_id = $data["document_id"];
$files->enrolment_id = $data["enrolment_id"];
$files->file = $send;
if (!$files->save()) {
$json["message"] = $files->message()->render();
echo json_encode($json);
return;
}
}
$json["message"] = $this->message->success("Arquivos Enviado com sucesso")->flash();
$json["reload"] = true;
echo json_encode($json);
return;
}
if (isset($data) and $data["action"] == "delete") {
$files = (new Files())->findById($data["id"]);
if (!$files) {
$json["message"] = $this->message->error("Você tentou deletar um arquivo que não existe")->flash();
$json["reload"] = true;
echo json_encode($json);
return;
}
if ($files->file && file_exists(__DIR__ . "/../../../" . CONF_UPLOAD_DIR . "/{$files->file}")) {
unlink(__DIR__ . "/../../../" . CONF_UPLOAD_DIR . "/{$files->file}");
}
$files->destroy();
$json["message"] = $this->message->success("Arquivo deletado com sucesso")->flash();
$json["reload"] = true;
echo json_encode($json);
return;
}
}
/**
* @param array|null $data
*/
public function newsletter(?array $data): void
{
$newsletter = (new Newsletter())->findById((int)$data['order_id']);
if (!$newsletter) {
redirect("admin/error/404");
}
$origin = 'newsletter';
$activity = (new Activity())->find("item_id = :itemid AND origin = :origin", "itemid={$data['order_id']}&origin={$origin}");
$head = $this->seo->render(
CONF_SITE_NAME . " | Inscrições",
CONF_SITE_DESC,
url("/admin"),
url("/admin/assets/images/image.jpg"),
false
);
echo $this->view->render("widgets/enrolment/newsletter", [
"app" => "enrolment/newsletter",
"head" => $head,
"newsletter" => $newsletter,
"activity" => $activity->fetch(true)
]);
}
public function enrolment(array $data): void
{
//STATUS
if (isset($data) and $data["action"] != null) {
$data = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRIPPED);
$cpf = str_replace([" ", " ", ".", "/", "-"], "", $data["document"]);
if (!is_email($data["email"])) {
$json["message"] = $this->message->warning("Formato de email inválido, digite outro email")->render();
echo json_encode($json);
return;
}
$clientVerify = (new Client())->find("(email = :email OR document = :document) AND (document != '') AND id != :id", "email={$data['email']}&document={$cpf}&id={$data['client_id']}");
if ($clientVerify->count()) {
$json["message"] = $this->message->error("CPF ou email já cadastrado em outro cliente")->render();
echo json_encode($json);
return;
}
if ($data["status"] == 6 or $data["status"] == 5 or $data["status"] == 7 or $data["status"] == 2) {
$client = (new Client())->findById($data["client_id"]);
$client->name = $data["name"];
$client->document = str_replace([" ", " ", ".", "/", "-"], "", $data["document"]);
$client->document2 = $data["document2"];
$client->email = $data["email"];
$client->phone = $data["phone"];
$client->address = $data["address"];
$client->zipcode = $data["zipcode"];
$client->city = $data["city"];
$client->state = $data["state"];
$client->neighborhood = $data["neighborhood"];
$client->complement = $data["complement"];
if (!$client->save()) {
$json["message"] = $client->message()->render();
echo json_encode($json);
return;
}
$enrolment = (new Enrolment())->findById($data["id"]);
$enrolment->status = $data["status"];
$enrolment->document_complete = 1;
if (!$enrolment->save()) {
$json["message"] = $enrolment->message()->render();
echo json_encode($json);
return;
}
$json["message"] = $this->message->success("Cadastro alterado com Sucesso")->flash();
$json["reload"] = true;
echo json_encode($json);
return;
} else {
if (
empty($data["name"]) or
empty($data["document"]) or
empty($data["document2"]) or
empty($data["email"]) or
empty($data["phone"]) or
empty($data["address"]) or
empty($data["city"]) or
empty($data["zipcode"]) or
empty($data["state"])
) {
$json["message"] = $this->message->info("Para alterar o status ou cliente preencha todos dados obrigatórios com **")->render();
echo json_encode($json);
return;
}
if (!is_cpf($data["document"])) {
$json["message"] = $this->message->warning("CPF Inválido, digitar CPF Válido")->render();
echo json_encode($json);
return;
}
$client = (new Client())->findById($data["client_id"]);
$client->name = $data["name"];
$client->document = str_replace([" ", " ", ".", "/", "-"], "", $data["document"]);
$client->document2 = $data["document2"];
$client->email = $data["email"];
$client->phone = $data["phone"];
$client->address = $data["address"];
$client->zipcode = $data["zipcode"];
$client->city = $data["city"];
$client->state = $data["state"];
$client->neighborhood = $data["neighborhood"];
$client->complement = $data["complement"];
if (!$client->save()) {
$json["message"] = $client->message()->render();
echo json_encode($json);
return;
}
$enrolment = (new Enrolment())->findById($data["id"]);
$enrolment->status = $data["status"];
$enrolment->document_complete = $data["document_complete"];
if (!$enrolment->save()) {
$json["message"] = $enrolment->message()->render();
echo json_encode($json);
return;
}
$json["message"] = $this->message->success("Matrícula alterada com Sucesso")->flash();
$json["reload"] = true;
echo json_encode($json);
return;
}
}
}
public function inscription(array $data): void
{
if (isset($data) and $data["action"] != null) {
$data = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRIPPED);
$newsletter = (new Newsletter())->findById($data["id"]);
$newsletter->status = $data["status"];
if (!$newsletter->save()) {
$json["message"] = $newsletter->message()->render();
echo json_encode($json);
return;
}
$json["message"] = $this->message->success("Status alterado com Sucesso")->render();
$json["redirect"] = url("/admin/dash/home");
echo json_encode($json);
return;
}
}
public function activity(array $data): void
{
if (isset($data) and $data["action"] = "enrolment") {
$data = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRIPPED);
$activity = new Activity();
$activity->activity = $data["activity"];
$activity->origin = $data["action"];
$activity->item_id = $data["item_id"];
$activity->user_id = Auth::user()->id;
$activity->user_name = Auth::user()->fullName();
if (!$activity->save()) {
$json["message"] = $activity->message()->render();
echo json_encode($json);
return;
}
$json["message"] = $this->message->success("Atividade incluída com Sucesso")->render();
$json["reload"] = true;
echo json_encode($json);
return;
}
}
/**
* @param array|null $data
*/
public function enrolments(?array $data): void
{
//search redirect
if (!empty($data["s"])) {
$s = str_search($data["s"]);
echo json_encode(["redirect" => url("/admin/enrolments/{$data["t"]}/{$s}")]);
return;
}
if (isset($data["s"]) and $data["s"] == "") {
echo json_encode(["redirect" => url("/admin/enrolments/all/all")]);
return;
}
if (isset($_SESSION["order-date"]) and $_SESSION["order-date"]->starting != "" and $_SESSION["order-date"]->final != "" and $data["type"] == "all") {
$dateQuery = "created_at BETWEEN '{$_SESSION["order-date"]->starting} 00:00:01' AND '{$_SESSION["order-date"]->final} 23:59:59'";
$dateQueryS = "AND e.created_at BETWEEN '{$_SESSION["order-date"]->starting} 00:00:01' AND '{$_SESSION["order-date"]->final} 23:59:59'";
} elseif (isset($_SESSION["order-date"]) and $_SESSION["order-date"]->starting != "" and $_SESSION["order-date"]->final != "") {
$dateQuery = "AND created_at BETWEEN '{$_SESSION["order-date"]->starting} 00:00:01' AND '{$_SESSION["order-date"]->final} 23:59:59'";
$dateQueryS = "AND e.created_at BETWEEN '{$_SESSION["order-date"]->starting} 00:00:01' AND '{$_SESSION["order-date"]->final} 23:59:59'";
} else {
$dateQuery = "";
}
$order = "created_at DESC";
$search = null;
$query = $dateQuery;
$queryS = $dateQueryS;
$title = "Todas Matrículas";
if ($data["type"] == "waiting") {
$query = "(status = 0) {$dateQuery}";
$queryS = "AND (e.status = 0) {$dateQueryS}";
$title = "Aguardando Cadastro";
}
if ($data["type"] == "current") {
$query = "(status = 2) {$dateQuery}";
$queryS = "AND (e.status = 2) {$dateQueryS}";
$title = "Em Atendimento";
}
if ($data["type"] == "no-interest") {
$query = "(status = 7) {$dateQuery}";
$queryS = "AND (e.status = 7) {$dateQueryS}";
$title = "Sem Interesse";
}
if ($data["type"] == "inscript") {
$query = "(status = 5) {$dateQuery}";
$queryS = "AND (e.status = 5) {$dateQueryS}";
$title = "Inscrito, entrar em contato";
}
if ($data["type"] == "confirmed") {
$query = "(status = 1) {$dateQuery}";
$queryS = "AND (e.status = 1) {$dateQueryS}";
$title = "Matrícula Efetuada";
}
if ($data["type"] == "canceled") {
$query = "(status = 6) {$dateQuery}";
$queryS = "AND (e.status = 6) {$dateQueryS}";
$title = "Matrícula Cancelada";
}
$enrolment = (new Enrolment())->find($query);
if (!empty($data["search"]) && str_search($data["search"]) != "all") {
$search = str_search($data["search"]);
$enrolment = (new Enrolment())->fullSelect("SELECT e.*, cl.name, c.title FROM enrolments e
INNER JOIN clients cl
INNER JOIN course c
WHERE e.client_id = cl.id
AND e.course_id = c.id
AND (e.id LIKE '%{$search}%' OR cl.name LIKE '%{$search}%' OR c.title LIKE '%{$search}%') {$queryS} ");
if (!$enrolment->count()) {
$this->message->info("Sua pesquisa não retornou resultados")->flash();
redirect("admin/enrolments/{$data["type"]}/all/1");
}
}
$all = ($search ?? "all");
$pager = new Pager(url("/admin/enrolments/{$data["type"]}/{$all}/"));
$pager->pager($enrolment->count(), 20, (!empty($data["page"]) ? $data["page"] : 1));
$head = $this->seo->render(
CONF_SITE_NAME . " | Matrículas",
CONF_SITE_DESC,
url("/admin"),
url("/admin/assets/images/image.jpg"),
false
);
echo $this->view->render("widgets/enrolment/enrolments", [
"app" => "order/order",
"head" => $head,
"enrolment" => $enrolment->order($order)->limit($pager->limit())->offset($pager->offset())->fetch(true),
"paginator" => $pager->render("pagination justify-content-center"),
"search" => $search,
"title" => $title
]);
}
/**
* @param array|null $data
*/
public function csvEnrolments(?array $data): void
{
$period = "TUDO";
if (isset($_SESSION["order-date"]) and $_SESSION["order-date"]->starting != "" and $_SESSION["order-date"]->final != "" and $data["type"] == "all") {
$dateQuery = "created_at BETWEEN '{$_SESSION["order-date"]->starting} 00:00:01' AND '{$_SESSION["order-date"]->final} 23:59:59'";
$dateQueryS = "AND e.created_at BETWEEN '{$_SESSION["order-date"]->starting} 00:00:01' AND '{$_SESSION["order-date"]->final} 23:59:59'";
$period = date_fmt($_SESSION["order-date"]->starting, "d/m/Y") . " a " . date_fmt($_SESSION["order-date"]->final, "d/m/Y");
} elseif (isset($_SESSION["order-date"]) and $_SESSION["order-date"]->starting != "" and $_SESSION["order-date"]->final != "") {
$dateQuery = "AND created_at BETWEEN '{$_SESSION["order-date"]->starting} 00:00:01' AND '{$_SESSION["order-date"]->final} 23:59:59'";
$dateQueryS = "AND e.created_at BETWEEN '{$_SESSION["order-date"]->starting} 00:00:01' AND '{$_SESSION["order-date"]->final} 23:59:59'";
$period = date_fmt($_SESSION["order-date"]->starting, "d/m/Y") . " a " . date_fmt($_SESSION["order-date"]->final, "d/m/Y");
} else {
$dateQuery = "";
}
$order = "created_at DESC";
$search = null;
$query = $dateQuery;
$queryS = $dateQueryS;
$title = "Todas Matrículas";
if ($data["type"] == "waiting") {
$query = "(status = 0) {$dateQuery}";
$queryS = "AND (e.status = 0) {$dateQueryS}";
$title = "Aguardando Cadastro";
}
if ($data["type"] == "current") {
$query = "(status = 2) {$dateQuery}";
$queryS = "AND (e.status = 2) {$dateQueryS}";
$title = "Em Atendimento";
}
if ($data["type"] == "no-interest") {
$query = "(status = 7) {$dateQuery}";
$queryS = "AND (e.status = 7) {$dateQueryS}";
$title = "Sem Interesse";
}
if ($data["type"] == "inscript") {
$query = "(status = 5) {$dateQuery}";
$queryS = "AND (e.status = 5) {$dateQueryS}";
$title = "Inscrito, entrar em contato";
}
if ($data["type"] == "confirmed") {
$query = "(status = 1) {$dateQuery}";
$queryS = "AND (e.status = 1) {$dateQueryS}";
$title = "Matrícula Efetuada";
}
if ($data["type"] == "canceled") {
$query = "(status = 6) {$dateQuery}";
$queryS = "AND (e.status = 6) {$dateQueryS}";
$title = "Matrícula Cancelada";
}
$enrolment = (new Enrolment())->find($query);
if (!empty($data["search"]) && str_search($data["search"]) != "all") {
$search = str_search($data["search"]);
$enrolment = (new Enrolment())->fullSelect("SELECT e.*, cl.name, c.title FROM enrolments e
INNER JOIN clients cl
INNER JOIN course c
WHERE e.client_id = cl.id
AND e.course_id = c.id
AND (e.id LIKE '%{$search}%' OR cl.name LIKE '%{$search}%' OR c.title LIKE '%{$search}%') {$queryS} ");
}
if ($enrolment->count() < 1) {
$json["message"] = $this->message->warning("Não existe itens para relatório")->render();
echo json_encode($json);
return;
} else {
$name = "relatorio-matriculas";
$fp = fopen($name . '.csv', 'w');
fputcsv($fp, array(
"Período: {$period}",
"Busca: {$search}",
"Tipo: {$title}",
"",
"",
"",
));
fputcsv($fp, array());
fputcsv($fp, array(
'N. inscrição',
'Data',
'Email',
'Cliente',
'Curso',
'Status',
));
foreach ($enrolment->fetch(true) as $enrolment) {
fputcsv($fp, array(
$enrolment->id,
$enrolment->created_at,
$enrolment->client()->email,
$enrolment->client()->name,
$enrolment->course()->title,
$this->enrolmentStatus($enrolment->status),
));
}
fclose($fp);
$this->message->success("Relatório gerado com sucesso")->flash();
echo json_encode(["redirect" => url($name . ".csv")]);
return;
}
}
public function enrolmentStatus(int $status) : ?string
{
switch ($status) :
case 0:
$res = "Pré-Matriculado";
break;
case 1:
$res = "Matriculado";
break;
case 2:
$res = "Em Atendimento";
break;
case 5:
$res = "Inscrito";
break;
case 6:
$res = "Cancelado";
break;
case 7:
$res = "Sem Interesse";
break;
default:
$res = "indefinido";
endswitch;
return $res;
}
/**
* @param array|null $data
*/
public function inscriptions(?array $data): void
{
//search redirect
if (!empty($data["s"])) {
$s = str_search($data["s"]);
echo json_encode(["redirect" => url("/admin/inscriptions/all/{$s}")]);
return;
}
if (isset($data["s"]) and $data["s"] == "") {
echo json_encode(["redirect" => url("/admin/inscriptions/all/all")]);
return;
}
if (isset($_SESSION["order-date"]) and $_SESSION["order-date"]->starting != "" and $_SESSION["order-date"]->final != "") {
$dateQuery = "AND created_at BETWEEN '{$_SESSION["order-date"]->starting} 00:00:01' AND '{$_SESSION["order-date"]->final} 23:59:59'";
$dateQueryS = "AND created_at BETWEEN '{$_SESSION["order-date"]->starting} 00:00:01' AND '{$_SESSION["order-date"]->final} 23:59:59'";
} else {
$dateQuery = "";
}
$order = "created_at DESC";
$search = null;
$query = $dateQuery;
$title = "Todas Inscrições";
if ($data["type"] == "all") {
$query = "(landing != '') {$dateQuery}";
$title = "Aguardando Atendimento";
}
if ($data["type"] == "waiting") {
$query = "(status = 0 AND landing != '') {$dateQuery}";
$title = "Aguardando Atendimento";
}
if ($data["type"] == "confirmed") {
$query = "(status = 1 AND landing != '') {$dateQuery}";
$title = "Atendimento Finalizado";
}
if ($data["type"] == "current") {
$query = "(status = 2 AND landing != '') {$dateQuery}";
$title = "Em Atendimento";
}
$newsletter = (new Newsletter())->find($query);
if (!empty($data["search"]) && str_search($data["search"]) != "all") {
$search = str_search($data["search"]);
$newsletter = (new Newsletter())->find("landing != '' AND (name LIKE '%{$search}%' OR email LIKE '%{$search}%') {$dateQueryS}");
if (!$newsletter->count()) {
$this->message->info("Sua pesquisa não retornou resultados")->flash();
redirect("admin/inscriptions/{$data["type"]}/all/1");
}
}
$all = ($search ?? "all");
$pager = new Pager(url("/admin/inscriptions/{$data["type"]}/{$all}/"));
$pager->pager($newsletter->count(), 20, (!empty($data["page"]) ? $data["page"] : 1));
$head = $this->seo->render(
CONF_SITE_NAME . " | Inscrições",
CONF_SITE_DESC,
url("/admin"),
url("/admin/assets/images/image.jpg"),
false
);
echo $this->view->render("widgets/enrolment/inscriptions", [
"app" => "inscriptions/inscriptions",
"head" => $head,
"newsletter" => $newsletter->order($order)->limit($pager->limit())->offset($pager->offset())->fetch(true),
"paginator" => $pager->render("pagination justify-content-center"),
"search" => $search,
"title" => $title
]);
}
public function verifyPercentual(int $courseId, int $enrolmentId)
{
$countDocuments = (new CourseDocuments())->find("course_id = {$courseId}");
$countFiles = (new Files())->find("enrolment_id = {$enrolmentId}");
if ($countDocuments->count() == 0 and $countDocuments->count() == 0) {
return 0;
} else {
$percentual = ($countFiles->count() / $countDocuments->count()) * 100;
return $percentual;
}
}
public function relatory(array $data): void
{
if ($data["startingDate"] != "" and validateDate($data["startingDate"], "d/m/Y") != true) {
unset($_SESSION["order-date"]);
$json["message"] = $this->message->error("Data Inicial Inválida")->flash();
$json["reload"] = true;
echo json_encode($json);
return;
}
if ($data["finalDate"] != "" and validateDate($data["finalDate"], "d/m/Y") != true) {
unset($_SESSION["order-date"]);
$json["message"] = $this->message->error("Data Final Inválida")->flash();
$json["reload"] = true;
echo json_encode($json);
return;
}
if ($data["startingDate"] == "" or $data["finalDate"] == "") {
unset($_SESSION["order-date"]);
$json["reload"] = true;
echo json_encode($json);
return;
}
if (isset($data) and $data["startingDate"] != "" and $data["finalDate"] != "") {
$session = new Session();
$session->set("order-date",
[
"starting" => date_fmt_back($data["startingDate"]),
"final" => date_fmt_back($data["finalDate"])
]);
$json["reload"] = true;
echo json_encode($json);
return;
}
}
}