HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/hours.komma.pro/app/Komma/Settings/ExcelImport/ExcelImportController.php
<?php

namespace App\Komma\Settings\ExcelImport;

use App\Http\Controllers\Controller;
use App\Komma\Users\User;
use Carbon\Carbon;
use App\Komma\Companies\Company;
use App\Komma\Contacts\Contact;
use App\Komma\Expenses\Expense;
use App\Komma\Hours\Hour;
use App\Komma\Projects\Project;
use App\Komma\ProjectWorkers\ProjectWorker;
use App\Komma\Settings\ExpenseTypes\ExpenseType;
use App\Komma\Settings\ExpenseUnits\ExpenseUnit;
use App\Komma\Settings\ProjectTemplates\ProjectTemplate;
use App\Komma\Settings\Subprojecttemplates\SubprojectTemplate;
use App\Komma\Settings\TaskTemplates\TaskTemplate;
use App\Komma\Subprojects\Subproject;
use App\Komma\Tasks\Task;
use Illuminate\Http\Request;
use App\Komma\Messages\MessageController;
use Illuminate\Support\Facades\Auth;

class ExcelImportController extends Controller
{
    private $messageController;

    public function __construct(MessageController $messageController)
    {
        $this->middleware('auth');
//        $this->middleware('permission:view_settings');
        $this->messageController = $messageController;
    }


