diff --git a/VERSION.txt b/VERSION.txt
index 80ba0b325279..e003fe334fcd 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1 +1 @@
-5.3.78
\ No newline at end of file
+5.3.79
\ No newline at end of file
diff --git a/app/Export/CSV/ClientExport.php b/app/Export/CSV/ClientExport.php
new file mode 100644
index 000000000000..3abb7e92db64
--- /dev/null
+++ b/app/Export/CSV/ClientExport.php
@@ -0,0 +1,180 @@
+ 'client.address1',
+ 'address2' => 'client.address2',
+ 'balance' => 'client.balance',
+ 'city' => 'client.city',
+ 'country' => 'client.country_id',
+ 'credit_balance' => 'client.credit_balance',
+ 'custom_value1' => 'client.custom_value1',
+ 'custom_value2' => 'client.custom_value2',
+ 'custom_value3' => 'client.custom_value3',
+ 'custom_value4' => 'client.custom_value4',
+ 'id_number' => 'client.id_number',
+ 'industry' => 'client.industry_id',
+ 'last_login' => 'client.last_login',
+ 'name' => 'client.name',
+ 'number' => 'client.number',
+ 'paid_to_date' => 'client.paid_to_date',
+ 'phone' => 'client.phone',
+ 'postal_code' => 'client.postal_code',
+ 'private_notes' => 'client.private_notes',
+ 'public_notes' => 'client.public_notes',
+ 'shipping_address1' => 'client.shipping_address1',
+ 'shipping_address2' => 'client.shipping_address2',
+ 'shipping_city' => 'client.shipping_city',
+ 'shipping_country' => 'client.shipping_country_id',
+ 'shipping_postal_code' => 'client.shipping_postal_code',
+ 'shipping_state' => 'client.shipping_state',
+ 'state' => 'client.state',
+ 'vat_number' => 'client.vat_number',
+ 'website' => 'client.website',
+ 'currency' => 'client.currency',
+ 'first_name' => 'contact.first_name',
+ 'last_name' => 'contact.last_name',
+ 'phone' => 'contact.phone',
+ 'contact_custom_value1' => 'contact.custom_value1',
+ 'contact_custom_value2' => 'contact.custom_value2',
+ 'contact_custom_value3' => 'contact.custom_value3',
+ 'contact_custom_value4' => 'contact.custom_value4',
+ 'email' => 'contact.email',
+ ];
+
+ private array $decorate_keys = [
+ 'client.country_id',
+ 'client.shipping_country_id',
+ 'client.currency',
+ 'client.industry',
+ ];
+
+ public function __construct(Company $company, array $report_keys)
+ {
+ $this->company = $company;
+ $this->report_keys = $report_keys;
+ $this->client_transformer = new ClientTransformer();
+ $this->contact_transformer = new ClientContactTransformer();
+ }
+
+ public function run()
+ {
+
+ MultiDB::setDb($this->company->db);
+ App::forgetInstance('translator');
+ App::setLocale($this->company->locale());
+ $t = app('translator');
+ $t->replace(Ninja::transformTranslations($this->company->settings));
+
+ //load the CSV document from a string
+ $this->csv = Writer::createFromString();
+
+ //insert the header
+ $this->csv->insertOne($this->buildHeader());
+
+ Client::with('contacts')->where('company_id', $this->company->id)
+ ->where('is_deleted',0)
+ ->cursor()
+ ->each(function ($client){
+
+ $this->csv->insertOne($this->buildRow($client));
+
+ });
+
+
+ echo $this->csv->toString();
+
+
+ }
+
+ private function buildHeader() :array
+ {
+
+ $header = [];
+
+ foreach(array_keys($this->report_keys) as $key)
+ $header[] = ctrans("texts.{$key}");
+
+ return $header;
+ }
+
+ private function buildRow(Client $client) :array
+ {
+
+ $transformed_contact = false;
+
+ $transformed_client = $this->client_transformer->transform($client);
+
+ if($contact = $client->contacts()->first())
+ $transformed_contact = $this->contact_transformer->transform($contact);
+
+
+ $entity = [];
+
+ foreach(array_values($this->report_keys) as $key){
+
+ $parts = explode(".",$key);
+ $entity[$parts[1]] = "";
+
+ if($parts[0] == 'client') {
+ $entity[$parts[1]] = $transformed_client[$parts[1]];
+ }
+ elseif($parts[0] == 'contact') {
+ $entity[$parts[1]] = $transformed_contact[$parts[1]];
+ }
+
+ }
+
+ return $this->decorateAdvancedFields($client, $entity);
+
+ }
+
+ private function decorateAdvancedFields(Client $client, array $entity) :array
+ {
+
+ if(array_key_exists('country_id', $entity))
+ $entity['country_id'] = $client->country ? ctrans("texts.country_{$client->country->name}") : "";
+
+ if(array_key_exists('shipping_country_id', $entity))
+ $entity['shipping_country_id'] = $client->shipping_country ? ctrans("texts.country_{$client->shipping_country->name}") : "";
+
+ if(array_key_exists('currency', $entity))
+ $entity['currency'] = $client->currency()->code;
+
+ if(array_key_exists('industry_id', $entity))
+ $entity['industry_id'] = $client->industry ? ctrans("texts.industry_{$client->industry->name}") : "";
+
+ return $entity;
+ }
+
+}
diff --git a/app/Factory/RecurringInvoiceFactory.php b/app/Factory/RecurringInvoiceFactory.php
index 7658938a8dcb..80691807a4bb 100644
--- a/app/Factory/RecurringInvoiceFactory.php
+++ b/app/Factory/RecurringInvoiceFactory.php
@@ -48,7 +48,7 @@ class RecurringInvoiceFactory
$invoice->frequency_id = RecurringInvoice::FREQUENCY_MONTHLY;
$invoice->last_sent_date = null;
$invoice->next_send_date = null;
- $invoice->remaining_cycles = 0;
+ $invoice->remaining_cycles = -1;
$invoice->paid_to_date = 0;
return $invoice;
diff --git a/app/Http/Controllers/ClientPortal/InvitationController.php b/app/Http/Controllers/ClientPortal/InvitationController.php
index 7c22fe41f86d..dc1a3cd21afe 100644
--- a/app/Http/Controllers/ClientPortal/InvitationController.php
+++ b/app/Http/Controllers/ClientPortal/InvitationController.php
@@ -210,7 +210,7 @@ class InvitationController extends Controller
public function paymentRouter(string $contact_key, string $payment_id)
{
- $contact = ClientContact::where('contact_key', $contact_key)->firstOrFail();
+ $contact = ClientContact::withTrashed()->where('contact_key', $contact_key)->firstOrFail();
$payment = Payment::find($this->decodePrimaryKey($payment_id));
if($payment->client_id != $contact->client_id)
diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php
index bbd80dca4826..c3d8039546e4 100644
--- a/app/Http/Controllers/InvoiceController.php
+++ b/app/Http/Controllers/InvoiceController.php
@@ -215,7 +215,7 @@ class InvoiceController extends BaseController
public function store(StoreInvoiceRequest $request)
{
- $client = Client::find($request->input('client_id'));
+ // $client = Client::find($request->input('client_id'));
$invoice = $this->invoice_repo->save($request->all(), InvoiceFactory::create(auth()->user()->company()->id, auth()->user()->id));
diff --git a/app/Http/Controllers/Reports/ClientReportController.php b/app/Http/Controllers/Reports/ClientReportController.php
new file mode 100644
index 000000000000..804cbce47d71
--- /dev/null
+++ b/app/Http/Controllers/Reports/ClientReportController.php
@@ -0,0 +1,70 @@
+json(['message' => 'Processing'], 200);
+ $export = new ClientExport(auth()->user()->company(), $request->input('keys'));
+
+ $csv = $export->run();
+ }
+
+
+
+}
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index 515d5f0df540..7cd6458ed8be 100644
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -170,6 +170,8 @@ class Kernel extends HttpKernel
protected $middlewarePriority = [
+ EncryptCookies::class,
+ StartSession::class,
SessionDomains::class,
Cors::class,
SetDomainNameDb::class,
diff --git a/app/Http/Middleware/ContactKeyLogin.php b/app/Http/Middleware/ContactKeyLogin.php
index 9891236cfbd5..129cd54c6c9c 100644
--- a/app/Http/Middleware/ContactKeyLogin.php
+++ b/app/Http/Middleware/ContactKeyLogin.php
@@ -122,6 +122,20 @@ class ContactKeyLogin
return redirect($this->setRedirectPath());
}
+ }elseif ($request->segment(3)) {
+ if ($client_contact = ClientContact::where('contact_key', $request->segment(3))->first()) {
+ if(empty($client_contact->email)) {
+ $client_contact->email = Str::random(6) . "@example.com"; $client_contact->save();
+ }
+
+ auth()->guard('contact')->loginUsingId($client_contact->id, true);
+
+ if ($request->query('next')) {
+ return redirect($request->query('next'));
+ }
+
+ return redirect($this->setRedirectPath());
+ }
}
//28-02-2022 middleware should not allow this to progress as we should have redirected by this stage.
abort(404, "Unable to authenticate.");
diff --git a/app/Http/Requests/Report/ClientReportRequest.php b/app/Http/Requests/Report/ClientReportRequest.php
new file mode 100644
index 000000000000..5fa2e16ec95c
--- /dev/null
+++ b/app/Http/Requests/Report/ClientReportRequest.php
@@ -0,0 +1,27 @@
+user()->isAdmin();
+ }
+}
diff --git a/app/Http/ValidationRules/ValidCreditsPresentRule.php b/app/Http/ValidationRules/ValidCreditsPresentRule.php
index 5cb77a680ed8..ac62328aede5 100644
--- a/app/Http/ValidationRules/ValidCreditsPresentRule.php
+++ b/app/Http/ValidationRules/ValidCreditsPresentRule.php
@@ -46,10 +46,9 @@ class ValidCreditsPresentRule implements Rule
if (request()->input('credits') && is_array(request()->input('credits'))) {
$credit_collection = Credit::whereIn('id', $this->transformKeys(array_column(request()->input('credits'), 'credit_id')))
- ->where('balance', '>', 0)
- ->get();
+ ->count();
- return $credit_collection->count() == count(request()->input('credits'));
+ return $credit_collection == count(request()->input('credits'));
}
return true;
diff --git a/app/Jobs/Company/CreateCompanyTaskStatuses.php b/app/Jobs/Company/CreateCompanyTaskStatuses.php
index 2c07dbf6cf1f..6e5b3bd7bb38 100644
--- a/app/Jobs/Company/CreateCompanyTaskStatuses.php
+++ b/app/Jobs/Company/CreateCompanyTaskStatuses.php
@@ -15,6 +15,7 @@ use App\Libraries\MultiDB;
use App\Models\TaskStatus;
use App\Utils\Traits\MakesHash;
use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Support\Facades\App;
class CreateCompanyTaskStatuses
{
@@ -51,6 +52,10 @@ class CreateCompanyTaskStatuses
if(TaskStatus::where('company_id', $this->company->id)->count() > 0)
return;
+ App::forgetInstance('translator');
+ $t = app('translator');
+ App::setLocale($this->company->locale());
+
$task_statuses = [
['name' => ctrans('texts.backlog'), 'company_id' => $this->company->id, 'user_id' => $this->user->id, 'created_at' => now(), 'updated_at' => now(), 'status_order' => 1],
['name' => ctrans('texts.ready_to_do'), 'company_id' => $this->company->id, 'user_id' => $this->user->id, 'created_at' => now(), 'updated_at' => now(), 'status_order' => 2],
diff --git a/app/Jobs/Document/ZipDocuments.php b/app/Jobs/Document/ZipDocuments.php
index 12312acb207e..810c9c2359b5 100644
--- a/app/Jobs/Document/ZipDocuments.php
+++ b/app/Jobs/Document/ZipDocuments.php
@@ -21,19 +21,23 @@ use App\Mail\DownloadInvoices;
use App\Models\Company;
use App\Models\Document;
use App\Models\User;
+use App\Utils\Ninja;
use App\Utils\TempFile;
+use App\Utils\Traits\MakesDates;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;
use ZipArchive;
class ZipDocuments implements ShouldQueue
{
- use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, MakesDates;
public $document_ids;
@@ -77,6 +81,11 @@ class ZipDocuments implements ShouldQueue
{
MultiDB::setDb($this->company->db);
+ App::setLocale($this->company->locale());
+ App::forgetInstance('translator');
+ $t = app('translator');
+ $t->replace(Ninja::transformTranslations($this->company->settings));
+
# create new zip object
$zipFile = new \PhpZip\ZipFile();
$file_name = date('Y-m-d').'_'.str_replace(' ', '_', trans('texts.documents')).'.zip';
@@ -88,7 +97,7 @@ class ZipDocuments implements ShouldQueue
foreach ($documents as $document) {
- $zipFile->addFromString($document->name, $document->getFile());
+ $zipFile->addFromString($this->buildFileName($document), $document->getFile());
}
@@ -112,7 +121,20 @@ class ZipDocuments implements ShouldQueue
$zipFile->close();
}
-
}
+
+ private function buildFileName($document) :string
+ {
+ $filename = $document->name;
+
+ $date = $this->formatDate(Carbon::createFromTimestamp($document->created_at), 'Y-m-d');
+
+ $number = "_";
+
+ if(isset($document->documentable->number))
+ $number = "_".$document->documentable->number;
+
+ return "{$date}_{$document->documentable->translate_entity()}{$number}_{$filename}";
+ }
}
diff --git a/app/Jobs/Quote/ApplyQuoteNumber.php b/app/Jobs/Quote/ApplyQuoteNumber.php
deleted file mode 100644
index a046e5f62315..000000000000
--- a/app/Jobs/Quote/ApplyQuoteNumber.php
+++ /dev/null
@@ -1,85 +0,0 @@
-quote = $quote;
-
- $this->settings = $settings;
-
- $this->company = $company;
- }
-
- /**
- * Execute the job.
- *
- *
- * @return Quote
- */
- public function handle()
- {
- MultiDB::setDB($this->company->db);
-
- //return early
- if ($this->quote->number != '') {
- return $this->quote;
- }
-
- switch ($this->settings->quote_number_applied) {
- case 'when_saved':
- $this->quote->number = $this->getNextQuoteNumber($this->quote->client, $this->quote);
- break;
- case 'when_sent':
- if ($this->quote->status_id == Quote::STATUS_SENT) {
- $this->quote->number = $this->getNextQuoteNumber($this->quote->client, $this->quote);
- }
- break;
-
- default:
- // code...
- break;
- }
-
- $this->quote->save();
-
- return $this->quote;
- }
-}
diff --git a/app/Jobs/Util/Import.php b/app/Jobs/Util/Import.php
index d30948bc3b87..aa5ebffa04ac 100644
--- a/app/Jobs/Util/Import.php
+++ b/app/Jobs/Util/Import.php
@@ -568,7 +568,9 @@ class Import implements ShouldQueue
unset($modified['id']);
unset($modified['password']); //cant import passwords.
unset($modified['confirmation_code']); //cant import passwords.
-
+ unset($modified['oauth_user_id']);
+ unset($modified['oauth_provider_id']);
+
$user = $user_repository->save($modified, $this->fetchUser($resource['email']), true, true);
$user->email_verified_at = now();
// $user->confirmation_code = '';
diff --git a/app/Listeners/Invoice/InvoiceCreatedNotification.php b/app/Listeners/Invoice/InvoiceCreatedNotification.php
index 4f6d117f8176..f85200d5aad3 100644
--- a/app/Listeners/Invoice/InvoiceCreatedNotification.php
+++ b/app/Listeners/Invoice/InvoiceCreatedNotification.php
@@ -64,7 +64,7 @@ class InvoiceCreatedNotification implements ShouldQueue
/* Returns an array of notification methods */
$methods = $this->findUserNotificationTypes($invoice->invitations()->first(), $company_user, 'invoice', ['all_notifications', 'invoice_created', 'invoice_created_all']);
/* If one of the methods is email then we fire the EntitySentMailer */
- // if (($key = array_search('mail', $methods))) {
+
if (($key = array_search('mail', $methods)) !== false) {
unset($methods[$key]);
diff --git a/app/Models/Client.php b/app/Models/Client.php
index 48ce8d6c8c84..9133fc951eff 100644
--- a/app/Models/Client.php
+++ b/app/Models/Client.php
@@ -22,6 +22,7 @@ use App\Models\Quote;
use App\Models\Task;
use App\Services\Client\ClientService;
use App\Utils\Traits\AppSetup;
+use App\Utils\Traits\ClientGroupSettingsSaver;
use App\Utils\Traits\GeneratesCounter;
use App\Utils\Traits\MakesDates;
use App\Utils\Traits\MakesHash;
@@ -40,6 +41,7 @@ class Client extends BaseModel implements HasLocalePreference
use Filterable;
use GeneratesCounter;
use AppSetup;
+ use ClientGroupSettingsSaver;
protected $presenter = ClientPresenter::class;
@@ -87,12 +89,6 @@ class Client extends BaseModel implements HasLocalePreference
'gateway_tokens',
'documents',
'contacts.company',
- // 'currency',
- // 'primary_contact',
- // 'country',
- // 'contacts',
- // 'shipping_country',
- // 'company',
];
protected $casts = [
@@ -710,4 +706,8 @@ class Client extends BaseModel implements HasLocalePreference
];
}
+ public function translate_entity()
+ {
+ return ctrans('texts.client');
+ }
}
diff --git a/app/Models/Company.php b/app/Models/Company.php
index 24e1ff98f288..35739589ae56 100644
--- a/app/Models/Company.php
+++ b/app/Models/Company.php
@@ -549,4 +549,9 @@ class Company extends BaseModel
return $data;
}
+
+ public function translate_entity()
+ {
+ return ctrans('texts.company');
+ }
}
diff --git a/app/Models/Credit.php b/app/Models/Credit.php
index 310041dbefd4..191b4dbcbbf4 100644
--- a/app/Models/Credit.php
+++ b/app/Models/Credit.php
@@ -314,4 +314,9 @@ class Credit extends BaseModel
'credit_status' => $credit->status_id ?: 1,
];
}
+
+ public function translate_entity()
+ {
+ return ctrans('texts.credit');
+ }
}
diff --git a/app/Models/Document.php b/app/Models/Document.php
index a6ff0fba4c32..7ebf62c77aaa 100644
--- a/app/Models/Document.php
+++ b/app/Models/Document.php
@@ -140,4 +140,9 @@ class Document extends BaseModel
{
return Storage::get($this->url);
}
+
+ public function translate_entity()
+ {
+ return ctrans('texts.document');
+ }
}
diff --git a/app/Models/Expense.php b/app/Models/Expense.php
index d9a09f6c2c54..27f1273113d1 100644
--- a/app/Models/Expense.php
+++ b/app/Models/Expense.php
@@ -101,4 +101,9 @@ class Expense extends BaseModel
{
return $this->belongsTo(Client::class);
}
+
+ public function translate_entity()
+ {
+ return ctrans('texts.expense');
+ }
}
diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php
index 30d4128cd318..5a028981c5f7 100644
--- a/app/Models/Invoice.php
+++ b/app/Models/Invoice.php
@@ -560,4 +560,9 @@ class Invoice extends BaseModel
'invoice_status' => $invoice->status_id ?: 1,
];
}
+
+ public function translate_entity()
+ {
+ return ctrans('texts.invoice');
+ }
}
diff --git a/app/Models/Payment.php b/app/Models/Payment.php
index 584fef37652e..47094396944b 100644
--- a/app/Models/Payment.php
+++ b/app/Models/Payment.php
@@ -337,4 +337,8 @@ class Payment extends BaseModel
];
}
+ public function translate_entity()
+ {
+ return ctrans('texts.payment');
+ }
}
diff --git a/app/Models/Product.php b/app/Models/Product.php
index 01b185263387..19f3d2be7e4f 100644
--- a/app/Models/Product.php
+++ b/app/Models/Product.php
@@ -64,4 +64,9 @@ class Product extends BaseModel
{
return $this->morphMany(Document::class, 'documentable');
}
-}
+
+ public function translate_entity()
+ {
+ return ctrans('texts.product');
+ }
+}
\ No newline at end of file
diff --git a/app/Models/Project.php b/app/Models/Project.php
index daf67ad2d1e8..694a44c8dc89 100644
--- a/app/Models/Project.php
+++ b/app/Models/Project.php
@@ -78,4 +78,8 @@ class Project extends BaseModel
return $this->hasMany(Task::class);
}
+ public function translate_entity()
+ {
+ return ctrans('texts.project');
+ }
}
diff --git a/app/Models/Quote.php b/app/Models/Quote.php
index 7dd4af6e1693..a0a9c8b09925 100644
--- a/app/Models/Quote.php
+++ b/app/Models/Quote.php
@@ -311,4 +311,9 @@ class Quote extends BaseModel
{
return $this->calc()->getTotal();
}
+
+ public function translate_entity()
+ {
+ return ctrans('texts.quote');
+ }
}
diff --git a/app/Models/RecurringExpense.php b/app/Models/RecurringExpense.php
index b886fac71349..aca56970e451 100644
--- a/app/Models/RecurringExpense.php
+++ b/app/Models/RecurringExpense.php
@@ -239,5 +239,8 @@ class RecurringExpense extends BaseModel
}
}
-
+ public function translate_entity()
+ {
+ return ctrans('texts.recurring_expense');
+ }
}
diff --git a/app/Models/RecurringInvoice.php b/app/Models/RecurringInvoice.php
index b600c8c65b4f..7b83d1c22a46 100644
--- a/app/Models/RecurringInvoice.php
+++ b/app/Models/RecurringInvoice.php
@@ -505,4 +505,9 @@ class RecurringInvoice extends BaseModel
{
return $this->belongsTo(Subscription::class);
}
+
+ public function translate_entity()
+ {
+ return ctrans('texts.recurring_invoice');
+ }
}
diff --git a/app/Models/RecurringQuote.php b/app/Models/RecurringQuote.php
index b6a685a3a2cd..a35b911453b4 100644
--- a/app/Models/RecurringQuote.php
+++ b/app/Models/RecurringQuote.php
@@ -488,5 +488,9 @@ class RecurringQuote extends BaseModel
return new RecurringService($this);
}
+ public function translate_entity()
+ {
+ return ctrans('texts.recurring_quote');
+ }
}
diff --git a/app/Models/Task.php b/app/Models/Task.php
index 96d169d965e3..b4e10732200d 100644
--- a/app/Models/Task.php
+++ b/app/Models/Task.php
@@ -147,4 +147,9 @@ class Task extends BaseModel
return round($duration);
}
-}
+
+ public function translate_entity()
+ {
+ return ctrans('texts.task');
+ }
+}
\ No newline at end of file
diff --git a/app/Models/User.php b/app/Models/User.php
index 7288f94a7e67..16a809109040 100644
--- a/app/Models/User.php
+++ b/app/Models/User.php
@@ -449,4 +449,9 @@ class User extends Authenticatable implements MustVerifyEmail
{
return new UserService($this);
}
+
+ public function translate_entity()
+ {
+ return ctrans('texts.user');
+ }
}
diff --git a/app/Models/Vendor.php b/app/Models/Vendor.php
index b7505d680a25..7cc03366a364 100644
--- a/app/Models/Vendor.php
+++ b/app/Models/Vendor.php
@@ -104,4 +104,9 @@ class Vendor extends BaseModel
{
return $this->belongsTo(User::class)->withTrashed();
}
+
+ public function translate_entity()
+ {
+ return ctrans('texts.vendor');
+ }
}
diff --git a/app/PaymentDrivers/Authorize/AuthorizeCreditCard.php b/app/PaymentDrivers/Authorize/AuthorizeCreditCard.php
index 98906f81d2d2..fe361592dd83 100644
--- a/app/PaymentDrivers/Authorize/AuthorizeCreditCard.php
+++ b/app/PaymentDrivers/Authorize/AuthorizeCreditCard.php
@@ -257,7 +257,7 @@ class AuthorizeCreditCard
$description = "There was an error processing the payment";
if ($response && $response->getErrors() != null) {
- $code = $response->getErrors()[0]->getErrorCode();
+ $code = (int)$response->getErrors()[0]->getErrorCode();
$description = $response->getErrors()[0]->getErrorText();
}
diff --git a/app/PaymentDrivers/StripePaymentDriver.php b/app/PaymentDrivers/StripePaymentDriver.php
index f693459e7a7f..cc4a769be12a 100644
--- a/app/PaymentDrivers/StripePaymentDriver.php
+++ b/app/PaymentDrivers/StripePaymentDriver.php
@@ -443,8 +443,11 @@ class StripePaymentDriver extends BaseDriver
"starting_after" => null
],$this->stripe_connect_auth);
- if(count($searchResults) == 1)
- return $searchResults->data[0];
+ if(count($searchResults) == 1){
+ $customer = $searchResults->data[0];
+ $this->updateStripeCustomer($customer);
+ return $customer;
+ }
//Else create a new record
$data['name'] = $this->client->present()->name();
@@ -454,6 +457,13 @@ class StripePaymentDriver extends BaseDriver
$data['email'] = $this->client->present()->email();
}
+ $data['address']['line1'] = $this->client->address1;
+ $data['address']['line2'] = $this->client->address2;
+ $data['address']['city'] = $this->client->city;
+ $data['address']['postal_code'] = $this->client->postal_code;
+ $data['address']['state'] = $this->client->state;
+ $data['address']['country'] = $this->client->country ? $this->client->country->iso_3166_2 : "";
+
$customer = Customer::create($data, $this->stripe_connect_auth);
if (!$customer) {
@@ -463,6 +473,32 @@ class StripePaymentDriver extends BaseDriver
return $customer;
}
+ public function updateStripeCustomer($customer)
+ {
+ //Else create a new record
+ $data['name'] = $this->client->present()->name();
+ $data['phone'] = substr($this->client->present()->phone(), 0 , 20);
+
+ if (filter_var($this->client->present()->email(), FILTER_VALIDATE_EMAIL)) {
+ $data['email'] = $this->client->present()->email();
+ }
+
+ $data['address']['line1'] = $this->client->address1;
+ $data['address']['line2'] = $this->client->address2;
+ $data['address']['city'] = $this->client->city;
+ $data['address']['postal_code'] = $this->client->postal_code;
+ $data['address']['state'] = $this->client->state;
+ $data['address']['country'] = $this->client->country ? $this->client->country->iso_3166_2 : "";
+
+ try{
+ \Stripe\Customer::update($customer->id, $data, $this->stripe_connect_auth);
+ }
+ catch(Exception $e){
+ nlog("unable to update clients in Stripe");
+ }
+
+ }
+
public function refund(Payment $payment, $amount, $return_client_response = false)
{
$this->init();
diff --git a/app/Repositories/ClientRepository.php b/app/Repositories/ClientRepository.php
index 8aec2c5604bf..a48a8bec49e7 100644
--- a/app/Repositories/ClientRepository.php
+++ b/app/Repositories/ClientRepository.php
@@ -14,6 +14,7 @@ namespace App\Repositories;
use App\Factory\ClientFactory;
use App\Models\Client;
use App\Models\Company;
+use App\Utils\Traits\ClientGroupSettingsSaver;
use App\Utils\Traits\GeneratesCounter;
use App\Utils\Traits\SavesDocuments;
@@ -61,10 +62,14 @@ class ClientRepository extends BaseRepository
$client->fill($data);
+
+ if (array_key_exists('settings', $data)) {
+ $client->saveSettings($data['settings'], $client);
+ }
+
if(!$client->country_id){
$company = Company::find($client->company_id);
$client->country_id = $company->settings->country_id;
-
}
$client->save();
diff --git a/app/Repositories/PaymentRepository.php b/app/Repositories/PaymentRepository.php
index fa02bec8e00f..651737fd8393 100644
--- a/app/Repositories/PaymentRepository.php
+++ b/app/Repositories/PaymentRepository.php
@@ -49,15 +49,7 @@ class PaymentRepository extends BaseRepository {
*/
public function save(array $data, Payment $payment): ?Payment
{
- // if ($payment->amount >= 0) {
- // return $this->applyPayment($data, $payment);
- // }
-
-
- return $this->applyPayment($data, $payment);
-
-
- return $payment;
+ return $this->applyPayment($data, $payment);
}
/**
@@ -164,6 +156,7 @@ class PaymentRepository extends BaseRepository {
$credit = Credit::withTrashed()->find($this->decodePrimaryKey($paid_credit['credit_id']));
if ($credit) {
+ $credit = $credit->service()->markSent()->save();
ApplyCreditPayment::dispatchNow($credit, $payment, $paid_credit['amount'], $credit->company);
}
}
diff --git a/app/Services/Credit/ApplyNumber.php b/app/Services/Credit/ApplyNumber.php
index 8bb190952118..bfc474f7cd22 100644
--- a/app/Services/Credit/ApplyNumber.php
+++ b/app/Services/Credit/ApplyNumber.php
@@ -15,6 +15,7 @@ use App\Models\Client;
use App\Models\Credit;
use App\Services\AbstractService;
use App\Utils\Traits\GeneratesCounter;
+use Illuminate\Database\QueryException;
class ApplyNumber extends AbstractService
{
@@ -24,6 +25,8 @@ class ApplyNumber extends AbstractService
private $credit;
+ private bool $completed = true;
+
public function __construct(Client $client, Credit $credit)
{
$this->client = $client;
@@ -37,8 +40,40 @@ class ApplyNumber extends AbstractService
return $this->credit;
}
- $this->credit->number = $this->getNextCreditNumber($this->client, $this->credit);
+ $this->trySaving();
+ // $this->credit->number = $this->getNextCreditNumber($this->client, $this->credit);
return $this->credit;
}
+
+
+ private function trySaving()
+ {
+
+ $x=1;
+
+ do{
+
+ try{
+
+ $this->credit->number = $this->getNextCreditNumber($this->client, $this->credit);
+ $this->credit->saveQuietly();
+
+ $this->completed = false;
+
+
+ }
+ catch(QueryException $e){
+
+ $x++;
+
+ if($x>10)
+ $this->completed = false;
+ }
+
+ }
+ while($this->completed);
+
+ }
+
}
diff --git a/app/Services/Invoice/ApplyNumber.php b/app/Services/Invoice/ApplyNumber.php
index 786051fb18c8..333566a82dbb 100644
--- a/app/Services/Invoice/ApplyNumber.php
+++ b/app/Services/Invoice/ApplyNumber.php
@@ -15,6 +15,7 @@ use App\Models\Client;
use App\Models\Invoice;
use App\Services\AbstractService;
use App\Utils\Traits\GeneratesCounter;
+use Illuminate\Database\QueryException;
class ApplyNumber extends AbstractService
{
@@ -24,6 +25,8 @@ class ApplyNumber extends AbstractService
private $invoice;
+ private $completed = true;
+
public function __construct(Client $client, Invoice $invoice)
{
$this->client = $client;
@@ -39,11 +42,13 @@ class ApplyNumber extends AbstractService
switch ($this->client->getSetting('counter_number_applied')) {
case 'when_saved':
- $this->invoice->number = $this->getNextInvoiceNumber($this->client, $this->invoice, $this->invoice->recurring_id);
+ $this->trySaving();
+ // $this->invoice->number = $this->getNextInvoiceNumber($this->client, $this->invoice, $this->invoice->recurring_id);
break;
case 'when_sent':
if ($this->invoice->status_id == Invoice::STATUS_SENT) {
- $this->invoice->number = $this->getNextInvoiceNumber($this->client, $this->invoice, $this->invoice->recurring_id);
+ $this->trySaving();
+ // $this->invoice->number = $this->getNextInvoiceNumber($this->client, $this->invoice, $this->invoice->recurring_id);
}
break;
@@ -53,4 +58,33 @@ class ApplyNumber extends AbstractService
return $this->invoice;
}
+
+ private function trySaving()
+ {
+
+ $x=1;
+
+ do{
+
+ try{
+
+ $this->invoice->number = $this->getNextInvoiceNumber($this->client, $this->invoice, $this->invoice->recurring_id);
+ $this->invoice->saveQuietly();
+
+ $this->completed = false;
+
+
+ }
+ catch(QueryException $e){
+
+ $x++;
+
+ if($x>10)
+ $this->completed = false;
+ }
+
+ }
+ while($this->completed);
+
+ }
}
diff --git a/app/Services/Invoice/ApplyRecurringNumber.php b/app/Services/Invoice/ApplyRecurringNumber.php
index 1c26e7f60ba1..c93817e6f3c3 100644
--- a/app/Services/Invoice/ApplyRecurringNumber.php
+++ b/app/Services/Invoice/ApplyRecurringNumber.php
@@ -15,6 +15,7 @@ use App\Models\Client;
use App\Models\Invoice;
use App\Services\AbstractService;
use App\Utils\Traits\GeneratesCounter;
+use Illuminate\Database\QueryException;
class ApplyRecurringNumber extends AbstractService
{
@@ -24,6 +25,8 @@ class ApplyRecurringNumber extends AbstractService
private $invoice;
+ private bool $completed = true;
+
public function __construct(Client $client, Invoice $invoice)
{
$this->client = $client;
@@ -39,11 +42,13 @@ class ApplyRecurringNumber extends AbstractService
switch ($this->client->getSetting('counter_number_applied')) {
case 'when_saved':
- $this->invoice->number = $this->getNextRecurringInvoiceNumber($this->client, $this->invoice);
+ $this->trySaving();
+ //$this->invoice->number = $this->getNextRecurringInvoiceNumber($this->client, $this->invoice);
break;
case 'when_sent':
if ($this->invoice->status_id == Invoice::STATUS_SENT) {
- $this->invoice->number = $this->getNextRecurringInvoiceNumber($this->client, $this->invoice);
+ $this->trySaving();
+ // $this->invoice->number = $this->getNextRecurringInvoiceNumber($this->client, $this->invoice);
}
break;
@@ -54,4 +59,33 @@ class ApplyRecurringNumber extends AbstractService
return $this->invoice;
}
-}
+
+ private function trySaving()
+ {
+
+ $x=1;
+
+ do{
+
+ try{
+
+ $this->invoice->number = $this->getNextRecurringInvoiceNumber($this->client, $this->invoice);
+ $this->invoice->saveQuietly();
+
+ $this->completed = false;
+
+
+ }
+ catch(QueryException $e){
+
+ $x++;
+
+ if($x>10)
+ $this->completed = false;
+ }
+
+ }
+ while($this->completed);
+
+ }
+}
\ No newline at end of file
diff --git a/app/Services/Invoice/AutoBillInvoice.php b/app/Services/Invoice/AutoBillInvoice.php
index 26ea686c077e..7649d86c6983 100644
--- a/app/Services/Invoice/AutoBillInvoice.php
+++ b/app/Services/Invoice/AutoBillInvoice.php
@@ -125,7 +125,7 @@ class AutoBillInvoice extends AbstractService
}
catch(\Exception $e){
nlog("payment NOT captured for ". $this->invoice->number . " with error " . $e->getMessage());
- $this->invoice->service()->removeUnpaidGatewayFees();
+ // $this->invoice->service()->removeUnpaidGatewayFees();
}
if($payment){
diff --git a/app/Services/Invoice/MarkPaid.php b/app/Services/Invoice/MarkPaid.php
index 9b29b072a9b8..920f72e27a09 100644
--- a/app/Services/Invoice/MarkPaid.php
+++ b/app/Services/Invoice/MarkPaid.php
@@ -61,6 +61,9 @@ class MarkPaid extends AbstractService
$payment->currency_id = $this->invoice->client->getSetting('currency_id');
$payment->is_manual = true;
+ if($this->invoice->company->timezone())
+ $payment->date = now()->addSeconds($this->invoice->company->timezone()->utc_offset)->format('Y-m-d');
+
$payment_type_id = $this->invoice->client->getSetting('payment_type_id');
if((int)$payment_type_id > 0)
diff --git a/app/Services/Payment/ApplyNumber.php b/app/Services/Payment/ApplyNumber.php
index 2f773dcb02fe..34604843bd57 100644
--- a/app/Services/Payment/ApplyNumber.php
+++ b/app/Services/Payment/ApplyNumber.php
@@ -14,6 +14,7 @@ namespace App\Services\Payment;
use App\Models\Payment;
use App\Services\AbstractService;
use App\Utils\Traits\GeneratesCounter;
+use Illuminate\Database\QueryException;
class ApplyNumber extends AbstractService
{
@@ -21,6 +22,8 @@ class ApplyNumber extends AbstractService
private $payment;
+ private bool $completed = true;
+
public function __construct(Payment $payment)
{
$this->client = $payment->client;
@@ -34,8 +37,38 @@ class ApplyNumber extends AbstractService
return $this->payment;
}
- $this->payment->number = $this->getNextPaymentNumber($this->client, $this->payment);
+ $this->trySaving();
+ // $this->payment->number = $this->getNextPaymentNumber($this->client, $this->payment);
return $this->payment;
}
+
+ private function trySaving()
+ {
+
+ $x=1;
+
+ do{
+
+ try{
+
+ $this->payment->number = $this->getNextPaymentNumber($this->client, $this->payment);
+ $this->payment->saveQuietly();
+
+ $this->completed = false;
+
+
+ }
+ catch(QueryException $e){
+
+ $x++;
+
+ if($x>10)
+ $this->completed = false;
+ }
+
+ }
+ while($this->completed);
+
+ }
}
diff --git a/app/Services/Payment/UpdateInvoicePayment.php b/app/Services/Payment/UpdateInvoicePayment.php
index a55f65fb703a..b51644100098 100644
--- a/app/Services/Payment/UpdateInvoicePayment.php
+++ b/app/Services/Payment/UpdateInvoicePayment.php
@@ -73,6 +73,10 @@ class UpdateInvoicePayment
/*Improve performance here - 26-01-2022 - also change the order of events for invoice first*/
//caution what if we amount paid was less than partial - we wipe it!
+ $invoice->balance -= $paid_amount;
+ $invoice->paid_to_date += $paid_amount;
+ $invoice->save();
+
$invoice = $invoice->service()
->clearPartial()
// ->updateBalance($paid_amount * -1)
@@ -80,10 +84,6 @@ class UpdateInvoicePayment
->updateStatus()
->touchPdf()
->save();
-
- $invoice->balance -= $paid_amount;
- $invoice->paid_to_date += $paid_amount;
- $invoice->save();
$invoice->service()
->workFlow()
diff --git a/app/Services/Quote/ApplyNumber.php b/app/Services/Quote/ApplyNumber.php
index d7a8a0055a6c..1b9b77b98a28 100644
--- a/app/Services/Quote/ApplyNumber.php
+++ b/app/Services/Quote/ApplyNumber.php
@@ -13,6 +13,7 @@ namespace App\Services\Quote;
use App\Models\Quote;
use App\Utils\Traits\GeneratesCounter;
+use Illuminate\Database\QueryException;
class ApplyNumber
{
@@ -20,6 +21,8 @@ class ApplyNumber
private $client;
+ private bool $completed = true;
+
public function __construct($client)
{
$this->client = $client;
@@ -33,11 +36,13 @@ class ApplyNumber
switch ($this->client->getSetting('counter_number_applied')) {
case 'when_saved':
- $quote->number = $this->getNextQuoteNumber($this->client, $quote);
+ $quote = $this->trySaving($quote);
+ // $quote->number = $this->getNextQuoteNumber($this->client, $quote);
break;
case 'when_sent':
if ($quote->status_id == Quote::STATUS_SENT) {
- $quote->number = $this->getNextQuoteNumber($this->client, $quote);
+ $quote = $this->trySaving($quote);
+ // $quote->number = $this->getNextQuoteNumber($this->client, $quote);
}
break;
@@ -48,4 +53,34 @@ class ApplyNumber
return $quote;
}
+
+ private function trySaving($quote)
+ {
+
+ $x=1;
+
+ do{
+
+ try{
+
+ $quote->number = $this->getNextQuoteNumber($this->client, $quote);
+ $quote->saveQuietly();
+
+ $this->completed = false;
+
+
+ }
+ catch(QueryException $e){
+
+ $x++;
+
+ if($x>10)
+ $this->completed = false;
+ }
+
+ }
+ while($this->completed);
+
+ return $quote;
+ }
}
diff --git a/app/Services/Recurring/ApplyNumber.php b/app/Services/Recurring/ApplyNumber.php
index 1e95c6d47a22..4fab238f8b76 100644
--- a/app/Services/Recurring/ApplyNumber.php
+++ b/app/Services/Recurring/ApplyNumber.php
@@ -14,6 +14,7 @@ namespace App\Services\Recurring;
use App\Models\Client;
use App\Services\AbstractService;
use App\Utils\Traits\GeneratesCounter;
+use Illuminate\Database\QueryException;
class ApplyNumber extends AbstractService
{
@@ -23,6 +24,8 @@ class ApplyNumber extends AbstractService
private $recurring_entity;
+ private bool $completed = true;
+
public function __construct(Client $client, $recurring_entity)
{
$this->client = $client;
@@ -36,8 +39,38 @@ class ApplyNumber extends AbstractService
if ($this->recurring_entity->number != '')
return $this->recurring_entity;
- $this->recurring_entity->number = $this->getNextRecurringInvoiceNumber($this->client, $this->recurring_entity);
+ $this->trySaving();
+ //$this->recurring_entity->number = $this->getNextRecurringInvoiceNumber($this->client, $this->recurring_entity);
return $this->recurring_entity;
}
+
+ private function trySaving()
+ {
+
+ $x=1;
+
+ do{
+
+ try{
+
+ $this->recurring_entity->number = $this->getNextRecurringInvoiceNumber($this->client, $this->recurring_entity);
+ $this->recurring_entity->saveQuietly();
+
+ $this->completed = false;
+
+
+ }
+ catch(QueryException $e){
+
+ $x++;
+
+ if($x>10)
+ $this->completed = false;
+ }
+
+ }
+ while($this->completed);
+
+ }
}
diff --git a/app/Services/Subscription/SubscriptionService.php b/app/Services/Subscription/SubscriptionService.php
index 9899e94f2259..04e2541df9be 100644
--- a/app/Services/Subscription/SubscriptionService.php
+++ b/app/Services/Subscription/SubscriptionService.php
@@ -121,7 +121,10 @@ class SubscriptionService
//execute any webhooks
$this->triggerWebhook($context);
- $this->handleRedirect('/client/invoices/'.$this->encodePrimaryKey($payment_hash->fee_invoice_id));
+ /* 06-04-2022 */
+ /* We may not be in a state where the user is present */
+ if(auth()->guard('contact'))
+ $this->handleRedirect('/client/invoices/'.$this->encodePrimaryKey($payment_hash->fee_invoice_id));
}
}
diff --git a/app/Utils/Traits/ClientGroupSettingsSaver.php b/app/Utils/Traits/ClientGroupSettingsSaver.php
index 2172469f19e2..a7dabe4f2076 100644
--- a/app/Utils/Traits/ClientGroupSettingsSaver.php
+++ b/app/Utils/Traits/ClientGroupSettingsSaver.php
@@ -104,6 +104,11 @@ trait ClientGroupSettingsSaver
}
foreach ($casts as $key => $value) {
+
+ if($value == 'float' && property_exists($settings, $key)){
+ $settings->{$key} = floatval($settings->{$key});
+ }
+
if (in_array($key, CompanySettings::$string_casts)) {
$value = 'string';
@@ -160,6 +165,10 @@ trait ClientGroupSettingsSaver
foreach ($casts as $key => $value) {
+ if($value == 'float' && property_exists($settings, $key)){
+ $settings->{$key} = floatval($settings->{$key});
+ }
+
/*Separate loop if it is a _id field which is an integer cast as a string*/
if (substr($key, -3) == '_id' || substr($key, -14) == 'number_counter') {
$value = 'integer';
diff --git a/app/Utils/Traits/Notifications/UserNotifies.php b/app/Utils/Traits/Notifications/UserNotifies.php
index 5b8d312c843b..f5d8f63adcec 100644
--- a/app/Utils/Traits/Notifications/UserNotifies.php
+++ b/app/Utils/Traits/Notifications/UserNotifies.php
@@ -32,7 +32,7 @@ trait UserNotifies
$notifiable_methods = [];
$notifications = $company_user->notifications;
- if ($company_user->company->is_disabled && is_array($notifications->email)) {
+ if ($company_user->company->is_disabled && is_array($notifications->email) || $company_user->trashed() || $company_user->user->trashed()) {
return [];
}
@@ -56,7 +56,7 @@ trait UserNotifies
$notifiable_methods = [];
$notifications = $company_user->notifications;
- if ($company_user->company->is_disabled || ! $notifications) {
+ if ($company_user->company->is_disabled || ! $notifications || $company_user->trashed() || $company_user->user->trashed()) {
return [];
}
@@ -125,7 +125,7 @@ trait UserNotifies
public function findCompanyUserNotificationType($company_user, $required_permissions) :array
{
- if ($company_user->company->is_disabled) {
+ if ($company_user->company->is_disabled || $company_user->trashed() || $company_user->user->trashed()) {
return [];
}
diff --git a/config/ninja.php b/config/ninja.php
index 89b2ac54fab5..b89a23be5bd8 100644
--- a/config/ninja.php
+++ b/config/ninja.php
@@ -14,8 +14,8 @@ return [
'require_https' => env('REQUIRE_HTTPS', true),
'app_url' => rtrim(env('APP_URL', ''), '/'),
'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
- 'app_version' => '5.3.78',
- 'app_tag' => '5.3.78',
+ 'app_version' => '5.3.79',
+ 'app_tag' => '5.3.79',
'minimum_client_version' => '5.0.16',
'terms_version' => '1.0.1',
'api_secret' => env('API_SECRET', ''),
diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php
index e4db031e75a8..acf2834c54d1 100644
--- a/resources/lang/en/texts.php
+++ b/resources/lang/en/texts.php
@@ -4542,7 +4542,26 @@ $LANG = array(
'gmail_credentials_invalid_body' => 'Your GMail credentials are not correct, please log into the administrator portal and navigate to Settings > User Details and disconnect and reconnect your GMail account. We will send you this notification daily until this issue is resolved',
'notification_invoice_sent' => 'Invoice Sent',
'total_columns' => 'Total Fields',
-
+ 'view_task' => 'View Task',
+ 'cancel_invoice' => 'Cancel',
+ 'changed_status' => 'Successfully changed task status',
+ 'change_status' => 'Change Status',
+ 'enable_touch_events' => 'Enable Touch Events',
+ 'enable_touch_events_help' => 'Support drag events to scroll',
+ 'after_saving' => 'After Saving',
+ 'view_record' => 'View Record',
+ 'enable_email_markdown' => 'Enable Email Markdown',
+ 'enable_email_markdown_help' => 'Use visual markdown editor for emails',
+ 'enable_pdf_markdown' => 'Enable PDF Markdown',
+ 'json_help' => 'Note: JSON files generated by the v4 app are not supported',
+ 'release_notes' => 'Release Notes',
+ 'upgrade_to_view_reports' => 'Upgrade your plan to view reports',
+ 'started_tasks' => 'Successfully started :value tasks',
+ 'stopped_tasks' => 'Successfully stopped :value tasks',
+ 'approved_quote' => 'Successfully apporved quote',
+ 'approved_quotes' => 'Successfully :value approved quotes',
+ 'client_website' => 'Client Website',
+ 'invalid_time' => 'Invalid Time',
);
return $LANG;
diff --git a/resources/lang/et/texts.php b/resources/lang/et/texts.php
index 070e02aa2bf1..eeec97ab1e39 100644
--- a/resources/lang/et/texts.php
+++ b/resources/lang/et/texts.php
@@ -68,10 +68,10 @@ $LANG = array(
'tax_rates' => 'Maksumäärad',
'rate' => 'Määr',
'settings' => 'Seaded',
- 'enable_invoice_tax' => 'Luba määramine',
+ 'enable_invoice_tax' => 'Lubage arve maksu määramine',
'enable_line_item_tax' => 'Luba täpsustamine',
'dashboard' => 'Töölaud',
- 'dashboard_totals_in_all_currencies_help' => 'Märkus. Lisage :link nimega ":Nimi", et kuvada kogusummad põhivluutat kasutades.',
+ 'dashboard_totals_in_all_currencies_help' => 'Märkus. Lisage :link nimega ":name", et kuvada kogusummad põhivluutat kasutades.',
'clients' => 'Kliendid',
'invoices' => 'Arved',
'payments' => 'Maksed',
@@ -207,9 +207,9 @@ $LANG = array(
'confirmation_required' => 'Palun kinnitage oma meiliaadress, :link kinnitusmeili uuesti saatmiseks.',
'updated_client' => 'Kliendi värskendamine õnnestus',
'archived_client' => 'Kliendi arhiivimine õnnestus',
- 'archived_clients' => ':kogus klienti on edukalt arhiveeritud',
+ 'archived_clients' => ':count klienti on edukalt arhiveeritud',
'deleted_client' => 'Kliendi kustutamine õnnestus',
- 'deleted_clients' => ':kogus klienti on edukalt kustutatud',
+ 'deleted_clients' => ':count klienti on edukalt kustutatud',
'updated_invoice' => 'Arve edukalt uuendatud',
'created_invoice' => 'Arve edukalt loodud',
'cloned_invoice' => 'Arve edukalt kloonitud',
@@ -220,24 +220,24 @@ $LANG = array(
'deleted_invoice' => 'Arve edukalt kustutatud',
'deleted_invoices' => ':count arvet edukalt kustutatud',
'created_payment' => 'Makse loomine õnnestus',
- 'created_payments' => ':kogus makse(t) on edukalt loodud',
+ 'created_payments' => ':count makse(t) on edukalt loodud',
'archived_payment' => 'Makse arhiivimine õnnestus',
- 'archived_payments' => ':kogus makset on edukalt arhiveeritud',
+ 'archived_payments' => ':count makset on edukalt arhiveeritud',
'deleted_payment' => 'Makse kustutamine õnnestus',
- 'deleted_payments' => ':kogus makset on edukalt kustutatud',
+ 'deleted_payments' => ':count makset on edukalt kustutatud',
'applied_payment' => 'Makse rakendamine õnnestus',
'created_credit' => 'Ettemaksu loomine õnnestus',
'archived_credit' => 'Ettemaksu arhiveerimine õnnestus',
- 'archived_credits' => ':kogus ettemakset on edukalt arhiveeritud',
+ 'archived_credits' => ':count ettemakset on edukalt arhiveeritud',
'deleted_credit' => 'Ettemaksu kustutamine õnnestus',
- 'deleted_credits' => ':kogus ettemakset on edukalt kustutatud',
+ 'deleted_credits' => ':count ettemakset on edukalt kustutatud',
'imported_file' => 'Fail edukalt imporditud',
'updated_vendor' => 'Tarnija värskendamine õnnestus',
'created_vendor' => 'Tarnija loomine õnnestus',
'archived_vendor' => 'Tarnija arhiivimine õnnestus',
- 'archived_vendors' => ':kogus tarnijaid on edukalt arhiveeritud',
+ 'archived_vendors' => ':count tarnijaid on edukalt arhiveeritud',
'deleted_vendor' => 'Tarnija edukalt kustutatud',
- 'deleted_vendors' => ':kogus tarnijad on edukalt kustutatud',
+ 'deleted_vendors' => ':count tarnijad on edukalt kustutatud',
'confirmation_subject' => 'Konto kinnitus',
'confirmation_header' => 'Konto Kinnitus',
'confirmation_message' => 'Oma konto kinnitamiseks minge allolevale lingile.',
@@ -252,9 +252,9 @@ $LANG = array(
'notification_invoice_paid_subject' => 'Arve :invoice tasutud :client poolt',
'notification_invoice_sent_subject' => 'Arve :invoice saadeti kliendile :client',
'notification_invoice_viewed_subject' => 'Arvet :invoice vaadati :client poolt',
- 'notification_invoice_paid' => 'Klient :klient tegi makse summas :summa arvele :arve.',
- 'notification_invoice_sent' => 'Antud kliendile :klient saadeti meili teel arve :arve summas :summa.',
- 'notification_invoice_viewed' => 'Antud klient :klient vaatas arvet :arve summas :summa.',
+ 'notification_invoice_paid' => 'Klient :clienttegi makse summas :amount arvele :invoice.',
+ 'notification_invoice_sent' => 'Antud kliendile :client saadeti meili teel arve :arve summas :amount.',
+ 'notification_invoice_viewed' => 'Antud klient :client vaatas arvet :invoice summas :amount.',
'reset_password' => 'Saate oma konto parooli lähtestada, klõpsates järgmist nuppu:',
'secure_payment' => 'Turvaline Makse',
'card_number' => 'Kaardi Number',
@@ -263,7 +263,7 @@ $LANG = array(
'cvv' => 'CVV',
'logout' => 'Logi Välja',
'sign_up_to_save' => 'Registreeruge oma töö salvestamiseks',
- 'agree_to_terms' => 'Nõustun :tingimustega',
+ 'agree_to_terms' => 'Nõustun :terms',
'terms_of_service' => 'Teenuse Tingimused',
'email_taken' => 'E-posti aadress on juba registreeritud',
'working' => 'Töötleb',
@@ -332,17 +332,17 @@ $LANG = array(
'cloned_quote' => 'Pakkumus edukalt kloonitud',
'emailed_quote' => 'Hinnapakkumise saatmine õnnestus',
'archived_quote' => 'Hinnapakkumine edukalt arhiivitud',
- 'archived_quotes' => ':kogus hinnapakkumisi on edukalt arhiveeritud',
+ 'archived_quotes' => ':count hinnapakkumisi on edukalt arhiveeritud',
'deleted_quote' => 'Hinnapakkmuise kustutamine õnnestus',
- 'deleted_quotes' => ':kogus hinnapakkumisi on edukalt kustutatud',
+ 'deleted_quotes' => ':count hinnapakkumisi on edukalt kustutatud',
'converted_to_invoice' => 'Hinnapakkumus edukalt muudetud arveks',
- 'quote_subject' => 'Uus hinnapakkumine :number :kasutaja poolt',
+ 'quote_subject' => 'Uus hinnapakkumine :number :account poolt',
'quote_message' => 'Nägemaks oma pakkumust summas :amount, klõpsa alloleval lingil.',
'quote_link_message' => 'Et vaadata oma kliendi hinnapakkumist klõpsake allolevat linki:',
'notification_quote_sent_subject' => 'Hinnapakkumus :invoice saadeti kliendile :client',
'notification_quote_viewed_subject' => 'Hinnapakkumust :invoice vaadati :client poolt',
- 'notification_quote_sent' => 'Antud kliendile :klient saadeti e-kirjaga hinnapakkumine :arve summas :summa.',
- 'notification_quote_viewed' => 'Antud klient :klient vaatas hinnapakkumist :arve summas :summa.',
+ 'notification_quote_sent' => 'Antud kliendile :client saadeti e-kirjaga hinnapakkumine :invoice summas :amount.',
+ 'notification_quote_viewed' => 'Antud klient :client vaatas hinnapakkumist :invoice summas :amount.',
'session_expired' => 'Sinu sessioon on aegunud.',
'invoice_fields' => 'Arve Väljad',
'invoice_options' => 'Arve Valikud',
@@ -354,7 +354,7 @@ $LANG = array(
'send_invite' => 'Saada Kutse',
'sent_invite' => 'Kutse saadeti edukalt',
'updated_user' => 'Kasutaja värskendamine õnnestus',
- 'invitation_message' => 'Teid on kutsunud :kutsuja.',
+ 'invitation_message' => 'Teid on kutsunud :invitor.',
'register_to_add_user' => 'Kasutaja lisamiseks registreeruge',
'user_state' => 'Maakond',
'edit_user' => 'Muuda Kasutajat',
@@ -382,9 +382,9 @@ $LANG = array(
'invoice_issued_to' => 'Arve Saaja',
'invalid_counter' => 'Võimalike konfliktide vältimiseks seadista arve või hinnapakkumuse numbri prefiks.',
'mark_sent' => 'Märgi saadetuks',
- 'gateway_help_1' => 'Autorize.neti registreerumiseks : link.',
- 'gateway_help_2' => 'Autorize.neti registreerumiseks : link.',
- 'gateway_help_17' => 'Oma PayPali API allkirja saamiseks. :link.',
+ 'gateway_help_1' => 'Autorize.neti registreerumiseks :link.',
+ 'gateway_help_2' => 'Autorize.neti registreerumiseks :link.',
+ 'gateway_help_17' => 'Oma PayPali API allkirja saamiseks :link.',
'gateway_help_27' => '2Checkout.com-i registreerumiseks : link. Maksete jälgimise tagamiseks määrake portaalis 2Checkout jaotises Konto > Saidihaldus ümbersuunamise URL-iks :complete_link.',
'gateway_help_60' => 'WePay konto loomiseks :link.',
'more_designs' => 'Rohkem kujundusi',
@@ -497,8 +497,8 @@ $LANG = array(
'set_password' => 'Sea Salasõna',
'converted' => 'Teisendatud',
'email_approved' => 'Saada mulle E-kiri, kui pakkumus kinnitatakse',
- 'notification_quote_approved_subject' => ':klient kiitis heaks hinnapakkumise :arve',
- 'notification_quote_approved' => 'Antud klient :klient kinnitas hinnapakkumise :arve summas :summa.',
+ 'notification_quote_approved_subject' => ':client kiitis heaks hinnapakkumise :invoice',
+ 'notification_quote_approved' => 'Antud klient :client kinnitas hinnapakkumise :invoice summas :amount.',
'resend_confirmation' => 'Saada kinnitusmeil uuesti',
'confirmation_resent' => 'Kinnitusmeil saadeti uuesti',
'gateway_help_42' => ':link BitPay kasutajaks registreerumiseks.
Märkus: Kasutage Legacy API võtit, mitte API tokenit.',
@@ -656,7 +656,7 @@ $LANG = array(
'recurring_invoice' => 'Perioodiline Arve',
'new_recurring_quote' => 'Uus korduv hinnapakkumine',
'recurring_quote' => 'Korduv hinnapakkumine',
- 'recurring_too_soon' => 'Järgmise korduva arve koostamiseks on liiga vara, see on ajastatud kuupäevaks :kuupäev',
+ 'recurring_too_soon' => 'Järgmise korduva arve koostamiseks on liiga vara, see on ajastatud kuupäevaks :date',
'created_by_invoice' => 'Loodud :invoice',
'primary_user' => 'Peamine Kasutaja',
'help' => 'Abi',
@@ -694,12 +694,12 @@ $LANG = array(
'second_reminder' => 'Teine Meeldetuletus',
'third_reminder' => 'Kolmas Meeldetuletus',
'num_days_reminder' => 'Päeva peale maksetähtaega',
- 'reminder_subject' => 'Meeldetuletus: Arve :arve :kasutajalt',
+ 'reminder_subject' => 'Meeldetuletus: Arve :invoice :account',
'reset' => 'Lähtesta',
'invoice_not_found' => 'Soovitud arve pole saadaval',
'referral_program' => 'Referral Program',
'referral_code' => 'Referral URL',
- 'last_sent_on' => 'Viimati saadetud: :kuupäev',
+ 'last_sent_on' => 'Viimati saadetud: :date',
'page_expire' => 'See leht aegub peagi, töö jätkamiseks :click_here',
'upcoming_quotes' => 'Eesseisvad Pakkumused',
'expired_quotes' => 'Aegunud hinnapakkumised',
@@ -711,10 +711,10 @@ $LANG = array(
'disable' => 'Keela',
'invoice_quote_number' => 'Arvete ja hinnapakkumiste numbrid',
'invoice_charges' => 'Arve lisatasud',
- 'notification_invoice_bounced' => 'Meil ei õnnestunud saata arvet :arve aadressile :kontakt.',
- 'notification_invoice_bounced_subject' => 'Arvet :arve ei saa saata',
- 'notification_quote_bounced' => 'Meil ei õnnestunud saata hinnapakkumist :arve aadressile :kontakt.',
- 'notification_quote_bounced_subject' => 'Hinnapakkumist :arve ei saa saata',
+ 'notification_invoice_bounced' => 'Meil ei õnnestunud saata arvet :invoice aadressile :contact.',
+ 'notification_invoice_bounced_subject' => 'Arvet :invoice ei saa saata',
+ 'notification_quote_bounced' => 'Meil ei õnnestunud saata hinnapakkumist :invoice aadressile :contact.',
+ 'notification_quote_bounced_subject' => 'Hinnapakkumist :invoiceei saa saata',
'custom_invoice_link' => 'Kohandatud Arve Link',
'total_invoiced' => 'Arveldatud kokku',
'open_balance' => 'Open Balance',
@@ -722,7 +722,7 @@ $LANG = array(
'basic_settings' => 'Elementaarsed Seaded',
'pro' => 'Pro',
'gateways' => 'Makselüüsid',
- 'next_send_on' => 'Järgmine saatmine: :kuupäev',
+ 'next_send_on' => 'Järgmine saatmine: :date',
'no_longer_running' => 'This invoice is not scheduled to run',
'general_settings' => 'Üldised Seaded',
'customize' => 'Kohanda',
@@ -743,7 +743,7 @@ $LANG = array(
'pattern_help_title' => 'Mustri Abi',
'pattern_help_1' => 'Loo Kohandatud Numeratsioon Kasutades Mustreid',
'pattern_help_2' => 'Saadaolevad muutujad:',
- 'pattern_help_3' => 'Näiteks :näide teisendataks väärtuseks :väärtus',
+ 'pattern_help_3' => 'Näiteks :example teisendataks väärtuseks :value',
'see_options' => 'Vaata valikuid',
'invoice_counter' => 'Arve Loendur',
'quote_counter' => 'Pakkumuse Loendur',
@@ -753,53 +753,53 @@ $LANG = array(
'activity_3' => ':user kustutas kliendi :client',
'activity_4' => ':user lõi arve :invoice',
'activity_5' => ':user uuendas arvet :invoice',
- 'activity_6' => ':kasutaja saatis arve :arve e-postiga :kliendile :kontaktile',
- 'activity_7' => ':kontakt on vaadatud arvet :arve :klient',
+ 'activity_6' => ':user saatis arve :invoice e-postiga :client :contact',
+ 'activity_7' => ':contact on vaadatud arvet :invoice :client',
'activity_8' => ':user arhiveeris arve :invoice',
'activity_9' => ':user kustutas arve :invoice',
'activity_10' => ':contact entered payment :payment for :payment_amount on invoice :invoice for :client',
- 'activity_11' => ':kasutaja uuendas makset :makse',
- 'activity_12' => ':kasutaja arhiveeris makse :makse',
- 'activity_13' => ':kasutaja kustutas makse :makse',
- 'activity_14' => ':kasutaja sisestas :ettemakse',
- 'activity_15' => ':kasutaja värskendas :ettemakse ettemakset',
- 'activity_16' => ':kasutaja arhiveeris :ettemakse ettemakse',
- 'activity_17' => ':kasutaja kustutas :ettemakse ettemakse',
- 'activity_18' => ':kasutaja lõi hinnapkkumise :hinnapakkumine',
- 'activity_19' => ':kasutaja uuendas hinnapakkumist :hinnapakkumine',
- 'activity_20' => ':kasutaja saatis meiliga hinnapakkumise :hinnapakkumine :kliendile :kontaktile',
- 'activity_21' => ':kontakt vaatas hinnapakkumist :hinnapakkumine',
- 'activity_22' => ':kasutaja arhiveeris hinnapakkumise :hinnapakkumine',
- 'activity_23' => ':kasutaja kustutas hinnapakkumise :hinnapakkumine',
- 'activity_24' => ':kasutaja taastas hinnapakkumise :hinnapakkumine',
- 'activity_25' => ':kasutaja taastas arve :arve',
- 'activity_26' => ':kasutaja taastas kliendi :klient',
- 'activity_27' => ':kasutaja taastas makse :makse',
- 'activity_28' => ':kasutaja taastas ettemakse :ettemakse',
- 'activity_29' => ':kontakt kinnitas hinnapakkumise :hinnapkkumine :kliendile',
- 'activity_30' => ':kasutaja lõi tarnija :tarnija',
- 'activity_31' => ':kasutaja arhiveeris tarnija :tarnija ',
- 'activity_32' => ':kasutaja kustutas tarnija :tarnija ',
- 'activity_33' => ':kasutaja taastas tarnija :tarnija',
- 'activity_34' => ':kasutaja lõi kulu :kulu',
- 'activity_35' => ':kasutaja arhiveeris kulu :kulu',
- 'activity_36' => ':kasutaja kustutas kulu :kulu',
- 'activity_37' => ':kasutaja taastas kulu :kulu',
+ 'activity_11' => ':user uuendas makset :payment',
+ 'activity_12' => ':user arhiveeris makse :payment',
+ 'activity_13' => ':user kustutas makse :payment',
+ 'activity_14' => ':user sisestas :credit',
+ 'activity_15' => ':user värskendas :credit ettemakset',
+ 'activity_16' => ':user arhiveeris :credit ettemakse',
+ 'activity_17' => ':user kustutas :credit ettemakse',
+ 'activity_18' => ':user lõi hinnapkkumise :quote',
+ 'activity_19' => ':user uuendas hinnapakkumist :quote',
+ 'activity_20' => ':user saatis meiliga hinnapakkumise :quote :client :contact',
+ 'activity_21' => ':contact vaatas hinnapakkumist :quote',
+ 'activity_22' => ':user arhiveeris hinnapakkumise :quote',
+ 'activity_23' => ':user kustutas hinnapakkumise :quote',
+ 'activity_24' => ':user taastas hinnapakkumise :quote',
+ 'activity_25' => ':user taastas arve :invoice',
+ 'activity_26' => ':user taastas kliendi :client',
+ 'activity_27' => ':user taastas makse :payment',
+ 'activity_28' => ':user taastas ettemakse :credit ',
+ 'activity_29' => ':contact kinnitas hinnapakkumise :quote :client',
+ 'activity_30' => ':user lõi tarnija :vendor',
+ 'activity_31' => ':user arhiveeris tarnija :tarnija ',
+ 'activity_32' => ':user kustutas tarnija :vendor',
+ 'activity_33' => ':user taastas tarnija :vendor',
+ 'activity_34' => ':user lõi kulu :expense',
+ 'activity_35' => ':user arhiveeris kulu :expense',
+ 'activity_36' => ':user kustutas kulu :expense',
+ 'activity_37' => ':user taastas kulu :expense',
'activity_42' => ':user lõi ülesande :task',
'activity_43' => ':user uuendas ülesannet :task',
'activity_44' => ':user arhiveeris ülesande :task',
'activity_45' => ':user kustutas ülesande :task',
'activity_46' => ':user taastas ülesande :task',
- 'activity_47' => ':kasutaja uuendas kulu :kulu',
- 'activity_48' => ':kasutaja uuendas piletit :pilet',
- 'activity_49' => ':kasutaja sulges pileti :pilet',
- 'activity_50' => ':kasutaja ühendas pileti :pilet',
- 'activity_51' => ':kasutaja jagas pileti :pilet',
- 'activity_52' => ':kontakt avas pileti :pilet',
- 'activity_53' => ':kontakt taasavas pileti :pilet',
- 'activity_54' => ':kasutaja taasavas pileti :pilet',
- 'activity_55' => ':contact vastas piletile :pilet',
- 'activity_56' => ':kasutaja vaatas piletit :pilet',
+ 'activity_47' => ':user uuendas kulu :expense',
+ 'activity_48' => ':user uuendas piletit :ticket',
+ 'activity_49' => ':user sulges pileti :ticket',
+ 'activity_50' => ':user ühendas pileti :ticket',
+ 'activity_51' => ':user jagas pileti :ticket',
+ 'activity_52' => ':contact avas pileti :ticket',
+ 'activity_53' => ':contact taasavas pileti :ticket',
+ 'activity_54' => ':user taasavas pileti :ticket',
+ 'activity_55' => ':contact vastas piletile :ticket',
+ 'activity_56' => ':user vaatas piletit :ticket',
'payment' => 'Makse',
'system' => 'Süsteem',
@@ -842,7 +842,7 @@ $LANG = array(
'user' => 'Kasutaja',
'country' => 'Riik',
'include' => 'Kaasa',
- 'logo_too_large' => 'Teie logo suurus on :suurus, parema PDF-i jõudluse tagamiseks soovitame üles laadida alla 200 KB suuruse pildifaili',
+ 'logo_too_large' => 'Teie logo suurus on :size, parema PDF-i jõudluse tagamiseks soovitame üles laadida alla 200 KB suuruse pildifaili',
'import_freshbooks' => 'Impordi FreshBooksist',
'import_data' => 'Impordi Andmed',
'source' => 'Allikas',
@@ -925,7 +925,7 @@ $LANG = array(
'yes' => 'Jah',
'no' => 'Ei',
'should_be_invoiced' => 'Tuleks esitada arve',
- 'view_expense' => 'Vaadake kulu # :kulu',
+ 'view_expense' => 'Vaadake kulu # :expense',
'edit_expense' => 'Muuda kulusid',
'archive_expense' => 'Arhiveeri kulud',
'delete_expense' => 'Kustuta kulud',
@@ -959,9 +959,9 @@ $LANG = array(
',
'due' => 'Tähtaeg',
- 'next_due_on' => 'Järgmine tähtaeg: :kuupäev',
+ 'next_due_on' => 'Järgmine tähtaeg: :date',
'use_client_terms' => 'Kasutage kliendi tingimusi',
- 'day_of_month' => ':järguline päev kuus',
+ 'day_of_month' => ':ordinal päev kuus',
'last_day_of_month' => 'Kuu viimane päev',
'day_of_week_after' => ':ordinal :day after',
'sunday' => 'pühapäev',
@@ -992,7 +992,7 @@ $LANG = array(
'archived_bank_account' => 'Pangakonto arhiveerimine õnnestus',
'created_bank_account' => 'Pangakonto loomine õnnestus',
'validate_bank_account' => 'Kinnitage pangakonto',
- 'bank_password_help' => 'Märkus. Teie parool edastatakse turvaliselt ja seda ei salvestata kunagi meie serveritesse.',
+ 'bank_password_help' => 'Märkus: Teie parool edastatakse turvaliselt ja seda ei salvestata kunagi meie serveritesse.',
'bank_password_warning' => 'Hoiatus: teie parool võidakse edastada lihttekstina, kaaluge HTTPS-i lubamist.',
'username' => 'Kasutajanimi',
'account_number' => 'Kontonumber',
@@ -1032,11 +1032,11 @@ $LANG = array(
'user_email_footer' => 'To adjust your email notification settings please visit :link',
'reset_password_footer' => 'Kui te seda parooli lähtestamist ei taotlenud, saatke meie toele e-kiri: :email',
'limit_users' => 'Vabandust, see ületab kasutajate limiiti :limit',
- 'more_designs_self_host_header' => 'Hankige veel 6 arvekujundust vaid $:hinna eest',
+ 'more_designs_self_host_header' => 'Hankige veel 6 arvekujundust vaid $:price eest',
'old_browser' => 'Palun kasutage :linki',
'newer_browser' => 'uuem brauser',
'white_label_custom_css' => ':link for $:price to enable custom styling and help support our project.',
- 'bank_accounts_help' => 'Ühendage pangakonto kulude automaatseks importimiseks ja tarnijate loomiseks. Toetab American Expressi ja :linki.',
+ 'bank_accounts_help' => 'Ühendage pangakonto kulude automaatseks importimiseks ja tarnijate loomiseks. Toetab American Expressi ja :link.',
'us_banks' => '400+ USA panka',
'pro_plan_remove_logo' => ':link Invoice Ninja logo eemaldamiseks, liitudes Pro-paketiga',
@@ -1131,7 +1131,7 @@ $LANG = array(
'invoice_embed_documents_help' => 'Lisage arvele lisatud pildid.',
'document_email_attachment' => 'Lisa dokumendid',
'ubl_email_attachment' => 'Lisa UBL',
- 'download_documents' => 'Laadi alla dokumendid (: suurus)',
+ 'download_documents' => 'Laadi alla dokumendid (:size)',
'documents_from_expenses' => 'Kuludest:',
'dropzone_default_message' => 'Asetage failid või klõpsake üleslaadimiseks',
'dropzone_default_message_disabled' => 'Üleslaadimine keelatud',
@@ -1159,8 +1159,8 @@ $LANG = array(
'plan_upgrade' => 'Uuenda',
'plan_change' => 'Muuda Paketti',
'pending_change_to' => 'Changes To',
- 'plan_changes_to' => ':plaan :kuupäev',
- 'plan_term_changes_to' => ':plaan (:tingimus) kuupäeval :kuupäev',
+ 'plan_changes_to' => ':plan :date',
+ 'plan_term_changes_to' => ':plan (:term) kuupäeval :date',
'cancel_plan_change' => 'Katkesta muudatused',
'plan' => 'Pakett',
'expires' => 'Kehtib kuni',
@@ -1179,8 +1179,8 @@ $LANG = array(
'plan_term_yearly' => 'Iga-aastaselt',
'plan_term_month' => 'Kuu',
'plan_term_year' => 'Aasta',
- 'plan_price_monthly' => '$:price/Kuu',
- 'plan_price_yearly' => '$:price/Aasta',
+ 'plan_price_monthly' => '$:price/Month',
+ 'plan_price_yearly' => '$:price/Year',
'updated_plan' => 'Uuendatud plaani seaded',
'plan_paid' => 'Term Started',
'plan_started' => 'Plaan alanud',
@@ -1218,11 +1218,11 @@ $LANG = array(
'status_completed' => 'Lõpetatud',
'status_failed' => 'Ebaõnnestunud',
'status_partially_refunded' => 'Osaliselt tagastatud',
- 'status_partially_refunded_amount' => ':summa tagastatud',
+ 'status_partially_refunded_amount' => ':amount tagastatud',
'status_refunded' => 'Tagastatud',
'status_voided' => 'Tühistatud',
'refunded_payment' => 'Tagastatud makse',
- 'activity_39' => ':kasutaja tühistas :makse_summa makse :makse',
+ 'activity_39' => ':user tühistas :payment_amount makse :payment',
'activity_40' => ':user refunded :adjustment of a :payment_amount payment :payment',
'card_expiration' => 'Exp: :expires',
@@ -1244,7 +1244,7 @@ $LANG = array(
'payment_type_stripe' => 'Stripe',
'ach' => 'ACH',
'enable_ach' => 'Aktsepteerige USA pangaülekandeid',
- 'stripe_ach_help' => 'ACH-tugi peab olema lubatud ka :linkis.',
+ 'stripe_ach_help' => 'ACH-tugi peab olema lubatud ka :link.',
'ach_disabled' => 'Another gateway is already configured for direct debit.',
'plaid' => 'Plaid',
@@ -1285,21 +1285,21 @@ $LANG = array(
'use_for_auto_bill' => 'Use For Autobill',
'used_for_auto_bill' => 'Autobill Payment Method',
'payment_method_set_as_default' => 'Set Autobill payment method.',
- 'activity_41' => ':makse_summa makse (:makse) ebaõnnestus',
+ 'activity_41' => ':payment_amount makse (:payment) ebaõnnestus',
'webhook_url' => 'Webhook URL',
'stripe_webhook_help' => 'Peate :link.',
'stripe_webhook_help_link_text' => 'lisage see URL Stripe\'i lõpp-punktina',
'gocardless_webhook_help_link_text' => 'lisage see URL GoCardlessi lõpp-punktina',
'payment_method_error' => 'Teie makseviisi lisamisel ilmnes viga. Palun proovi hiljem uuesti.',
- 'notification_invoice_payment_failed_subject' => 'Arve :arve makse ebaõnnestus',
- 'notification_invoice_payment_failed' => 'Kliendi :klient poolt tehtud makse arvele :arve ebaõnnestus. Makse on märgitud ebaõnnestunuks ja :summa on lisatud kliendi saldole.',
+ 'notification_invoice_payment_failed_subject' => 'Arve :invoice makse ebaõnnestus',
+ 'notification_invoice_payment_failed' => 'Kliendi :client poolt tehtud makse arvele :invoice ebaõnnestus. Makse on märgitud ebaõnnestunuks ja :amount on lisatud kliendi saldole.',
'link_with_plaid' => 'Link Account Instantly with Plaid',
'link_manually' => 'Link käsitsi',
'secured_by_plaid' => 'Secured by Plaid',
'plaid_linked_status' => 'Teie pangakonto aadressil :bank',
'add_payment_method' => 'Lisa makseviis',
'account_holder_type' => 'Konto omaniku tüüp',
- 'ach_authorization' => 'Volitan :firmat kasutama minu pangakontot tulevaste maksete tegemiseks ja vajadusel krediteerin oma kontot elektrooniliselt, et parandada vigaseid deebeteid. Mõistan, et võin selle volituse igal ajal tühistada, eemaldades makseviisi või võttes ühendust aadressil :email.',
+ 'ach_authorization' => 'Volitan :company kasutama minu pangakontot tulevaste maksete tegemiseks ja vajadusel krediteerin oma kontot elektrooniliselt, et parandada vigaseid deebeteid. Mõistan, et võin selle volituse igal ajal tühistada, eemaldades makseviisi või võttes ühendust aadressil :email.',
'ach_authorization_required' => 'Peate ACH tehingutega nõustuma.',
'off' => 'Off',
'opt_in' => 'Opt-in',
@@ -1332,7 +1332,7 @@ $LANG = array(
'company_name' => 'Ettevõtte nimi',
'wepay_company_name_help' => 'See kuvatakse kliendi krediitkaardi väljavõtetel.',
'wepay_description_help' => 'Selle konto eesmärk.',
- 'wepay_tos_agree' => 'Nõustun :linkiga.',
+ 'wepay_tos_agree' => 'Nõustun :link.',
'wepay_tos_link_text' => 'WePay teenusetingimused',
'resend_confirmation_email' => 'Saada kinnitusmeil uuesti',
'manage_account' => 'Konto haldamine',
@@ -1353,7 +1353,7 @@ $LANG = array(
'original_start_date' => 'Algne alguskuupäev',
'new_start_date' => 'Uus alguskuupäev',
'security' => 'Turvalisus',
- 'see_whats_new' => 'Vaadake, mis on v:versioonis uut',
+ 'see_whats_new' => 'Vaadake, mis on v:versioon uut',
'wait_for_upload' => 'Palun oodake, kuni dokumendi üleslaadimine on lõpule viidud.',
'upgrade_for_permissions' => 'Upgrade to our Enterprise plan to enable permissions.',
'enable_second_tax_rate' => 'Luba määramine teine maksumäär',
@@ -1363,7 +1363,7 @@ $LANG = array(
'import_products' => 'Impordi tooted',
'products_will_create' => 'luuakse tooteid',
'product_key' => 'Toode',
- 'created_products' => 'Edukalt loodud/värskendatud: kogus toodet/tooteid',
+ 'created_products' => 'Edukalt loodud/värskendatud :count toodet/tooteid',
'export_help' => 'Kasuta JSON vormingut kui soovind andmed importida Invoice Ninja-sse.
Fail sisaldab kliente, tooteid, arveid, pakkumusi ja makseid.',
'selfhost_export_help' => '
Soovitame täieliku varukoopia loomiseks kasutada mysqldumpi.',
'JSON_file' => 'JSON Fail',
@@ -1386,7 +1386,7 @@ $LANG = array(
'bank_account' => 'Pangakonto',
'payment_processed_through_wepay' => 'ACH-makseid töödeldakse WePay abil.',
- 'wepay_payment_tos_agree' => 'Nõustun WePay :tingimuste ja :privaatsuspoliitikaga.',
+ 'wepay_payment_tos_agree' => 'Nõustun WePay :terms ja :privacy_policy.',
'privacy_policy' => 'Privaatsuspoliitika',
'wepay_payment_tos_agree_required' => 'Peate nõustuma WePay teenusetingimuste ja privaatsuspoliitikaga.',
'ach_email_prompt' => 'Palun sisestage oma e-posti aadress:',
@@ -1824,7 +1824,7 @@ $LANG = array(
'updated_expense_category' => 'Kulukategooria värskendamine õnnestus',
'created_expense_category' => 'Kulukategooria loomine õnnestus',
'archived_expense_category' => 'Kulukategooria arhiiveerimine õnnestus',
- 'archived_expense_categories' => 'Edukalt arhiveeritud :kogus kulukategooriat',
+ 'archived_expense_categories' => 'Edukalt arhiveeritud :count kulukategooriat',
'restore_expense_category' => 'Taasta kulukategooria',
'restored_expense_category' => 'Kulukategooria edukalt taastatud',
'apply_taxes' => 'Rakenda maksud',
@@ -1844,7 +1844,7 @@ $LANG = array(
'wepay_account_description' => 'Payment gateway for Invoice Ninja',
'payment_error_code' => 'Teie makse [:code] töötlemisel ilmnes viga. Palun proovi hiljem uuesti.',
'standard_fees_apply' => 'Tasu: 2,9%/1,2% [krediitkaart/pangaülekanne] + 0,30 dollarit eduka makse eest.',
- 'limit_import_rows' => 'Andmed tuleb importida partiidena :kogus ridade kaupa',
+ 'limit_import_rows' => 'Andmed tuleb importida partiidena :count ridade kaupa',
'error_title' => 'Midagi läks valesti',
'error_contact_text' => 'Kui soovite abi, saatke meile e-kiri aadressil :mailaddress',
'no_undo' => 'Hoiatus: seda ei saa tagasi võtta.',
@@ -1852,7 +1852,7 @@ $LANG = array(
'no_client_selected' => 'Valige klient',
'gateway_config_error' => 'See võib aidata määrata uusi paroole või luua uusi API-võtmeid.',
- 'payment_type_on_file' => ':tüüp faili',
+ 'payment_type_on_file' => ':type faili',
'invoice_for_client' => 'Arve :invoice kliendile :client',
'intent_not_found' => 'Vabandust, ma pole kindel, mida te küsite.',
'intent_not_supported' => 'Vabandust, ma ei saa seda teha.',
@@ -1866,7 +1866,7 @@ $LANG = array(
'bot_get_email' => 'Tere! (lehvitus)
Täname Invoice Ninja Boti proovimise eest.
Selle boti kasutamiseks peate looma tasuta konto.
Alustamiseks saatke mulle oma konto meiliaadress.',
'bot_get_code' => 'Aitäh! Saatsin teile turvakoodiga meili.',
'bot_welcome' => 'See on kõik, teie konto on kinnitatud.
',
- 'email_not_found' => 'Ma ei leidnud saadaolevat kontot :e-posti jaoks',
+ 'email_not_found' => 'Ma ei leidnud saadaolevat kontot :email jaoks',
'invalid_code' => 'Kood ei ole õige',
'security_code_email_subject' => 'InvoiceNinja Boti turvakood',
'security_code_email_line1' => 'See on teie Invoice Ninja Boti turvakood.',
@@ -1876,7 +1876,7 @@ $LANG = array(
'list_products' => 'Toodete loend',
'include_item_taxes_inline' => 'Include line item taxes in line total',
- 'created_quotes' => 'Edukalt loodud :kogus hinnapakkumist',
+ 'created_quotes' => 'Edukalt loodud :count hinnapakkumist',
'limited_gateways' => 'Note: we support one credit card gateway per company.',
'warning' => 'Hoiatus',
@@ -1887,7 +1887,7 @@ $LANG = array(
'update_invoiceninja_unavailable' => 'Invoice Ninja uut versiooni pole saadaval.',
'update_invoiceninja_instructions' => 'Palun installige uus versioon :versioon klõpsates nuppu Uuendage kohe allpool. Pärast seda suunatakse teid juhtpaneelile.',
'update_invoiceninja_update_start' => 'Uuendage kohe',
- 'update_invoiceninja_download_start' => 'Laadi alla: versioon',
+ 'update_invoiceninja_download_start' => 'Laadi alla :version',
'create_new' => 'Loo Uus',
'toggle_navigation' => 'Toggle Navigation',
@@ -1938,9 +1938,9 @@ $LANG = array(
'text' => 'Tekst',
'expense_will_create' => 'Kulu luuakse',
'expenses_will_create' => 'Kulud luuakse',
- 'created_expenses' => 'Edukalt loodud :kogus kulu(d)',
+ 'created_expenses' => 'Edukalt loodud :count kulu(d)',
- 'translate_app' => 'Aidake meie tõlkeid täiustada :linki abil',
+ 'translate_app' => 'Aidake meie tõlkeid täiustada :link abil',
'expense_category' => 'Kulu kategooria',
'go_ninja_pro' => 'Mine Ninja Pro!',
@@ -1982,42 +1982,10 @@ $LANG = array(
'authorization' => 'Autoriseerimine',
'signed' => 'Allkirjastatud',
- // BlueVine
- 'bluevine_promo' => 'Get flexible business lines of credit and invoice factoring using BlueVine.',
- 'bluevine_modal_label' => 'Registreeruge BlueVine\'iga',
- 'bluevine_modal_text' => '