• File: SubAccountExport.php
  • Full Path: /var/www/imaliapitest/app/Exports/SubAccountExport.php
  • Date Modified: 05/19/2025 4:29 PM
  • File size: 6.67 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

namespace App\Exports;

use App\Bank\Payment;
use Barryvdh\DomPDF\Facade\Pdf as FacadePdf;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithHeadings;
use PDF;

class SubAccountExport implements FromQuery, WithHeadings
{
    /**
     * @return \Illuminate\Support\Collection
     */
    use Exportable;

    protected $subAccounNumber;
    protected $startDate;
    protected $endDate;

    public function __construct($subAccounNumber, $startDate = null, $endDate = null)
    {
        $this->subAccounNumber = $subAccounNumber;
        $this->startDate = $startDate;
        $this->endDate = $endDate;
    }

    public function query()
    {
        // $query = Payment::query()
        //     ->join('imali_sub_accounts', 'imali_sub_accounts.card_number', 'payments.sender_card_number')
        //     ->join('users', 'users.id', 'payments.sender_id')
        //     ->join('stores', 'stores.id', 'payments.store_id')
        //     ->select(
        //         'users.name as user',
        //         'users.last_name as last_name',
        //         'imali_sub_accounts.main_account_number as main_account_number',
        //         'stores.name as store_name',
        //         'imali_sub_accounts.name as name',
        //         'imali_sub_accounts.account_number as account_number',
        //         'imali_sub_accounts.card_number as card_number',
        //         'transaction_id as TransactionID',
        //         DB::raw("DATE_FORMAT(payments.created_at, '%d-%m-%y %H:%i:%s') as Date"),
        //         DB::raw("IFNULL(sender_card_number, 'No associated card') as SubAccountNumber"),
        //         'sender_account_number as CardNumber',
        //         'transaction_name as TransactionType',
        //         'amount as Amount',
        //         DB::raw("CASE 
        //         WHEN transaction_name IN ('Deposito', 'Depósito') THEN new_balance 
        //         ELSE old_balance 
        //      END as OldBalance"),
        //         DB::raw("CASE 
        //         WHEN transaction_name IN ('Deposito', 'Depósito') THEN old_balance 
        //         ELSE new_balance 
        //      END as NewBalance"),
        //         'payments.status as Status'
        //     )
        //     ->where('sender_card_number', $this->subAccounNumber)
        //     ->orWhere('sender_account_number', $this->subAccounNumber);

        $query = Payment::query()
            ->join('imali_sub_accounts', 'imali_sub_accounts.card_number', 'payments.sender_card_number')
            ->join('users', 'users.id', 'payments.sender_id')
            ->join('stores', 'stores.id', 'payments.store_id')
            ->select(
                'users.name as user',
                'users.last_name as last_name',
                'imali_sub_accounts.main_account_number as main_account_number',
                'stores.name as store_name',
                'imali_sub_accounts.name as name',
                'imali_sub_accounts.account_number as account_number',
                'imali_sub_accounts.card_number as card_number',
                'transaction_id as TransactionID',
                DB::raw("DATE_FORMAT(payments.created_at, '%d-%m-%y %H:%i:%s') as Date"),
                DB::raw("IFNULL(sender_card_number, 'No associated card') as SubAccountNumber"),
                'sender_account_number as CardNumber',
                'transaction_name as TransactionType',
                'amount as Amount',
                DB::raw("CASE 
                WHEN transaction_name IN ('Deposito', 'Depósito') THEN imali_sub_accounts.balance - payments.amount
                ELSE old_balance 
             END as OldBalance"),
                DB::raw("CASE 
                WHEN transaction_name IN ('Deposito', 'Depósito') THEN imali_sub_accounts.balance 
                ELSE new_balance 
             END as NewBalance"),
                'payments.status as Status'
            )
            ->where('sender_card_number', $this->subAccounNumber)
            ->orWhere('sender_account_number', $this->subAccounNumber);

        // Intervalo de datas
        if ($this->startDate) {
            $query->where('payments.created_at', '>=', $this->startDate);
        }

        if ($this->endDate) {
            $query->where('payments.created_at', '<=', $this->endDate);
        }

        $query->orderBy('payments.created_at', 'desc');

        // return $query;
        return $query->get(); // Obter resultados da query
    }

    // Gerar ficjeito e deixar numa pasta reports e o Miguel vai acessar o ficheito ppor link
    public function exportPDFOLD()
    {
        $payments = $this->query(); // Obter dados da query

        // return response()->json([
        //     'status' => 'success',
        //     'status' => $payments
        // ]);

        // Gerar o PDF usando o template Blade
        $pdf = FacadePdf::loadView('pdf.subaccount-extract', ['payments' => $payments]);

        // Retornar o PDF para download
        return $pdf->download('subaccount-extract.pdf');
    }

    private function getYesterDayDate()
    {
        // return date('Y-m-d', strtotime(date('Y-m-d')) - 24 * 1200);
        return date('Y-m-d', strtotime(date('Y-m-d')));
    }

    public function exportPDF()
    {
        // return date('Hms');
        $payments = $this->query(); // Obter dados da query
        // return $payments;

        // Gerar o PDF
        $pdf = FacadePdf::loadView('pdf.subaccount-extract', ['payments' => $payments]);

        // Nome do arquivo
        $fileName = 'subaccount-extract-' . $this->subAccounNumber . '-' . $this->getYesterDayDate() . '-' . date('Hms') . '.pdf';

        // Caminho absoluto para pasta public/reports
        $folder = public_path('reports');

        // Criar pasta se não existir
        if (!file_exists($folder)) {
            mkdir($folder, 0755, true);
        }

        // Caminho completo do arquivo
        $filePath = "{$folder}/{$fileName}";

        // Salvar PDF
        $pdf->save($filePath);

        // if (file_exists($filePath)) {
        //     sleep(15);
        //     unlink($filePath);
        // }

        // URL pública (relativa ao domínio)
        $url = url("reports/{$fileName}");

        return response()->json([
            'status' => 'success',
            'message' => 'Extracto de subconta gerado com sucesso.',
            'url' => $url
        ]);
    }

    public function headings(): array
    {
        return [
            'TransactionID',
            'Date',
            'SubAccount Number',
            'Card Number',
            'Transaction Type',
            'Amount',
            'Old Balance',
            'New Balance',
            'Transaction Status'
        ];
    }
}