File: //home/artinside/public_html/finance/source/App/Admin/Order.php
<?php
namespace Source\App\Admin;
use Source\Core\View;
use Source\Models\Ecommerce\OrderItens;
use Source\Support\Email;
use Source\Models\Ecommerce\Orders;
use Source\Support\Pager;
/**
* Class Orders
* @package Source\App\Admin
*/
class Order extends Admin
{
/**
* Order constructor.
*/
public function __construct($router)
{
parent::__construct();
$this->view->addData("router", $router);
}
/**
* @param array|null $data
*/
public function home(): void
{
//search redirect
if (!empty($data["s"])) {
$s = str_search($data["s"]);
echo json_encode(["redirect" => url("/order/home/{$s}/1")]);
return;
}
$order = "id DESC";
$search = null;
$title = "Todas Ordens";
if (!empty($data["search"]) && str_search($data["search"]) != "all") {
$search = str_search($data["search"]);
$orders = (new Orders())->find("MATCH(title, subtitle) AGAINST(:s)", "s={$search}");
if (!$orders->count()) {
$this->message->info("Sua pesquisa não retornou resultados")->flash();
redirect("/order/home/all/1");
}
}
$orders = (new Orders())->find();
$all = ($search ?? "all");
$pager = new Pager(url("/admin/order/home/{$all}/"));
$pager->pager($orders->count(), 20, (!empty($data["page"]) ? $data["page"] : 1));
$head = $this->seo->render(
CONF_SITE_NAME . " | Orders",
CONF_SITE_DESC,
url("/admin"),
url("/admin/assets/images/image.jpg"),
false
);
echo $this->view->render("widgets/order/home", [
"app" => "order/order",
"head" => $head,
"orders" => $orders->order($order)->limit($pager->limit())->offset($pager->offset())->fetch(true),
"paginator" => $pager->render(),
"search" => $search,
"title" => $title
]);
}
/**
* @param array|null $data
*/
public function order(?array $data): void
{
if (!empty($data["action"]) && $data["action"] == "create") {
$data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
if ($data["title"] == "" OR $data["starting_date"] == "" OR $data["percentual"] == "" ) {
$json["message"] = $this->message->info("Campos com * São de Preenchimento obrigatório")->render();
echo json_encode($json);
return;
}
$create = new Orders();
$create->title = $data["title"];
$create->percentual = number_format($data["percentual"], 2, ".", ",");
$create->starting_date = date_fmt_back($data["starting_date"]);
$create->observations = $data["observations"];
if (!$create->save()) {
$json["message"] = $create->message()->render();
echo json_encode($json);
return;
}
$this->message->success("Ordem publicada com sucesso...")->flash();
$json["redirect"] = url("/admin/order/order/{$create->id}");
echo json_encode($json);
return;
}
if (!empty($data["action"]) && $data["action"] == "update") {
$data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
if ($data["title"] == "" OR $data["starting_date"] == "" OR $data["percentual"] == "" ) {
$json["message"] = $this->message->info("Campos com * São de Preenchimento obrigatório")->render();
echo json_encode($json);
return;
}
$edit = (new Orders())->findById($data["id"]);
$edit->title = $data["title"];
$edit->percentual = number_format($data["percentual"], 2, ".", ",");
$edit->starting_date = date_fmt_back($data["starting_date"]);
$edit->observations = $data["observations"];
if (!$edit->save()) {
$json["message"] = $edit->message()->render();
echo json_encode($json);
return;
}
$orderItems = (new OrderItens())->find("order_id = {$data["id"]}");
if($orderItems){
foreach ($orderItems->fetch(true) as $item){
$initialDate = date_fmt(date_fmt_back($data["starting_date"]), "Y-m-d");
$itemDate = $item->date_chq;
$date1 = new \DateTime($initialDate);
$date2 = new \DateTime($itemDate);
if($date2->format("w") == 0){
$extraDays = 1;
}elseif ($date2->format("w") == 6){
$extraDays = 2;
}else{
$extraDays = 0;
}
$interval = $date1->diff($date2);
$days = $interval->days + $extraDays;
$percentualDay = number_format(($data["percentual"]/30), 6, ".","");
$itemValue = number_format($item->item_value, 6, ".","");
$realPercentual = $percentualDay * $days;
$fee = ($itemValue * $realPercentual) / 100;
$realValue = number_format($itemValue - $fee, 2, ".", "");
$item->date_chq = $itemDate;
$item->real_value = $realValue;
$item->days = $days;
$item->percentual = $realPercentual;
$item->extra_days = $extraDays;
if (!$item->save()) {
$json["message"] = $orderItem->message()->render();
echo json_encode($json);
}
}
}
$this->message->success("Ordem editada com sucesso...")->flash();
$json["redirect"] = url("/admin/order/order/{$edit->id}");
echo json_encode($json);
return;
}
if (!empty($data["action"]) && $data["action"] == "delete") {
$data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
$delete = (new OrderItens())->findById($data["id"]);
if (!$delete) {
$this->message->error("Você tentou excluir um item que não existe ou já foi removido")->flash();
echo json_encode(["reload" => true]);
return;
}
$delete->destroy();
$this->message->success("O cheque foi excluído com sucesso...")->flash();
echo json_encode(["reload" => true]);
return;
}
if (!empty($data["action"]) && $data["action"] == "delete-order") {
$data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
$delete = (new Orders())->findById($data["id"]);
if (!$delete) {
$this->message->error("Você tentou excluir um item que não existe ou já foi removido")->flash();
echo json_encode(["reload" => true]);
return;
}
$deleteItens = (new OrderItens())->find("order_id = :id", "id={$data['id']}");
if($deleteItens->count() > 0){
foreach ($deleteItens->fetch(true) as $del){
$del->destroy();
}
}
$delete->destroy();
$this->message->success("A orodem foi excluída com sucesso...")->flash();
echo json_encode(["reload" => true]);
return;
}
$orderItems="";
$edit = null;
if (!empty($data["id"])) {
$orderId = filter_var($data["id"], FILTER_VALIDATE_INT);
$edit = (new Orders())->findById($orderId);
$orderItems = (new OrderItens())->find("order_id = {$data["id"]}")->fetch(true);
}
$head = $this->seo->render(
CONF_SITE_NAME . " | Ordens",
CONF_SITE_DESC,
url("/admin"),
url("/admin/assets/images/image.jpg"),
false
);
echo $this->view->render("widgets/order/order", [
"app" => "order/order",
"head" => $head,
"order" => $edit,
"orderItems" => $orderItems
]);
}
/**
* @param array|null $data
*/
public function chq(?array $data): void
{
if (!empty($data["action"]) && $data["action"] == "create") {
$data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
if ($data["starting_date"] == "" OR $data["percentual"] == "" OR $data["item_date"] == "" OR $data["item_value"] == "") {
$json["message"] = $this->message->info("Não são permitidos campos em branco")->render();
echo json_encode($json);
return;
}
$orderItem = new OrderItens();
$initialDate = date_fmt(date_fmt_back($data["starting_date"]), "Y-m-d");
$itemDate = date_fmt_back($data["item_date"]);
$date1 = new \DateTime($initialDate);
$date2 = new \DateTime($itemDate);
if(strtotime($initialDate) >= strtotime($itemDate)){
$json["message"] = $this->message->warning("A data do cheque é menor ou igual que a data inicial")->render();
echo json_encode($json);
return;
}
if($date2->format("w") == 0){
$extraDays = 1;
}elseif ($date2->format("w") == 6){
$extraDays = 2;
}else{
$extraDays = 0;
}
$interval = $date1->diff($date2);
$days = $interval->days + $extraDays;
$percentualDay = number_format(($data["percentual"]/30), 6, ".","");
$itemValue = number_format($data["item_value"], 6, ".","");
$realPercentual = $percentualDay * $days;
$fee = ($itemValue * $realPercentual) / 100;
$realValue = number_format($itemValue - $fee, 2, ".", "");
$orderItem->order_id = $data["order_id"];
$orderItem->date_chq = $itemDate;
$orderItem->item_value = $itemValue;
$orderItem->real_value = $realValue;
$orderItem->days = $days;
$orderItem->percentual = $realPercentual;
$orderItem->extra_days = $extraDays;
if (!$orderItem->save()) {
$json["message"] = $orderItem->message()->render();
echo json_encode($json);
return;
}
$orderItems = (new OrderItens())->find("order_id = {$orderItem->order_id}")->fetch(true);
$json["fragment"] = true;
$json["local"] = "#fragment-table";
$json["html"] = $this->view->render("views/fragments/table-itens",["orderItems" =>$orderItems] );
echo json_encode($json);
return;
}
}
/**
* @param array|null $data
*/
public function invoice(?array $data): void
{
$order = (new Orders())->findById((int)$data['order_id']);
if (!$order) {
redirect("admin/error/404");
}
$orderItems = (new OrderItens())->find("order_id = :id", "id={$order->id}");
if (!$orderItems) {
redirect("admin/error/404");
}
$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/order/invoice", [
"app" => "order/order",
"head" => $head,
"order" => $order,
"orderItems" => $orderItems->fetch(true)
]);
}
public function shipping(array $data):void
{
if(isset($data) AND $data["action"] != null){
$data = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRIPPED);
$Orders = (new \Source\Models\Ecommerce\Orders())->findById($data["id"]);
$Orders->shipment_code = $data["shipment_code"] ? $data["shipment_code"] : "N/A";
if($Orders->save()){
$view = new View(__DIR__ . "/../../../shared/views/email");
$message = $view->render("shipped", [
"title" => CONF_SITE_NAME . " | Pedido Enviado",
"user" => $Orders->user()->fullName(),
"code" => $data["shipment_code"] ? $data["shipment_code"] : "N/A",
"orderId" => $data["id"]
]);
(new Email())->bootstrap(
CONF_SITE_NAME . " | Pedido Enviado",
$message,
$Orders->user()->data()->email, $Orders->user()->fullName()
)->send();
$json["message"] = $this->message->success("Pedido Atualizado com sucesso!")->flash();
$json["reload"] = true;
echo json_encode($json);
return;
}
$json["message"] = $this->message->error("Não foi possível atualizar, contate o suporte")->render();
echo json_encode($json);
return;
}
$json["message"] = $this->message->error("Não foi possível atualizar, contate o suporte")->render();
echo json_encode($json);
return;
}
}