Merge pull request #8537 from turbo124/v5-develop

v5.6.0
This commit is contained in:
David Bomba 2023-06-07 18:29:58 +10:00 committed by GitHub
commit 8213d32319
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
179 changed files with 3575 additions and 203233 deletions

View File

@ -1 +1 @@
5.5.124
5.6.0

View File

@ -223,7 +223,7 @@ class Rule extends BaseRule implements RuleInterface
public function calculateRates(): self
{
if ($this->client->is_tax_exempt) {
nlog("tax exempt");
// nlog("tax exempt");
$this->tax_rate = 0;
$this->reduced_tax_rate = 0;
// } elseif($this->client_subregion != $this->client->company->tax_data->seller_subregion && in_array($this->client_subregion, $this->eu_country_codes) && $this->client->has_valid_vat_number && $this->eu_business_tax_exempt) {
@ -247,7 +247,6 @@ class Rule extends BaseRule implements RuleInterface
// $this->reduced_tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->company->country()->iso_3166_2}->reduced_tax_rate;
// }
} else {
nlog("default tax");
$this->tax_rate = $this->client->company->tax_data->regions->AU->subregions->{$this->client->company->country()->iso_3166_2}->tax_rate;
$this->reduced_tax_rate = $this->client->company->tax_data->regions->AU->subregions->{$this->client->company->country()->iso_3166_2}->reduced_tax_rate;
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\BE;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'BTW';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\BG;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'НДС';
}

View File

@ -263,7 +263,8 @@ class BaseRule implements RuleInterface
public function isTaxableRegion(): bool
{
return $this->client->company->tax_data->regions->{$this->client_region}->tax_all_subregions || $this->client->company->tax_data->regions->{$this->client_region}->subregions->{$this->client_subregion}->apply_tax;
return $this->client->company->tax_data->regions->{$this->client_region}->tax_all_subregions ||
(property_exists($this->client->company->tax_data->regions->{$this->client_region}->subregions, $this->client_subregion) && $this->client->company->tax_data->regions->{$this->client_region}->subregions->{$this->client_subregion}->apply_tax);
}
public function defaultForeign(): self

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\CY;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'ΦΠΑ';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\CZ;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'DPH';
}

View File

@ -217,20 +217,20 @@ class Rule extends BaseRule implements RuleInterface
public function calculateRates(): self
{
if ($this->client->is_tax_exempt) {
nlog("tax exempt");
// nlog("tax exempt");
$this->tax_rate = 0;
$this->reduced_tax_rate = 0;
}
elseif($this->client_subregion != $this->client->company->tax_data->seller_subregion && in_array($this->client_subregion, $this->eu_country_codes) && $this->client->vat_number && $this->eu_business_tax_exempt)
// elseif($this->client_subregion != $this->client->company->tax_data->seller_subregion && in_array($this->client_subregion, $this->eu_country_codes) && $this->client->has_valid_vat_number && $this->eu_business_tax_exempt)
{
nlog("euro zone and tax exempt");
// nlog("euro zone and tax exempt");
$this->tax_rate = 0;
$this->reduced_tax_rate = 0;
}
elseif(!in_array($this->client_subregion, $this->eu_country_codes) && ($this->foreign_consumer_tax_exempt || $this->foreign_business_tax_exempt)) //foreign + tax exempt
{
nlog("foreign and tax exempt");
// nlog("foreign and tax exempt");
$this->tax_rate = 0;
$this->reduced_tax_rate = 0;
}
@ -242,18 +242,18 @@ class Rule extends BaseRule implements RuleInterface
{
if(($this->client->company->tax_data->seller_subregion != $this->client_subregion) && $this->client->company->tax_data->regions->EU->has_sales_above_threshold)
{
nlog("eu zone with sales above threshold");
// nlog("eu zone with sales above threshold");
$this->tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->country->iso_3166_2}->tax_rate;
$this->reduced_tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->country->iso_3166_2}->reduced_tax_rate;
}
else {
nlog("EU with intra-community supply ie DE to DE");
// nlog("EU with intra-community supply ie DE to DE");
$this->tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->company->country()->iso_3166_2}->tax_rate;
$this->reduced_tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->company->country()->iso_3166_2}->reduced_tax_rate;
}
}
else {
nlog("default tax");
// nlog("default tax");
$this->tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->company->country()->iso_3166_2}->tax_rate;
$this->reduced_tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->company->country()->iso_3166_2}->reduced_tax_rate;
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\DK;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'Moms';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\EE;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'KM';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\ES;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'IVA';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\FI;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'ALV';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\FR;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'TVA';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\GR;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'IVA';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\HR;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'PDV';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\HU;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'ÁFA';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\IE;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'VAT';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\IT;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'IVA';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\LT;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'PVM';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\LU;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'TVA';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\LV;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'PVN';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\MT;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'VAT';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\NL;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'BTW';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\PT;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'IVA';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\RO;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'TVA';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\SE;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'Moms';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\SI;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'DDV';
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Tax\SK;
use App\DataMapper\Tax\DE\Rule as DERule;
class Rule extends DERule
{
/** @var string $seller_region */
public string $seller_region = 'EU';
/** @var bool $consumer_tax_exempt */
public bool $consumer_tax_exempt = false;
/** @var bool $business_tax_exempt */
public bool $business_tax_exempt = false;
/** @var bool $eu_business_tax_exempt */
public bool $eu_business_tax_exempt = true;
/** @var bool $foreign_business_tax_exempt */
public bool $foreign_business_tax_exempt = false;
/** @var bool $foreign_consumer_tax_exempt */
public bool $foreign_consumer_tax_exempt = false;
/** @var float $tax_rate */
public float $tax_rate = 0;
/** @var float $reduced_tax_rate */
public float $reduced_tax_rate = 0;
public string $tax_name1 = 'DPH';
}

View File

@ -344,9 +344,9 @@ class TaxModel
$this->regions->EU->subregions = new \stdClass();
$this->regions->EU->subregions->AT = new \stdClass();
$this->regions->EU->subregions->AT->tax_rate = 21;
$this->regions->EU->subregions->AT->tax_rate = 20;
$this->regions->EU->subregions->AT->tax_name = 'USt';
$this->regions->EU->subregions->AT->reduced_tax_rate = 11;
$this->regions->EU->subregions->AT->reduced_tax_rate = 10;
$this->regions->EU->subregions->AT->apply_tax = false;
$this->regions->EU->subregions->BE = new \stdClass();

View File

