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;
}
}