MOON
Server: Apache
System: Linux server1.studioinfinity.com.br 2.6.32-954.3.5.lve1.4.90.el6.x86_64 #1 SMP Tue Feb 21 12:26:30 UTC 2023 x86_64
User: artinside (517)
PHP: 7.4.33
Disabled: exec,passthru,shell_exec,system
Upload Files
File: /home/artinside/www/raquel/source/App/CafeApi/Invoices.php
<?php

namespace Source\App\CafeApi;

use Source\Models\CafeApp\AppCategory;
use Source\Models\CafeApp\AppInvoice;
use Source\Models\CafeApp\AppWallet;
use Source\Support\Pager;

/**
 * Class Invoices
 * @package Source\App\CafeApi
 */
class Invoices extends CafeApi
{
    /**
     * Invoices constructor.
     * @throws \Exception
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * list all invoices
     */
    public function index(): void
    {
        $where = "";
        $params = "";
        $values = $this->headers;

        //by wallet
        if (!empty($values["wallet_id"]) && $wallet_id = filter_var($values["wallet_id"], FILTER_VALIDATE_INT)) {
            $where .= " AND wallet_id = :wallet_id";
            $params .= "&wallet_id={$wallet_id}";
        }

        //by type
        $typeList = ["income", "expense", "fixed_income", "fixed_expense"];
        if (!empty($values["type"]) && in_array($values["type"], $typeList) && $type = $values["type"]) {
            $where .= " AND type = :type";
            $params .= "&type={$type}";
        }

        //by status
        $statusList = ["paid", "unpaid"];
        if (!empty($values["status"]) && in_array($values["status"], $statusList) && $status = $values["status"]) {
            $where .= " AND status = :status";
            $params .= "&status={$status}";
        }

        //get invoices
        $invoices = (new AppInvoice())->find("user_id = :user_id{$where}",
            "user_id={$this->user->id}{$params}");

        if (!$invoices->count()) {
            $this->call(
                404,
                "not_found",
                "Nada encontrado para sua pesquisa. Tente outros termos"
            )->back(["results" => 0]);
            return;
        }

        $page = (!empty($values["page"]) ? $values["page"] : 1);
        $pager = new Pager(url("/invoices/"));
        $pager->pager($invoices->count(), 10, $page);

        $response["results"] = $invoices->count();
        $response["page"] = $pager->page();
        $response["pages"] = $pager->pages();

        foreach ($invoices->limit($pager->limit())->offset($pager->offset())->order("due_at ASC")->fetch(true) as $invoice) {
            $response["invoices"][] = $invoice->data();
        }

        $this->back($response);
        return;
    }

    /**
     * @param array $data
     * @throws \Exception
     */
    public function create(array $data): void
    {
        $request = $this->requestLimit("invoicesCreate", 5, 60);
        if (!$request) {
            return;
        }

        $invoice = new AppInvoice();

        if (!$invoice->launch($this->user, $data)) {
            $this->call(
                400,
                "invalid_data",
                $invoice->message()->getText()
            )->back();
            return;
        }

        $invoice->fixed($this->user, 3);
        $this->back(["invoice" => $invoice->data()]);
    }

    /**
     * @param array $data
     */
    public function read(array $data): void
    {
        if (empty($data["invoice_id"]) || !$invoice_id = filter_var($data["invoice_id"], FILTER_VALIDATE_INT)) {
            $this->call(
                400,
                "invalid_data",
                "É preciso informar o ID da fatura que deseja consultar"
            )->back();
            return;
        }

        $invoice = (new AppInvoice())->find("user_id = :user_id AND id = :id",
            "user_id={$this->user->id}&id={$invoice_id}")->fetch();

        if (!$invoice) {
            $this->call(
                404,
                "not_found",
                "Você tentou acessar uma fatura que não existe"
            )->back();
            return;
        }

        $response["invoice"] = $invoice->data();
        $response["invoice"]->wallet = (new AppWallet())->findById($invoice->wallet_id)->data();
        $response["invoice"]->category = (new AppCategory())->findById($invoice->category_id)->data();

        $this->back($response);
    }