@ -105,7 +105,7 @@ class Handler extends ExceptionHandler
if($exception instanceof ThrottleRequestsException && class_exists(\Modules\Admin\Events\ThrottledExceptionRaised::class)) {
$uri = urldecode(request()->getRequestUri());
event(new \Modules\Admin\Events\ThrottledExceptionRaised(auth()->user()?->account?->key, $uri));
event(new \Modules\Admin\Events\ThrottledExceptionRaised(auth()->user()?->account?->key, $uri, request()->ip()));
}
Integration::configureScope(function (Scope $scope): void {

View File

@ -138,6 +138,7 @@ abstract class QueryFilters
*/
public function status(string $filter = ''): Builder
{
if (strlen($filter) == 0) {
return $this->builder;
}
@ -146,17 +147,17 @@ abstract class QueryFilters
return $this->builder->where(function ($query) use ($filters) {
if (in_array(self::STATUS_ACTIVE, $filters)) {
$query->orWhereNull('deleted_at');
$query = $query->orWhereNull('deleted_at');
}
if (in_array(self::STATUS_ARCHIVED, $filters)) {
$query->orWhere(function ($query) {
$query->whereNotNull('deleted_at')->where('is_deleted', 0);
$query = $query->orWhere(function ($q) {
$q->whereNotNull('deleted_at')->where('is_deleted', 0);
});
}
if (in_array(self::STATUS_DELETED, $filters)) {
$query->orWhere('is_deleted', 1);
$query = $query->orWhere('is_deleted', 1);
}
});
}

View File

@ -61,32 +61,32 @@ class InvoiceItemSum
private array $tax_jurisdictions = [
'AT', // Austria
// 'BE', // Belgium
// 'BG', // Bulgaria
// 'CY', // Cyprus
// 'CZ', // Czech Republic
'BE', // Belgium
'BG', // Bulgaria
'CY', // Cyprus
'CZ', // Czech Republic
'DE', // Germany
// 'DK', // Denmark
// 'EE', // Estonia
// 'ES', // Spain
// 'FI', // Finland
// 'FR', // France
// 'GR', // Greece
// 'HR', // Croatia
// 'HU', // Hungary
// 'IE', // Ireland
// 'IT', // Italy
// 'LT', // Lithuania
// 'LU', // Luxembourg
// 'LV', // Latvia
// 'MT', // Malta
// 'NL', // Netherlands
// 'PL', // Poland
// 'PT', // Portugal
// 'RO', // Romania
// 'SE', // Sweden
// 'SI', // Slovenia
// 'SK', // Slovakia
'DK', // Denmark
'EE', // Estonia
'ES', // Spain
'FI', // Finland
'FR', // France
'GR', // Greece
'HR', // Croatia
'HU', // Hungary
'IE', // Ireland
'IT', // Italy
'LT', // Lithuania
'LU', // Luxembourg
'LV', // Latvia
'MT', // Malta
'NL', // Netherlands
'PL', // Poland
'PT', // Portugal
'RO', // Romania
'SE', // Sweden
'SI', // Slovenia
'SK', // Slovakia
'US', // USA

View File

@ -11,12 +11,13 @@
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Libraries\MultiDB;
use App\Models\Account;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use App\Models\Company;
use App\Libraries\MultiDB;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Password;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller
{

View File

@ -69,7 +69,7 @@ class ResetPasswordController extends Controller
$account = Account::first();
}
return $this->render('auth.passwords.reset', ['root' => 'themes', 'token' => $token, 'account' => $account]);
return $this->render('auth.passwords.reset', ['root' => 'themes', 'token' => $token, 'account' => $account, 'email' => $request->email]);
}
/**
@ -111,4 +111,28 @@ class ResetPasswordController extends Controller
return redirect('/');
}
/**
* Get the response for a successful password reset.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetResponse(Request $request, $response)
{
if ($request->wantsJson()) {
return new JsonResponse(['message' => trans($response)], 200);
}
if(Ninja::isHosted() && $request->hasHeader('X-React')){
return redirect('https://app.invoicing.co/#/login');
}
elseif($request->hasHeader('X-React'))
return redirect('/#/login');
return redirect($this->redirectPath())
->with('status', trans($response));
}
}

View File

@ -176,7 +176,9 @@ class PreviewController extends BaseController
if (Ninja::isHosted() && !in_array($request->getHost(), ['preview.invoicing.co','staging.invoicing.co'])) {
return response()->json(['message' => 'This server cannot handle this request.'], 400);
}
$start = microtime(true);
/** @var \App\Models\User $user */
$user = auth()->user();
@ -322,6 +324,8 @@ class PreviewController extends BaseController
$response = Response::make($file_path, 200);
$response->header('Content-Type', 'application/pdf');
$response->header('Server-Timing', microtime(true)-$start);
return $response;
}

View File

@ -15,44 +15,18 @@ use App\Libraries\MultiDB;
class SubdomainController extends BaseController
{
private $protected = [
'www',
'app',
'ninja',
'sentry',
'sentry2',
'staging',
'pdf',
'demo',
'docs',
'client_domain',
'custom_domain',
'preview',
'invoiceninja',
'cname',
'sandbox',
'stage',
'html',
'lb',
'shopify',
'beta',
'prometh',
'license',
'socket',
];
public function __construct()
{
}
/**
* Display a listing of the resource.
* Return if a subdomain is available.
*
* @return void
*/
public function index()
{
if (in_array(request()->input('subdomain'), $this->protected) || MultiDB::findAndSetDbByDomain(['subdomain' => request()->input('subdomain')])) {
if (!MultiDB::checkDomainAvailable(request()->input('subdomain'))) {
return response()->json(['message' => 'Domain not available'], 401);
}

View File

@ -84,6 +84,7 @@ trait VerifiesUserEmail
return $this->render('auth.confirmed', [
'root' => 'themes',
'message' => ctrans('texts.security_confirmation'),
'redirect_url' => request()->hasHeader('X-React') ? 'https://app.invoicing.co/#/' : url('/'),
]);
}
}

View File

@ -231,8 +231,11 @@ class UserController extends BaseController
$return_user_collection = collect();
$users->each(function ($user, $key) use ($action, $return_user_collection) {
if (auth()->user()->can('edit', $user)) {
/** @var \App\Models\User $logged_in_user */
$logged_in_user = auth()->user();
$users->each(function ($user, $key) use ($logged_in_user, $action, $return_user_collection) {
if ($logged_in_user->can('edit', $user)) {
$this->user_repo->{$action}($user);
$return_user_collection->push($user->id);
@ -251,12 +254,11 @@ class UserController extends BaseController
*/
public function detach(DetachCompanyUserRequest $request, User $user)
{
// if ($request->entityIsDeleted($user)) {
// return $request->disallowUpdate();
// }
/** @var \App\Models\User $logged_in_user */
$logged_in_user = auth()->user();
$company_user = CompanyUser::whereUserId($user->id)
->whereCompanyId(auth()->user()->companyId())
->whereCompanyId($logged_in_user->companyId())
->withTrashed()
->first();

View File

@ -15,7 +15,7 @@ class Cors
// ALLOW OPTIONS METHOD
$headers = [
'Access-Control-Allow-Methods'=> 'POST, GET, OPTIONS, PUT, DELETE',
'Access-Control-Allow-Headers'=> 'X-API-PASSWORD-BASE64,X-API-COMPANY-KEY,X-CLIENT-VERSION,X-API-SECRET,X-API-TOKEN,X-API-PASSWORD,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Disposition,Range,X-CSRF-TOKEN,X-XSRF-TOKEN,X-LIVEWIRE',
'Access-Control-Allow-Headers'=> 'X-React,X-API-PASSWORD-BASE64,X-API-COMPANY-KEY,X-CLIENT-VERSION,X-API-SECRET,X-API-TOKEN,X-API-PASSWORD,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Disposition,Range,X-CSRF-TOKEN,X-XSRF-TOKEN,X-LIVEWIRE',
];
return Response::make('OK', 200, $headers);
@ -25,7 +25,7 @@ class Cors
$response->headers->set('Access-Control-Allow-Origin', '*');
$response->headers->set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
$response->headers->set('Access-Control-Allow-Headers', 'X-API-PASSWORD-BASE64,X-API-COMPANY-KEY,X-API-SECRET,X-API-TOKEN,X-API-PASSWORD,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Disposition,Range,X-CSRF-TOKEN,X-XSRF-TOKEN,X-LIVEWIRE');
$response->headers->set('Access-Control-Allow-Headers', 'X-React,X-API-PASSWORD-BASE64,X-API-COMPANY-KEY,X-API-SECRET,X-API-TOKEN,X-API-PASSWORD,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Disposition,Range,X-CSRF-TOKEN,X-XSRF-TOKEN,X-LIVEWIRE');
$response->headers->set('Access-Control-Expose-Headers', 'X-APP-VERSION,X-MINIMUM-CLIENT-VERSION,Content-Disposition');
$response->headers->set('X-APP-VERSION', config('ninja.app_version'));
$response->headers->set('X-MINIMUM-CLIENT-VERSION', config('ninja.minimum_client_version'));

View File

@ -61,14 +61,11 @@ class UpdateCompanyRequest extends Request
if (isset($input['portal_mode']) && ($input['portal_mode'] == 'domain' || $input['portal_mode'] == 'iframe')) {
$rules['portal_domain'] = 'sometimes|url';
} else {
if (Ninja::isHosted()) {
$rules['subdomain'] = ['nullable', 'regex:/^[a-zA-Z0-9.-]+[a-zA-Z0-9]$/', new ValidSubdomain($this->all())];
} else {
$rules['subdomain'] = 'nullable|regex:/^[a-zA-Z0-9.-]+[a-zA-Z0-9]$/';
}
}
if (Ninja::isHosted())
$rules['subdomain'] = ['nullable', 'regex:/^[a-zA-Z0-9.-]+[a-zA-Z0-9]$/', new ValidSubdomain()];
return $rules;
}
@ -85,6 +82,10 @@ class UpdateCompanyRequest extends Request
$input['settings'] = (array)$this->filterSaveableSettings($input['settings']);
}
if(array_key_exists('subdomain', $input) && $this->subdomain == $input['subdomain']) {
unset($input['subdomain']);
}
if(array_key_exists('e_invoice_certificate_passphrase', $input) && empty($input['e_invoice_certificate_passphrase'])) {
unset($input['e_invoice_certificate_passphrase']);
}

View File

@ -59,6 +59,11 @@ class StoreSchedulerRequest extends Request
if (array_key_exists('next_run', $input) && is_string($input['next_run'])) {
$this->merge(['next_run_client' => $input['next_run']]);
}
if($input['template'] == 'email_record'){
$input['frequency_id'] = 0;
}
$this->replace($input);
}
}

View File

@ -57,5 +57,12 @@ class UpdateSchedulerRequest extends Request
$this->merge(['next_run_client' => $input['next_run']]);
}
if($input['template'] == 'email_record') {
$input['frequency_id'] = 0;
}
$this->replace($input);
}
}

View File

@ -19,25 +19,18 @@ use Illuminate\Contracts\Validation\Rule;
*/
class ValidSubdomain implements Rule
{
/**
* @param string $attribute
* @param mixed $value
* @return bool
*/
private $input;
public function __construct($input)
public function __construct()
{
$this->input = $input;
}
public function passes($attribute, $value)
{
if (empty($input['subdomain'])) {
if (empty($value)) {
return true;
}
return MultiDB::checkDomainAvailable($input['subdomain']);
return MultiDB::checkDomainAvailable($value);
}
/**

View File

@ -144,12 +144,12 @@ class AdjustProductInventory implements ShouldQueue
private function notifyStocklevels(Product $product, string $notification_level)
{
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new InventoryNotificationObject($product, $notification_level))->build());
$nmo->company = $this->company;
$nmo->settings = $this->company->settings;
$this->company->company_users->each(function ($cu) use ($product, $nmo) {
$this->company->company_users->each(function ($cu) use ($product, $nmo, $notification_level) {
if ($this->checkNotificationExists($cu, $product, ['inventory_all', 'inventory_user', 'inventory_threshold_all', 'inventory_threshold_user'])) {
$nmo->mailable = new NinjaMailer((new InventoryNotificationObject($product, $notification_level, $cu->portalType()))->build());
$nmo->to_user = $cu->user;
NinjaMailerJob::dispatch($nmo);
}

View File

@ -92,7 +92,7 @@ class PaymentFailedMailer implements ShouldQueue
if (($key = array_search('mail', $methods)) !== false) {
unset($methods[$key]);
$mail_obj = (new PaymentFailureObject($this->client, $this->error, $this->company, $amount, $this->payment_hash))->build();
$mail_obj = (new PaymentFailureObject($this->client, $this->error, $this->company, $amount, $this->payment_hash, $company_user->portalType()))->build();
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer($mail_obj);

View File

@ -95,7 +95,6 @@ class QuoteCheckExpired implements ShouldQueue
private function queueExpiredQuoteNotification(Quote $quote)
{
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new QuoteExpiredObject($quote, $quote->company))->build());
$nmo->company = $quote->company;
$nmo->settings = $quote->company->settings;
@ -107,6 +106,8 @@ class QuoteCheckExpired implements ShouldQueue
if (! $user) {
continue;
}
$nmo->mailable = new NinjaMailer((new QuoteExpiredObject($quote, $quote->company, $company_user->portalType()))->build());
/* Returns an array of notification methods */
$methods = $this->findUserNotificationTypes($quote->invitations()->first(), $company_user, 'quote', ['all_notifications', 'quote_expired', 'quote_expired_all', 'quote_expired_user']);

View File

@ -45,6 +45,32 @@ class MultiDB
public static $dbs = ['db-ninja-01', 'db-ninja-02'];
private static $protected_domains = [
'www',
'app',
'ninja',
'sentry',
'sentry2',
'staging',
'pdf',
'demo',
'docs',
'client_domain',
'custom_domain',
'preview',
'invoiceninja',
'cname',
'sandbox',
'stage',
'html',
'lb',
'shopify',
'beta',
'prometh',
'license',
'socket',
];
/**
* @return array
*/
@ -55,10 +81,15 @@ class MultiDB
public static function checkDomainAvailable($subdomain) : bool
{
if (! config('ninja.db.multi_db_enabled')) {
return Company::whereSubdomain($subdomain)->count() == 0;
}
if (in_array($subdomain, self::$protected_domains)) {
return false;
}
$current_db = config('database.default');
foreach (self::$dbs as $db) {

View File

@ -40,8 +40,6 @@ class CreditCreatedNotification implements ShouldQueue
{
MultiDB::setDb($event->company->db);
// $first_notification_sent = true;
$credit = $event->credit;
/* We loop through each user and determine whether they need to be notified */
@ -60,7 +58,7 @@ class CreditCreatedNotification implements ShouldQueue
unset($methods[$key]);
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new EntityCreatedObject($credit, 'credit'))->build());
$nmo->mailable = new NinjaMailer((new EntityCreatedObject($credit, 'credit', $company_user->portalType()))->build());
$nmo->company = $credit->company;
$nmo->settings = $credit->company->settings;
$nmo->to_user = $user;

View File

@ -56,7 +56,7 @@ class CreditEmailedNotification implements ShouldQueue
unset($methods[$key]);
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new EntitySentObject($event->invitation, 'credit', $event->template))->build());
$nmo->mailable = new NinjaMailer((new EntitySentObject($event->invitation, 'credit', $event->template, $company_user->portalType()))->build());
$nmo->company = $credit->company;
$nmo->settings = $credit->company->settings;
$nmo->to_user = $user;

View File

@ -24,7 +24,7 @@ class InvoiceCreatedNotification implements ShouldQueue
{
use UserNotifies;
public $delay = 7;
public $delay = 3;
public function __construct()
{
@ -48,11 +48,11 @@ class InvoiceCreatedNotification implements ShouldQueue
foreach ($event->company->company_users as $company_user) {
/* The User */
$user = $company_user->user;
if (! $user) {
continue;
}
/* This is only here to handle the alternate message channels - ie Slack */
// $notification = new EntitySentNotification($event->invitation, 'invoice');
@ -64,7 +64,7 @@ class InvoiceCreatedNotification implements ShouldQueue
unset($methods[$key]);
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new EntityCreatedObject($invoice, 'invoice'))->build());
$nmo->mailable = new NinjaMailer((new EntityCreatedObject($invoice, 'invoice', $company_user->portalType()))->build());
$nmo->company = $invoice->company;
$nmo->settings = $invoice->company->settings;
$nmo->to_user = $user;

View File

@ -64,7 +64,7 @@ class InvoiceEmailedNotification implements ShouldQueue
unset($methods[$key]);
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new EntitySentObject($event->invitation, 'invoice', $event->template))->build());
$nmo->mailable = new NinjaMailer((new EntitySentObject($event->invitation, 'invoice', $event->template, $company_user->portalType()))->build());
$nmo->company = $invoice->company;
$nmo->settings = $invoice->company->settings;
$nmo->to_user = $user;

View File

@ -49,7 +49,7 @@ class InvoiceFailedEmailNotification
unset($methods[$key]);
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new EntityFailedSendObject($event->invitation->withoutRelations(), 'invoice', $event->template, $event->message))->build());
$nmo->mailable = new NinjaMailer((new EntityFailedSendObject($event->invitation->withoutRelations(), 'invoice', $event->template, $event->message, $company_user->portalType()))->build());
$nmo->company = $invoice->company->withoutRelations();
$nmo->settings = $invoice->company->settings;
$nmo->to_user = $user;

View File

@ -70,7 +70,7 @@ class InvitationViewedListener implements ShouldQueue
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new EntityViewedObject($invitation, $entity_name))->build());
$nmo->mailable = new NinjaMailer((new EntityViewedObject($invitation, $entity_name, $company_user->portalType()))->build());
$nmo->company = $invitation->company;
$nmo->settings = $invitation->company->settings;

View File

@ -76,7 +76,7 @@ class PaymentNotification implements ShouldQueue
unset($methods[$key]);
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new EntityPaidObject($payment))->build());
$nmo->mailable = new NinjaMailer((new EntityPaidObject($payment, $company_user->portalType()))->build());
$nmo->company = $event->company;
$nmo->settings = $event->company->settings;
$nmo->to_user = $user;
@ -108,7 +108,7 @@ class PaymentNotification implements ShouldQueue
unset($methods[$key]);
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new EntityPaidObject($payment))->build());
$nmo->mailable = new NinjaMailer((new EntityPaidObject($payment, $company_user->portalType()))->build());
$nmo->company = $event->company;
$nmo->settings = $event->company->settings;
$nmo->to_user = $user;
@ -161,11 +161,12 @@ class PaymentNotification implements ShouldQueue
}
/**
* @param $data
* @param string $url
*/
private function sendAnalytics($data)
{
$data = utf8_encode($data);
private function sendAnalytics($url)
{
$data = mb_convert_encoding($url, 'UTF-8');
// $data = utf8_encode($data);
$curl = curl_init();
$opts = [

View File

@ -59,7 +59,7 @@ class PurchaseOrderAcceptedListener implements ShouldQueue
unset($methods[$key]);
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new PurchaseOrderAcceptedObject($purchase_order, $event->company))->build());
$nmo->mailable = new NinjaMailer((new PurchaseOrderAcceptedObject($purchase_order, $event->company, $company_user->portalType()))->build());
$nmo->company = $event->company;
$nmo->settings = $event->company->settings;

View File

@ -45,7 +45,6 @@ class PurchaseOrderCreatedListener implements ShouldQueue
$purchase_order = $event->purchase_order;
/* We loop through each user and determine whether they need to be notified */
foreach ($event->company->company_users as $company_user) {
/* The User */
@ -66,7 +65,7 @@ class PurchaseOrderCreatedListener implements ShouldQueue
unset($methods[$key]);
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new EntityCreatedObject($purchase_order, 'purchase_order'))->build());
$nmo->mailable = new NinjaMailer((new EntityCreatedObject($purchase_order, 'purchase_order', $company_user->portalType()))->build());
$nmo->company = $purchase_order->company;
$nmo->settings = $purchase_order->company->settings;

View File

@ -62,7 +62,7 @@ class PurchaseOrderEmailedNotification implements ShouldQueue
unset($methods[$key]);
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new EntitySentObject($event->invitation, 'purchase_order', 'purchase_order'))->build());
$nmo->mailable = new NinjaMailer((new EntitySentObject($event->invitation, 'purchase_order', 'purchase_order', $company_user->portalType()))->build());
$nmo->company = $purchase_order->company;
$nmo->settings = $purchase_order->company->settings;
$nmo->to_user = $user;

View File

@ -61,7 +61,7 @@ class QuoteApprovedNotification implements ShouldQueue
unset($methods[$key]);
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new QuoteApprovedObject($quote, $event->company))->build());
$nmo->mailable = new NinjaMailer((new QuoteApprovedObject($quote, $event->company, $company_user->portalType()))->build());
$nmo->company = $quote->company;
$nmo->settings = $quote->company->settings;

View File

@ -54,6 +54,12 @@ class QuoteCreatedNotification implements ShouldQueue
continue;
}
$use_react_link = false;
if(isset($company_user->react_settings->react_notification_link) && $company_user->react_settings->react_notification_link) {
$use_react_link = true;
}
/* This is only here to handle the alternate message channels - ie Slack */
// $notification = new EntitySentNotification($event->invitation, 'quote');
@ -65,7 +71,7 @@ class QuoteCreatedNotification implements ShouldQueue
unset($methods[$key]);
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new EntityCreatedObject($quote, 'quote'))->build());
$nmo->mailable = new NinjaMailer((new EntityCreatedObject($quote, 'quote', $company_user->portalType()))->build());
$nmo->company = $quote->company;
$nmo->settings = $quote->company->settings;

View File

@ -54,7 +54,7 @@ class QuoteEmailedNotification implements ShouldQueue
unset($methods[$key]);
$nmo = new NinjaMailerObject;
$nmo->mailable = new NinjaMailer((new EntitySentObject($event->invitation, 'quote', $event->template))->build());
$nmo->mailable = new NinjaMailer((new EntitySentObject($event->invitation, 'quote', $event->template, $company_user->portalType()))->build());
$nmo->company = $quote->company;
$nmo->settings = $quote->company->settings;
$nmo->to_user = $user;

View File

