Your IP : 216.73.217.77


Current Path : /home/users/unlimited/www/whatsapp-crm/app/Exports/
Upload File :
Current File : /home/users/unlimited/www/whatsapp-crm/app/Exports/ContactsExport.php

<?php

namespace App\Exports;

use App\Models\Contact;
use App\Models\ContactField;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;

class ContactsExport implements FromCollection, WithHeadings
{
    /**
    * @return \Illuminate\Support\Collection
    */
    public function collection()
    {
        $contacts = Contact::with('contactGroup')
            ->where('organization_id', session()->get('current_organization'))
            ->whereNull('deleted_at')
            ->get();

        // Get dynamic fields from the contact_fields table
        $dynamicFields = ContactField::where('organization_id', session()->get('current_organization'))
            ->whereNull('deleted_at')
            ->get();

        // Extract field names from the dynamic fields
        $fieldNames = $dynamicFields->pluck('name')->toArray();

        // Modify the collection to include formatted phone numbers and group names
        return $contacts->map(function ($contact) use ($fieldNames) {
            $address = json_decode($contact->address, true);
            $row = [
                'first_name' => $contact->first_name,
                'last_name' => $contact->last_name,
                'phone' => $contact->formatted_phone_number, // Assuming formatted_phone_number is defined
                'email' => $contact->email,
                'group_name' => $contact->contactGroup ? $contact->contactGroup->name : null,
                'street' => $address['street'] ?? null,
                'city' => $address['city'] ?? null,
                'state' => $address['state'] ?? null,
                'zip' => $address['zip'] ?? null,
                'country' => $address['country'] ?? null,
            ];

            foreach ($fieldNames as $fieldName) {
                $metadata = json_decode($contact->metadata, true);

                if (isset($metadata[$fieldName])) {
                    $row[$fieldName] = $metadata[$fieldName];
                } else {
                    $row[$fieldName] = null;
                }
            }

            return $row;
        });
    }

    public function headings(): array
    {
        $dynamicFields = ContactField::where('organization_id', session()->get('current_organization'))
            ->whereNull('deleted_at')
            ->get();

        $fieldNames = $dynamicFields->pluck('name')->toArray();

        // Define your headers here
        $headers = [
            'First name',
            'Last name',
            'Phone',
            'Email',
            'Group name',
            'Street',
            'City',
            'State',
            'Zip',
            'Country'
        ];

        // Add dynamic field names to headers
        foreach ($fieldNames as $fieldName) {
            $headers[] = $fieldName;
        }

        return $headers;
    }
}