    /**
     * @param array $data
     */
    public function update(array $data): void
    {
        $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
        if (empty($data["invoice_id"]) || !$invoice_id = filter_var($data["invoice_id"], FILTER_VALIDATE_INT)) {
            $this->call(
                400,
                "invalid_data",
                "Informe id ID do lançamento que deseja atualizar"
            )->back();
            return;
        }

        $invoice = (new AppInvoice())->find("user_id = :user_id AND id = :id",
            "user_id={$this->user->id}&id={$invoice_id}")->fetch();

        if (!$invoice) {
            $this->call(
                404,
                "not_found",
                "Você tentou atualizar um lançamento que não existe"
            )->back();
            return;
        }

        if (!empty($data["wallet_id"]) && $wallet_id = filter_var($data["wallet_id"], FILTER_VALIDATE_INT)) {
            $wallet = (new AppWallet())->find("user_id = :user_id AND id = :id",
                "user_id={$this->user->id}&id={$wallet_id}")->fetch();

            if (!$wallet) {
                $this->call(
                    400,
                    "invalid_data",
                    "Você informou uma carteira que não existe"
                )->back();
                return;
            }
        }

        if (!empty($data["category_id"]) && $category_id = filter_var($data["category_id"], FILTER_VALIDATE_INT)) {
            $category = (new AppCategory())->findById($category_id);

            if (!$category) {
                $this->call(
                    400,
                    "invalid_data",
                    "Você informou uma categoria que não existe"
                )->back();
                return;
            }
        }

        if (!empty($data["due_day"])) {
            if ($data["due_day"] < 1 || $data["due_day"] > 28) {
                $this->call(
                    400,
                    "invalid_data",
                    "O dia de vencimento deve estar entre 1 e 28"
                )->back();
                return;
            }

            $due_at = date("Y-m", strtotime($invoice->due_at)) . "-" . $data["due_day"];
        }

        $statusList = ["paid", "unpaid"];
        if (!empty($data["status"]) && !in_array($data["status"], $statusList)) {
            $this->call(
                400,
                "invalid_data",
                "O status do lançamento deve ser pago ou não pago"
            )->back();
            return;
        }

        $invoice->wallet_id = (!empty($data["wallet_id"]) ? $data["wallet_id"] : $invoice->wallet_id);
        $invoice->category_id = (!empty($data["category_id"]) ? $data["category_id"] : $invoice->category_id);
        $invoice->description = (!empty($data["description"]) ? $data["description"] : $invoice->description);
        $invoice->value = (!empty($data["value"]) ? $data["value"] : $invoice->value);
        $invoice->due_at = (!empty($due_at) ? date("Y-m-d", strtotime($due_at)) : $invoice->due_at);
        $invoice->status = (!empty($data["status"]) ? $data["status"] : $invoice->status);

        if (!$invoice->save()) {
            $this->call(
                400,
                "invalid_data",
                $invoice->message()->getText()
            )->back();
            return;
        }

        $this->back(["invoice" => $invoice->data()]);
    }

    /**
     * @param array $data
     */
    public function delete(array $data): void
    {
        if (empty($data["invoice_id"]) || !$invoice_id = filter_var($data["invoice_id"], FILTER_VALIDATE_INT)) {
            $this->call(
                400,
                "invalid_data",
                "Informe o ID do lançamento que deseja deletar"
            )->back();
            return;
        }

        $invoice = (new AppInvoice())->find("user_id = :user_id AND id = :id",
            "user_id={$this->user->id}&id={$invoice_id}")->fetch();

        if (!$invoice) {
            $this->call(
                404,
                "not_found",
                "Você tentou excluir um lançamento que não existe"
            )->back();
            return;
        }

        $invoice->destroy();
        $this->call(
            200,
            "success",
            "O lançamento foi eccluído com sucesso",
            "accpeted"
        )->back();
    }
}