@ -11,19 +11,16 @@
namespace App\Mail\Admin;
use App\Models\User;
use App\Utils\Ninja;
use App\Models\Company;
use Illuminate\Support\Facades\App;
class AccountCreatedObject
{
public $user;
public $company;
public function __construct($user, $company)
public function __construct(public User $user, public Company $company)
{
$this->user = $user;
$this->company = $company;
}
public function build()

View File

@ -17,7 +17,7 @@ use App\Utils\Ninja;
use App\Utils\Traits\MakesHash;
use Illuminate\Support\Facades\App;
use stdClass;
//@deprecated
class AutoBillingFailureObject
{
use MakesHash;

View File

@ -33,10 +33,13 @@ class EntityCreatedObject
private $template_body;
public function __construct($entity, $entity_type)
protected bool $use_react_link;
public function __construct($entity, $entity_type, $use_react_link = false)
{
$this->entity_type = $entity_type;
$this->entity = $entity;
$this->use_react_link = $use_react_link;
}
/**
@ -81,7 +84,7 @@ class EntityCreatedObject
'purchase_order' => $this->entity->number,
]
),
'url' => $this->entity->invitations()->first()->getAdminLink(),
'url' => $this->entity->invitations()->first()->getAdminLink($this->use_react_link),
'button' => ctrans("texts.view_{$this->entity_type}"),
'signature' => $this->company->settings->email_signature,
'logo' => $this->company->present()->logo(),
@ -165,7 +168,7 @@ class EntityCreatedObject
return [
'title' => $this->getSubject(),
'message' => $this->getMessage(),
'url' => $this->entity->invitations()->first()->getAdminLink(),
'url' => $this->entity->invitations()->first()->getAdminLink($this->use_react_link),
'button' => ctrans("texts.view_{$this->entity_type}"),
'signature' => $settings->email_signature,
'logo' => $this->company->present()->logo(),

View File

@ -39,7 +39,9 @@ class EntityFailedSendObject
private $message;
public function __construct($invitation, $entity_type, $template, $message)
protected $use_react_url;
public function __construct($invitation, $entity_type, $template, $message, $use_react_url)
{
$this->invitation = $invitation;
$this->entity_type = $entity_type;
@ -48,6 +50,7 @@ class EntityFailedSendObject
$this->company = $invitation->company;
$this->template = $template;
$this->message = $message;
$this->use_react_url = $use_react_url;
}
public function build()
@ -149,7 +152,7 @@ class EntityFailedSendObject
'contact' => $this->contact->present()->name(),
]
),
'url' => $this->invitation->getAdminLink(),
'url' => $this->invitation->getAdminLink($this->use_react_url),
'button' => ctrans("texts.view_{$this->entity_type}"),
'signature' => $signature,
'logo' => $this->company->present()->logo(),

View File

@ -30,7 +30,7 @@ class EntityPaidObject
public $settings;
public function __construct(public Payment $payment)
public function __construct(public Payment $payment, protected bool $use_react_url)
{
$this->payment = $payment;
$this->company = $payment->company;
@ -98,7 +98,7 @@ class EntityPaidObject
'invoice' => $invoice_texts,
]
),
'url' => config('ninja.app_url'),
'url' => $this->payment->portalUrl($this->use_react_url),
'button' => ctrans('texts.view_payment'),
'signature' => $settings->email_signature,
'logo' => $this->company->present()->logo(),
@ -117,4 +117,5 @@ class EntityPaidObject
return $signature;
}
}

View File

@ -36,7 +36,9 @@ class EntitySentObject
private $template_body;
public function __construct($invitation, $entity_type, $template)
protected $use_react_url;
public function __construct($invitation, $entity_type, $template, $use_react_url)
{
$this->invitation = $invitation;
$this->entity_type = $entity_type;
@ -44,6 +46,7 @@ class EntitySentObject
$this->contact = $invitation->contact;
$this->company = $invitation->company;
$this->template = $template;
$this->use_react_url = $use_react_url;
}
public function build()
@ -78,7 +81,7 @@ class EntitySentObject
'purchase_order' => $this->entity->number,
]
),
'url' => $this->invitation->getAdminLink(),
'url' => $this->invitation->getAdminLink($this->use_react_url),
'button' => ctrans("texts.view_{$this->entity_type}"),
'signature' => $this->company->settings->email_signature,
'logo' => $this->company->present()->logo(),
@ -185,7 +188,7 @@ class EntitySentObject
return [
'title' => $this->getSubject(),
'message' => $this->getMessage(),
'url' => $this->invitation->getAdminLink(),
'url' => $this->invitation->getAdminLink($this->use_react_url),
'button' => ctrans("texts.view_{$this->entity_type}"),
'signature' => $settings->email_signature,
'logo' => $this->company->present()->logo(),

View File

@ -30,13 +30,16 @@ class EntityViewedObject
public $settings;
public function __construct($invitation, $entity_type)
protected $use_react_url;
public function __construct($invitation, $entity_type, $use_react_url)
{
$this->invitation = $invitation;
$this->entity_type = $entity_type;
$this->entity = $invitation->{$entity_type};
$this->contact = $invitation->contact;
$this->company = $invitation->company;
$this->use_react_url = $use_react_url;
}
public function build()
@ -104,7 +107,7 @@ class EntityViewedObject
'invoice' => $this->entity->number,
]
),
'url' => $this->invitation->getAdminLink(),
'url' => $this->invitation->getAdminLink($this->use_react_url),
'button' => ctrans("texts.view_{$this->entity_type}"),
'signature' => $settings->email_signature,
'logo' => $this->company->present()->logo(),

View File

@ -12,7 +12,6 @@
namespace App\Mail\Admin;
use App\Models\Company;
use App\Models\Product;
use App\Utils\Ninja;
use Illuminate\Support\Facades\App;
@ -20,19 +19,9 @@ use stdClass;
class InventoryNotificationObject
{
public Product $product;
public Company $company;
public $settings;
public string $notification_level;
public function __construct(Product $product, string $notification_level)
public function __construct(protected Product $product, public string $notification_level, protected bool $use_react_url)
{
$this->product = $product;
$this->company = $product->company;
$this->settings = $this->company->settings;
}
public function build()
@ -41,16 +30,16 @@ class InventoryNotificationObject
/* Init a new copy of the translator*/
$t = app('translator');
/* Set the locale*/
App::setLocale($this->company->getLocale());
App::setLocale($this->product->company->getLocale());
/* Set customized translations _NOW_ */
$t->replace(Ninja::transformTranslations($this->company->settings));
$t->replace(Ninja::transformTranslations($this->product->company->settings));
$mail_obj = new stdClass;
$mail_obj->amount = $this->getAmount();
$mail_obj->subject = $this->getSubject();
$mail_obj->data = $this->getData();
$mail_obj->markdown = 'email.admin.generic';
$mail_obj->tag = $this->company->company_key;
$mail_obj->tag = $this->product->company->company_key;
return $mail_obj;
}
@ -79,12 +68,12 @@ class InventoryNotificationObject
'product' => $this->product->product_key.': '.$this->product->notes,
]
),
'url' => config('ninja.app_url'),
'button' => ctrans('texts.login'),
'signature' => $this->settings->email_signature,
'logo' => $this->company->present()->logo(),
'settings' => $this->settings,
'whitelabel' => $this->company->account->isPaid() ? true : false,
'url' => $this->product->portalUrl($this->use_react_url),
'button' => $this->use_react_url ? ctrans('texts.product_library') : ctrans('ninja.app_url'),
'signature' => $this->product->company->settings->email_signature,
'logo' => $this->product->company->present()->logo(),
'settings' => $this->product->company->settings,
'whitelabel' => $this->product->company->account->isPaid() ? true : false,
];
return $data;

View File

@ -24,17 +24,6 @@ class PaymentFailureObject
{
use MakesHash;
public Client $client;
public string $error;
public Company $company;
public $amount;
public ?PaymentHash $payment_hash;
// private $invoices;
/**
* Create a new job instance.
*
@ -43,19 +32,8 @@ class PaymentFailureObject
* @param $company
* @param $amount
*/
public function __construct(Client $client, string $error, Company $company, $amount, ?PaymentHash $payment_hash)
public function __construct(public Client $client, public string $error, public Company $company, public float $amount, public ?PaymentHash $payment_hash, protected bool $use_react_url)
{
$this->client = $client;
$this->error = $error;
$this->company = $company;
$this->amount = $amount;
$this->company = $company;
$this->payment_hash = $payment_hash;
}
public function build()
@ -115,8 +93,8 @@ class PaymentFailureObject
'logo' => $this->company->present()->logo(),
'settings' => $this->client->getMergedSettings(),
'whitelabel' => $this->company->account->isPaid() ? true : false,
'url' => config('ninja.app_url'),
'button' => ctrans('texts.login'),
'url' => $this->client->portalUrl($this->use_react_url),
'button' => $this->use_react_url ? ctrans('texts.view_client') : ctrans('texts.login'),
'additional_info' => $this->error,
];

View File

@ -21,16 +21,9 @@ use stdClass;
class PurchaseOrderAcceptedObject
{
public $purchase_order;
public $company;
public $settings;
public function __construct(PurchaseOrder $purchase_order, Company $company)
public function __construct(public PurchaseOrder $purchase_order, public Company $company, protected bool $use_react_url)
{
$this->purchase_order = $purchase_order;
$this->company = $company;
}
public function build()
@ -90,7 +83,7 @@ class PurchaseOrderAcceptedObject
'purchase_order' => $this->purchase_order->number,
]
),
'url' => $this->purchase_order->invitations->first()->getAdminLink(),
'url' => $this->purchase_order->invitations->first()->getAdminLink($this->use_react_url),
'button' => ctrans('texts.view_purchase_order'),
'signature' => $settings->email_signature,
'logo' => $this->company->present()->logo(),

View File

@ -21,16 +21,9 @@ use stdClass;
class QuoteApprovedObject
{
public $quote;
public $company;
public $settings;
public function __construct(Quote $quote, Company $company)
public function __construct(public Quote $quote, public Company $company, public bool $use_react_url)
{
$this->quote = $quote;
$this->company = $company;
}
public function build()
@ -90,7 +83,7 @@ class QuoteApprovedObject
'invoice' => $this->quote->number,
]
),
'url' => $this->quote->invitations->first()->getAdminLink(),
'url' => $this->quote->invitations->first()->getAdminLink($this->use_react_url),
'button' => ctrans('texts.view_quote'),
'signature' => $settings->email_signature,
'logo' => $this->company->present()->logo(),

View File

@ -21,16 +21,9 @@ use stdClass;
class QuoteExpiredObject
{
public $quote;
public $company;
public $settings;
public function __construct(Quote $quote, Company $company)
public function __construct(public Quote $quote, public Company $company, public bool $use_react_url)
{
$this->quote = $quote;
$this->company = $company;
}
public function build()
@ -90,8 +83,8 @@ class QuoteExpiredObject
'invoice' => $this->quote->number,
]
),
'url' => $this->quote->invitations->first()->getAdminLink(),
'button' => ctrans('texts.view_quote'),
'url' => $this->quote->invitations->first()->getAdminLink($this->use_react_url),
'button' => $this->use_react_url ? ctrans('texts.view_quote') : ctrans('texts.login'),
'signature' => $settings->email_signature,
'logo' => $this->company->present()->logo(),
'settings' => $settings,

View File

@ -865,4 +865,9 @@ class Client extends BaseModel implements HasLocalePreference
{
return ctrans('texts.client');
}
public function portalUrl(bool $use_react_url): string
{
return $use_react_url ? config('ninja.react_url'). "/clients/{$this->hashed_id}": config('ninja.app_url');
}
}

View File

@ -241,37 +241,40 @@ class Company extends BaseModel
protected array $tax_coverage_countries = [
'US',
// //EU countries
// 'AT', // Austria
// 'BE', // Belgium
// 'BG', // Bulgaria
// 'CY', // Cyprus
// 'CZ', // Czech Republic
// 'DE', // Germany
// 'DK', // Denmark
// 'EE', // Estonia
// 'ES', // Spain
// 'FI', // Finland
// 'FR', // France
// 'GR', // Greece
// 'HR', // Croatia
// 'HU', // Hungary
// 'IE', // Ireland
// 'IT', // Italy
// 'LT', // Lithuania
// 'LU', // Luxembourg
// 'LV', // Latvia
// 'MT', // Malta
// 'NL', // Netherlands
// 'PL', // Poland
// 'PT', // Portugal
// 'RO', // Romania
// 'SE', // Sweden
// 'SI', // Slovenia
// 'SK', // Slovakia
'AT', // Austria
'BE', // Belgium
'BG', // Bulgaria
'CY', // Cyprus
'CZ', // Czech Republic
'DE', // Germany
'DK', // Denmark
'EE', // Estonia
'ES', // Spain
'FI', // Finland
'FR', // France
'GR', // Greece
'HR', // Croatia
'HU', // Hungary
'IE', // Ireland
'IT', // Italy
'LT', // Lithuania
'LU', // Luxembourg
'LV', // Latvia
'MT', // Malta
'NL', // Netherlands
'PL', // Poland
'PT', // Portugal
'RO', // Romania
'SE', // Sweden
'SI', // Slovenia
'SK', // Slovakia
// //EU Countries
'AU', // Australia
];
protected $fillable = [
'invoice_task_item_description',
'invoice_task_project_header',
'invoice_task_hours',
'markdown_enabled',
'calculate_expense_tax_by_amount',

View File

@ -35,7 +35,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
* @property int|null $updated_at
* @property int $permissions_updated_at
* @property string $ninja_portal_url
* @property string|null $react_settings
* @property object|null $react_settings
* @property-read \App\Models\Account $account
* @property-read \App\Models\Company $company
* @property-read \App\Models\CompanyUser $cu
@ -128,6 +128,7 @@ class CompanyUser extends Pivot
'settings' => 'object',
'notifications' => 'object',
'permissions' => 'string',
'react_settings' => 'object',
];
protected $fillable = [
@ -195,8 +196,22 @@ class CompanyUser extends Pivot
public function scopeAuthCompany($query)
{
$query->where('company_id', auth()->user()->companyId());
/** @var \App\Models\User $user */
$user = auth()->user();
$query->where('company_id', $user->companyId());
return $query;
}
}
/**
* Determines if the notifications should be React or Flutter links
*
* @return bool
*/
public function portalType():bool
{
return isset($this->react_settings->react_notification_link) && $this->react_settings->react_notification_link;
}
}

View File

@ -112,7 +112,14 @@ class CreditInvitation extends BaseModel
{
return $this->belongsTo(Credit::class)->withTrashed();
}
/**
* @return mixed
*/
public function entity()
{
return $this->belongsTo(Credit::class)->withTrashed();
}
/**
* @return mixed
*/

View File

@ -115,6 +115,14 @@ class InvoiceInvitation extends BaseModel
return $this->belongsTo(Invoice::class)->withTrashed();
}
/**
* @return mixed
*/
public function getEntity()
{
return $this->belongsTo(Invoice::class)->withTrashed();
}
/**
* @return mixed
*/

View File

@ -557,4 +557,10 @@ class Payment extends BaseModel
{
return ctrans('texts.payment');
}
public function portalUrl($use_react_url)
{
return $use_react_url ? config('ninja.react_url')."/payments/{$this->hashed_id}/edit" : config('ninja.app_url');
}
}