    /**
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function index()
    {
        return view('settings.excelImport.index');
    }


    public function importFileIntoDB(Request $request)
    {
        $succes = false;
        if ($request->hasFile('sample_file')) {
            $path = $request->file('sample_file')->getRealPath();
            $data = \Excel::load($path)->get();
            $results = [];
            if ($data->count()) {
                foreach ($data as $key => $value) {
//                $arr[] = [
//                    'klant' => $value->klant,
//                    'project' => $value->project,
//                    'deelproject' => $value->deelproject,
//                    'taakonkosten' => $value->taakonkosten,
//                    'uurprijs_taak' => $value->uurprijs_taak,
//                    'datum' => $value->datum,
//                    'aantal' => $value->aantal,
//                    'eenheid' => $value->eenheid,
//                    'omschrijving' => $value->omschrijving,
//                    'gebruiker' => $value->gebruiker,
//                    'facturabel' => $value->facturabel,
//                    'gefactureerd' => $value->gefactureerd
//                    ];
                    $importUser = User::where('name', $value->gebruiker)->first();
                    if (empty($value->project)) {
                        $results[] = 'Project is empty, skipping ... ';
                        continue;
                    }
                    if (empty($importUser)) {
                        $results[] = 'User "' . $value->gebruiker . '" could not be found, skipping this hour record (' . $value->aantal . ' hours on ' . $value->datum . ' for project "' . $value->project . '" and subproject "' . $value->deelproject . '")';
                    } else {
                        $userID = $importUser->id;

                        if (!empty($value->klant)) {
                            $importCompany = Company::where('name', $value->klant)->first();
                            $companyID = !empty($importCompany) ? $importCompany->id : $this->createNewCompany($value->klant);
                        } else {
                            $importCompany = Company::where('name', 'Import')->first();
                            $companyID = !empty($importCompany) ? $importCompany->id : $this->createNewCompany('Import');
                        }


                        $importProject = Project::where('name', $value->project)->first();
                        if (empty($importProject)) $results[] = "Creating project " . $value->project;
                        $projectID = !empty($importProject) ? $importProject->id : $this->createNewProject($value->project, $companyID);

                        $importSubProject = Subproject::where('project_id', $projectID)->where('name', $value->deelproject)->first();
                        if (empty($importSubProject)) $results[] = "Creating subproject " . $value->deelproject;
                        $subprojectID = !empty($importSubProject) ? $importSubProject->id : $this->createNewSubproject($value->deelproject, $projectID);

                        $importDate = Carbon::parse($value->datum)->toDateString();

                        if ($value->eenheid == 'uur') {


                            $importTaskTemplate = TaskTemplate::where('name', $value->taakonkosten)->first();
                            if (empty($importTaskTemplate)) $results[] = "Creating task template " . $value->taakonkosten;
                            $taskTemplateID = !empty($importTaskTemplate) ? $importTaskTemplate->id : $this->createNewTaskTemplate($value->taakonkosten, $value->uurprijs_taak, $value->facturabel == "Ja" ? 1 : 0);

                            $importTask = Task::where('subproject_id', $subprojectID)->where('task_template_id', $taskTemplateID)->first();
                            if (empty($importTask)) $results[] = "Creating task for " . $value->taakonkosten;
                            $taskID = !empty($importTask) ? $importTask->id : $this->createNewTask($subprojectID, $taskTemplateID);

                            $foundHour = Hour::where('user_id', $userID)->where('task_id', $taskID)->where('value', $value->aantal)->where('description', $value->omschrijving)->where('date', $importDate)->first();

                            if (count($foundHour) > 0) {
                                $results[] = 'Skipped hour (' . $value->aantal . ' hours on ' . $value->datum . ' for project "' . $value->project . '" and subproject "' . $value->deelproject . '" by ' . $value->gebruiker . ')';
                            } else {

                                $hour = new Hour();
                                $hour->user_id = $userID;
                                $hour->task_id = $taskID;
                                $hour->value = $value->aantal;
                                $hour->margin = 0;
                                $hour->billable = $value->facturabel == "ja" ? 1 : 0;
                                $hour->exceed_subproject = 0;
                                $hour->bug = 0;
                                $hour->description = !empty($value->omschrijving) ? $value->omschrijving : "";
                                $hour->intern_description = '';
                                $hour->date = $importDate;
                                $hour->save();

                                $results[] = 'Saved hour (' . $value->aantal . ' hours on ' . $value->datum . ' for project "' . $value->project . '" and subproject "' . $value->deelproject . '" by ' . $value->gebruiker . ')';
                            }
                        } else {

                            $foundExpense = Expense::where('user_id', $userID)->where('subproject_id', $subprojectID)->where('value', $value->aantal)->where('date', $importDate)->where('description', $value->omschrijving)->first();
                            if (count($foundExpense) > 0) {
                                $results[] = 'Skipped expense (' . $value->aantal . ' ' . $value->eenheid . ' on ' . $value->datum . ' for project "' . $value->project . '" and subproject "' . $value->deelproject . '" by ' . $value->gebruiker . ')';
                            } else {

                                $importExpenseType = ExpenseType::where('name', $value->taakonkosten)->first();
                                $expenseTypeID = !empty($importExpenseType) ? $importExpenseType->id : $this->createNewExpenseType($value->taakonkosten, $value->uurprijs_taak, $value->eenheid);
                                $expense = new Expense();
                                $expense->user_id = $userID;
                                $expense->subproject_id = $subprojectID;
                                $expense->expense_type_id = $expenseTypeID;
                                $expense->value = $value->aantal;
                                $expense->costs = $value->uurprijs_taak;
                                $expense->description = !empty($value->omschrijving) ? $value->omschrijving : "";
                                $expense->intern_description = '';
                                $expense->date = $importDate;
                                $expense->billable = $value->facturabel == "ja" ? 1 : 0;
                                $expense->bug = 0;
                                $expense->save();

                                $results[] = 'Saved expense (' . $value->aantal . ' ' . $value->eenheid . ' on ' . $value->datum . ' for project "' . $value->project . '" and subproject "' . $value->deelproject . '" by ' . $value->gebruiker . ')';
                            }
                        }
                    }
                }
            }
            return view('settings.excelImport.index', compact('results'));
        }
    }

    private function createNewProject($projectName, $companyID)
    {
        $importProjectTemplate = ProjectTemplate::where('name', 'Import')->first();
        if (empty($importProjectTemplate)) {
            $projectTemplate = new ProjectTemplate();
            $projectTemplate->name = 'Import';
            $projectTemplate->save();
        } else {
            $projectTemplate = $importProjectTemplate;
        }

        $project = new Project();
        $project->name = $projectName;
        $project->company_id = $companyID;
        $project->billable = 1;
        $project->hourly_rate = 70;
        $project->project_template_id = $projectTemplate->id;
        $project->save();

        $projectWorker = new ProjectWorker();
        $projectWorker->user_id = 3; // Tim Lammers
        $projectWorker->project_id = $project->id;
        $projectWorker->role_id = 1;
        $projectWorker->save();

        return $project->id;
    }

    private function createNewCompany($klantName)
    {
        $company = new Company();
        $company->name = $klantName;
        $company->country_id = 1;
        $company->save();

        $contact = new Contact();
        $contact->name = 'Import contact' . $company->id;
        $contact->save();

        $company->Contacts()->sync([$contact->id]);

        return $company->id;
    }

    private function createNewSubproject($deelprojectName, $projectID)
    {
        $importSubprojectTemplate = SubprojectTemplate::where('name', 'Import')->first();
        if (empty($importSubprojectTemplate)) {
            $subprojectTemplate = new SubprojectTemplate();
            $subprojectTemplate->name = 'Import';
            $subprojectTemplate->standard_billable = 1;
            $subprojectTemplate->save();
        } else {
            $subprojectTemplate = $importSubprojectTemplate;
        }

        $subproject = new Subproject();
        $subproject->subproject_template_id = $subprojectTemplate->id;
        $subproject->project_id = $projectID;
        $subproject->name = $deelprojectName;
        $subproject->budget = 0;
        $subproject->hourly_rate = 70;
        $subproject->save();

        return $subproject->id;
    }

    private function createNewTask($subProjectID, $taskTemplateID)
    {
        $task = new Task();
        $task->subproject_id = $subProjectID;
        $task->task_template_id = $taskTemplateID;
        $task->save();

        return $task->id;
    }

    private function createNewTaskTemplate($taakName, $hourlyRate, $billable)
    {
        $taskTemplate = new TaskTemplate();
        $taskTemplate->name = $taakName;
        $taskTemplate->hourly_rate = $hourlyRate;
        $taskTemplate->standard_billable = 1;
        $taskTemplate->save();

        return $taskTemplate->id;
    }

    private function createNewExpenseType($name, $costs, $unitName)
    {
        $importExpenseUnit = ExpenseUnit::where('name', $unitName)->first();
        if (empty($importExpenseUnit)) {
            $expenseUnit = new ExpenseUnit();
            $expenseUnit->name = $unitName;
            $expenseUnit->save();

            $expenseUnitID = $expenseUnit->id;
        } else {
            $expenseUnitID = $importExpenseUnit->id;
        }
        $expenseType = new ExpenseType();
        $expenseType->name = $name;
        $expenseType->costs = $costs;
        $expenseType->expense_unit_id = $expenseUnitID;
        $expenseType->save();

        return $expenseType->id;
    }
}