This commit is contained in:
David Bomba 2024-07-22 19:31:19 +10:00
parent 80274b34a9
commit a236da0149
8 changed files with 182 additions and 35 deletions

View File

@ -1 +1 @@
5.10.12 5.10.13

View File

@ -385,6 +385,9 @@ class CreateSingleAccount extends Command
}); });
$this->countryClients($company, $user);
$this->info("finished"); $this->info("finished");
} }
@ -1109,4 +1112,44 @@ class CreateSingleAccount extends Command
event(new RecurringInvoiceWasCreated($invoice, $invoice->company, Ninja::eventVars())); event(new RecurringInvoiceWasCreated($invoice, $invoice->company, Ninja::eventVars()));
} }
private function countryClients($company, $user)
{
Client::unguard();
Client::create([
'company_id' => $company->id,
'user_id' => $user->id,
'name' => 'Swiss Company AG',
'website' => 'https://www.testcompany.ch',
'private_notes' => 'These are some private notes about the test client.',
'balance' => 0,
'paid_to_date' => 0,
'vat_number' => '654321987',
'id_number' => 'CH9300762011623852957', // Sample Swiss IBAN
'custom_value1' => '2024-07-22 10:00:00',
'custom_value2' => 'blue',
'custom_value3' => 'sampleword',
'custom_value4' => 'test@example.com',
'address1' => '123',
'address2' => 'Test Street 45',
'city' => 'Zurich',
'state' => 'Zurich',
'postal_code' => '8001',
'country_id' => '756', // Switzerland
'shipping_address1' => '123',
'shipping_address2' => 'Test Street 45',
'shipping_city' => 'Zurich',
'shipping_state' => 'Zurich',
'shipping_postal_code' => '8001',
'shipping_country_id' => '756', // Switzerland
'settings' => ClientSettings::Defaults(),
'client_hash' => \Illuminate\Support\Str::random(32),
'routing_id' => '',
]);
}
} }

View File