View File

@ -200,4 +200,9 @@ class Product extends BaseModel
return $converter->convert($this->notes);
}
public function portalUrl($use_react_url): string
{
return $use_react_url ? config('ninja.react_url') . "/products/{$this->hashed_id}/edit" : config('ninja.app_url');
}
}

View File

@ -110,6 +110,14 @@ class PurchaseOrderInvitation extends BaseModel
return $this->belongsTo(PurchaseOrder::class)->withTrashed();
}
/**
* @return mixed
*/
public function entity()
{
return $this->belongsTo(PurchaseOrder::class)->withTrashed();
}
/**
* @return mixed
*/
@ -186,8 +194,16 @@ class PurchaseOrderInvitation extends BaseModel
}
}
public function getAdminLink() :string
public function getAdminLink($use_react_link = false) :string
{
return $this->getLink().'?silent=true';
return $use_react_link ? $this->getReactLink() : $this->getLink().'?silent=true';
}
private function getReactLink(): string
{
$entity_type = Str::snake(class_basename($this->entityType()));
return config('ninja.react_url')."/{$entity_type}s/{$this->{$entity_type}->hashed_id}/edit";
}
}

View File

@ -113,6 +113,14 @@ class QuoteInvitation extends BaseModel
return $this->belongsTo(Quote::class)->withTrashed();
}
/**
* @return mixed
*/
public function entity()
{
return $this->belongsTo(Quote::class)->withTrashed();
}
/**
* @return mixed
*/

View File

@ -104,6 +104,14 @@ class RecurringInvoiceInvitation extends BaseModel
return $this->belongsTo(RecurringInvoice::class)->withTrashed();
}
/**
* @return mixed
*/
public function entity()
{
return $this->belongsTo(RecurringInvoice::class)->withTrashed();
}
/**
* @return mixed
*/

View File

@ -154,7 +154,7 @@ class Scheduler extends BaseModel
switch ($this->frequency_id) {
case 0: //used only for email entities
$next_run = now()->startOfDay();
$next_run = $this->next_run;
break;
case RecurringInvoice::FREQUENCY_DAILY:
$next_run = now()->startOfDay()->addDay();

View File

@ -38,6 +38,8 @@ class EntityViewedNotification extends Notification
protected $contact;
public $is_system;
public function __construct($invitation, $entity_name, $is_system = false, $settings = null)
{
$this->entity_name = $entity_name;

View File

@ -68,6 +68,7 @@ class AuthorizePaymentDriver extends BaseDriver
{
$data = [
['name' => 'client_name', 'label' => ctrans('texts.name'), 'type' => 'text', 'validation' => 'required|min:2'],
['name' => 'client_phone', 'label' => ctrans('texts.phone'), 'type' => 'text', 'validation' => 'required'],
['name' => 'contact_email', 'label' => ctrans('texts.email'), 'type' => 'text', 'validation' => 'required|email:rfc'],
['name' => 'client_address_line_1', 'label' => ctrans('texts.address1'), 'type' => 'text', 'validation' => 'required'],
['name' => 'client_city', 'label' => ctrans('texts.city'), 'type' => 'text', 'validation' => 'required'],

View File

@ -230,7 +230,9 @@ class EmailDefaults
$this->email->email_object->subject = strtr($this->email->email_object->subject, $this->email->email_object->variables);
if ($this->template != 'custom') {
//06-06-2023 ensure we do not parse markdown in custom templates
if ($this->template != 'custom' && $this->template != 'email.template.custom') {
$this->email->email_object->body = $this->parseMarkdownToHtml($this->email->email_object->body);
}

View File

@ -201,6 +201,8 @@ class CompanyTransformer extends EntityTransformer
'tax_data' => $company->tax_data ?: new \stdClass,
'has_e_invoice_certificate' => $company->e_invoice_certificate ? true : false,
'has_e_invoice_certificate_passphrase' => $company->e_invoice_certificate_passphrase ? true : false,
'invoice_task_project_header' => (bool) $company->invoice_task_project_header,
'invoice_task_item_description' => (bool) $company->invoice_task_item_description,
];
}

View File

@ -44,7 +44,7 @@ class CompanyUserTransformer extends EntityTransformer
'permissions' => $company_user->permissions ?: '',
'notifications' => $company_user->notifications ? (object) $company_user->notifications : $blank_obj,
'settings' => $company_user->settings ? (object) $company_user->settings : $blank_obj,
'react_settings' => $company_user->react_settings ? $company_user->react_settings : [],
'react_settings' => $company_user->react_settings ? (object) $company_user->react_settings : $blank_obj,
'is_owner' => (bool) $company_user->is_owner,
'is_admin' => (bool) $company_user->is_admin,
'is_locked' => (bool) $company_user->is_locked,

View File

@ -139,8 +139,15 @@ trait Inviteable
}
}
public function getAdminLink() :string
public function getAdminLink($use_react_link = false) :string
{
return $this->getLink().'?silent=true';
return $use_react_link ? $this->getReactLink() : $this->getLink().'?silent=true';
}
private function getReactLink(): string
{
$entity_type = Str::snake(class_basename($this->entityType()));
return config('ninja.react_url')."/{$entity_type}s/{$this->{$entity_type}->hashed_id}/edit";
}
}

View File

