mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-10-31 08:27:32 -04:00 
			
		
		
		
	einvoice
This commit is contained in:
		
							parent
							
								
									329044dccc
								
							
						
					
					
						commit
						c46936c9f3
					
				| @ -9,12 +9,11 @@ | ||||
|  * @license https://www.elastic.co/licensing/elastic-license | ||||
|  */ | ||||
| 
 | ||||
| namespace App\Services\EDocument\Gateway; | ||||
| namespace App\Services\EDocument\Gateway\Storecove; | ||||
| 
 | ||||
| use App\Models\Company; | ||||
| use Illuminate\Support\Facades\Http; | ||||
| 
 | ||||
| 
 | ||||
| enum HttpVerb: string | ||||
| { | ||||
|     case POST = 'post'; | ||||
| @ -26,7 +25,7 @@ enum HttpVerb: string | ||||
| 
 | ||||
| class Storecove { | ||||
| 
 | ||||
|     private string $base_url = 'https://api.storecove.com/'; | ||||
|     private string $base_url = 'https://api.storecove.com/api/v2/'; | ||||
| 
 | ||||
|     private array $peppol_discovery = [ | ||||
|         "documentTypes" =>  ["invoice"], | ||||
| @ -102,16 +101,35 @@ class Storecove { | ||||
|     { | ||||
| 
 | ||||
|         $payload = [ | ||||
|             'documentType' => 'invoice', | ||||
|             'rawDocumentData' => base64_encode($document), | ||||
|             'parse' => true, | ||||
|             'parseStrategy', 'ubl' | ||||
|             "legalEntityId"=> 290868, | ||||
|             "idempotencyGuid"=> "61b37456-5f9e-4d56-b63b-3b1a23fa5c73", | ||||
|             "routing"=>  [ | ||||
|                 "eIdentifiers" => [ | ||||
|                     [ | ||||
|                         "scheme"=> "DE:LWID", | ||||
|                         "id"=> "10101010-STO-10" | ||||
|                     ], | ||||
|                 ], | ||||
|                 "emails"=> [ | ||||
|                 "david@invoiceninja.com" | ||||
|                 ], | ||||
|                 "eIdentifiers"=> [] | ||||
|             ], | ||||
|             "document"=> [ | ||||
|                 'documentType' => 'invoice', | ||||
|                 'rawDocumentData' => ['document' => base64_encode($document)], | ||||
|                 'parse' => true, | ||||
|                 'parseStrategy', 'ubl' | ||||
|             ], | ||||
|         ]; | ||||
| 
 | ||||
|         $uri = "api/v2/document_submissions"; | ||||
|         $uri = "document_submissions"; | ||||
|          | ||||
|         $r = $this->httpClient($uri, (HttpVerb::POST)->value, $payload, $this->getHeaders()); | ||||
| 
 | ||||
|         nlog($r->body()); | ||||
|         nlog($r->json()); | ||||
| 
 | ||||
|         if($r->successful()) | ||||
|             return $r->json()['guid']; | ||||
| 
 | ||||
| @ -122,7 +140,7 @@ class Storecove { | ||||
|     //document submission sending evidence
 | ||||
|     public function getSendingEvidence(string $guid) | ||||
|     { | ||||
|         $uri = "api/v2/document_submissions/{$guid}"; | ||||
|         $uri = "document_submissions/{$guid}"; | ||||
|         $r = $this->httpClient($uri, (HttpVerb::GET)->value, [], $this->getHeaders()); | ||||
| 
 | ||||
|     } | ||||
| @ -214,6 +232,21 @@ class Storecove { | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public function getLegalEntity($id) | ||||
|     { | ||||
| 
 | ||||
|         $uri = "legal_entities/{$id}"; | ||||
| 
 | ||||
|         $r = $this->httpClient($uri, (HttpVerb::GET)->value, []); | ||||
| 
 | ||||
|         if($r->successful()) { | ||||
|             return $r->json(); | ||||
|         } | ||||
| 
 | ||||
|         return $r; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public function updateLegalEntity($id, array $data) | ||||
|     { | ||||
| 
 | ||||
| @ -242,7 +275,7 @@ class Storecove { | ||||
| 
 | ||||
|     private function httpClient(string $uri, string $verb, array $data, ?array $headers = []) | ||||
|     { | ||||
| 
 | ||||
| nlog("{$this->base_url}{$uri}"); | ||||
|         $r = Http::withToken(config('ninja.storecove_api_key')) | ||||
|                 ->withHeaders($this->getHeaders($headers)) | ||||
|                 ->{$verb}("{$this->base_url}{$uri}", $data); | ||||
|  | ||||
| @ -15,6 +15,7 @@ use App\Models\Invoice; | ||||
| use App\Services\AbstractService; | ||||
| use App\Helpers\Invoice\InvoiceSum; | ||||
| use App\Helpers\Invoice\InvoiceSumInclusive; | ||||
| use InvoiceNinja\EInvoice\EInvoice; | ||||
| use InvoiceNinja\EInvoice\Models\Peppol\ItemType\Item; | ||||
| use InvoiceNinja\EInvoice\Models\Peppol\PartyType\Party; | ||||
| use InvoiceNinja\EInvoice\Models\Peppol\PriceType\Price; | ||||
| @ -78,6 +79,12 @@ class Peppol extends AbstractService | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public function toXml(): string | ||||
|     { | ||||
|         $e = new EInvoice(); | ||||
|         return $e->encode($this->p_invoice, 'xml'); | ||||
|     } | ||||
| 
 | ||||
|     public function run() | ||||
|     { | ||||
|         $this->p_invoice->ID = $this->invoice->number; | ||||
|  | ||||
							
								
								
									
										200
									
								
								tests/Integration/Einvoice/Storecove/StorecoveTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								tests/Integration/Einvoice/Storecove/StorecoveTest.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,200 @@ | ||||
| <?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\Storecove; | ||||
| 
 | ||||
| use Tests\TestCase; | ||||
| use Tests\MockAccountData; | ||||
| use Illuminate\Foundation\Testing\DatabaseTransactions; | ||||
| 
 | ||||
| 
 | ||||
| class StorecoveTest extends TestCase | ||||
| { | ||||
|     use MockAccountData; | ||||
|     use DatabaseTransactions; | ||||
| 
 | ||||
|     protected function setUp(): void | ||||
|     { | ||||
|         parent::setUp(); | ||||
| 
 | ||||
|         $this->makeTestData(); | ||||
| 
 | ||||
|         if (config('ninja.testvars.travis') !== false || !config('ninja.storecove_api_key'))  | ||||
|             $this->markTestSkipped("do not run in CI"); | ||||
|     } | ||||
| 
 | ||||
|     public function teseateLegalEntity() | ||||
|     { | ||||
| 
 | ||||
|         $data = [ | ||||
|             'acts_as_receiver' => true, | ||||
|             'acts_as_sender' => true, | ||||
|             'advertisements' => ['invoice'], | ||||
|             'city' => $this->company->settings->city, | ||||
|             'country' => 'DE', | ||||
|             'county' => $this->company->settings->state, | ||||
|             'line1' => $this->company->settings->address1, | ||||
|             'line2' => $this->company->settings->address2, | ||||
|             'party_name' => $this->company->present()->name(), | ||||
|             'tax_registered' => true, | ||||
|             'tenant_id' => $this->company->company_key, | ||||
|             'zip' => $this->company->settings->postal_code, | ||||
|         ]; | ||||
| 
 | ||||
|         $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove(); | ||||
|         $r = $sc->createLegalEntity($data, $this->company); | ||||
| 
 | ||||
|         $this->assertIsArray($r); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     public function testGetLegalEntity() | ||||
|     { | ||||
| 
 | ||||
|          | ||||
|         $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove(); | ||||
|         $r = $sc->getLegalEntity(290868); | ||||
| 
 | ||||
|         $this->assertIsArray($r); | ||||
| 
 | ||||
|         // nlog($r);
 | ||||
| 
 | ||||
|     }     | ||||
| 
 | ||||
|     public function testSendDocument() | ||||
|     { | ||||
| 
 | ||||
|         $x = '<?xml version="1.0"?>
 | ||||
|             <cbc:ID>0061</cbc:ID> | ||||
|             <cbc:IssueDate>2024-07-15</cbc:IssueDate> | ||||
|             <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode> | ||||
|             <cac:AccountingSupplierParty> | ||||
|             <cac:Party> | ||||
|                 <cac:PartyName> | ||||
|                 <cbc:Name>Eladio Ullrich I</cbc:Name> | ||||
|                 </cac:PartyName> | ||||
|                 <cac:PostalAddress> | ||||
|                 <cbc:StreetName>Jasper Brook</cbc:StreetName> | ||||
|                 <cbc:CityName>Kodychester</cbc:CityName> | ||||
|                 <cbc:PostalZone>73445-5131</cbc:PostalZone> | ||||
|                 <cbc:CountrySubentity>South Dakota</cbc:CountrySubentity> | ||||
|                 <cac:Country> | ||||
|                     <cbc:IdentificationCode>AT</cbc:IdentificationCode> | ||||
|                 </cac:Country> | ||||
|                 </cac:PostalAddress> | ||||
|                 <cac:PhysicalLocation> | ||||
|                 <cbc:StreetName>Jasper Brook</cbc:StreetName> | ||||
|                 <cbc:CityName>Kodychester</cbc:CityName> | ||||
|                 <cbc:PostalZone>73445-5131</cbc:PostalZone> | ||||
|                 <cbc:CountrySubentity>South Dakota</cbc:CountrySubentity> | ||||
|                 <cac:Country> | ||||
|                     <cbc:IdentificationCode>AT</cbc:IdentificationCode> | ||||
|                 </cac:Country> | ||||
|                 </cac:PhysicalLocation> | ||||
|                 <cac:Contact> | ||||
|                 <cbc:ElectronicMail>small@example.com</cbc:ElectronicMail> | ||||
|                 </cac:Contact> | ||||
|             </cac:Party> | ||||
|             </cac:AccountingSupplierParty> | ||||
|             <cac:AccountingCustomerParty> | ||||
|             <cac:Party> | ||||
|                 <cac:PartyName> | ||||
|                 <cbc:Name>Beispiel GmbH</cbc:Name> | ||||
|                 </cac:PartyName> | ||||
|                 <cac:PostalAddress> | ||||
|                 <cbc:StreetName>45 Hauptstraße</cbc:StreetName>
 | ||||
|                 <cbc:CityName>Berlin</cbc:CityName> | ||||
|                 <cbc:PostalZone>10115</cbc:PostalZone> | ||||
|                 <cbc:CountrySubentity>Berlin</cbc:CountrySubentity> | ||||
|                 <cac:Country> | ||||
|                     <cbc:IdentificationCode>DE</cbc:IdentificationCode> | ||||
|                 </cac:Country> | ||||
|                 </cac:PostalAddress> | ||||
|                 <cac:PhysicalLocation> | ||||
|                 <cbc:StreetName>45 Hauptstraße</cbc:StreetName>
 | ||||
|                 <cbc:CityName>Berlin</cbc:CityName> | ||||
|                 <cbc:PostalZone>10115</cbc:PostalZone> | ||||
|                 <cbc:CountrySubentity>Berlin</cbc:CountrySubentity> | ||||
|                 <cac:Country> | ||||
|                     <cbc:IdentificationCode>DE</cbc:IdentificationCode> | ||||
|                 </cac:Country> | ||||
|                 </cac:PhysicalLocation> | ||||
|                 <cac:Contact> | ||||
|                 <cbc:ElectronicMail>TTKGjKW9Rv00LEr@example.com</cbc:ElectronicMail> | ||||
|                 </cac:Contact> | ||||
|             </cac:Party> | ||||
|             </cac:AccountingCustomerParty> | ||||
|             <cac:TaxTotal/> | ||||
|             <cac:LegalMonetaryTotal> | ||||
|             <cbc:LineExtensionAmount currencyID="EUR">215</cbc:LineExtensionAmount> | ||||
|             <cbc:TaxExclusiveAmount currencyID="EUR">215</cbc:TaxExclusiveAmount> | ||||
|             <cbc:TaxInclusiveAmount currencyID="EUR">215.00</cbc:TaxInclusiveAmount> | ||||
|             <cbc:PayableAmount currencyID="EUR">215.00</cbc:PayableAmount> | ||||
|             </cac:LegalMonetaryTotal> | ||||
|             <cac:InvoiceLine> | ||||
|             <cbc:ID>1</cbc:ID> | ||||
|             <cbc:InvoicedQuantity>1</cbc:InvoicedQuantity> | ||||
|             <cbc:LineExtensionAmount currencyID="EUR">10</cbc:LineExtensionAmount> | ||||
|             <cac:TaxTotal> | ||||
|                 <cbc:TaxAmount currencyID="EUR">0.5</cbc:TaxAmount> | ||||
|                 <cac:TaxSubtotal> | ||||
|                 <cbc:TaxableAmount currencyID="EUR">10</cbc:TaxableAmount> | ||||
|                 <cbc:TaxAmount currencyID="EUR">0.5</cbc:TaxAmount> | ||||
|                 <cac:TaxCategory> | ||||
|                     <cbc:ID>C62</cbc:ID> | ||||
|                     <cbc:Percent>20</cbc:Percent> | ||||
|                     <cac:TaxScheme> | ||||
|                     <cbc:ID>USt</cbc:ID> | ||||
|                     </cac:TaxScheme> | ||||
|                 </cac:TaxCategory> | ||||
|                 </cac:TaxSubtotal> | ||||
|             </cac:TaxTotal> | ||||
|             <cac:Item> | ||||
|                 <cbc:Description>The Pro Plan NO MORE</cbc:Description> | ||||
|                 <cbc:Name>ee</cbc:Name> | ||||
|             </cac:Item> | ||||
|             <cac:Price> | ||||
|                 <cbc:PriceAmount currencyID="EUR">10</cbc:PriceAmount> | ||||
|             </cac:Price> | ||||
|             </cac:InvoiceLine> | ||||
|             <cac:InvoiceLine> | ||||
|             <cbc:ID>2</cbc:ID> | ||||
|             <cbc:InvoicedQuantity>1</cbc:InvoicedQuantity> | ||||
|             <cbc:LineExtensionAmount currencyID="EUR">14</cbc:LineExtensionAmount> | ||||
|             <cac:Item> | ||||
|                 <cbc:Description>The Enterprise Plan</cbc:Description> | ||||
|                 <cbc:Name>eee</cbc:Name> | ||||
|             </cac:Item> | ||||
|             <cac:Price> | ||||
|                 <cbc:PriceAmount currencyID="EUR">14</cbc:PriceAmount> | ||||
|             </cac:Price> | ||||
|             </cac:InvoiceLine> | ||||
|             <cac:InvoiceLine> | ||||
|             <cbc:ID>3</cbc:ID> | ||||
|             <cbc:InvoicedQuantity>1</cbc:InvoicedQuantity> | ||||
|             <cbc:LineExtensionAmount currencyID="EUR">191</cbc:LineExtensionAmount> | ||||
|             <cac:Item> | ||||
|                 <cbc:Description>Soluta provident.</cbc:Description> | ||||
|                 <cbc:Name>k</cbc:Name> | ||||
|             </cac:Item> | ||||
|             <cac:Price> | ||||
|                 <cbc:PriceAmount currencyID="EUR">191</cbc:PriceAmount> | ||||
|             </cac:Price> | ||||
|             </cac:InvoiceLine>'; | ||||
| 
 | ||||
|          | ||||
|         $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove(); | ||||
|         $sc->sendDocument($x); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user