@ -75,7 +75,7 @@ class Peppol extends AbstractService
'US' => 'EIN', 'US' => 'EIN',
'US' => 'SSN', 'US' => 'SSN',
'NZ' => 'GST', 'NZ' => 'GST',
'CH' => 'VAT', 'CH' => 'VAT', // VAT number = CHE - 999999999 - MWST|IVA|VAT
'IS' => 'VAT', 'IS' => 'VAT',
'LI' => 'VAT', 'LI' => 'VAT',
'NO' => 'VAT', 'NO' => 'VAT',
@ -85,6 +85,12 @@ class Peppol extends AbstractService
'BA' => 'VAT', 'BA' => 'VAT',
'BE' => 'VAT', 'BE' => 'VAT',
'BG' => 'VAT', 'BG' => 'VAT',
'AU' => 'ABN', //Australia
'CA' => 'CBN', //Canada
'MX' => 'RFC', //Mexico
'NZ' => 'GST', //Nuuu zulund
'GB' => 'VAT', //Great Britain
'SA' => 'TIN', //South Africa
'CY' => 'VAT', 'CY' => 'VAT',
'CZ' => 'VAT', 'CZ' => 'VAT',
'DE' => 'VAT', //tested - requires Payment Means to be defined. 'DE' => 'VAT', //tested - requires Payment Means to be defined.
@ -175,8 +181,10 @@ class Peppol extends AbstractService
$this->p_invoice->AccountingSupplierParty = $this->getAccountingSupplierParty(); $this->p_invoice->AccountingSupplierParty = $this->getAccountingSupplierParty();
$this->p_invoice->AccountingCustomerParty = $this->getAccountingCustomerParty(); $this->p_invoice->AccountingCustomerParty = $this->getAccountingCustomerParty();
$this->p_invoice->InvoiceLine = $this->getInvoiceLines(); $this->p_invoice->InvoiceLine = $this->getInvoiceLines();
$this->p_invoice->TaxTotal = $this->getTotalTaxes(); $this->p_invoice->TaxTotal = $this->getTotalTaxes();
$this->p_invoice->LegalMonetaryTotal = $this->getLegalMonetaryTotal(); $this->p_invoice->LegalMonetaryTotal = $this->getLegalMonetaryTotal();
// $this->p_invoice->PaymentMeans = $this->getPaymentMeans(); // $this->p_invoice->PaymentMeans = $this->getPaymentMeans();
// $payeeFinancialAccount = (new PayeeFinancialAccount()) // $payeeFinancialAccount = (new PayeeFinancialAccount())
@ -191,8 +199,8 @@ class Peppol extends AbstractService
} }
private function getPaymentMeans(): PaymentMeans // private function getPaymentMeans(): PaymentMeans
{ // {
// $payeeFinancialAccount = new PayeeFinancialAccount() // $payeeFinancialAccount = new PayeeFinancialAccount()
// $payeeFinancialAccount-> // $payeeFinancialAccount->
@ -200,7 +208,7 @@ class Peppol extends AbstractService
// $ppm->PayeeFinancialAccount = $payeeFinancialAccount; // $ppm->PayeeFinancialAccount = $payeeFinancialAccount;
// return $ppm; // return $ppm;
} // }
private function getLegalMonetaryTotal(): LegalMonetaryTotal private function getLegalMonetaryTotal(): LegalMonetaryTotal
{ {
@ -231,6 +239,16 @@ class Peppol extends AbstractService
return $lmt; return $lmt;
} }
private function getTotalTaxAmount(): float
{
if(!$this->invoice->total_taxes)
return 0;
elseif($this->invoice->uses_inclusive_taxes)
return $this->invoice->total_taxes;
return $this->calcAmountLineTax($this->invoice->tax_rate1, $this->invoice->amount) ?? 0;
}
private function getTotalTaxes(): array private function getTotalTaxes(): array
{ {
$taxes = []; $taxes = [];
@ -241,8 +259,7 @@ class Peppol extends AbstractService
$tax_amount = new TaxAmount(); $tax_amount = new TaxAmount();
$tax_amount->currencyID = $this->invoice->client->currency()->code; $tax_amount->currencyID = $this->invoice->client->currency()->code;
// $tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiveLineTax($this->invoice->tax_rate1, $this->invoice->amount) : $this->calcAmountLineTax($this->invoice->tax_rate1, $this->invoice->amount); $tax_amount->amount = $this->getTotalTaxAmount();
$tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->invoice->total_taxes : $this->calcAmountLineTax($this->invoice->tax_rate1, $this->invoice->amount);
$tax_subtotal = new TaxSubtotal(); $tax_subtotal = new TaxSubtotal();
$tax_subtotal->TaxAmount = $tax_amount; $tax_subtotal->TaxAmount = $tax_amount;
@ -256,7 +273,7 @@ class Peppol extends AbstractService
$tc->ID = $type_id == '2' ? 'HUR' : 'C62'; $tc->ID = $type_id == '2' ? 'HUR' : 'C62';
$tc->Percent = $this->invoice->tax_rate1; $tc->Percent = $this->invoice->tax_rate1;
$ts = new PeppolTaxScheme(); $ts = new PeppolTaxScheme();
$ts->ID = $this->invoice->tax_name1; $ts->ID = strlen($this->invoice->tax_name1 ?? '') > 1 ? $this->invoice->tax_name1 : '0';
$tc->TaxScheme = $ts; $tc->TaxScheme = $ts;
$tax_subtotal->TaxCategory = $tc; $tax_subtotal->TaxCategory = $tc;
@ -363,6 +380,9 @@ class Peppol extends AbstractService
if(count($item_taxes) > 0) { if(count($item_taxes) > 0) {
$line->TaxTotal = $item_taxes; $line->TaxTotal = $item_taxes;
} }
// else {
// $line->TaxTotal = $this->zeroTaxAmount();
// }
$price = new Price(); $price = new Price();
$pa = new PriceAmount(); $pa = new PriceAmount();
@ -393,6 +413,37 @@ class Peppol extends AbstractService
return $cost; return $cost;
} }
private function zeroTaxAmount(): array
{
$blank_tax = [];
$tax_amount = new TaxAmount();
$tax_amount->currencyID = $this->invoice->client->currency()->code;
$tax_amount->amount = '0';
$tax_subtotal = new TaxSubtotal();
$tax_subtotal->TaxAmount = $tax_amount;
$taxable_amount = new TaxableAmount();
$taxable_amount->currencyID = $this->invoice->client->currency()->code;
$taxable_amount->amount = '0';
$tax_subtotal->TaxableAmount = $taxable_amount;
$tc = new TaxCategory();
$tc->ID = 'Z';
$tc->Percent = 0;
$ts = new PeppolTaxScheme();
$ts->ID = '0';
$tc->TaxScheme = $ts;
$tax_subtotal->TaxCategory = $tc;
$tax_total = new TaxTotal();
$tax_total->TaxAmount = $tax_amount;
$tax_total->TaxSubtotal[] = $tax_subtotal;
$blank_tax[] = $tax_total;
return $blank_tax;
}
private function getItemTaxes(object $item): array private function getItemTaxes(object $item): array
{ {
$item_taxes = []; $item_taxes = [];
@ -541,7 +592,7 @@ $tax_amount->amount = $this->invoice->uses_inclusive_taxes ? $this->calcInclusiv
$pi = new PartyIdentification; $pi = new PartyIdentification;
$vatID = new ID; $vatID = new ID;
$vatID->schemeID = 'IT:VAT'; $vatID->schemeID = 'CH:MWST';
$vatID->value = $this->invoice->client->vat_number; $vatID->value = $this->invoice->client->vat_number;
$pi->ID = $vatID; $pi->ID = $vatID;

View File

@ -41,7 +41,7 @@
"authorizenet/authorizenet": "^2.0", "authorizenet/authorizenet": "^2.0",
"awobaz/compoships": "^2.1", "awobaz/compoships": "^2.1",
"bacon/bacon-qr-code": "^2.0", "bacon/bacon-qr-code": "^2.0",
"beganovich/snappdf": "^5", "beganovich/snappdf": "dev-master",
"braintree/braintree_php": "^6.0", "braintree/braintree_php": "^6.0",
"btcpayserver/btcpayserver-greenfield-php": "^2.6", "btcpayserver/btcpayserver-greenfield-php": "^2.6",
"checkout/checkout-sdk-php": "^3.0", "checkout/checkout-sdk-php": "^3.0",
@ -194,6 +194,10 @@
{ {
"type": "vcs", "type": "vcs",
"url": "https://github.com/beganovich/php-ansible" "url": "https://github.com/beganovich/php-ansible"
},
{
"type": "vcs",
"url": "https://github.com/turbo124/snappdf"
} }
], ],
"minimum-stability": "dev", "minimum-stability": "dev",

