mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-08 20:22:42 +01:00
tests for importing documents
This commit is contained in:
parent
0b9da695d7
commit
6bc9f679a9
@ -11,12 +11,13 @@
|
||||
|
||||
namespace App\Services\EDocument\Imports;
|
||||
|
||||
use Exception;
|
||||
use App\Utils\Ninja;
|
||||
use App\Models\Company;
|
||||
use App\Models\Expense;
|
||||
use App\Services\AbstractService;
|
||||
use App\Utils\Ninja;
|
||||
use Exception;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use App\Services\EDocument\Imports\UblEDocument;
|
||||
|
||||
class ParseEDocument extends AbstractService
|
||||
{
|
||||
@ -56,9 +57,16 @@ class ParseEDocument extends AbstractService
|
||||
case ($extension == 'xml' || $mimetype == 'application/xml') && stristr($this->file->get(), "urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_2.0"):
|
||||
try {
|
||||
return (new ZugferdEDocument($this->file, $this->company))->run();
|
||||
} catch (Exception $e) {
|
||||
} catch (Throwable $e) {
|
||||
nlog("Zugferd Exception: " . $e->getMessage());
|
||||
}
|
||||
case ($extension == 'xml' || $mimetype == 'application/xml') && stristr($this->file->get(), "urn:oasis:names:specification:ubl"):
|
||||
try {
|
||||
return (new UblEDocument($this->file, $this->company))->run();
|
||||
}
|
||||
catch(\Throwable $e){
|
||||
nlog("UBL Import Exception: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// MINDEE OCR - try to parse via mindee external service
|
||||
|
45
app/Services/EDocument/Imports/UblEDocument.php
Normal file
45
app/Services/EDocument/Imports/UblEDocument.php
Normal file
@ -0,0 +1,45 @@
|
||||
<?php
|
||||
/**
|
||||
* Invoice Ninja (https://invoiceninja.com).
|
||||
*
|
||||
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||
*
|
||||
* @copyright Copyright (c) 2024. Invoice Ninja LLC (https://invoiceninja.com)
|
||||
*
|
||||
* @license https://www.elastic.co/licensing/elastic-license
|
||||
*/
|
||||
|
||||
namespace App\Services\EDocument\Imports;
|
||||
|
||||
use App\Models\Company;
|
||||
use App\Factory\ExpenseFactory;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use App\Utils\Traits\SavesDocuments;
|
||||
|
||||
class UblEDocument extends AbstractService
|
||||
{
|
||||
use SavesDocuments;
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function __construct(public UploadedFile $file, public Company $company)
|
||||
{
|
||||
# curl -X POST http://localhost:8000/api/v1/edocument/upload -H "Content-Type: multipart/form-data" -H "X-API-TOKEN: 7tdDdkz987H3AYIWhNGXy8jTjJIoDhkAclCDLE26cTCj1KYX7EBHC66VEitJwWhn" -H "X-Requested-With: XMLHttpRequest" -F _method=PUT -F documents[]=@einvoice.xml
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function run(): Expense
|
||||
{
|
||||
|
||||
//parse doc
|
||||
|
||||
//append file as an attachment to the document
|
||||
|
||||
$expense = ExpenseFactory::create($this->company->id, $this->company->owner()->id);
|
||||
|
||||
return $expense;
|
||||
}
|
||||
}
|
39
tests/Integration/Einvoice/ImportEInvoiceTest.php
Normal file
39
tests/Integration/Einvoice/ImportEInvoiceTest.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
/**
|
||||
* Invoice Ninja (https://invoiceninja.com).
|
||||
*
|
||||
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||
*
|
||||
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
|
||||
*
|
||||
* @license https://www.elastic.co/licensing/elastic-license
|
||||
*/
|
||||
|
||||
namespace Tests\Integration\Einvoice;
|
||||
|
||||
use Tests\TestCase;
|
||||
use InvoiceNinja\EInvoice\EInvoice;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class ImportEInvoiceTest extends TestCase
|
||||
{
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
}
|
||||
|
||||
public function testParsingDocument()
|
||||
{
|
||||
$peppol_doc = file_get_contents(base_path('tests/Integration/Einvoice/samples/peppol.xml'));
|
||||
|
||||
$this->assertNotNull($peppol_doc);
|
||||
|
||||
$e = new EInvoice();
|
||||
$invoice = $e->decode('Peppol', $peppol_doc, 'xml');
|
||||
|
||||
$this->assertNotNull($invoice);
|
||||
}
|
||||
}
|
211
tests/Integration/Einvoice/samples/peppol.xml
Normal file
211
tests/Integration/Einvoice/samples/peppol.xml
Normal file
@ -0,0 +1,211 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Invoice xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
|
||||
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
|
||||
xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
|
||||
<cbc:UBLVersionID>2.1</cbc:UBLVersionID>
|
||||
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
|
||||
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
|
||||
<cbc:ID>Snippet1</cbc:ID>
|
||||
<cbc:IssueDate>2017-11-13</cbc:IssueDate>
|
||||
<cbc:DueDate>2017-12-01</cbc:DueDate>
|
||||
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
|
||||
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
|
||||
<cbc:AccountingCost>4025:123:4343</cbc:AccountingCost>
|
||||
<cbc:BuyerReference>0150abc</cbc:BuyerReference>
|
||||
<cac:AccountingSupplierParty>
|
||||
<cac:Party>
|
||||
<cbc:EndpointID schemeID="0088">9482348239847239874</cbc:EndpointID>
|
||||
<cac:PartyIdentification>
|
||||
<cbc:ID>99887766</cbc:ID>
|
||||
</cac:PartyIdentification>
|
||||
<cac:PartyName>
|
||||
<cbc:Name>SupplierTradingName Ltd.</cbc:Name>
|
||||
</cac:PartyName>
|
||||
<cac:PostalAddress>
|
||||
<cbc:StreetName>Main street 1</cbc:StreetName>
|
||||
<cbc:AdditionalStreetName>Postbox 123</cbc:AdditionalStreetName>
|
||||
<cbc:CityName>London</cbc:CityName>
|
||||
<cbc:PostalZone>GB 123 EW</cbc:PostalZone>
|
||||
<cac:Country>
|
||||
<cbc:IdentificationCode>GB</cbc:IdentificationCode>
|
||||
</cac:Country>
|
||||
</cac:PostalAddress>
|
||||
<cac:PartyTaxScheme>
|
||||
<cbc:CompanyID>GB1232434</cbc:CompanyID>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:PartyTaxScheme>
|
||||
<cac:PartyLegalEntity>
|
||||
<cbc:RegistrationName>SupplierOfficialName Ltd</cbc:RegistrationName>
|
||||
<cbc:CompanyID>GB983294</cbc:CompanyID>
|
||||
</cac:PartyLegalEntity>
|
||||
</cac:Party>
|
||||
</cac:AccountingSupplierParty>
|
||||
<cac:AccountingCustomerParty>
|
||||
<cac:Party>
|
||||
<cbc:EndpointID schemeID="0002">FR23342</cbc:EndpointID>
|
||||
<cac:PartyIdentification>
|
||||
<cbc:ID schemeID="0002">FR23342</cbc:ID>
|
||||
</cac:PartyIdentification>
|
||||
<cac:PartyName>
|
||||
<cbc:Name>BuyerTradingName AS</cbc:Name>
|
||||
</cac:PartyName>
|
||||
<cac:PostalAddress>
|
||||
<cbc:StreetName>Hovedgatan 32</cbc:StreetName>
|
||||
<cbc:AdditionalStreetName>Po box 878</cbc:AdditionalStreetName>
|
||||
<cbc:CityName>Stockholm</cbc:CityName>
|
||||
<cbc:PostalZone>456 34</cbc:PostalZone>
|
||||
<cac:Country>
|
||||
<cbc:IdentificationCode>SE</cbc:IdentificationCode>
|
||||
</cac:Country>
|
||||
</cac:PostalAddress>
|
||||
<cac:PartyTaxScheme>
|
||||
<cbc:CompanyID>SE4598375937</cbc:CompanyID>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:PartyTaxScheme>
|
||||
<cac:PartyLegalEntity>
|
||||
<cbc:RegistrationName>Buyer Official Name</cbc:RegistrationName>
|
||||
<cbc:CompanyID schemeID="0183">39937423947</cbc:CompanyID>
|
||||
</cac:PartyLegalEntity>
|
||||
<cac:Contact>
|
||||
<cbc:Name>Lisa Johnson</cbc:Name>
|
||||
<cbc:Telephone>23434234</cbc:Telephone>
|
||||
<cbc:ElectronicMail>lj@buyer.se</cbc:ElectronicMail>
|
||||
</cac:Contact>
|
||||
</cac:Party>
|
||||
</cac:AccountingCustomerParty>
|
||||
<cac:Delivery>
|
||||
<cbc:ActualDeliveryDate>2017-11-01</cbc:ActualDeliveryDate>
|
||||
<cac:DeliveryLocation>
|
||||
<cbc:ID schemeID="0088">9483759475923478</cbc:ID>
|
||||
<cac:Address>
|
||||
<cbc:StreetName>Delivery street 2</cbc:StreetName>
|
||||
<cbc:AdditionalStreetName>Building 56</cbc:AdditionalStreetName>
|
||||
<cbc:CityName>Stockholm</cbc:CityName>
|
||||
<cbc:PostalZone>21234</cbc:PostalZone>
|
||||
<cac:Country>
|
||||
<cbc:IdentificationCode>SE</cbc:IdentificationCode>
|
||||
</cac:Country>
|
||||
</cac:Address>
|
||||
</cac:DeliveryLocation>
|
||||
<cac:DeliveryParty>
|
||||
<cac:PartyName>
|
||||
<cbc:Name>Delivery party Name</cbc:Name>
|
||||
</cac:PartyName>
|
||||
</cac:DeliveryParty>
|
||||
</cac:Delivery>
|
||||
<cac:PaymentMeans>
|
||||
<cbc:PaymentMeansCode name="Credit transfer">30</cbc:PaymentMeansCode>
|
||||
<cbc:PaymentID>Snippet1</cbc:PaymentID>
|
||||
<cac:PayeeFinancialAccount>
|
||||
<cbc:ID>IBAN32423940</cbc:ID>
|
||||
<cbc:Name>AccountName</cbc:Name>
|
||||
<cac:FinancialInstitutionBranch>
|
||||
<cbc:ID>BIC324098</cbc:ID>
|
||||
</cac:FinancialInstitutionBranch>
|
||||
</cac:PayeeFinancialAccount>
|
||||
</cac:PaymentMeans>
|
||||
<cac:PaymentTerms>
|
||||
<cbc:Note>Payment within 10 days, 2% discount</cbc:Note>
|
||||
</cac:PaymentTerms>
|
||||
<cac:AllowanceCharge>
|
||||
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
|
||||
<cbc:AllowanceChargeReason>Insurance</cbc:AllowanceChargeReason>
|
||||
<cbc:Amount currencyID="EUR">25</cbc:Amount>
|
||||
<cac:TaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>25.0</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:TaxCategory>
|
||||
</cac:AllowanceCharge>
|
||||
<cac:TaxTotal>
|
||||
<cbc:TaxAmount currencyID="EUR">331.25</cbc:TaxAmount>
|
||||
<cac:TaxSubtotal>
|
||||
<cbc:TaxableAmount currencyID="EUR">1325</cbc:TaxableAmount>
|
||||
<cbc:TaxAmount currencyID="EUR">331.25</cbc:TaxAmount>
|
||||
<cac:TaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>25.0</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:TaxCategory>
|
||||
</cac:TaxSubtotal>
|
||||
</cac:TaxTotal>
|
||||
<cac:LegalMonetaryTotal>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">1300</cbc:LineExtensionAmount>
|
||||
<cbc:TaxExclusiveAmount currencyID="EUR">1325</cbc:TaxExclusiveAmount>
|
||||
<cbc:TaxInclusiveAmount currencyID="EUR">1656.25</cbc:TaxInclusiveAmount>
|
||||
<cbc:ChargeTotalAmount currencyID="EUR">25</cbc:ChargeTotalAmount>
|
||||
<cbc:PayableAmount currencyID="EUR">1656.25</cbc:PayableAmount>
|
||||
</cac:LegalMonetaryTotal>
|
||||
|
||||
<cac:InvoiceLine>
|
||||
<cbc:ID>1</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="DAY">7</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">2800</cbc:LineExtensionAmount>
|
||||
<cbc:AccountingCost>Konteringsstreng</cbc:AccountingCost>
|
||||
<cac:OrderLineReference>
|
||||
<cbc:LineID>123</cbc:LineID>
|
||||
</cac:OrderLineReference>
|
||||
<cac:Item>
|
||||
<cbc:Description>Description of item</cbc:Description>
|
||||
<cbc:Name>item name</cbc:Name>
|
||||
<cac:StandardItemIdentification>
|
||||
<cbc:ID schemeID="0088">21382183120983</cbc:ID>
|
||||
</cac:StandardItemIdentification>
|
||||
<cac:OriginCountry>
|
||||
<cbc:IdentificationCode>NO</cbc:IdentificationCode>
|
||||
</cac:OriginCountry>
|
||||
<cac:CommodityClassification>
|
||||
<cbc:ItemClassificationCode listID="SRV">09348023</cbc:ItemClassificationCode>
|
||||
</cac:CommodityClassification>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>25.0</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">400</cbc:PriceAmount>
|
||||
</cac:Price>
|
||||
</cac:InvoiceLine>
|
||||
<cac:InvoiceLine>
|
||||
<cbc:ID>2</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="DAY">-3</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">-1500</cbc:LineExtensionAmount>
|
||||
<cac:OrderLineReference>
|
||||
<cbc:LineID>123</cbc:LineID>
|
||||
</cac:OrderLineReference>
|
||||
<cac:Item>
|
||||
<cbc:Description>Description 2</cbc:Description>
|
||||
<cbc:Name>item name 2</cbc:Name>
|
||||
<cac:StandardItemIdentification>
|
||||
<cbc:ID schemeID="0088">21382183120983</cbc:ID>
|
||||
</cac:StandardItemIdentification>
|
||||
<cac:OriginCountry>
|
||||
<cbc:IdentificationCode>NO</cbc:IdentificationCode>
|
||||
</cac:OriginCountry>
|
||||
<cac:CommodityClassification>
|
||||
<cbc:ItemClassificationCode listID="SRV">09348023</cbc:ItemClassificationCode>
|
||||
</cac:CommodityClassification>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>25.0</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">500</cbc:PriceAmount>
|
||||
</cac:Price>
|
||||
</cac:InvoiceLine>
|
||||
</Invoice>
|
Loading…
Reference in New Issue
Block a user