@ -5,7 +5,7 @@ return [
'web_url' => 'https://www.invoiceninja.com',
'admin_token' => env('NINJA_ADMIN_TOKEN', ''),
'license_url' => 'https://app.invoiceninja.com',
'react_url' => 'https://app.invoicing.co',
'react_url' => env('REACT_URL', 'https://app.invoicing.co'),
'production' => env('NINJA_PROD', false),
'license' => env('NINJA_LICENSE', ''),
'version_url' => 'https://pdf.invoicing.co/api/version',
@ -15,8 +15,8 @@ return [
'require_https' => env('REQUIRE_HTTPS', true),
'app_url' => rtrim(env('APP_URL', ''), '/'),
'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
'app_version' => '5.5.124',
'app_tag' => '5.5.124',
'app_version' => '5.6.0',
'app_tag' => '5.6.0',
'minimum_client_version' => '5.0.16',
'terms_version' => '1.0.1',
'api_secret' => env('API_SECRET', ''),

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('companies', function (Illuminate\Database\Schema\Blueprint $table) {
$table->boolean('invoice_task_project_header')->default(true);
$table->boolean('invoice_task_item_description')->default(true);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
};

View File

@ -373,11 +373,6 @@ $LANG = array(
'invoice_issued_to' => 'الفاتورة الصادرة ل',
'invalid_counter' => 'لمنع حدوث تعارض محتمل ، يرجى تعيين بادئة رقم الفاتورة أو عرض الأسعار',
'mark_sent' => 'مارك المرسلة',
'gateway_help_1' => ':link للتسجيل في Authorize.net.',
'gateway_help_2' => ':link للتسجيل في Authorize.net.',
'gateway_help_17' => ':link للحصول على توقيع PayPal API الخاص بك.',
'gateway_help_27' => ':link للتسجيل في 2Checkout.com. لضمان تتبع المدفوعات ، قم بتعيين :complete_link كعنوان URL لإعادة التوجيه ضمن الحساب&gt; إدارة الموقع في بوابة 2Checkout.',
'gateway_help_60' => ':link لإنشاء حساب WePay.',
'more_designs' => 'المزيد من التصاميم',
'more_designs_title' => 'تصاميم الفاتورة الإضافية',
'more_designs_cloud_header' => 'Go Pro لمزيد من تصاميم الفواتير',
@ -492,7 +487,6 @@ $LANG = array(
'notification_quote_approved' => 'تمت الموافقة على العميل التالي :client اقتباس :invoice لـ :amount.',
'resend_confirmation' => 'أعد إرسال رسالة البريد الالكتروني الخاصة بالتأكيد',
'confirmation_resent' => 'تم الاستياء من البريد الإلكتروني للتأكيد',
'gateway_help_42' => ':link للتسجيل في BitPay.<br/> ملاحظة: استخدم مفتاح واجهة برمجة تطبيقات قديم ، وليس رمزًا مميزًا لواجهة برمجة التطبيقات.',
'payment_type_credit_card' => 'بطاقة إئتمان',
'payment_type_paypal' => 'باي بال',
'payment_type_bitcoin' => 'بيتكوين',
@ -577,7 +571,6 @@ $LANG = array(
'prefix' => 'بادئة',
'counter' => 'عداد',
'payment_type_dwolla' => 'دوولا',
'gateway_help_43' => ':link للتسجيل في Dwolla',
'partial_value' => 'يجب أن يكون أكبر من صفر وأقل من الإجمالي',
'more_actions' => 'المزيد من الإجراءات',
'pro_plan_title' => 'نينجا برو',
@ -1070,8 +1063,6 @@ $LANG = array(
'user_create_all' => 'إنشاء العملاء والفواتير وما إلى ذلك.',
'user_view_all' => 'عرض جميع العملاء والفواتير وما إلى ذلك.',
'user_edit_all' => 'تحرير جميع العملاء والفواتير وما إلى ذلك.',
'gateway_help_20' => ':link للتسجيل في Sage Pay.',
'gateway_help_21' => ':link للتسجيل في Sage Pay.',
'partial_due' => 'استحقاق جزئي',
'restore_vendor' => 'استعادة البائع',
'restored_vendor' => 'تمت استعادة البائع بنجاح',
@ -2255,7 +2246,6 @@ $LANG = array(
'product_notes' => 'ملاحظات المنتج',
'app_version' => 'نسخة التطبيق',
'ofx_version' => 'إصدار OFX',
'gateway_help_23' => ':link للحصول على مفاتيح Stripe API الخاصة بك.',
'error_app_key_set_to_default' => 'خطأ: تم تعيين APP_KEY على قيمة افتراضية ، لتحديثه ، قم بعمل نسخة احتياطية من قاعدة البيانات الخاصة بك ثم قم بتشغيل <code>php artisan ninja:update-key</code>',
'charge_late_fee' => 'تحصيل الرسوم المتأخرة',
'late_fee_amount' => 'مبلغ الرسوم المتأخرة',
@ -2495,7 +2485,6 @@ $LANG = array(
'videos' => 'أشرطة فيديو',
'video' => 'فيديو',
'return_to_invoice' => 'العودة إلى الفاتورة',
'gateway_help_13' => 'لاستخدام ITN ، اترك حقل مفتاح PDT فارغًا.',
'partial_due_date' => 'تاريخ الاستحقاق الجزئي',
'task_fields' => 'مجالات المهام',
'product_fields_help' => 'قم بسحب وإسقاط الحقول لتغيير ترتيبها',
@ -4651,7 +4640,6 @@ $LANG = array(
'vat' => 'ضريبة القيمة المضافة',
'view_map' => 'عرض الخريطة',
'set_default_design' => 'تعيين التصميم الافتراضي',
'add_gateway_help_message' => 'أضف بوابة دفع (مثل Stripe أو WePay أو PayPal) لقبول المدفوعات عبر الإنترنت',
'purchase_order_issued_to' => 'تم إصدار طلب الشراء إلى',
'archive_task_status' => 'أرشفة حالة المهمة',
'delete_task_status' => 'حذف حالة المهمة',
@ -5042,9 +5030,48 @@ $LANG = array(
'tax_exempt' => 'معفاة من الضرائب',
'late_fee_added_locked_invoice' => 'تمت إضافة الرسوم المتأخرة للفاتورة :invoice على a0b70e20 XXeeaz0',
'lang_Khmer' => 'الخمير',
'routing_id' => 'Routing ID',
'enable_e_invoice' => 'Enable E-Invoice',
'e_invoice_type' => 'E-Invoice Type',
'reduced_tax' => 'Reduced Tax',
'override_tax' => 'Override Tax',
'zero_rated' => 'Zero Rated',
'reverse_tax' => 'Reverse Tax',
'updated_tax_category' => 'Successfully updated the tax category',
'updated_tax_categories' => 'Successfully updated the tax categories',
'set_tax_category' => 'Set Tax Category',
'payment_manual' => 'Payment Manual',
'expense_payment_type' => 'Expense Payment Type',
'payment_type_Cash App' => 'Cash App',
'rename' => 'Rename',
'renamed_document' => 'Successfully renamed document',
'e_invoice' => 'E-Invoice',
'light_dark_mode' => 'Light/Dark Mode',
'activities' => 'Activities',
'recent_transactions' => "Here are your company's most recent transactions:",
'country_Palestine' => "Palestine",
'country_Taiwan' => 'Taiwan',
'duties' => 'Duties',
'order_number' => 'Order Number',
'order_id' => 'Order',
'total_invoices_outstanding' => 'Total Invoices Outstanding',
'recent_activity' => 'Recent Activity',
'enable_auto_bill' => 'Enable auto billing',
'email_count_invoices' => 'Email :count invoices',
'invoice_task_item_description' => 'Invoice Task Item Description',
'invoice_task_item_description_help' => 'Add the item description to the invoice line items',
'next_send_time' => 'Next Send Time',
'uploaded_certificate' => 'Successfully uploaded certificate',
'certificate_set' => 'Certificate set',
'certificate_not_set' => 'Certificate not set',
'passphrase_set' => 'Passphrase set',
'passphrase_not_set' => 'Passphrase not set',
'upload_certificate' => 'Upload Certificate',
'certificate_passphrase' => 'Certificate Passphrase',
'valid_vat_number' => 'Valid VAT Number',
);
return $LANG;
?>
?>

View File

@ -387,11 +387,6 @@ $LANG = array(
'invoice_issued_to' => 'Фактура издадена на',
'invalid_counter' => 'За да се избегне възможен конфликт, моля въведете префикс за номер на фактура или за номер на оферта',
'mark_sent' => 'Маркирай като изпратена',
'gateway_help_1' => ':link за регистрация в Authorize.net.',
'gateway_help_2' => ':link за регистрация в Authorize.net.',
'gateway_help_17' => ':link за получаване на PayPal API signature.',
'gateway_help_27' => ':link за регистрация в 2Checkout.com. За да осигурите проследяване на плащанията въведете :complete_link като "redirect URL" в менюто Account > Site Management в портала на 2Checkout.',
'gateway_help_60' => ':link за създаване на профил в WePay.',
'more_designs' => 'Още дизайни',
'more_designs_title' => 'Допълнителни дизайни на фактурите',
'more_designs_cloud_header' => 'Ъпгрейд към версия Pro за повече дизайни на фактури',
@ -506,7 +501,6 @@ $LANG = array(
'notification_quote_approved' => 'Клиентът :client одобри оферта :invoice на стойност :amount.',
'resend_confirmation' => 'Повторно изпращане на имейл за потвърждение',
'confirmation_resent' => 'Имейлът за потвърждение беше изпратен отново',
'gateway_help_42' => ':link за регистрация в BitPay.<br/>Забележка: използвайте Legacy API Key, а не API token.',
'payment_type_credit_card' => 'Кредитна карта',
'payment_type_paypal' => 'PayPal',
'payment_type_bitcoin' => 'Bitcoin',
@ -591,7 +585,6 @@ $LANG = array(
'prefix' => 'Префикс',
'counter' => 'Брояч',
'payment_type_dwolla' => 'Dwolla',
'gateway_help_43' => ':link за вход в Dwolla',
'partial_value' => 'Трябва да бъде повече от 0 и по-малко от общата стойност.',
'more_actions' => 'Още',
'pro_plan_title' => 'NINJA PRO',
@ -1097,8 +1090,6 @@ $LANG = array(
'user_create_all' => 'Създаване на клиенти, фактури и т.н.',
'user_view_all' => 'Преглед на всички клиенти, фактури и т.н.',
'user_edit_all' => 'Редакция на всички клиенти, фактури и т.н.',
'gateway_help_20' => ':link за регистрация в Sage Pay.',
'gateway_help_21' => ':link за регистрация в Sage Pay.',
'partial_due' => 'Частично дължима',
'restore_vendor' => 'Възстановяване на доставчик',
'restored_vendor' => 'Успешно възстановяване на доставчик',
@ -2282,7 +2273,6 @@ $LANG = array(
'product_notes' => 'Бележки за продукта',
'app_version' => 'Версия на приложението',
'ofx_version' => 'OFX версия',
'gateway_help_23' => ':link за получаване на Stripe API ключове.',
'error_app_key_set_to_default' => 'Грешка: APP_KEY е със стойност по подразбиране. За да го актуализирате архивирайте своята база данни и след това стартирайте <code>php artisan ninja:update-key</code>',
'charge_late_fee' => 'Такса за закъснение',
'late_fee_amount' => 'Стойност на таксата за закъснение',
@ -2522,7 +2512,6 @@ $LANG = array(
'videos' => 'Видео',
'video' => 'Видео',
'return_to_invoice' => 'Назад към фактурата',
'gateway_help_13' => 'За да използвате ITN оставете полето PDT Key празно.',
'partial_due_date' => 'Частичен падеж',
'task_fields' => 'Полета за задачи',
'product_fields_help' => 'Използвайте "Drag and drop" за промяна реда на полетата',
@ -4013,6 +4002,7 @@ $LANG = array(
'notification_invoice_reminder1_sent_subject' => 'Първо напомняне за фактура :invoice беше изпратено до :client',
'notification_invoice_reminder2_sent_subject' => 'Второ напомняне за фактура :invoice беше изпратено до :client',
'notification_invoice_reminder3_sent_subject' => 'Трето напомняне за фактура :invoice беше изпратено до :client',
'notification_invoice_custom_sent_subject' => 'Custom reminder for Invoice :invoice was sent to :client',
'notification_invoice_reminder_endless_sent_subject' => 'Безкрайно напомняне за фактура :invoice беше изпратено до :client',
'assigned_user' => 'Assigned User',
'setup_steps_notice' => 'To proceed to next step, make sure you test each section.',
@ -4390,7 +4380,7 @@ $LANG = array(
'imported_customers' => 'Successfully started importing customers',
'login_success' => 'Successful Login',
'login_failure' => 'Failed Login',
'exported_data' => 'Once the file is ready you"ll receive an email with a download link',
'exported_data' => 'Once the file is ready you\'ll receive an email with a download link',
'include_deleted_clients' => 'Include Deleted Clients',
'include_deleted_clients_help' => 'Load records belonging to deleted clients',
'step_1_sign_in' => 'Step 1: Sign In',
@ -4479,7 +4469,7 @@ $LANG = array(
'activity_123' => ':user deleted recurring expense :recurring_expense',
'activity_124' => ':user restored recurring expense :recurring_expense',
'fpx' => "FPX",
'to_view_entity_set_password' => 'To view the :entity you need to set password.',
'to_view_entity_set_password' => 'To view the :entity you need to set a password.',
'unsubscribe' => 'Unsubscribe',
'unsubscribed' => 'Unsubscribed',
'unsubscribed_text' => 'You have been removed from notifications for this document',
@ -4577,7 +4567,7 @@ $LANG = array(
'purchase_order_number' => 'Purchase Order Number',
'purchase_order_number_short' => 'Purchase Order #',
'inventory_notification_subject' => 'Inventory threshold notification for product: :product',
'inventory_notification_body' => 'Threshold of :amount has been reach for product: :product',
'inventory_notification_body' => 'Threshold of :amount has been reached for product: :product',
'activity_130' => ':user created purchase order :purchase_order',
'activity_131' => ':user updated purchase order :purchase_order',
'activity_132' => ':user archived purchase order :purchase_order',
@ -4609,7 +4599,7 @@ $LANG = array(
'vendor_document_upload' => 'Vendor Document Upload',
'vendor_document_upload_help' => 'Enable vendors to upload documents',
'are_you_enjoying_the_app' => 'Are you enjoying the app?',
'yes_its_great' => 'Yes, it"s great!',
'yes_its_great' => 'Yes, it\'s great!',
'not_so_much' => 'Not so much',
'would_you_rate_it' => 'Great to hear! Would you like to rate it?',
'would_you_tell_us_more' => 'Sorry to hear it! Would you like to tell us more?',
@ -4677,7 +4667,6 @@ $LANG = array(
'vat' => 'VAT',
'view_map' => 'View Map',
'set_default_design' => 'Set Default Design',
'add_gateway_help_message' => 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments',
'purchase_order_issued_to' => 'Purchase Order issued to',
'archive_task_status' => 'Archive Task Status',
'delete_task_status' => 'Delete Task Status',
@ -4982,7 +4971,7 @@ $LANG = array(
'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
'xinvoice_no_buyers_reference' => "No buyer's reference given",
'xinvoice_online_payment' => 'The invoice needs to be payed online via the provided link',
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link',
'pre_payment' => 'Pre Payment',
'number_of_payments' => 'Number of payments',
'number_of_payments_helper' => 'The number of times this payment will be made',
@ -4990,11 +4979,6 @@ $LANG = array(
'notification_payment_emailed' => 'Payment :payment was emailed to :client',
'notification_payment_emailed_subject' => 'Payment :payment was emailed',
'record_not_found' => 'Record not found',
'product_tax_exempt' => 'Product Tax Exempt',
'product_type_physical' => 'Physical Goods',
'product_type_digital' => 'Digital Goods',
'product_type_service' => 'Services',
'product_type_freight' => 'Shipping',
'minimum_payment_amount' => 'Minimum Payment Amount',
'client_initiated_payments' => 'Client Initiated Payments',
'client_initiated_payments_help' => 'Support making a payment in the client portal without an invoice',
@ -5061,9 +5045,60 @@ $LANG = array(
'date_picker_hint' => 'Use +days to set the date in the future',
'app_help_link' => 'More information ',
'here' => 'here',
'industry_Restaurant & Catering' => 'Restaurant & Catering',
'show_credits_table' => 'Show Credits Table',
'manual_payment' => 'Payment Manual',
'tax_summary_report' => 'Tax Summary Report',
'tax_category' => 'Tax Category',
'physical_goods' => 'Physical Goods',
'digital_products' => 'Digital Products',
'services' => 'Services',
'shipping' => 'Shipping',
'tax_exempt' => 'Tax Exempt',
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
'lang_Khmer' => 'Khmer',
'routing_id' => 'Routing ID',
'enable_e_invoice' => 'Enable E-Invoice',
'e_invoice_type' => 'E-Invoice Type',
'reduced_tax' => 'Reduced Tax',
'override_tax' => 'Override Tax',
'zero_rated' => 'Zero Rated',
'reverse_tax' => 'Reverse Tax',
'updated_tax_category' => 'Successfully updated the tax category',
'updated_tax_categories' => 'Successfully updated the tax categories',
'set_tax_category' => 'Set Tax Category',
'payment_manual' => 'Payment Manual',
'expense_payment_type' => 'Expense Payment Type',
'payment_type_Cash App' => 'Cash App',
'rename' => 'Rename',
'renamed_document' => 'Successfully renamed document',
'e_invoice' => 'E-Invoice',
'light_dark_mode' => 'Light/Dark Mode',
'activities' => 'Activities',
'recent_transactions' => "Here are your company's most recent transactions:",
'country_Palestine' => "Palestine",
'country_Taiwan' => 'Taiwan',
'duties' => 'Duties',
'order_number' => 'Order Number',
'order_id' => 'Order',
'total_invoices_outstanding' => 'Total Invoices Outstanding',
'recent_activity' => 'Recent Activity',
'enable_auto_bill' => 'Enable auto billing',
'email_count_invoices' => 'Email :count invoices',
'invoice_task_item_description' => 'Invoice Task Item Description',
'invoice_task_item_description_help' => 'Add the item description to the invoice line items',
'next_send_time' => 'Next Send Time',
'uploaded_certificate' => 'Successfully uploaded certificate',
'certificate_set' => 'Certificate set',
'certificate_not_set' => 'Certificate not set',
'passphrase_set' => 'Passphrase set',
'passphrase_not_set' => 'Passphrase not set',
'upload_certificate' => 'Upload Certificate',
'certificate_passphrase' => 'Certificate Passphrase',
'valid_vat_number' => 'Valid VAT Number',
);
return $LANG;
?>
?>

View File

@ -386,11 +386,6 @@ $LANG = array(
'invoice_issued_to' => 'Invoice issued to',
'invalid_counter' => 'To prevent a possible conflict please set either an invoice or quote number prefix',
'mark_sent' => 'Mark Sent',
'gateway_help_1' => ':link to sign up for Authorize.net.',
'gateway_help_2' => ':link to sign up for Authorize.net.',
'gateway_help_17' => ':link to get your PayPal API signature.',
'gateway_help_27' => ':link to sign up for 2Checkout.com. To ensure payments are tracked set :complete_link as the redirect URL under Account > Site Management in the 2Checkout portal.',
'gateway_help_60' => ':link to create a WePay account.',
'more_designs' => 'More designs',
'more_designs_title' => 'Additional Invoice Designs',
'more_designs_cloud_header' => 'Go Pro for more invoice designs',
@ -505,7 +500,6 @@ $LANG = array(
'notification_quote_approved' => 'The following client :client approved Quote :invoice for :amount.',
'resend_confirmation' => 'Resend confirmation email',
'confirmation_resent' => 'The confirmation email was resent',
'gateway_help_42' => ':link to sign up for BitPay.<br/>Note: use a Legacy API Key, not an API token.',
'payment_type_credit_card' => 'Credit Card',
'payment_type_paypal' => 'PayPal',
'payment_type_bitcoin' => 'Bitcoin',
@ -590,7 +584,6 @@ $LANG = array(
'prefix' => 'Prefix',
'counter' => 'Counter',
'payment_type_dwolla' => 'Dwolla',
'gateway_help_43' => ':link to sign up for Dwolla',
'partial_value' => 'Must be greater than zero and less than the total',
'more_actions' => 'More Actions',
'pro_plan_title' => 'NINJA PRO',
@ -1096,8 +1089,6 @@ $LANG = array(
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Venciment parcial',
'restore_vendor' => 'Restore Vendor',
'restored_vendor' => 'Successfully restored vendor',
@ -2281,7 +2272,6 @@ $LANG = array(
'product_notes' => 'Product Notes',
'app_version' => 'App Version',
'ofx_version' => 'OFX Version',
'gateway_help_23' => ':link to get your Stripe API keys.',
'error_app_key_set_to_default' => 'Error: APP_KEY is set to a default value, to update it backup your database and then run <code>php artisan ninja:update-key</code>',
'charge_late_fee' => 'Charge Late Fee',
'late_fee_amount' => 'Late Fee Amount',
@ -2521,7 +2511,6 @@ $LANG = array(
'videos' => 'Vídeos',
'video' => 'Vídeo',
'return_to_invoice' => 'Return to Invoice',
'gateway_help_13' => 'To use ITN leave the PDT Key field blank.',
'partial_due_date' => 'Data venciment parcial',
'task_fields' => 'Task Fields',
'product_fields_help' => 'Drag and drop fields to change their order',
@ -4677,7 +4666,6 @@ $LANG = array(
'vat' => 'VAT',
'view_map' => 'View Map',
'set_default_design' => 'Set Default Design',
'add_gateway_help_message' => 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments',
'purchase_order_issued_to' => 'Purchase Order issued to',
'archive_task_status' => 'Archive Task Status',
'delete_task_status' => 'Delete Task Status',
@ -5086,9 +5074,30 @@ $LANG = array(
'e_invoice' => 'E-Invoice',
'light_dark_mode' => 'Light/Dark Mode',
'activities' => 'Activities',
'recent_transactions' => "Here are your company's most recent transactions:",
'country_Palestine' => "Palestine",
'country_Taiwan' => 'Taiwan',
'duties' => 'Duties',
'order_number' => 'Order Number',
'order_id' => 'Order',
'total_invoices_outstanding' => 'Total Invoices Outstanding',
'recent_activity' => 'Recent Activity',
'enable_auto_bill' => 'Enable auto billing',
'email_count_invoices' => 'Email :count invoices',
'invoice_task_item_description' => 'Invoice Task Item Description',
'invoice_task_item_description_help' => 'Add the item description to the invoice line items',
'next_send_time' => 'Next Send Time',
'uploaded_certificate' => 'Successfully uploaded certificate',
'certificate_set' => 'Certificate set',
'certificate_not_set' => 'Certificate not set',
'passphrase_set' => 'Passphrase set',
'passphrase_not_set' => 'Passphrase not set',
'upload_certificate' => 'Upload Certificate',
'certificate_passphrase' => 'Certificate Passphrase',
'valid_vat_number' => 'Valid VAT Number',
);
return $LANG;
?>
?>

View File

@ -385,11 +385,6 @@ $LANG = array(
'invoice_issued_to' => 'Faktura vystavena pro',
'invalid_counter' => 'Pro případný konflikt si raději nastavte prefix pro faktury nebo nabídky',
'mark_sent' => 'Značka odesláno',
'gateway_help_1' => ':link zaregistrovat se na Authorize.net.',
'gateway_help_2' => ':link zaregistrovat se na Authorize.net.',
'gateway_help_17' => ':link získat PayPal API signature.',
'gateway_help_27' => ':link to sign up for 2Checkout.com. To ensure payments are tracked set :complete_link as the redirect URL under Account > Site Management in the 2Checkout portal.',
'gateway_help_60' => ':link pro vytvoření účtu WePay.',
'more_designs' => 'Více vzhledů',
'more_designs_title' => 'Další vzhledy faktur',
'more_designs_cloud_header' => 'Přejděte na Profi plán pro více vzhledů faktur',
@ -504,7 +499,6 @@ $LANG = array(
'notification_quote_approved' => 'Klient :client schválil nabídku :invoice na :amount.',
'resend_confirmation' => 'Znovu poslat potvrzovací email',
'confirmation_resent' => 'Potvrzení bylo odesláno emailem',
'gateway_help_42' => ':link zaregistrujte se na BitPay.<br/>Poznámka: použijte Legacy API Key, nikoliv API token.',
'payment_type_credit_card' => 'Platební karty',
'payment_type_paypal' => 'PayPal',
'payment_type_bitcoin' => 'Bitcoin',
@ -589,7 +583,6 @@ $LANG = array(
'prefix' => 'Prefix',
'counter' => 'Počítadlo',
'payment_type_dwolla' => 'Dwolla',
'gateway_help_43' => ':link zaregistrujte se na Dwolla',
'partial_value' => 'Musí být větší než nula a méně než součet',
'more_actions' => 'Více akcí',
'pro_plan_title' => 'NINJA PROFI',
@ -1096,8 +1089,6 @@ $LANG = array(
'user_create_all' => 'Vytvářet klienty,faktury atd.',
'user_view_all' => 'Vidět všechny klienty,faktury atd.',
'user_edit_all' => 'Editovat všechny klienty,faktury atd.',
'gateway_help_20' => ':link pro registraci na Sage Pay.',
'gateway_help_21' => ':link pro registraci na Sage Pay.',
'partial_due' => 'Částečně splaceno',
'restore_vendor' => 'Obnovit dodavatele',
'restored_vendor' => 'Dodavatel úspěšně obnoven',
@ -2281,7 +2272,6 @@ $LANG = array(
'product_notes' => 'Product Notes',
'app_version' => 'App Version',
'ofx_version' => 'OFX Version',
'gateway_help_23' => ':link to get your Stripe API keys.',
'error_app_key_set_to_default' => 'Error: APP_KEY is set to a default value, to update it backup your database and then run <code>php artisan ninja:update-key</code>',
'charge_late_fee' => 'Charge Late Fee',
'late_fee_amount' => 'Late Fee Amount',
@ -2521,7 +2511,6 @@ $LANG = array(
'videos' => 'Videos',
'video' => 'Video',
'return_to_invoice' => 'Return to Invoice',
'gateway_help_13' => 'To use ITN leave the PDT Key field blank.',
'partial_due_date' => 'Partial Due Date',
'task_fields' => 'Task Fields',
'product_fields_help' => 'Drag and drop fields to change their order',
@ -4012,6 +4001,7 @@ $LANG = array(
'notification_invoice_reminder1_sent_subject' => 'Reminder 1 for Invoice :invoice was sent to :client',
'notification_invoice_reminder2_sent_subject' => 'Reminder 2 for Invoice :invoice was sent to :client',
'notification_invoice_reminder3_sent_subject' => 'Reminder 3 for Invoice :invoice was sent to :client',
'notification_invoice_custom_sent_subject' => 'Custom reminder for Invoice :invoice was sent to :client',
'notification_invoice_reminder_endless_sent_subject' => 'Endless reminder for Invoice :invoice was sent to :client',
'assigned_user' => 'Assigned User',
'setup_steps_notice' => 'To proceed to next step, make sure you test each section.',
@ -4676,7 +4666,6 @@ $LANG = array(
'vat' => 'VAT',
'view_map' => 'View Map',
'set_default_design' => 'Set Default Design',
'add_gateway_help_message' => 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments',
'purchase_order_issued_to' => 'Purchase Order issued to',
'archive_task_status' => 'Archive Task Status',
'delete_task_status' => 'Delete Task Status',
@ -4981,7 +4970,7 @@ $LANG = array(
'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
'xinvoice_no_buyers_reference' => "No buyer's reference given",
'xinvoice_online_payment' => 'The invoice needs to be payed online via the provided link',
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link',
'pre_payment' => 'Pre Payment',
'number_of_payments' => 'Number of payments',
'number_of_payments_helper' => 'The number of times this payment will be made',
@ -4989,11 +4978,6 @@ $LANG = array(
'notification_payment_emailed' => 'Payment :payment was emailed to :client',
'notification_payment_emailed_subject' => 'Payment :payment was emailed',
'record_not_found' => 'Record not found',
'product_tax_exempt' => 'Product Tax Exempt',
'product_type_physical' => 'Physical Goods',
'product_type_digital' => 'Digital Goods',
'product_type_service' => 'Services',
'product_type_freight' => 'Shipping',
'minimum_payment_amount' => 'Minimum Payment Amount',
'client_initiated_payments' => 'Client Initiated Payments',
'client_initiated_payments_help' => 'Support making a payment in the client portal without an invoice',
@ -5062,9 +5046,58 @@ $LANG = array(
'here' => 'here',
'industry_Restaurant & Catering' => 'Restaurant & Catering',
'show_credits_table' => 'Show Credits Table',
'manual_payment' => 'Payment Manual',
'tax_summary_report' => 'Tax Summary Report',
'tax_category' => 'Tax Category',
'physical_goods' => 'Physical Goods',
'digital_products' => 'Digital Products',
'services' => 'Services',
'shipping' => 'Shipping',
'tax_exempt' => 'Tax Exempt',
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
'lang_Khmer' => 'Khmer',
'routing_id' => 'Routing ID',
'enable_e_invoice' => 'Enable E-Invoice',
'e_invoice_type' => 'E-Invoice Type',
'reduced_tax' => 'Reduced Tax',
'override_tax' => 'Override Tax',
'zero_rated' => 'Zero Rated',
'reverse_tax' => 'Reverse Tax',
'updated_tax_category' => 'Successfully updated the tax category',
'updated_tax_categories' => 'Successfully updated the tax categories',
'set_tax_category' => 'Set Tax Category',
'payment_manual' => 'Payment Manual',
'expense_payment_type' => 'Expense Payment Type',
'payment_type_Cash App' => 'Cash App',
'rename' => 'Rename',
'renamed_document' => 'Successfully renamed document',
'e_invoice' => 'E-Invoice',
'light_dark_mode' => 'Light/Dark Mode',
'activities' => 'Activities',
'recent_transactions' => "Here are your company's most recent transactions:",
'country_Palestine' => "Palestine",
'country_Taiwan' => 'Taiwan',
'duties' => 'Duties',
'order_number' => 'Order Number',
'order_id' => 'Order',
'total_invoices_outstanding' => 'Total Invoices Outstanding',
'recent_activity' => 'Recent Activity',
'enable_auto_bill' => 'Enable auto billing',
'email_count_invoices' => 'Email :count invoices',
'invoice_task_item_description' => 'Invoice Task Item Description',
'invoice_task_item_description_help' => 'Add the item description to the invoice line items',
'next_send_time' => 'Next Send Time',
'uploaded_certificate' => 'Successfully uploaded certificate',
'certificate_set' => 'Certificate set',
'certificate_not_set' => 'Certificate not set',
'passphrase_set' => 'Passphrase set',
'passphrase_not_set' => 'Passphrase not set',
'upload_certificate' => 'Upload Certificate',
'certificate_passphrase' => 'Certificate Passphrase',
'valid_vat_number' => 'Valid VAT Number',
);
return $LANG;
?>
?>

View File

@ -386,11 +386,6 @@ $LANG = array(
'invoice_issued_to' => 'Faktura udstedt til',
'invalid_counter' => 'For at undgå mulige overlap, sæt et faktura eller tilbuds nummer præfiks',
'mark_sent' => 'Markér som sendt',
'gateway_help_1' => ':link til at registrere dig hos Authorize.net.',
'gateway_help_2' => ':link til at registrere dig hos Authorize.net.',
'gateway_help_17' => ':link til at hente din PayPal API signatur.',
'gateway_help_27' => ':link for at oprette sig hos 2Checkout.com. For at sikre at betalinger er fulgt sæt :complete_link som redirect URL under Konto > Side Management i 2Checkout portalen.',
'gateway_help_60' => ':link til at oprette en WePay konto',
'more_designs' => 'Flere designs',
'more_designs_title' => 'Yderligere fakturadesigns',
'more_designs_cloud_header' => 'Skift til Pro for flere fakturadesigns',
@ -505,7 +500,6 @@ $LANG = array(
'notification_quote_approved' => 'Den følgende kunde :client accepterede tilbud :invoice lydende på :amount.',
'resend_confirmation' => 'Send bekræftelses e-mail igen',
'confirmation_resent' => 'Bekræftelses e-mail er afsendt',
'gateway_help_42' => ':link til registrering hos BitPay.<br/>Bemærk: brug en use a Legacy API nøgle, og ikke en API token.',
'payment_type_credit_card' => 'Kredit kort',
'payment_type_paypal' => 'PayPal',
'payment_type_bitcoin' => 'Bitcoin',
@ -590,7 +584,6 @@ $LANG = array(
'prefix' => 'Præfix',
'counter' => 'Tæller',
'payment_type_dwolla' => 'Dwolla',
'gateway_help_43' => ':link til at registrere dig hos Dwolla.',
'partial_value' => 'Skal være større end nul og mindre end totalen',
'more_actions' => 'Flere handlinger',
'pro_plan_title' => 'NINJA PRO',
@ -1096,8 +1089,6 @@ $LANG = array(
'user_create_all' => 'Create clients, invoices, etc.',
'user_view_all' => 'View all clients, invoices, etc.',
'user_edit_all' => 'Edit all clients, invoices, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Genskab sælger',
'restored_vendor' => 'Genskabelse af sælger gennemført',
@ -2280,7 +2271,6 @@ $LANG = array(
'product_notes' => 'Product Notes',
'app_version' => 'App Version',
'ofx_version' => 'OFX Version',
'gateway_help_23' => ':link to get your Stripe API keys.',
'error_app_key_set_to_default' => 'Error: APP_KEY is set to a default value, to update it backup your database and then run <code>php artisan ninja:update-key</code>',
'charge_late_fee' => 'Charge Late Fee',
'late_fee_amount' => 'Late Fee Amount',
@ -2520,7 +2510,6 @@ $LANG = array(
'videos' => 'Videos',
'video' => 'Video',
'return_to_invoice' => 'Return to Invoice',
'gateway_help_13' => 'To use ITN leave the PDT Key field blank.',
'partial_due_date' => 'Partial Due Date',
'task_fields' => 'Task Fields',
'product_fields_help' => 'Drag and drop fields to change their order',
@ -4011,6 +4000,7 @@ $LANG = array(
'notification_invoice_reminder1_sent_subject' => 'Reminder 1 for Invoice :invoice was sent to :client',
'notification_invoice_reminder2_sent_subject' => 'Reminder 2 for Invoice :invoice was sent to :client',
'notification_invoice_reminder3_sent_subject' => 'Reminder 3 for Invoice :invoice was sent to :client',
'notification_invoice_custom_sent_subject' => 'Custom reminder for Invoice :invoice was sent to :client',
'notification_invoice_reminder_endless_sent_subject' => 'Endless reminder for Invoice :invoice was sent to :client',
'assigned_user' => 'Assigned User',
'setup_steps_notice' => 'To proceed to next step, make sure you test each section.',
@ -4388,7 +4378,7 @@ $LANG = array(
'imported_customers' => 'Successfully started importing customers',
'login_success' => 'Successful Login',
'login_failure' => 'Failed Login',
'exported_data' => 'Once the file is ready you"ll receive an email with a download link',
'exported_data' => 'Once the file is ready you\'ll receive an email with a download link',
'include_deleted_clients' => 'Include Deleted Clients',
'include_deleted_clients_help' => 'Load records belonging to deleted clients',
'step_1_sign_in' => 'Step 1: Sign In',
@ -4477,7 +4467,7 @@ $LANG = array(
'activity_123' => ':user deleted recurring expense :recurring_expense',
'activity_124' => ':user restored recurring expense :recurring_expense',
'fpx' => "FPX",
'to_view_entity_set_password' => 'To view the :entity you need to set password.',
'to_view_entity_set_password' => 'To view the :entity you need to set a password.',
'unsubscribe' => 'Unsubscribe',
'unsubscribed' => 'Unsubscribed',
'unsubscribed_text' => 'You have been removed from notifications for this document',
@ -4575,7 +4565,7 @@ $LANG = array(
'purchase_order_number' => 'Purchase Order Number',
'purchase_order_number_short' => 'Purchase Order #',
'inventory_notification_subject' => 'Inventory threshold notification for product: :product',
'inventory_notification_body' => 'Threshold of :amount has been reach for product: :product',
'inventory_notification_body' => 'Threshold of :amount has been reached for product: :product',
'activity_130' => ':user created purchase order :purchase_order',
'activity_131' => ':user updated purchase order :purchase_order',
'activity_132' => ':user archived purchase order :purchase_order',
@ -4607,7 +4597,7 @@ $LANG = array(
'vendor_document_upload' => 'Vendor Document Upload',
'vendor_document_upload_help' => 'Enable vendors to upload documents',
'are_you_enjoying_the_app' => 'Are you enjoying the app?',
'yes_its_great' => 'Yes, it"s great!',
'yes_its_great' => 'Yes, it\'s great!',
'not_so_much' => 'Not so much',
'would_you_rate_it' => 'Great to hear! Would you like to rate it?',
'would_you_tell_us_more' => 'Sorry to hear it! Would you like to tell us more?',
@ -4675,7 +4665,6 @@ $LANG = array(
'vat' => 'VAT',
'view_map' => 'View Map',
'set_default_design' => 'Set Default Design',
'add_gateway_help_message' => 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments',
'purchase_order_issued_to' => 'Purchase Order issued to',
'archive_task_status' => 'Archive Task Status',
'delete_task_status' => 'Delete Task Status',
@ -4980,7 +4969,7 @@ $LANG = array(
'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
'xinvoice_no_buyers_reference' => "No buyer's reference given",
'xinvoice_online_payment' => 'The invoice needs to be payed online via the provided link',
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link',
'pre_payment' => 'Pre Payment',
'number_of_payments' => 'Number of payments',
'number_of_payments_helper' => 'The number of times this payment will be made',
@ -4988,11 +4977,6 @@ $LANG = array(
'notification_payment_emailed' => 'Payment :payment was emailed to :client',
'notification_payment_emailed_subject' => 'Payment :payment was emailed',
'record_not_found' => 'Record not found',
'product_tax_exempt' => 'Product Tax Exempt',
'product_type_physical' => 'Physical Goods',
'product_type_digital' => 'Digital Goods',
'product_type_service' => 'Services',
'product_type_freight' => 'Shipping',
'minimum_payment_amount' => 'Minimum Payment Amount',
'client_initiated_payments' => 'Client Initiated Payments',
'client_initiated_payments_help' => 'Support making a payment in the client portal without an invoice',
@ -5059,9 +5043,60 @@ $LANG = array(
'date_picker_hint' => 'Use +days to set the date in the future',
'app_help_link' => 'More information ',
'here' => 'here',
'industry_Restaurant & Catering' => 'Restaurant & Catering',
'show_credits_table' => 'Show Credits Table',
'manual_payment' => 'Payment Manual',
'tax_summary_report' => 'Tax Summary Report',
'tax_category' => 'Tax Category',
'physical_goods' => 'Physical Goods',
'digital_products' => 'Digital Products',
'services' => 'Services',
'shipping' => 'Shipping',
'tax_exempt' => 'Tax Exempt',
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
'lang_Khmer' => 'Khmer',
'routing_id' => 'Routing ID',
'enable_e_invoice' => 'Enable E-Invoice',
'e_invoice_type' => 'E-Invoice Type',
'reduced_tax' => 'Reduced Tax',
'override_tax' => 'Override Tax',
'zero_rated' => 'Zero Rated',
'reverse_tax' => 'Reverse Tax',
'updated_tax_category' => 'Successfully updated the tax category',
'updated_tax_categories' => 'Successfully updated the tax categories',
'set_tax_category' => 'Set Tax Category',
'payment_manual' => 'Payment Manual',
'expense_payment_type' => 'Expense Payment Type',
'payment_type_Cash App' => 'Cash App',
'rename' => 'Rename',
'renamed_document' => 'Successfully renamed document',
'e_invoice' => 'E-Invoice',
'light_dark_mode' => 'Light/Dark Mode',
'activities' => 'Activities',
'recent_transactions' => "Here are your company's most recent transactions:",
'country_Palestine' => "Palestine",
'country_Taiwan' => 'Taiwan',
'duties' => 'Duties',
'order_number' => 'Order Number',
'order_id' => 'Order',
'total_invoices_outstanding' => 'Total Invoices Outstanding',
'recent_activity' => 'Recent Activity',
'enable_auto_bill' => 'Enable auto billing',
'email_count_invoices' => 'Email :count invoices',
'invoice_task_item_description' => 'Invoice Task Item Description',
'invoice_task_item_description_help' => 'Add the item description to the invoice line items',
'next_send_time' => 'Next Send Time',
'uploaded_certificate' => 'Successfully uploaded certificate',
'certificate_set' => 'Certificate set',
'certificate_not_set' => 'Certificate not set',
'passphrase_set' => 'Passphrase set',
'passphrase_not_set' => 'Passphrase not set',
'upload_certificate' => 'Upload Certificate',
'certificate_passphrase' => 'Certificate Passphrase',
'valid_vat_number' => 'Valid VAT Number',
);
return $LANG;
?>
?>

View File

@ -387,11 +387,6 @@ $LANG = array(
'invoice_issued_to' => 'Rechnung ausgestellt für',
'invalid_counter' => 'Bitte setze, um Probleme zu vermeiden, entweder ein Rechnungs- oder Angebotspräfix.',
'mark_sent' => 'Als versendet markieren',
'gateway_help_1' => ':link um sich bei Authorize.net anzumelden.',
'gateway_help_2' => ':link um sich bei Authorize.net anzumelden.',
'gateway_help_17' => ':link, um deine PayPal API-Signatur zu erhalten.',
'gateway_help_27' => ':link to sign up for 2Checkout.com. To ensure payments are tracked set :complete_link as the redirect URL under Account > Site Management in the 2Checkout portal.',
'gateway_help_60' => ':link um ein WePay Konto zu erstellen.',
'more_designs' => 'Weitere Designs',
'more_designs_title' => 'Zusätzliche Rechnungsdesigns',
'more_designs_cloud_header' => 'Werde Pro-Mitglied für zusätzliche Rechnungsdesigns',
@ -506,7 +501,6 @@ $LANG = array(
'notification_quote_approved' => 'Der folgende Kunde :client nahm das Angebot :invoice über :amount an.',
'resend_confirmation' => 'Bestätigungsmail erneut senden',
'confirmation_resent' => 'Bestätigungs-E-Mail wurde erneut versendet',
'gateway_help_42' => ':link zum Registrieren auf BitPay.<br/>Hinweis: benutze einen Legacy API Key, keinen API token.',
'payment_type_credit_card' => 'Kreditkarte',
'payment_type_paypal' => 'PayPal',
'payment_type_bitcoin' => 'Bitcoin',
@ -591,7 +585,6 @@ $LANG = array(
'prefix' => 'Präfix',
'counter' => 'Zähler',
'payment_type_dwolla' => 'Dwolla',
'gateway_help_43' => ':link zum Registrieren auf Dwolla.',
'partial_value' => 'Muss grösser als Null und kleiner als der Gesamtbetrag sein',
'more_actions' => 'Weitere Aktionen',
'pro_plan_title' => 'NINJA PRO',
@ -1097,8 +1090,6 @@ $LANG = array(
'user_create_all' => 'Erstelle Kunden, Rechnungen, usw.',
'user_view_all' => 'Alle Kunden, Rechnungen, usw. ansehen',
'user_edit_all' => 'Alle Kunden, Rechnungen, usw. bearbeiten',
'gateway_help_20' => ':link um sich bei Sage Pay zu registrieren.',
'gateway_help_21' => ':link um sich bei Sage Pay zu registrieren.',
'partial_due' => 'Anzahlung',
'restore_vendor' => 'Lieferant wiederherstellen',
'restored_vendor' => 'Lieferant erfolgreich wiederhergestellt',
@ -2282,7 +2273,6 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'product_notes' => 'Produktnotizen',
'app_version' => 'App-Version',
'ofx_version' => 'OFX-Version',
'gateway_help_23' => ':link um Ihre Stripe API-Keys zu erhalten.',
'error_app_key_set_to_default' => 'Fehler: APP_KEY ist auf einen Standardwert gesetzt. Um ihn zu aktualisieren, sichere deine Datenbank und führe dann <code>php artisan ninja:update-key</code> aus',
'charge_late_fee' => 'Verspätungszuschlag berechnen',
'late_fee_amount' => 'Höhe des Verspätungszuschlags',
@ -2522,7 +2512,6 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'videos' => 'Videos',
'video' => 'Video',
'return_to_invoice' => 'Zurück zur Rechnung',
'gateway_help_13' => 'Um ITN zu benutzen, lassen Sie das PDT-Feld leer.',
'partial_due_date' => 'Teilzahlungsziel',
'task_fields' => 'Aufgabenfelder',
'product_fields_help' => 'Felder verschieben, um ihre Reihenfolge zu ändern',
@ -3996,7 +3985,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'over_payments_disabled' => 'Das Unternehmen unterstützt keine Überbezahlungen.',
'saved_at' => 'Gespeichert um :time',
'credit_payment' => 'Gutschrift auf Rechnung :invoice_number angewendet',
'credit_subject' => 'Neue Kredit :number von :account',
'credit_subject' => 'Neue Gutschrift :number von :account',
'credit_message' => 'Um Ihre Gutschrift über :amount einzusehen, klicken Sie auf den untenstehenden Link.',
'payment_type_Crypto' => 'Kryptowährung',
'payment_type_Credit' => 'Gutschrift',
@ -4679,7 +4668,6 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'vat' => 'MwSt.',
'view_map' => 'Karte anzeigen',
'set_default_design' => 'Standard-Design festlegen',
'add_gateway_help_message' => 'Hinzufügen eines Zahlungs-Gateways (z. B. Stripe, WePay oder Paypal), um Online-Zahlungen zu akzeptieren',
'purchase_order_issued_to' => 'Bestellung ausgestellt für',
'archive_task_status' => 'Aufgaben Status archivieren',
'delete_task_status' => 'Aufgaben Status löschen',
@ -5082,9 +5070,36 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'set_tax_category' => 'Steuerkategorie setzen',
'payment_manual' => 'Zahlungshandbuch',
'expense_payment_type' => 'Expense Payment Type',
'payment_type_Cash App' => 'Cash App',
'rename' => 'Rename',
'renamed_document' => 'Successfully renamed document',
'e_invoice' => 'E-Invoice',
'light_dark_mode' => 'Light/Dark Mode',
'activities' => 'Activities',
'recent_transactions' => "Here are your company's most recent transactions:",
'country_Palestine' => "Palestine",
'country_Taiwan' => 'Taiwan',
'duties' => 'Duties',
'order_number' => 'Order Number',
'order_id' => 'Order',
'total_invoices_outstanding' => 'Total Invoices Outstanding',
'recent_activity' => 'Recent Activity',
'enable_auto_bill' => 'Enable auto billing',
'email_count_invoices' => 'Email :count invoices',
'invoice_task_item_description' => 'Invoice Task Item Description',
'invoice_task_item_description_help' => 'Add the item description to the invoice line items',
'next_send_time' => 'Next Send Time',
'uploaded_certificate' => 'Successfully uploaded certificate',
'certificate_set' => 'Certificate set',
'certificate_not_set' => 'Certificate not set',
'passphrase_set' => 'Passphrase set',
'passphrase_not_set' => 'Passphrase not set',
'upload_certificate' => 'Upload Certificate',
'certificate_passphrase' => 'Certificate Passphrase',
'valid_vat_number' => 'Valid VAT Number',
);
return $LANG;
?>
?>

View File

@ -386,11 +386,6 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'invoice_issued_to' => 'Έκδοση τιμολογίου προς',
'invalid_counter' => 'Για να αποφείγετε πιθανή σύγχυση, παρακαλώ ορίστε σειρά σε τιμολόγιο ή προσφορά',
'mark_sent' => 'Σήμανση ως Απεσταλμένο',
'gateway_help_1' => ':link για εγγραφή στο Authorize.net.',
'gateway_help_2' => ':link για εγγραφή στο Authorize.net.',
'gateway_help_17' => ':link για να πάρετε υπογραφή για το API του PayPal.',
'gateway_help_27' => ':link για να εγγραφείτε στο 2Checkout.com. Για να βεβαιωθείτε ότι οι πληρωμές παρακολουθούνται ορίστε το :complete_link ως τη διέυθυνση ανακατεύθυνσης στο Λογαριασμός > Διαχείρισης Ιστοσελίδας στην ιστοσελίδα του 2Checkout.',
'gateway_help_60' => ':link για δημιουργία λογαριασμού WePay.',
'more_designs' => 'Περισσότερα σχέδια',
'more_designs_title' => 'Επιπλέον Σχέδια Τιμολογίων',
'more_designs_cloud_header' => 'Αποκτήστε την Επαγγελματική έκδοση για επιπλέον σχέδια τιμολογίων',
@ -505,7 +500,6 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'notification_quote_approved' => 'Ο πελάτης :client αποδέχτηκε την Προσφορά :invoice ποσού :amount.',
'resend_confirmation' => 'Νέα αποστολή email επιβεβαίωσης',
'confirmation_resent' => 'Το email επιβεβαίωσης εστάλη ξανά',
'gateway_help_42' => ':link για να εγγραφείτε στο BitPay.<br/>Σημείωση: χρησιμοποιήστε ένα παλαιού τύπου κλειδί API, όχι ένα διακριτικό API.',
'payment_type_credit_card' => 'Πιστωτική Κάρτα',
'payment_type_paypal' => 'PayPal',
'payment_type_bitcoin' => 'Bitcoin',
@ -590,7 +584,6 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'prefix' => 'Πρόθεμα',
'counter' => 'Μετρητής',
'payment_type_dwolla' => 'Dwolla',
'gateway_help_43' => ':link για εγγραφή στο Dwolla',
'partial_value' => 'Πρέπει να είναι μεγαλύτερο του μηδενός και μικρότερο από το σύνολο.',
'more_actions' => 'Περισσότερες Ενέργειες',
'pro_plan_title' => 'NINJA PRO',
@ -1096,8 +1089,6 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'user_create_all' => 'Δημιουργία πελατών, τιμολογίων κλπ.',
'user_view_all' => 'Προβολή πελατών, τιμολογίων κλπ.',
'user_edit_all' => 'Επεξεργασία πελατών, τιμολογίων κλπ.',
'gateway_help_20' => ':link για εγγραφή στο Sage Pay.',
'gateway_help_21' => ':link για εγγραφή στο Sage Pay.',
'partial_due' => 'Μερική Πληρωμή',
'restore_vendor' => 'Ανάκτηση Προμηθευτή',
'restored_vendor' => 'Ο Προμηθευτής ανακτήθηκε με επιτυχία',
@ -2281,7 +2272,6 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'product_notes' => 'Σημειώσεις Προϊόντος',
'app_version' => 'Έκδοση Εφαρμογής',
'ofx_version' => 'Έκδοση OFX',
'gateway_help_23' => ':link για να λάβετε τα κλειδιά του Stripe API.',
'error_app_key_set_to_default' => 'Σφάλμα: Το APP_KEY έχει οριστεί στην προκαθορισμένη τιμή, για να το ενημερώσετε κάντε αντίγραφο ασφαλείας από τη βάση δεδομένων και εκτελέστε το <code>php artisan ninja:update-key</code>',
'charge_late_fee' => 'Τέλη Καθυστερημένης Εξόφλησης',
'late_fee_amount' => 'Ποσό Τέλους Καθυστερημένης Εξόφλησης',
@ -2521,7 +2511,6 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'videos' => 'Βίντεο',
'video' => 'Βίντεο',
'return_to_invoice' => 'Επιστροφή στο Τιμολόγιο',
'gateway_help_13' => 'Για να χρησιμοποιήσετε το ITN αφήστε κενό το πεδίο για το κλειδί PDT.',
'partial_due_date' => 'Ημερομηνία Μερικής Πληρωμής',
'task_fields' => 'Πεδία Εργασίας',
'product_fields_help' => 'Μεταφέρετε και αποθέστε πεδία για να αλλάξετε τη σειρά τους',
@ -4012,6 +4001,7 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'notification_invoice_reminder1_sent_subject' => 'Reminder 1 for Invoice :invoice was sent to :client',
'notification_invoice_reminder2_sent_subject' => 'Reminder 2 for Invoice :invoice was sent to :client',
'notification_invoice_reminder3_sent_subject' => 'Reminder 3 for Invoice :invoice was sent to :client',
'notification_invoice_custom_sent_subject' => 'Custom reminder for Invoice :invoice was sent to :client',
'notification_invoice_reminder_endless_sent_subject' => 'Endless reminder for Invoice :invoice was sent to :client',
'assigned_user' => 'Assigned User',
'setup_steps_notice' => 'To proceed to next step, make sure you test each section.',
@ -4389,7 +4379,7 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'imported_customers' => 'Successfully started importing customers',
'login_success' => 'Successful Login',
'login_failure' => 'Failed Login',
'exported_data' => 'Once the file is ready you"ll receive an email with a download link',
'exported_data' => 'Once the file is ready you\'ll receive an email with a download link',
'include_deleted_clients' => 'Include Deleted Clients',
'include_deleted_clients_help' => 'Load records belonging to deleted clients',
'step_1_sign_in' => 'Step 1: Sign In',
@ -4478,7 +4468,7 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'activity_123' => ':user deleted recurring expense :recurring_expense',
'activity_124' => ':user restored recurring expense :recurring_expense',
'fpx' => "FPX",
'to_view_entity_set_password' => 'To view the :entity you need to set password.',
'to_view_entity_set_password' => 'To view the :entity you need to set a password.',
'unsubscribe' => 'Unsubscribe',
'unsubscribed' => 'Unsubscribed',
'unsubscribed_text' => 'You have been removed from notifications for this document',
@ -4576,7 +4566,7 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'purchase_order_number' => 'Purchase Order Number',
'purchase_order_number_short' => 'Purchase Order #',
'inventory_notification_subject' => 'Inventory threshold notification for product: :product',
'inventory_notification_body' => 'Threshold of :amount has been reach for product: :product',
'inventory_notification_body' => 'Threshold of :amount has been reached for product: :product',
'activity_130' => ':user created purchase order :purchase_order',
'activity_131' => ':user updated purchase order :purchase_order',
'activity_132' => ':user archived purchase order :purchase_order',
@ -4608,7 +4598,7 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'vendor_document_upload' => 'Vendor Document Upload',
'vendor_document_upload_help' => 'Enable vendors to upload documents',
'are_you_enjoying_the_app' => 'Are you enjoying the app?',
'yes_its_great' => 'Yes, it"s great!',
'yes_its_great' => 'Yes, it\'s great!',
'not_so_much' => 'Not so much',
'would_you_rate_it' => 'Great to hear! Would you like to rate it?',
'would_you_tell_us_more' => 'Sorry to hear it! Would you like to tell us more?',
@ -4676,7 +4666,6 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'vat' => 'VAT',
'view_map' => 'View Map',
'set_default_design' => 'Set Default Design',
'add_gateway_help_message' => 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments',
'purchase_order_issued_to' => 'Purchase Order issued to',
'archive_task_status' => 'Archive Task Status',
'delete_task_status' => 'Delete Task Status',
@ -4981,7 +4970,7 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
'xinvoice_no_buyers_reference' => "No buyer's reference given",
'xinvoice_online_payment' => 'The invoice needs to be payed online via the provided link',
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link',
'pre_payment' => 'Pre Payment',
'number_of_payments' => 'Number of payments',
'number_of_payments_helper' => 'The number of times this payment will be made',
@ -4989,11 +4978,6 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'notification_payment_emailed' => 'Payment :payment was emailed to :client',
'notification_payment_emailed_subject' => 'Payment :payment was emailed',
'record_not_found' => 'Record not found',
'product_tax_exempt' => 'Product Tax Exempt',
'product_type_physical' => 'Physical Goods',
'product_type_digital' => 'Digital Goods',
'product_type_service' => 'Services',
'product_type_freight' => 'Shipping',
'minimum_payment_amount' => 'Minimum Payment Amount',
'client_initiated_payments' => 'Client Initiated Payments',
'client_initiated_payments_help' => 'Support making a payment in the client portal without an invoice',
@ -5046,9 +5030,74 @@ email που είναι συνδεδεμένη με το λογαριασμό σ
'oauth_mail' => 'OAuth / Mail',
'preferences' => 'Preferences',
'analytics' => 'Analytics',
'reduced_rate' => 'Reduced Rate',
'tax_all' => 'Tax All',
'tax_selected' => 'Tax Selected',
'version' => 'version',
'seller_subregion' => 'Seller Subregion',
'calculate_taxes' => 'Calculate Taxes',
'calculate_taxes_help' => 'Automatically calculate taxes when saving invoices',
'link_expenses' => 'Link Expenses',
'converted_client_balance' => 'Converted Client Balance',
'converted_payment_balance' => 'Converted Payment Balance',
'total_hours' => 'Total Hours',
'date_picker_hint' => 'Use +days to set the date in the future',
'app_help_link' => 'More information ',
'here' => 'here',
'industry_Restaurant & Catering' => 'Restaurant & Catering',
'show_credits_table' => 'Show Credits Table',
'manual_payment' => 'Payment Manual',
'tax_summary_report' => 'Tax Summary Report',
'tax_category' => 'Tax Category',
'physical_goods' => 'Physical Goods',
'digital_products' => 'Digital Products',
'services' => 'Services',
'shipping' => 'Shipping',
'tax_exempt' => 'Tax Exempt',
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
'lang_Khmer' => 'Khmer',
'routing_id' => 'Routing ID',
'enable_e_invoice' => 'Enable E-Invoice',
'e_invoice_type' => 'E-Invoice Type',
'reduced_tax' => 'Reduced Tax',
'override_tax' => 'Override Tax',
'zero_rated' => 'Zero Rated',
'reverse_tax' => 'Reverse Tax',
'updated_tax_category' => 'Successfully updated the tax category',
'updated_tax_categories' => 'Successfully updated the tax categories',
'set_tax_category' => 'Set Tax Category',
'payment_manual' => 'Payment Manual',
'expense_payment_type' => 'Expense Payment Type',
'payment_type_Cash App' => 'Cash App',
'rename' => 'Rename',
'renamed_document' => 'Successfully renamed document',
'e_invoice' => 'E-Invoice',
'light_dark_mode' => 'Light/Dark Mode',
'activities' => 'Activities',
'recent_transactions' => "Here are your company's most recent transactions:",
'country_Palestine' => "Palestine",
'country_Taiwan' => 'Taiwan',
'duties' => 'Duties',
'order_number' => 'Order Number',
'order_id' => 'Order',
'total_invoices_outstanding' => 'Total Invoices Outstanding',
'recent_activity' => 'Recent Activity',
'enable_auto_bill' => 'Enable auto billing',
'email_count_invoices' => 'Email :count invoices',
'invoice_task_item_description' => 'Invoice Task Item Description',
'invoice_task_item_description_help' => 'Add the item description to the invoice line items',
'next_send_time' => 'Next Send Time',
'uploaded_certificate' => 'Successfully uploaded certificate',
'certificate_set' => 'Certificate set',
'certificate_not_set' => 'Certificate not set',
'passphrase_set' => 'Passphrase set',
'passphrase_not_set' => 'Passphrase not set',
'upload_certificate' => 'Upload Certificate',
'certificate_passphrase' => 'Certificate Passphrase',
'valid_vat_number' => 'Valid VAT Number',
);
return $LANG;
?>
?>

View File

@ -5095,6 +5095,16 @@ $LANG = array(
'upload_certificate' => 'Upload Certificate',
'certificate_passphrase' => 'Certificate Passphrase',
'valid_vat_number' => 'Valid VAT Number',
'react_notification_link' => 'React Notification Links',
'react_notification_link_help' => 'Admin emails will contain links to the react application',
'show_task_billable' => 'Show Task Billable',
'credit_item' => 'Credit Item',
'drop_file_here' => 'Drop file here',
'files' => 'Files',
'camera' => 'Camera',
'gallery' => 'Gallery',
'project_location' => 'Project Location',
'add_gateway_help_message' => 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments',
);

View File

@ -385,11 +385,6 @@ $LANG = array(
'invoice_issued_to' => 'Factura emitida a',
'invalid_counter' => 'Para evitar posibles conflictos, por favor crea un prefijo de facturación y de cotización.',
'mark_sent' => 'Marcar como enviado',
'gateway_help_1' => ':link para registrarse con Authorize.net.',
'gateway_help_2' => ':link para registrarse con Authorize.net.',
'gateway_help_17' => ':link para obtener su firma del API de PayPal.',
'gateway_help_27' => ':link para suscribirte a 2Checkout.com. Para asegurarte que los pagos puedan ser reastreados configura :complete_link como la URL de redirección en Account > Site Management en el portal de 2Checkout.',
'gateway_help_60' => ':link para crear una cuenta WePay.',
'more_designs' => 'Más diseños',
'more_designs_title' => 'Diseños Adicionales de Facturas',
'more_designs_cloud_header' => 'Pase a Pro para más diseños de facturas',
@ -504,7 +499,6 @@ $LANG = array(
'notification_quote_approved' => 'El cliente :client ha aprobado la cotización :invoice por el valor :amount.',
'resend_confirmation' => 'Reenviar correo de confirmación',
'confirmation_resent' => 'El correo de confirmación fue reenviado',
'gateway_help_42' => ':link para registrarse en BitPay.<br/>Nota: use una llave del API legacy, no un token API.',
'payment_type_credit_card' => 'Tarjeta de Crédito',
'payment_type_paypal' => 'PayPal',
'payment_type_bitcoin' => 'Bitcoin',
@ -589,7 +583,6 @@ $LANG = array(
'prefix' => 'Prefijo',
'counter' => 'Contador',
'payment_type_dwolla' => 'Dwolla',
'gateway_help_43' => ':link para registrarse con Dwolla.',
'partial_value' => 'Debe ser mayor que cero y menor que el total',
'more_actions' => 'Más Acciones',
'pro_plan_title' => 'NINJA PRO',
@ -1094,8 +1087,6 @@ $LANG = array(
'user_create_all' => 'Crear clientes, facturas, etc.',
'user_view_all' => 'Ver todos los clientes, facturas, etc.',
'user_edit_all' => 'Editar todos los clientes, facturas, etc.',
'gateway_help_20' => ':link to sign up for Sage Pay.',
'gateway_help_21' => ':link to sign up for Sage Pay.',
'partial_due' => 'Partial Due',
'restore_vendor' => 'Recuperar Proveedor',
'restored_vendor' => 'Proveedor recuperado con éxito',
@ -2279,7 +2270,6 @@ $LANG = array(
'product_notes' => 'Notas de Producto',
'app_version' => 'Versión de la Aplicación',
'ofx_version' => 'Versión de OFX',
'gateway_help_23' => ':link para obtener tus llaves del API de Stripe.',
'error_app_key_set_to_default' => 'Error: APP_KEY está configurado con un valor por defecto, para actualizarlo haz un backup de la base de datos y después ejecuta el comando <code>php artisan ninja:update-key</code>',
'charge_late_fee' => 'Cobrar Tarifa por Tardanza',
'late_fee_amount' => 'Valor Tarifa por Tardanza',
@ -2519,7 +2509,6 @@ $LANG = array(
'videos' => 'Videos',
'video' => 'Video',
'return_to_invoice' => 'Volver a la Factura',
'gateway_help_13' => 'Para usar ITN, deje el campo Clave de PDT en blanco.',
'partial_due_date' => 'Fecha de Vencimiento Parcial',
'task_fields' => 'Campos de la Tarea',
'product_fields_help' => 'Arrastra y suelta los campos para cambiar su orden',
@ -4010,6 +3999,7 @@ $LANG = array(
'notification_invoice_reminder1_sent_subject' => 'El recordatorio 1 de la factura :invoice se envió a :client',
'notification_invoice_reminder2_sent_subject' => 'El recordatorio 2 de la factura :invoice se envió a :client',
'notification_invoice_reminder3_sent_subject' => 'El recordatorio 3 de la factura :invoice se envió a :client',
'notification_invoice_custom_sent_subject' => 'Custom reminder for Invoice :invoice was sent to :client',
'notification_invoice_reminder_endless_sent_subject' => 'Se envió un recordatorio interminable de la factura :invoice a :client',
'assigned_user' => 'Usuario asignado',
'setup_steps_notice' => 'Para continuar con el siguiente paso, asegúrese de probar cada sección.',
@ -4674,7 +4664,6 @@ $LANG = array(
'vat' => 'IVA',
'view_map' => 'Ver el mapa',
'set_default_design' => 'Establecer diseño predeterminado',
'add_gateway_help_message' => 'Agregue una pasarela de pago (es decir, Stripe, WePay o PayPal) para aceptar pagos en línea',
'purchase_order_issued_to' => 'Orden de compra emitida a',
'archive_task_status' => 'Estado de la tarea de archivo',
'delete_task_status' => 'Eliminar estado de tarea',
@ -5064,10 +5053,49 @@ $LANG = array(
'shipping' => 'Shipping',
'tax_exempt' => 'Tax Exempt',
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
'lang_Khmer' => 'Khmer',
'routing_id' => 'Routing ID',
'enable_e_invoice' => 'Enable E-Invoice',
'e_invoice_type' => 'E-Invoice Type',
'reduced_tax' => 'Reduced Tax',
'override_tax' => 'Override Tax',
'zero_rated' => 'Zero Rated',
'reverse_tax' => 'Reverse Tax',
'updated_tax_category' => 'Successfully updated the tax category',
'updated_tax_categories' => 'Successfully updated the tax categories',
'set_tax_category' => 'Set Tax Category',
'payment_manual' => 'Payment Manual',
'expense_payment_type' => 'Expense Payment Type',
'payment_type_Cash App' => 'Cash App',
'rename' => 'Rename',
'renamed_document' => 'Successfully renamed document',
'e_invoice' => 'E-Invoice',
'light_dark_mode' => 'Light/Dark Mode',
'activities' => 'Activities',
'recent_transactions' => "Here are your company's most recent transactions:",
'country_Palestine' => "Palestine",
'country_Taiwan' => 'Taiwan',
'duties' => 'Duties',
'order_number' => 'Order Number',
'order_id' => 'Order',
'total_invoices_outstanding' => 'Total Invoices Outstanding',
'recent_activity' => 'Recent Activity',
'enable_auto_bill' => 'Enable auto billing',
'email_count_invoices' => 'Email :count invoices',
'invoice_task_item_description' => 'Invoice Task Item Description',
'invoice_task_item_description_help' => 'Add the item description to the invoice line items',
'next_send_time' => 'Next Send Time',
'uploaded_certificate' => 'Successfully uploaded certificate',
'certificate_set' => 'Certificate set',
'certificate_not_set' => 'Certificate not set',
'passphrase_set' => 'Passphrase set',
'passphrase_not_set' => 'Passphrase not set',
'upload_certificate' => 'Upload Certificate',
'certificate_passphrase' => 'Certificate Passphrase',
'valid_vat_number' => 'Valid VAT Number',
);
return $LANG;
?>
?>

Some files were not shown because too many files have changed in this diff Show More