49
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "7c67ca71986b97fc72bba5eba530e878", "content-hash": "edc6905124cb32fef6a13befb3d5a4e1",
"packages": [ "packages": [
{ {
"name": "adrienrn/php-mimetyper", "name": "adrienrn/php-mimetyper",
@ -684,16 +684,16 @@
}, },
{ {
"name": "beganovich/snappdf", "name": "beganovich/snappdf",
"version": "v5.0", "version": "dev-master",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/beganovich/snappdf.git", "url": "https://github.com/turbo124/snappdf.git",
"reference": "3b21c7a88a4d05b01a606bc74f1950b0e9e820b1" "reference": "adadaf593dca174db46efa139bdff844b3a64da8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/beganovich/snappdf/zipball/3b21c7a88a4d05b01a606bc74f1950b0e9e820b1", "url": "https://api.github.com/repos/turbo124/snappdf/zipball/adadaf593dca174db46efa139bdff844b3a64da8",
"reference": "3b21c7a88a4d05b01a606bc74f1950b0e9e820b1", "reference": "adadaf593dca174db46efa139bdff844b3a64da8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -708,6 +708,7 @@
"friendsofphp/php-cs-fixer": "^3.6", "friendsofphp/php-cs-fixer": "^3.6",
"phpunit/phpunit": "^11.0" "phpunit/phpunit": "^11.0"
}, },
"default-branch": true,
"bin": [ "bin": [
"snappdf" "snappdf"
], ],
@ -717,7 +718,11 @@
"Beganovich\\Snappdf\\": "src/" "Beganovich\\Snappdf\\": "src/"
} }
}, },
"notification-url": "https://packagist.org/downloads/", "autoload-dev": {
"psr-4": {
"Test\\Snappdf\\": "tests/"
}
},
"license": [ "license": [
"MIT" "MIT"
], ],
@ -729,10 +734,9 @@
], ],
"description": "Convert webpages or HTML into the PDF file using Chromium or Google Chrome.", "description": "Convert webpages or HTML into the PDF file using Chromium or Google Chrome.",
"support": { "support": {
"issues": "https://github.com/beganovich/snappdf/issues", "source": "https://github.com/turbo124/snappdf/tree/master"
"source": "https://github.com/beganovich/snappdf/tree/v5.0"
}, },
"time": "2024-03-20T22:03:41+00:00" "time": "2024-07-22T09:26:26+00:00"
}, },
{ {
"name": "braintree/braintree_php", "name": "braintree/braintree_php",
@ -18944,16 +18948,16 @@
}, },
{ {
"name": "spatie/backtrace", "name": "spatie/backtrace",
"version": "1.6.1", "version": "1.6.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/spatie/backtrace.git", "url": "https://github.com/spatie/backtrace.git",
"reference": "8373b9d51638292e3bfd736a9c19a654111b4a23" "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/spatie/backtrace/zipball/8373b9d51638292e3bfd736a9c19a654111b4a23", "url": "https://api.github.com/repos/spatie/backtrace/zipball/1a9a145b044677ae3424693f7b06479fc8c137a9",
"reference": "8373b9d51638292e3bfd736a9c19a654111b4a23", "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -18991,7 +18995,7 @@
"spatie" "spatie"
], ],
"support": { "support": {
"source": "https://github.com/spatie/backtrace/tree/1.6.1" "source": "https://github.com/spatie/backtrace/tree/1.6.2"
}, },
"funding": [ "funding": [
{ {
@ -19003,20 +19007,20 @@
"type": "other" "type": "other"
} }
], ],
"time": "2024-04-24T13:22:11+00:00" "time": "2024-07-22T08:21:24+00:00"
}, },
{ {
"name": "spatie/error-solutions", "name": "spatie/error-solutions",
"version": "1.0.5", "version": "1.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/spatie/error-solutions.git", "url": "https://github.com/spatie/error-solutions.git",
"reference": "4bb6c734dc992b2db3e26df1ef021c75d2218b13" "reference": "a014da18f2675ea15af0ba97f7e9aee59e13964f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/spatie/error-solutions/zipball/4bb6c734dc992b2db3e26df1ef021c75d2218b13", "url": "https://api.github.com/repos/spatie/error-solutions/zipball/a014da18f2675ea15af0ba97f7e9aee59e13964f",
"reference": "4bb6c734dc992b2db3e26df1ef021c75d2218b13", "reference": "a014da18f2675ea15af0ba97f7e9aee59e13964f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -19069,7 +19073,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/spatie/error-solutions/issues", "issues": "https://github.com/spatie/error-solutions/issues",
"source": "https://github.com/spatie/error-solutions/tree/1.0.5" "source": "https://github.com/spatie/error-solutions/tree/1.1.0"
}, },
"funding": [ "funding": [
{ {
@ -19077,7 +19081,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-07-09T12:13:32+00:00" "time": "2024-07-22T08:18:22+00:00"
}, },
{ {
"name": "spatie/flare-client-php", "name": "spatie/flare-client-php",
@ -19577,6 +19581,7 @@
"minimum-stability": "dev", "minimum-stability": "dev",
"stability-flags": { "stability-flags": {
"asm/php-ansible": 20, "asm/php-ansible": 20,
"beganovich/snappdf": 20,
"horstoeko/orderx": 20, "horstoeko/orderx": 20,
"invoiceninja/einvoice": 20, "invoiceninja/einvoice": 20,
"socialiteproviders/apple": 20 "socialiteproviders/apple": 20

View File

@ -17,8 +17,8 @@ return [
'require_https' => env('REQUIRE_HTTPS', true), 'require_https' => env('REQUIRE_HTTPS', true),
'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_url' => rtrim(env('APP_URL', ''), '/'),
'app_domain' => env('APP_DOMAIN', 'invoicing.co'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
'app_version' => env('APP_VERSION', '5.10.12'), 'app_version' => env('APP_VERSION', '5.10.13'),
'app_tag' => env('APP_TAG', '5.10.12'), 'app_tag' => env('APP_TAG', '5.10.13'),
'minimum_client_version' => '5.0.16', 'minimum_client_version' => '5.0.16',
'terms_version' => '1.0.1', 'terms_version' => '1.0.1',
'api_secret' => env('API_SECRET', false), 'api_secret' => env('API_SECRET', false),

View File

@ -11,6 +11,8 @@
namespace Tests\Integration\Einvoice\Storecove; namespace Tests\Integration\Einvoice\Storecove;
use App\DataMapper\ClientSettings;
use App\Models\Client;
use Tests\TestCase; use Tests\TestCase;
use Tests\MockAccountData; use Tests\MockAccountData;
use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Foundation\Testing\DatabaseTransactions;
@ -64,7 +66,7 @@ class StorecoveTest extends TestCase
// { // {
// $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove(); // $sc = new \App\Services\EDocument\Gateway\Storecove\Storecove();
// $r = $sc->addIdentifier(290868, "DE923356489", "DE:VAT"); // $r = $sc->addIdentifier(291394, "DE923356489", "DE:VAT");
// nlog($r); // nlog($r);
@ -347,4 +349,45 @@ $x = '<?xml version="1.0" encoding="utf-8"?>
} }
public function testCreateCHClient()
{
Client::unguard();
$c =
Client::create([
'company_id' => $this->company->id,
'user_id' => $this->user->id,
'name' => 'Test Company AG',
'website' => 'https://www.testcompany.ch',
'private_notes' => 'These are some private notes about the test client.',
'balance' => 0,
'paid_to_date' => 0,
'vat_number' => '654321987',
'id_number' => 'CH9300762011623852957', // Sample Swiss IBAN
'custom_value1' => '2024-07-22 10:00:00',
'custom_value2' => 'blue',
'custom_value3' => 'sampleword',
'custom_value4' => 'test@example.com',
'address1' => '123',
'address2' => 'Test Street 45',
'city' => 'Zurich',
'state' => 'Zurich',
'postal_code' => '8001',
'country_id' => '756', // Switzerland
'shipping_address1' => '123',
'shipping_address2' => 'Test Street 45',
'shipping_city' => 'Zurich',
'shipping_state' => 'Zurich',
'shipping_postal_code' => '8001',
'shipping_country_id' => '756', // Switzerland
'settings' => ClientSettings::Defaults(),
'client_hash' => \Illuminate\Support\Str::random(32),
'routing_id' => '',
]);
$this->assertInstanceOf(\App\Models\Client::class, $c);
}
} }

View File

@ -848,4 +848,5 @@ trait MockAccountData
return $line_items; return $line_items;
} }
} }