integrate ParseEDocument to InboundMailEngine

This commit is contained in:
paulwer 2024-06-22 15:33:53 +02:00
parent e586455be3
commit 45e2b6aeb8

View File

@ -11,7 +11,6 @@
namespace App\Services\InboundMail; namespace App\Services\InboundMail;
use App\Events\Expense\ExpenseWasCreated;
use App\Factory\ExpenseFactory; use App\Factory\ExpenseFactory;
use App\Jobs\Util\SystemLogger; use App\Jobs\Util\SystemLogger;
use App\Libraries\MultiDB; use App\Libraries\MultiDB;
@ -19,8 +18,8 @@ use App\Models\ClientContact;
use App\Models\Company; use App\Models\Company;
use App\Models\SystemLog; use App\Models\SystemLog;
use App\Models\VendorContact; use App\Models\VendorContact;
use App\Services\EDocument\Imports\ParseEDocument;
use App\Services\InboundMail\InboundMail; use App\Services\InboundMail\InboundMail;
use App\Utils\Ninja;
use App\Utils\TempFile; use App\Utils\TempFile;
use App\Utils\Traits\GeneratesCounter; use App\Utils\Traits\GeneratesCounter;
use App\Utils\Traits\SavesDocuments; use App\Utils\Traits\SavesDocuments;
@ -167,67 +166,62 @@ class InboundMailEngine
return; return;
} }
// handle vendor assignment
$expense_vendor = $this->getVendor($company, $email);
// handle documents
$this->processHtmlBodyToDocument($email);
// handle documents seperatly
foreach ($email->documents as $document) {
/** @var \App\Models\Expense $expense */ /** @var \App\Models\Expense $expense */
$expense = null; $expense = null;
// TODO: check if document is a ZugferdEDocument and can be handled that way // check documents for EDocument xml
if ($document->extension() === 'pdf' || $document->extension() === 'xml') { foreach ($email->documents as $document) {
// check if document can be parsed to an expense
try { try {
$expense = (new ZugferdEDocument($document->get()))->run(); $expense_obj = (new ParseEDocument($document->get(), $document->getFilename()))->run();
// throw error, when multiple parseable files are registered
if ($expense && $expense_obj)
throw new \Exception('Multiple parseable Invoice documents found in email. Please use only one Invoice document per email.');
$expense = $expense_obj;
} catch (\Exception $err) { } catch (\Exception $err) {
// throw error, only, when its not expected
// throw error, when its not the DocumentNotFoundError switch (true) {
if (!($exception instanceof \horstoeko\zugferd\exception\ZugferdFileNotFoundException)) { case ($err->getMessage() === 'E-Invoice standard not supported'):
nlog("An error occured while processing InboundEmail document with ZugferdEDocument: {$err}"); case ($err->getMessage() === 'File type not supported'):
break;
default:
throw $err; throw $err;
} }
}
} }
// save additional context of the email to the document // populate missing data with data from email
if ($expense) { if (!$expense)
if (!$expense->vendor_id && $expense_vendor)
$expense->vendor_id = $expense_vendor->id;
$documents = [];
if ($email->body_document !== null)
array_push($documents, $email->body_document);
$expense->saveQuietly();
$this->saveDocuments($documents, $expense);
continue;
}
}
// TODO: check if document can be handled by OCR solution
// create expense just from document
$expense = ExpenseFactory::create($company->id, $company->owner()->id); $expense = ExpenseFactory::create($company->id, $company->owner()->id);
if (!$expense->public_notes)
$expense->public_notes = $email->subject; $expense->public_notes = $email->subject;
if (!$expense->private_notes)
$expense->private_notes = $email->text_body; $expense->private_notes = $email->text_body;
if (!$expense->date)
$expense->date = $email->date; $expense->date = $email->date;
if (!$expense->vendor_id) {
$expense_vendor = $this->getVendor($company, $email);
if ($expense_vendor) if ($expense_vendor)
$expense->vendor_id = $expense_vendor->id; $expense->vendor_id = $expense_vendor->id;
}
// handle documents
$documents = []; $documents = [];
array_push($documents, $document); array_push($documents, $document);
// handle email document
$this->processHtmlBodyToDocument($email);
if ($email->body_document !== null) if ($email->body_document !== null)
array_push($documents, $email->body_document); array_push($documents, $email->body_document);
@ -235,10 +229,6 @@ class InboundMailEngine
$this->saveDocuments($documents, $expense); $this->saveDocuments($documents, $expense);
event(new ExpenseWasCreated($expense, $expense->company, Ninja::eventVars(null))); // @turbo124 please check, I copied from API-Controller
event('eloquent.created: App\Models\Expense', $expense); // @turbo124 please check, I copied from API-Controller
}
} }
// HELPERS // HELPERS