mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-07 10:34:30 -04:00
Merge branch 'v5-develop' of https://github.com/invoiceninja/invoiceninja into feature-inbound-email-expenses
This commit is contained in:
commit
21d569bd2b
@ -1 +1 @@
|
|||||||
5.8.30
|
5.8.37
|
@ -884,14 +884,14 @@ class CheckData extends Command
|
|||||||
public function checkClientSettings()
|
public function checkClientSettings()
|
||||||
{
|
{
|
||||||
if ($this->option('fix') == 'true') {
|
if ($this->option('fix') == 'true') {
|
||||||
Client::query()->whereNull('country_id')->cursor()->each(function ($client) {
|
Client::query()->whereNull('country_id')->orWhere('country_id', 0)->cursor()->each(function ($client) {
|
||||||
$client->country_id = $client->company->settings->country_id;
|
$client->country_id = $client->company->settings->country_id;
|
||||||
$client->saveQuietly();
|
$client->saveQuietly();
|
||||||
|
|
||||||
$this->logMessage("Fixing country for # {$client->id}");
|
$this->logMessage("Fixing country for # {$client->id}");
|
||||||
});
|
});
|
||||||
|
|
||||||
Client::query()->whereNull("settings->currency_id")->cursor()->each(function ($client) {
|
Client::query()->whereNull("settings->currency_id")->orWhereJsonContains('settings', ['currency_id' => ''])->cursor()->each(function ($client) {
|
||||||
$settings = $client->settings;
|
$settings = $client->settings;
|
||||||
$settings->currency_id = (string)$client->company->settings->currency_id;
|
$settings->currency_id = (string)$client->company->settings->currency_id;
|
||||||
$client->settings = $settings;
|
$client->settings = $settings;
|
||||||
@ -933,7 +933,6 @@ class CheckData extends Command
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
Invoice::withTrashed()
|
Invoice::withTrashed()
|
||||||
->where("partial", 0)
|
->where("partial", 0)
|
||||||
->whereNotNull("partial_due_date")
|
->whereNotNull("partial_due_date")
|
||||||
@ -947,7 +946,42 @@ class CheckData extends Command
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Company::whereDoesntHave('company_users', function ($query){
|
||||||
|
$query->where('is_owner', 1);
|
||||||
|
})
|
||||||
|
->cursor()
|
||||||
|
->when(Ninja::isHosted())
|
||||||
|
->each(function ($c){
|
||||||
|
|
||||||
|
$this->logMessage("Orphan Account # {$c->account_id}");
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
CompanyUser::whereDoesntHave('tokens')
|
||||||
|
->cursor()
|
||||||
|
->when(Ninja::isHosted())
|
||||||
|
->each(function ($cu){
|
||||||
|
|
||||||
|
$this->logMessage("Missing tokens for Company User # {$cu->id}");
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
CompanyUser::whereDoesntHave('user')
|
||||||
|
->cursor()
|
||||||
|
->when(Ninja::isHosted())
|
||||||
|
->each(function ($cu) {
|
||||||
|
|
||||||
|
$this->logMessage("Missing user for Company User # {$cu->id}");
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
$cus = CompanyUser::withTrashed()
|
||||||
|
->whereHas("user", function ($query) {
|
||||||
|
$query->whereColumn("users.account_id", "!=", "company_user.account_id");
|
||||||
|
})->pluck('id')->implode(",");
|
||||||
|
|
||||||
|
|
||||||
|
$this->logMessage("Cross Linked CompanyUser ids # {$cus}");
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -264,7 +264,7 @@ class BaseRule implements RuleInterface
|
|||||||
return USStates::getState(strlen($this->client->postal_code) > 1 ? $this->client->postal_code : $this->client->shipping_postal_code);
|
return USStates::getState(strlen($this->client->postal_code) > 1 ? $this->client->postal_code : $this->client->shipping_postal_code);
|
||||||
|
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
return $this->client->company->country()->iso_3166_2 == 'US' ? $this->client->company->tax_data->seller_subregion : 'CA';
|
return 'CA';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,14 +55,12 @@ class Handler extends ExceptionHandler
|
|||||||
|
|
||||||
protected $selfHostDontReport = [
|
protected $selfHostDontReport = [
|
||||||
FilePermissionsFailure::class,
|
FilePermissionsFailure::class,
|
||||||
PDOException::class,
|
|
||||||
MaxAttemptsExceededException::class,
|
MaxAttemptsExceededException::class,
|
||||||
CommandNotFoundException::class,
|
CommandNotFoundException::class,
|
||||||
ValidationException::class,
|
ValidationException::class,
|
||||||
ModelNotFoundException::class,
|
ModelNotFoundException::class,
|
||||||
NotFoundHttpException::class,
|
NotFoundHttpException::class,
|
||||||
UnableToCreateDirectory::class,
|
UnableToCreateDirectory::class,
|
||||||
ConnectException::class,
|
|
||||||
RuntimeException::class,
|
RuntimeException::class,
|
||||||
InvalidArgumentException::class,
|
InvalidArgumentException::class,
|
||||||
CredentialsException::class,
|
CredentialsException::class,
|
||||||
@ -140,7 +138,7 @@ class Handler extends ExceptionHandler
|
|||||||
'email' => 'anonymous@example.com',
|
'email' => 'anonymous@example.com',
|
||||||
'name' => 'Anonymous User',
|
'name' => 'Anonymous User',
|
||||||
]);
|
]);
|
||||||
} elseif (auth()->guard('user') && auth()->guard('user')->user() && auth()->user()->company() && auth()->user()->company()->account->report_errors) {
|
} elseif (auth()->guard('user') && auth()->guard('user')->user() && auth()->user()->companyIsSet() && auth()->user()->company()->account->report_errors) {
|
||||||
$scope->setUser([
|
$scope->setUser([
|
||||||
'id' => auth()->user()->account->key,
|
'id' => auth()->user()->account->key,
|
||||||
'email' => 'anonymous@example.com',
|
'email' => 'anonymous@example.com',
|
||||||
|
@ -827,7 +827,14 @@ class BaseExport
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function applyFilters(Builder $query): Builder
|
/**
|
||||||
|
* Apply Product Filters
|
||||||
|
*
|
||||||
|
* @param Builder $query
|
||||||
|
*
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
public function applyProductFilters(Builder $query): Builder
|
||||||
{
|
{
|
||||||
|
|
||||||
if(isset($this->input['product_key'])) {
|
if(isset($this->input['product_key'])) {
|
||||||
@ -845,7 +852,15 @@ class BaseExport
|
|||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function addClientFilter($query, $clients): Builder
|
/**
|
||||||
|
* Add Client Filter
|
||||||
|
*
|
||||||
|
* @param Builder $query
|
||||||
|
* @param mixed $clients
|
||||||
|
*
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
protected function addClientFilter(Builder $query, $clients): Builder
|
||||||
{
|
{
|
||||||
if(is_string($clients)) {
|
if(is_string($clients)) {
|
||||||
$clients = explode(',', $clients);
|
$clients = explode(',', $clients);
|
||||||
@ -863,7 +878,15 @@ class BaseExport
|
|||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function addVendorFilter($query, $vendors): Builder
|
/**
|
||||||
|
* Add Vendor Filter
|
||||||
|
*
|
||||||
|
* @param Builder $query
|
||||||
|
* @param string $vendors
|
||||||
|
*
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
protected function addVendorFilter(Builder$query, string $vendors): Builder
|
||||||
{
|
{
|
||||||
|
|
||||||
if(is_string($vendors)) {
|
if(is_string($vendors)) {
|
||||||
@ -879,7 +902,15 @@ class BaseExport
|
|||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function addProjectFilter($query, $projects): Builder
|
/**
|
||||||
|
* AddProjectFilter
|
||||||
|
*
|
||||||
|
* @param Builder $query
|
||||||
|
* @param string $projects
|
||||||
|
*
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
protected function addProjectFilter(Builder $query, string $projects): Builder
|
||||||
{
|
{
|
||||||
|
|
||||||
if(is_string($projects)) {
|
if(is_string($projects)) {
|
||||||
@ -895,7 +926,15 @@ class BaseExport
|
|||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function addCategoryFilter($query, $expense_categories): Builder
|
/**
|
||||||
|
* Add Category Filter
|
||||||
|
*
|
||||||
|
* @param Builder $query
|
||||||
|
* @param string $expense_categories
|
||||||
|
*
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
protected function addCategoryFilter(Builder $query, string $expense_categories): Builder
|
||||||
{
|
{
|
||||||
|
|
||||||
if(is_string($expense_categories)) {
|
if(is_string($expense_categories)) {
|
||||||
@ -912,12 +951,229 @@ class BaseExport
|
|||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function addInvoiceStatusFilter($query, $status): Builder
|
/**
|
||||||
|
* Add Payment Status Filters
|
||||||
|
*
|
||||||
|
* @param Builder $query
|
||||||
|
* @param string $status
|
||||||
|
*
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
protected function addPaymentStatusFilters(Builder $query, string $status): Builder
|
||||||
{
|
{
|
||||||
|
|
||||||
$status_parameters = explode(',', $status);
|
$status_parameters = explode(',', $status);
|
||||||
|
|
||||||
if(in_array('all', $status_parameters)) {
|
if(in_array('all', $status_parameters) || count($status_parameters) == 0) {
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query->where(function ($query) use ($status_parameters) {
|
||||||
|
$payment_filters = [];
|
||||||
|
|
||||||
|
if (in_array('pending', $status_parameters)) {
|
||||||
|
$payment_filters[] = Payment::STATUS_PENDING;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('cancelled', $status_parameters)) {
|
||||||
|
$payment_filters[] = Payment::STATUS_CANCELLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('failed', $status_parameters)) {
|
||||||
|
$payment_filters[] = Payment::STATUS_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('completed', $status_parameters)) {
|
||||||
|
$payment_filters[] = Payment::STATUS_COMPLETED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('partially_refunded', $status_parameters)) {
|
||||||
|
$payment_filters[] = Payment::STATUS_PARTIALLY_REFUNDED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('refunded', $status_parameters)) {
|
||||||
|
$payment_filters[] = Payment::STATUS_REFUNDED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($payment_filters) > 0) {
|
||||||
|
$query->whereIn('status_id', $payment_filters);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(in_array('partially_unapplied', $status_parameters)) {
|
||||||
|
$query->whereColumn('amount', '>', 'applied')->where('refunded', 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $query;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add RecurringInvoice Status Filter
|
||||||
|
*
|
||||||
|
* @param Builder $query
|
||||||
|
* @param string $status
|
||||||
|
*
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
protected function addRecurringInvoiceStatusFilter(Builder $query, string $status): Builder
|
||||||
|
{
|
||||||
|
|
||||||
|
$status_parameters = explode(',', $status);
|
||||||
|
|
||||||
|
if (in_array('all', $status_parameters) || count($status_parameters) == 0){
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
$recurring_filters = [];
|
||||||
|
|
||||||
|
if (in_array('active', $status_parameters)) {
|
||||||
|
$recurring_filters[] = RecurringInvoice::STATUS_ACTIVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('paused', $status_parameters)) {
|
||||||
|
$recurring_filters[] = RecurringInvoice::STATUS_PAUSED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('completed', $status_parameters)) {
|
||||||
|
$recurring_filters[] = RecurringInvoice::STATUS_COMPLETED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($recurring_filters) >= 1) {
|
||||||
|
return $query->whereIn('status_id', $recurring_filters);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $query;
|
||||||
|
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Add QuoteStatus Filter
|
||||||
|
*
|
||||||
|
* @param Builder $query
|
||||||
|
* @param string $status
|
||||||
|
*
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
protected function addQuoteStatusFilter(Builder $query, string $status): Builder
|
||||||
|
{
|
||||||
|
|
||||||
|
$status_parameters = explode(',', $status);
|
||||||
|
|
||||||
|
if (in_array('all', $status_parameters)) {
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query->where(function ($query) use ($status_parameters) {
|
||||||
|
if (in_array('sent', $status_parameters)) {
|
||||||
|
$query->orWhere(function ($q) {
|
||||||
|
$q->where('status_id', Quote::STATUS_SENT)
|
||||||
|
->whereNull('due_date')
|
||||||
|
->orWhere('due_date', '>=', now()->toDateString());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$quote_filters = [];
|
||||||
|
|
||||||
|
if (in_array('draft', $status_parameters)) {
|
||||||
|
$quote_filters[] = Quote::STATUS_DRAFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('approved', $status_parameters)) {
|
||||||
|
$quote_filters[] = Quote::STATUS_APPROVED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($quote_filters) > 0) {
|
||||||
|
$query->orWhereIn('status_id', $quote_filters);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('expired', $status_parameters)) {
|
||||||
|
$query->orWhere(function ($q) {
|
||||||
|
$q->where('status_id', Quote::STATUS_SENT)
|
||||||
|
->whereNotNull('due_date')
|
||||||
|
->where('due_date', '<=', now()->toDateString());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('upcoming', $status_parameters)) {
|
||||||
|
$query->orWhere(function ($q) {
|
||||||
|
$q->where('status_id', Quote::STATUS_SENT)
|
||||||
|
->where('due_date', '>=', now()->toDateString())
|
||||||
|
->orderBy('due_date', 'DESC');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if(in_array('converted', $status_parameters)) {
|
||||||
|
$query->orWhere(function ($q) {
|
||||||
|
$q->whereNotNull('invoice_id');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add PurchaseOrder Status Filter
|
||||||
|
*
|
||||||
|
* @param Builder $query
|
||||||
|
* @param string $status
|
||||||
|
*
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
protected function addPurchaseOrderStatusFilter(Builder $query, string $status): Builder
|
||||||
|
{
|
||||||
|
|
||||||
|
$status_parameters = explode(',', $status);
|
||||||
|
|
||||||
|
if (in_array('all', $status_parameters) || count($status_parameters) == 0) {
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query->where(function ($query) use ($status_parameters) {
|
||||||
|
$po_status = [];
|
||||||
|
|
||||||
|
if (in_array('draft', $status_parameters)) {
|
||||||
|
$po_status[] = PurchaseOrder::STATUS_DRAFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('sent', $status_parameters)) {
|
||||||
|
$query->orWhere(function ($q) {
|
||||||
|
$q->where('status_id', PurchaseOrder::STATUS_SENT)
|
||||||
|
->whereNull('due_date')
|
||||||
|
->orWhere('due_date', '>=', now()->toDateString());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('accepted', $status_parameters)) {
|
||||||
|
$po_status[] = PurchaseOrder::STATUS_ACCEPTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('cancelled', $status_parameters)) {
|
||||||
|
$po_status[] = PurchaseOrder::STATUS_CANCELLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($po_status) >= 1) {
|
||||||
|
$query->whereIn('status_id', $po_status);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $query;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add Invoice Status Filter
|
||||||
|
*
|
||||||
|
* @param Builder $query
|
||||||
|
* @param string $status
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
protected function addInvoiceStatusFilter(Builder $query, string $status): Builder
|
||||||
|
{
|
||||||
|
|
||||||
|
$status_parameters = explode(',', $status);
|
||||||
|
|
||||||
|
if(in_array('all', $status_parameters) || count($status_parameters) == 0) {
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -942,6 +1198,10 @@ class BaseExport
|
|||||||
$invoice_filters[] = Invoice::STATUS_PARTIAL;
|
$invoice_filters[] = Invoice::STATUS_PARTIAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (in_array('cancelled', $status_parameters)) {
|
||||||
|
$invoice_filters[] = Invoice::STATUS_CANCELLED;
|
||||||
|
}
|
||||||
|
|
||||||
if (count($invoice_filters) > 0) {
|
if (count($invoice_filters) > 0) {
|
||||||
$nested->whereIn('status_id', $invoice_filters);
|
$nested->whereIn('status_id', $invoice_filters);
|
||||||
}
|
}
|
||||||
@ -966,14 +1226,18 @@ class BaseExport
|
|||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function addDateRange($query)
|
/**
|
||||||
|
* Add Date Range
|
||||||
|
*
|
||||||
|
* @param Builder $query
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
protected function addDateRange(Builder $query): Builder
|
||||||
{
|
{
|
||||||
$query = $this->applyFilters($query);
|
$query = $this->applyProductFilters($query);
|
||||||
|
|
||||||
$date_range = $this->input['date_range'];
|
$date_range = $this->input['date_range'];
|
||||||
|
|
||||||
nlog($date_range);
|
|
||||||
|
|
||||||
if (array_key_exists('date_key', $this->input) && strlen($this->input['date_key']) > 1) {
|
if (array_key_exists('date_key', $this->input) && strlen($this->input['date_key']) > 1) {
|
||||||
$this->date_key = $this->input['date_key'];
|
$this->date_key = $this->input['date_key'];
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ class ClientExport extends BaseExport
|
|||||||
$query = Client::query()->with('contacts')
|
$query = Client::query()->with('contacts')
|
||||||
->withTrashed()
|
->withTrashed()
|
||||||
->where('company_id', $this->company->id)
|
->where('company_id', $this->company->id)
|
||||||
->where('is_deleted', 0);
|
->where('is_deleted', $this->input['include_deleted'] ?? false);
|
||||||
|
|
||||||
$query = $this->addDateRange($query);
|
$query = $this->addDateRange($query);
|
||||||
|
|
||||||
|
@ -103,10 +103,14 @@ class CreditExport extends BaseExport
|
|||||||
->withTrashed()
|
->withTrashed()
|
||||||
->with('client')
|
->with('client')
|
||||||
->where('company_id', $this->company->id)
|
->where('company_id', $this->company->id)
|
||||||
->where('is_deleted', 0);
|
->where('is_deleted', $this->input['include_deleted'] ?? false);
|
||||||
|
|
||||||
$query = $this->addDateRange($query);
|
$query = $this->addDateRange($query);
|
||||||
|
|
||||||
|
if($this->input['status'] ?? false) {
|
||||||
|
$query = $this->addCreditStatusFilter($query, $this->input['status']);
|
||||||
|
}
|
||||||
|
|
||||||
if($this->input['document_email_attachment'] ?? false) {
|
if($this->input['document_email_attachment'] ?? false) {
|
||||||
$this->queueDocuments($query);
|
$this->queueDocuments($query);
|
||||||
}
|
}
|
||||||
@ -162,6 +166,40 @@ class CreditExport extends BaseExport
|
|||||||
return $this->decorateAdvancedFields($credit, $entity);
|
return $this->decorateAdvancedFields($credit, $entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function addCreditStatusFilter($query, $status): Builder
|
||||||
|
{
|
||||||
|
|
||||||
|
$status_parameters = explode(',', $status);
|
||||||
|
|
||||||
|
if (in_array('all', $status_parameters)) {
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
$credit_filters = [];
|
||||||
|
|
||||||
|
if (in_array('draft', $status_parameters)) {
|
||||||
|
$credit_filters[] = Credit::STATUS_DRAFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('sent', $status_parameters)) {
|
||||||
|
$credit_filters[] = Credit::STATUS_SENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('partial', $status_parameters)) {
|
||||||
|
$credit_filters[] = Credit::STATUS_PARTIAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('applied', $status_parameters)) {
|
||||||
|
$credit_filters[] = Credit::STATUS_APPLIED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($credit_filters) >= 1) {
|
||||||
|
$query->whereIn('status_id', $credit_filters);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
private function decorateAdvancedFields(Credit $credit, array $entity): array
|
private function decorateAdvancedFields(Credit $credit, array $entity): array
|
||||||
{
|
{
|
||||||
// if (in_array('country_id', $this->input['report_keys'])) {
|
// if (in_array('country_id', $this->input['report_keys'])) {
|
||||||
|
@ -83,10 +83,14 @@ class ExpenseExport extends BaseExport
|
|||||||
->with('client')
|
->with('client')
|
||||||
->withTrashed()
|
->withTrashed()
|
||||||
->where('company_id', $this->company->id)
|
->where('company_id', $this->company->id)
|
||||||
->where('is_deleted', 0);
|
->where('is_deleted', $this->input['include_deleted'] ?? false);
|
||||||
|
|
||||||
$query = $this->addDateRange($query);
|
$query = $this->addDateRange($query);
|
||||||
|
|
||||||
|
if($this->input['status'] ?? false) {
|
||||||
|
$query = $this->addExpenseStatusFilter($query, $this->input['status']);
|
||||||
|
}
|
||||||
|
|
||||||
if(isset($this->input['clients'])) {
|
if(isset($this->input['clients'])) {
|
||||||
$query = $this->addClientFilter($query, $this->input['clients']);
|
$query = $this->addClientFilter($query, $this->input['clients']);
|
||||||
}
|
}
|
||||||
@ -152,6 +156,55 @@ class ExpenseExport extends BaseExport
|
|||||||
return $this->decorateAdvancedFields($expense, $entity);
|
return $this->decorateAdvancedFields($expense, $entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function addExpenseStatusFilter($query, $status): Builder
|
||||||
|
{
|
||||||
|
|
||||||
|
$status_parameters = explode(',', $status);
|
||||||
|
|
||||||
|
if (in_array('all', $status_parameters)) {
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query->where(function ($query) use ($status_parameters) {
|
||||||
|
if (in_array('logged', $status_parameters)) {
|
||||||
|
$query->orWhere(function ($query) {
|
||||||
|
$query->where('amount', '>', 0)
|
||||||
|
->whereNull('invoice_id')
|
||||||
|
->whereNull('payment_date')
|
||||||
|
->where('should_be_invoiced', false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('pending', $status_parameters)) {
|
||||||
|
$query->orWhere(function ($query) {
|
||||||
|
$query->where('should_be_invoiced', true)
|
||||||
|
->whereNull('invoice_id');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('invoiced', $status_parameters)) {
|
||||||
|
$query->orWhere(function ($query) {
|
||||||
|
$query->whereNotNull('invoice_id');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('paid', $status_parameters)) {
|
||||||
|
$query->orWhere(function ($query) {
|
||||||
|
$query->whereNotNull('payment_date');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('unpaid', $status_parameters)) {
|
||||||
|
$query->orWhere(function ($query) {
|
||||||
|
$query->whereNull('payment_date');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
private function decorateAdvancedFields(Expense $expense, array $entity): array
|
private function decorateAdvancedFields(Expense $expense, array $entity): array
|
||||||
{
|
{
|
||||||
// if (in_array('expense.currency_id', $this->input['report_keys'])) {
|
// if (in_array('expense.currency_id', $this->input['report_keys'])) {
|
||||||
|
@ -58,7 +58,7 @@ class InvoiceExport extends BaseExport
|
|||||||
->withTrashed()
|
->withTrashed()
|
||||||
->with('client')
|
->with('client')
|
||||||
->where('company_id', $this->company->id)
|
->where('company_id', $this->company->id)
|
||||||
->where('is_deleted', 0);
|
->where('is_deleted', $this->input['include_deleted'] ?? false);
|
||||||
|
|
||||||
$query = $this->addDateRange($query);
|
$query = $this->addDateRange($query);
|
||||||
|
|
||||||
@ -151,9 +151,9 @@ class InvoiceExport extends BaseExport
|
|||||||
// $entity['invoice.status'] = $invoice->stringStatus($invoice->status_id);
|
// $entity['invoice.status'] = $invoice->stringStatus($invoice->status_id);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// if (in_array('invoice.recurring_id', $this->input['report_keys'])) {
|
if (in_array('invoice.recurring_id', $this->input['report_keys'])) {
|
||||||
// $entity['invoice.recurring_id'] = $invoice->recurring_invoice->number ?? '';
|
$entity['invoice.recurring_id'] = $invoice->recurring_invoice->number ?? '';
|
||||||
// }
|
}
|
||||||
|
|
||||||
if (in_array('invoice.auto_bill_enabled', $this->input['report_keys'])) {
|
if (in_array('invoice.auto_bill_enabled', $this->input['report_keys'])) {
|
||||||
$entity['invoice.auto_bill_enabled'] = $invoice->auto_bill_enabled ? ctrans('texts.yes') : ctrans('texts.no');
|
$entity['invoice.auto_bill_enabled'] = $invoice->auto_bill_enabled ? ctrans('texts.yes') : ctrans('texts.no');
|
||||||
|
@ -71,11 +71,15 @@ class InvoiceItemExport extends BaseExport
|
|||||||
->withTrashed()
|
->withTrashed()
|
||||||
->with('client')
|
->with('client')
|
||||||
->where('company_id', $this->company->id)
|
->where('company_id', $this->company->id)
|
||||||
->where('is_deleted', 0);
|
->where('is_deleted', $this->input['include_deleted'] ?? false);
|
||||||
|
|
||||||
$query = $this->addDateRange($query);
|
$query = $this->addDateRange($query);
|
||||||
|
|
||||||
$query = $this->applyFilters($query);
|
if($this->input['status'] ?? false) {
|
||||||
|
$query = $this->addInvoiceStatusFilter($query, $this->input['status']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = $this->applyProductFilters($query);
|
||||||
|
|
||||||
if($this->input['document_email_attachment'] ?? false) {
|
if($this->input['document_email_attachment'] ?? false) {
|
||||||
$this->queueDocuments($query);
|
$this->queueDocuments($query);
|
||||||
@ -232,9 +236,9 @@ class InvoiceItemExport extends BaseExport
|
|||||||
// $entity['invoice.status'] = $invoice->stringStatus($invoice->status_id);
|
// $entity['invoice.status'] = $invoice->stringStatus($invoice->status_id);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// if (in_array('invoice.recurring_id', $this->input['report_keys'])) {
|
if (in_array('invoice.recurring_id', $this->input['report_keys'])) {
|
||||||
// $entity['invoice.recurring_id'] = $invoice->recurring_invoice->number ?? '';
|
$entity['invoice.recurring_id'] = $invoice->recurring_invoice->number ?? '';
|
||||||
// }
|
}
|
||||||
|
|
||||||
if (in_array('invoice.assigned_user_id', $this->input['report_keys'])) {
|
if (in_array('invoice.assigned_user_id', $this->input['report_keys'])) {
|
||||||
$entity['invoice.assigned_user_id'] = $invoice->assigned_user ? $invoice->assigned_user->present()->name() : '';
|
$entity['invoice.assigned_user_id'] = $invoice->assigned_user ? $invoice->assigned_user->present()->name() : '';
|
||||||
|
@ -61,6 +61,8 @@ class PaymentExport extends BaseExport
|
|||||||
|
|
||||||
$query = $this->addDateRange($query);
|
$query = $this->addDateRange($query);
|
||||||
|
|
||||||
|
$query = $this->addPaymentStatusFilters($query, $this->input['status'] ?? '');
|
||||||
|
|
||||||
if($this->input['document_email_attachment'] ?? false) {
|
if($this->input['document_email_attachment'] ?? false) {
|
||||||
$this->queueDocuments($query);
|
$this->queueDocuments($query);
|
||||||
}
|
}
|
||||||
|
@ -31,51 +31,6 @@ class PurchaseOrderExport extends BaseExport
|
|||||||
|
|
||||||
private Decorator $decorator;
|
private Decorator $decorator;
|
||||||
|
|
||||||
public array $entity_keys = [
|
|
||||||
'amount' => 'purchase_order.amount',
|
|
||||||
'balance' => 'purchase_order.balance',
|
|
||||||
'vendor' => 'purchase_order.vendor_id',
|
|
||||||
// 'custom_surcharge1' => 'purchase_order.custom_surcharge1',
|
|
||||||
// 'custom_surcharge2' => 'purchase_order.custom_surcharge2',
|
|
||||||
// 'custom_surcharge3' => 'purchase_order.custom_surcharge3',
|
|
||||||
// 'custom_surcharge4' => 'purchase_order.custom_surcharge4',
|
|
||||||
'custom_value1' => 'purchase_order.custom_value1',
|
|
||||||
'custom_value2' => 'purchase_order.custom_value2',
|
|
||||||
'custom_value3' => 'purchase_order.custom_value3',
|
|
||||||
'custom_value4' => 'purchase_order.custom_value4',
|
|
||||||
'date' => 'purchase_order.date',
|
|
||||||
'discount' => 'purchase_order.discount',
|
|
||||||
'due_date' => 'purchase_order.due_date',
|
|
||||||
'exchange_rate' => 'purchase_order.exchange_rate',
|
|
||||||
'footer' => 'purchase_order.footer',
|
|
||||||
'number' => 'purchase_order.number',
|
|
||||||
'paid_to_date' => 'purchase_order.paid_to_date',
|
|
||||||
'partial' => 'purchase_order.partial',
|
|
||||||
'partial_due_date' => 'purchase_order.partial_due_date',
|
|
||||||
'po_number' => 'purchase_order.po_number',
|
|
||||||
'private_notes' => 'purchase_order.private_notes',
|
|
||||||
'public_notes' => 'purchase_order.public_notes',
|
|
||||||
'status' => 'purchase_order.status',
|
|
||||||
'tax_name1' => 'purchase_order.tax_name1',
|
|
||||||
'tax_name2' => 'purchase_order.tax_name2',
|
|
||||||
'tax_name3' => 'purchase_order.tax_name3',
|
|
||||||
'tax_rate1' => 'purchase_order.tax_rate1',
|
|
||||||
'tax_rate2' => 'purchase_order.tax_rate2',
|
|
||||||
'tax_rate3' => 'purchase_order.tax_rate3',
|
|
||||||
'terms' => 'purchase_order.terms',
|
|
||||||
'total_taxes' => 'purchase_order.total_taxes',
|
|
||||||
'currency_id' => 'purchase_order.currency_id',
|
|
||||||
];
|
|
||||||
|
|
||||||
private array $decorate_keys = [
|
|
||||||
'country',
|
|
||||||
'currency_id',
|
|
||||||
'status',
|
|
||||||
'vendor',
|
|
||||||
'project',
|
|
||||||
];
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct(Company $company, array $input)
|
public function __construct(Company $company, array $input)
|
||||||
{
|
{
|
||||||
$this->company = $company;
|
$this->company = $company;
|
||||||
@ -104,10 +59,12 @@ class PurchaseOrderExport extends BaseExport
|
|||||||
->withTrashed()
|
->withTrashed()
|
||||||
->with('vendor')
|
->with('vendor')
|
||||||
->where('company_id', $this->company->id)
|
->where('company_id', $this->company->id)
|
||||||
->where('is_deleted', 0);
|
->where('is_deleted', $this->input['include_deleted'] ?? false);
|
||||||
|
|
||||||
$query = $this->addDateRange($query);
|
$query = $this->addDateRange($query);
|
||||||
|
|
||||||
|
$query = $this->addPurchaseOrderStatusFilter($query, $this->input['status'] ?? '');
|
||||||
|
|
||||||
if($this->input['document_email_attachment'] ?? false) {
|
if($this->input['document_email_attachment'] ?? false) {
|
||||||
$this->queueDocuments($query);
|
$this->queueDocuments($query);
|
||||||
}
|
}
|
||||||
@ -167,7 +124,7 @@ class PurchaseOrderExport extends BaseExport
|
|||||||
if (is_array($parts) && $parts[0] == 'purchase_order' && array_key_exists($parts[1], $transformed_purchase_order)) {
|
if (is_array($parts) && $parts[0] == 'purchase_order' && array_key_exists($parts[1], $transformed_purchase_order)) {
|
||||||
$entity[$key] = $transformed_purchase_order[$parts[1]];
|
$entity[$key] = $transformed_purchase_order[$parts[1]];
|
||||||
} else {
|
} else {
|
||||||
// nlog($key);
|
nlog($key);
|
||||||
$entity[$key] = $this->decorator->transform($key, $purchase_order);
|
$entity[$key] = $this->decorator->transform($key, $purchase_order);
|
||||||
// $entity[$key] = '';
|
// $entity[$key] = '';
|
||||||
|
|
||||||
@ -182,16 +139,13 @@ class PurchaseOrderExport extends BaseExport
|
|||||||
|
|
||||||
private function decorateAdvancedFields(PurchaseOrder $purchase_order, array $entity): array
|
private function decorateAdvancedFields(PurchaseOrder $purchase_order, array $entity): array
|
||||||
{
|
{
|
||||||
if (in_array('country_id', $this->input['report_keys'])) {
|
|
||||||
$entity['country'] = $purchase_order->vendor->country ? ctrans("texts.country_{$purchase_order->vendor->country->name}") : '';
|
if (in_array('purchase_order.currency_id', $this->input['report_keys'])) {
|
||||||
|
$entity['purchase_order.currency_id'] = $purchase_order->vendor->currency() ? $purchase_order->vendor->currency()->code : $purchase_order->company->currency()->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_array('currency_id', $this->input['report_keys'])) {
|
if (in_array('purchase_order.vendor_id', $this->input['report_keys'])) {
|
||||||
$entity['currency_id'] = $purchase_order->vendor->currency() ? $purchase_order->vendor->currency()->code : $purchase_order->company->currency()->code;
|
$entity['purchase_order.vendor_id'] = $purchase_order->vendor->present()->name();
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array('vendor_id', $this->input['report_keys'])) {
|
|
||||||
$entity['vendor'] = $purchase_order->vendor->present()->name();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_array('purchase_order.status', $this->input['report_keys'])) {
|
if (in_array('purchase_order.status', $this->input['report_keys'])) {
|
||||||
|
@ -63,10 +63,12 @@ class PurchaseOrderItemExport extends BaseExport
|
|||||||
$query = PurchaseOrder::query()
|
$query = PurchaseOrder::query()
|
||||||
->withTrashed()
|
->withTrashed()
|
||||||
->with('vendor')->where('company_id', $this->company->id)
|
->with('vendor')->where('company_id', $this->company->id)
|
||||||
->where('is_deleted', 0);
|
->where('is_deleted', $this->input['include_deleted'] ?? false);
|
||||||
|
|
||||||
$query = $this->addDateRange($query);
|
$query = $this->addDateRange($query);
|
||||||
|
|
||||||
|
$query = $this->addPurchaseOrderStatusFilter($query, $this->input['status'] ?? '');
|
||||||
|
|
||||||
if($this->input['document_email_attachment'] ?? false) {
|
if($this->input['document_email_attachment'] ?? false) {
|
||||||
$this->queueDocuments($query);
|
$this->queueDocuments($query);
|
||||||
}
|
}
|
||||||
@ -190,23 +192,35 @@ class PurchaseOrderItemExport extends BaseExport
|
|||||||
|
|
||||||
private function decorateAdvancedFields(PurchaseOrder $purchase_order, array $entity): array
|
private function decorateAdvancedFields(PurchaseOrder $purchase_order, array $entity): array
|
||||||
{
|
{
|
||||||
if (in_array('currency_id', $this->input['report_keys'])) {
|
// if (in_array('currency_id', $this->input['report_keys'])) {
|
||||||
$entity['currency'] = $purchase_order->vendor->currency() ? $purchase_order->vendor->currency()->code : $purchase_order->company->currency()->code;
|
// $entity['currency'] = $purchase_order->vendor->currency() ? $purchase_order->vendor->currency()->code : $purchase_order->company->currency()->code;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if(array_key_exists('type', $entity)) {
|
||||||
|
// $entity['type'] = $purchase_order->typeIdString($entity['type']);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if(array_key_exists('tax_category', $entity)) {
|
||||||
|
// $entity['tax_category'] = $purchase_order->taxTypeString($entity['tax_category']);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if($this->force_keys) {
|
||||||
|
// $entity['vendor'] = $purchase_order->vendor->present()->name();
|
||||||
|
// $entity['vendor_id_number'] = $purchase_order->vendor->id_number;
|
||||||
|
// $entity['vendor_number'] = $purchase_order->vendor->number;
|
||||||
|
// $entity['status'] = $purchase_order->stringStatus($purchase_order->status_id);
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (in_array('purchase_order.currency_id', $this->input['report_keys'])) {
|
||||||
|
$entity['purchase_order.currency_id'] = $purchase_order->vendor->currency() ? $purchase_order->vendor->currency()->code : $purchase_order->company->currency()->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(array_key_exists('type', $entity)) {
|
if (in_array('purchase_order.vendor_id', $this->input['report_keys'])) {
|
||||||
$entity['type'] = $purchase_order->typeIdString($entity['type']);
|
$entity['purchase_order.vendor_id'] = $purchase_order->vendor->present()->name();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(array_key_exists('tax_category', $entity)) {
|
if (in_array('purchase_order.status', $this->input['report_keys'])) {
|
||||||
$entity['tax_category'] = $purchase_order->taxTypeString($entity['tax_category']);
|
$entity['purchase_order.status'] = $purchase_order->stringStatus($purchase_order->status_id);
|
||||||
}
|
|
||||||
|
|
||||||
if($this->force_keys) {
|
|
||||||
$entity['vendor'] = $purchase_order->vendor->present()->name();
|
|
||||||
$entity['vendor_id_number'] = $purchase_order->vendor->id_number;
|
|
||||||
$entity['vendor_number'] = $purchase_order->vendor->number;
|
|
||||||
$entity['status'] = $purchase_order->stringStatus($purchase_order->status_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_array('purchase_order.user_id', $this->input['report_keys'])) {
|
if (in_array('purchase_order.user_id', $this->input['report_keys'])) {
|
||||||
|
@ -65,10 +65,12 @@ class QuoteExport extends BaseExport
|
|||||||
->withTrashed()
|
->withTrashed()
|
||||||
->with('client')
|
->with('client')
|
||||||
->where('company_id', $this->company->id)
|
->where('company_id', $this->company->id)
|
||||||
->where('is_deleted', 0);
|
->where('is_deleted', $this->input['include_deleted'] ?? false);
|
||||||
|
|
||||||
$query = $this->addDateRange($query);
|
$query = $this->addDateRange($query);
|
||||||
|
|
||||||
|
$query = $this->addQuoteStatusFilter($query, $this->input['status'] ?? '');
|
||||||
|
|
||||||
if($this->input['document_email_attachment'] ?? false) {
|
if($this->input['document_email_attachment'] ?? false) {
|
||||||
$this->queueDocuments($query);
|
$this->queueDocuments($query);
|
||||||
}
|
}
|
||||||
|
@ -66,10 +66,12 @@ class QuoteItemExport extends BaseExport
|
|||||||
$query = Quote::query()
|
$query = Quote::query()
|
||||||
->withTrashed()
|
->withTrashed()
|
||||||
->with('client')->where('company_id', $this->company->id)
|
->with('client')->where('company_id', $this->company->id)
|
||||||
->where('is_deleted', 0);
|
->where('is_deleted', $this->input['include_deleted'] ?? false);
|
||||||
|
|
||||||
$query = $this->addDateRange($query);
|
$query = $this->addDateRange($query);
|
||||||
|
|
||||||
|
$query = $this->addQuoteStatusFilter($query, $this->input['status'] ?? '');
|
||||||
|
|
||||||
if($this->input['document_email_attachment'] ?? false) {
|
if($this->input['document_email_attachment'] ?? false) {
|
||||||
$this->queueDocuments($query);
|
$this->queueDocuments($query);
|
||||||
}
|
}
|
||||||
|
@ -57,10 +57,12 @@ class RecurringInvoiceExport extends BaseExport
|
|||||||
->withTrashed()
|
->withTrashed()
|
||||||
->with('client')
|
->with('client')
|
||||||
->where('company_id', $this->company->id)
|
->where('company_id', $this->company->id)
|
||||||
->where('is_deleted', 0);
|
->where('is_deleted', $this->input['include_deleted'] ?? false);
|
||||||
|
|
||||||
$query = $this->addDateRange($query);
|
$query = $this->addDateRange($query);
|
||||||
|
|
||||||
|
$query = $this->addRecurringInvoiceStatusFilter($query, $this->input['status'] ?? '');
|
||||||
|
|
||||||
return $query;
|
return $query;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -68,7 +68,7 @@ class TaskExport extends BaseExport
|
|||||||
$query = Task::query()
|
$query = Task::query()
|
||||||
->withTrashed()
|
->withTrashed()
|
||||||
->where('company_id', $this->company->id)
|
->where('company_id', $this->company->id)
|
||||||
->where('is_deleted', 0);
|
->where('is_deleted', $this->input['include_deleted'] ?? false);
|
||||||
|
|
||||||
$query = $this->addDateRange($query);
|
$query = $this->addDateRange($query);
|
||||||
|
|
||||||
@ -203,6 +203,34 @@ class TaskExport extends BaseExport
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add Task Status Filter
|
||||||
|
*
|
||||||
|
* @param Builder $query
|
||||||
|
* @param string $status
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
protected function addTaskStatusFilter(Builder $query, string $status): Builder
|
||||||
|
{
|
||||||
|
|
||||||
|
$status_parameters = explode(',', $status);
|
||||||
|
|
||||||
|
if (in_array('all', $status_parameters) || count($status_parameters) == 0) {
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('invoiced', $status_parameters)) {
|
||||||
|
$query->whereNotNull('invoice_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('uninvoiced', $status_parameters)) {
|
||||||
|
$query->whereNull('invoice_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $query;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private function decorateAdvancedFields(Task $task, array $entity): array
|
private function decorateAdvancedFields(Task $task, array $entity): array
|
||||||
{
|
{
|
||||||
if (in_array('task.status_id', $this->input['report_keys'])) {
|
if (in_array('task.status_id', $this->input['report_keys'])) {
|
||||||
|
@ -62,7 +62,7 @@ class VendorExport extends BaseExport
|
|||||||
$query = Vendor::query()->with('contacts')
|
$query = Vendor::query()->with('contacts')
|
||||||
->withTrashed()
|
->withTrashed()
|
||||||
->where('company_id', $this->company->id)
|
->where('company_id', $this->company->id)
|
||||||
->where('is_deleted', 0);
|
->where('is_deleted', $this->input['include_deleted'] ?? false);
|
||||||
|
|
||||||
$query = $this->addDateRange($query);
|
$query = $this->addDateRange($query);
|
||||||
|
|
||||||
|
@ -79,7 +79,6 @@ class InvoiceDecorator extends Decorator implements DecoratorInterface
|
|||||||
return $invoice->partial_due_date ?? '';
|
return $invoice->partial_due_date ?? '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function assigned_user_id(Invoice $invoice)
|
public function assigned_user_id(Invoice $invoice)
|
||||||
{
|
{
|
||||||
return $invoice->assigned_user ? $invoice->assigned_user->present()->name() : '';
|
return $invoice->assigned_user ? $invoice->assigned_user->present()->name() : '';
|
||||||
|
@ -29,11 +29,13 @@ class DocumentFilters extends QueryFilters
|
|||||||
*/
|
*/
|
||||||
public function filter(string $filter = ''): Builder
|
public function filter(string $filter = ''): Builder
|
||||||
{
|
{
|
||||||
|
|
||||||
if (strlen($filter) == 0) {
|
if (strlen($filter) == 0) {
|
||||||
return $this->builder;
|
return $this->builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->builder;
|
return $this->builder->where('name', 'like', '%'.$filter.'%');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -47,6 +49,43 @@ class DocumentFilters extends QueryFilters
|
|||||||
*/
|
*/
|
||||||
public function client_id(string $client_id = ''): Builder
|
public function client_id(string $client_id = ''): Builder
|
||||||
{
|
{
|
||||||
|
|
||||||
|
return $this->builder->where(function ($query) use ($client_id) {
|
||||||
|
$query->whereHasMorph('documentable', [
|
||||||
|
\App\Models\Invoice::class,
|
||||||
|
\App\Models\Quote::class,
|
||||||
|
\App\Models\Credit::class,
|
||||||
|
\App\Models\Expense::class,
|
||||||
|
\App\Models\Payment::class,
|
||||||
|
\App\Models\Task::class,
|
||||||
|
\App\Models\RecurringExpense::class,
|
||||||
|
\App\Models\RecurringInvoice::class,
|
||||||
|
\App\Models\Project::class,
|
||||||
|
], function ($q2) use ($client_id) {
|
||||||
|
$q2->where('client_id', $this->decodePrimaryKey($client_id));
|
||||||
|
})->orWhereHasMorph('documentable', [\App\Models\Client::class], function ($q3) use ($client_id) {
|
||||||
|
$q3->where('id', $this->decodePrimaryKey($client_id));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function type(string $types = '')
|
||||||
|
{
|
||||||
|
$types = explode(',', $types);
|
||||||
|
|
||||||
|
foreach ($types as $type)
|
||||||
|
{
|
||||||
|
match($type) {
|
||||||
|
'private' => $this->builder->where('is_public', 0),
|
||||||
|
'public' => $this->builder->where('is_public', 1),
|
||||||
|
'pdf' => $this->builder->where('type', 'pdf'),
|
||||||
|
'image' => $this->builder->whereIn('type', ['png','jpeg','jpg','gif','svg']),
|
||||||
|
'other' => $this->builder->whereNotIn('type', ['pdf','png','jpeg','jpg','gif','svg']),
|
||||||
|
default => $this->builder,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
return $this->builder;
|
return $this->builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,6 +62,10 @@ class InvoiceFilters extends QueryFilters
|
|||||||
$invoice_filters[] = Invoice::STATUS_PAID;
|
$invoice_filters[] = Invoice::STATUS_PAID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (in_array('cancelled', $status_parameters)) {
|
||||||
|
$invoice_filters[] = Invoice::STATUS_CANCELLED;
|
||||||
|
}
|
||||||
|
|
||||||
if (in_array('unpaid', $status_parameters)) {
|
if (in_array('unpaid', $status_parameters)) {
|
||||||
$invoice_filters[] = Invoice::STATUS_SENT;
|
$invoice_filters[] = Invoice::STATUS_SENT;
|
||||||
$invoice_filters[] = Invoice::STATUS_PARTIAL;
|
$invoice_filters[] = Invoice::STATUS_PARTIAL;
|
||||||
@ -324,6 +328,7 @@ class InvoiceFilters extends QueryFilters
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($sort_col[0] == 'number') {
|
if($sort_col[0] == 'number') {
|
||||||
|
// return $this->builder->orderByRaw('CAST(number AS UNSIGNED), number ' . $dir);
|
||||||
return $this->builder->orderByRaw('ABS(number) ' . $dir);
|
return $this->builder->orderByRaw('ABS(number) ' . $dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,11 +97,11 @@ class Nordigen
|
|||||||
return $it->transform($out);
|
return $it->transform($out);
|
||||||
|
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
if (strpos($e->getMessage(), "Invalid Account ID") !== false) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw $e;
|
nlog("Nordigen getAccount() failed => {$account_id} => " . $e->getMessage());
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,7 +277,7 @@ class InvoiceItemSum
|
|||||||
|
|
||||||
$item_tax += $item_tax_rate1_total;
|
$item_tax += $item_tax_rate1_total;
|
||||||
|
|
||||||
if (strlen($this->item->tax_name1) > 2) {
|
if (strlen($this->item->tax_name1) > 1) {
|
||||||
$this->groupTax($this->item->tax_name1, $this->item->tax_rate1, $item_tax_rate1_total);
|
$this->groupTax($this->item->tax_name1, $this->item->tax_rate1, $item_tax_rate1_total);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,7 +285,7 @@ class InvoiceItemSum
|
|||||||
|
|
||||||
$item_tax += $item_tax_rate2_total;
|
$item_tax += $item_tax_rate2_total;
|
||||||
|
|
||||||
if (strlen($this->item->tax_name2) > 2) {
|
if (strlen($this->item->tax_name2) > 1) {
|
||||||
$this->groupTax($this->item->tax_name2, $this->item->tax_rate2, $item_tax_rate2_total);
|
$this->groupTax($this->item->tax_name2, $this->item->tax_rate2, $item_tax_rate2_total);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,7 +293,7 @@ class InvoiceItemSum
|
|||||||
|
|
||||||
$item_tax += $item_tax_rate3_total;
|
$item_tax += $item_tax_rate3_total;
|
||||||
|
|
||||||
if (strlen($this->item->tax_name3) > 2) {
|
if (strlen($this->item->tax_name3) > 1) {
|
||||||
$this->groupTax($this->item->tax_name3, $this->item->tax_rate3, $item_tax_rate3_total);
|
$this->groupTax($this->item->tax_name3, $this->item->tax_rate3, $item_tax_rate3_total);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,7 +231,7 @@ class InvoiceItemSumInclusive
|
|||||||
/** @var float $item_tax */
|
/** @var float $item_tax */
|
||||||
$item_tax += $this->formatValue($item_tax_rate1_total, $this->currency->precision);
|
$item_tax += $this->formatValue($item_tax_rate1_total, $this->currency->precision);
|
||||||
|
|
||||||
if (strlen($this->item->tax_name1) > 2) {
|
if (strlen($this->item->tax_name1) > 1) {
|
||||||
$this->groupTax($this->item->tax_name1, $this->item->tax_rate1, $item_tax_rate1_total);
|
$this->groupTax($this->item->tax_name1, $this->item->tax_rate1, $item_tax_rate1_total);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,7 +239,7 @@ class InvoiceItemSumInclusive
|
|||||||
|
|
||||||
$item_tax += $this->formatValue($item_tax_rate2_total, $this->currency->precision);
|
$item_tax += $this->formatValue($item_tax_rate2_total, $this->currency->precision);
|
||||||
|
|
||||||
if (strlen($this->item->tax_name2) > 2) {
|
if (strlen($this->item->tax_name2) > 1) {
|
||||||
$this->groupTax($this->item->tax_name2, $this->item->tax_rate2, $item_tax_rate2_total);
|
$this->groupTax($this->item->tax_name2, $this->item->tax_rate2, $item_tax_rate2_total);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -247,7 +247,7 @@ class InvoiceItemSumInclusive
|
|||||||
|
|
||||||
$item_tax += $this->formatValue($item_tax_rate3_total, $this->currency->precision);
|
$item_tax += $this->formatValue($item_tax_rate3_total, $this->currency->precision);
|
||||||
|
|
||||||
if (strlen($this->item->tax_name3) > 2) {
|
if (strlen($this->item->tax_name3) > 1) {
|
||||||
$this->groupTax($this->item->tax_name3, $this->item->tax_rate3, $item_tax_rate3_total);
|
$this->groupTax($this->item->tax_name3, $this->item->tax_rate3, $item_tax_rate3_total);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ class InvoiceSum
|
|||||||
|
|
||||||
private function calculateInvoiceTaxes(): self
|
private function calculateInvoiceTaxes(): self
|
||||||
{
|
{
|
||||||
if (is_string($this->invoice->tax_name1) && strlen($this->invoice->tax_name1) > 2) {
|
if (is_string($this->invoice->tax_name1) && strlen($this->invoice->tax_name1) >= 2) {
|
||||||
$tax = $this->taxer($this->total, $this->invoice->tax_rate1);
|
$tax = $this->taxer($this->total, $this->invoice->tax_rate1);
|
||||||
$tax += $this->getSurchargeTaxTotalForKey($this->invoice->tax_name1, $this->invoice->tax_rate1);
|
$tax += $this->getSurchargeTaxTotalForKey($this->invoice->tax_name1, $this->invoice->tax_rate1);
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ class InvoiceSum
|
|||||||
$this->total_tax_map[] = ['name' => $this->invoice->tax_name1.' '.floatval($this->invoice->tax_rate1).'%', 'total' => $tax];
|
$this->total_tax_map[] = ['name' => $this->invoice->tax_name1.' '.floatval($this->invoice->tax_rate1).'%', 'total' => $tax];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_string($this->invoice->tax_name2) && strlen($this->invoice->tax_name2) > 2) {
|
if (is_string($this->invoice->tax_name2) && strlen($this->invoice->tax_name2) >= 2) {
|
||||||
$tax = $this->taxer($this->total, $this->invoice->tax_rate2);
|
$tax = $this->taxer($this->total, $this->invoice->tax_rate2);
|
||||||
$tax += $this->getSurchargeTaxTotalForKey($this->invoice->tax_name2, $this->invoice->tax_rate2);
|
$tax += $this->getSurchargeTaxTotalForKey($this->invoice->tax_name2, $this->invoice->tax_rate2);
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ class InvoiceSum
|
|||||||
$this->total_tax_map[] = ['name' => $this->invoice->tax_name2.' '.floatval($this->invoice->tax_rate2).'%', 'total' => $tax];
|
$this->total_tax_map[] = ['name' => $this->invoice->tax_name2.' '.floatval($this->invoice->tax_rate2).'%', 'total' => $tax];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_string($this->invoice->tax_name3) && strlen($this->invoice->tax_name3) > 2) {
|
if (is_string($this->invoice->tax_name3) && strlen($this->invoice->tax_name3) >= 2) {
|
||||||
$tax = $this->taxer($this->total, $this->invoice->tax_rate3);
|
$tax = $this->taxer($this->total, $this->invoice->tax_rate3);
|
||||||
$tax += $this->getSurchargeTaxTotalForKey($this->invoice->tax_name3, $this->invoice->tax_rate3);
|
$tax += $this->getSurchargeTaxTotalForKey($this->invoice->tax_name3, $this->invoice->tax_rate3);
|
||||||
|
|
||||||
|
@ -340,8 +340,7 @@ class InvoiceSumInclusive
|
|||||||
|
|
||||||
$this->total_taxes += $total_line_tax;
|
$this->total_taxes += $total_line_tax;
|
||||||
}
|
}
|
||||||
nlog($this->tax_map);
|
|
||||||
nlog($this->total_taxes);
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ class SwissQrGenerator
|
|||||||
// Optionally, add some human-readable information about what the bill is for.
|
// Optionally, add some human-readable information about what the bill is for.
|
||||||
$qrBill->setAdditionalInformation(
|
$qrBill->setAdditionalInformation(
|
||||||
QrBill\DataGroup\Element\AdditionalInformation::create(
|
QrBill\DataGroup\Element\AdditionalInformation::create(
|
||||||
$this->invoice->public_notes ? substr($this->invoice->public_notes, 0, 139) : ctrans('texts.invoice_number_placeholder', ['invoice' => $this->invoice->number])
|
$this->invoice->public_notes ? substr(strip_tags($this->invoice->public_notes), 0, 139) : ctrans('texts.invoice_number_placeholder', ['invoice' => $this->invoice->number])
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -49,6 +49,9 @@ use App\Http\Requests\Client\ClientDocumentsRequest;
|
|||||||
use App\Http\Requests\Client\ReactivateClientEmailRequest;
|
use App\Http\Requests\Client\ReactivateClientEmailRequest;
|
||||||
use App\Models\Expense;
|
use App\Models\Expense;
|
||||||
use App\Models\Payment;
|
use App\Models\Payment;
|
||||||
|
use App\Models\Project;
|
||||||
|
use App\Models\RecurringExpense;
|
||||||
|
use App\Models\RecurringInvoice;
|
||||||
use App\Models\Task;
|
use App\Models\Task;
|
||||||
use App\Transformers\DocumentTransformer;
|
use App\Transformers\DocumentTransformer;
|
||||||
|
|
||||||
@ -421,7 +424,7 @@ class ClientController extends BaseController
|
|||||||
|
|
||||||
$documents = Document::query()
|
$documents = Document::query()
|
||||||
->company()
|
->company()
|
||||||
->whereHasMorph('documentable', [Invoice::class, Quote::class, Credit::class, Expense::class, Payment::class, Task::class], function ($query) use ($client) {
|
->whereHasMorph('documentable', [Invoice::class, Quote::class, Credit::class, Expense::class, Payment::class, Task::class, RecurringInvoice::class, RecurringExpense::class, Project::class], function ($query) use ($client) {
|
||||||
$query->where('client_id', $client->id);
|
$query->where('client_id', $client->id);
|
||||||
})
|
})
|
||||||
->orWhereHasMorph('documentable', [Client::class], function ($query) use ($client) {
|
->orWhereHasMorph('documentable', [Client::class], function ($query) use ($client) {
|
||||||
|
@ -45,7 +45,7 @@ class EmailPreferencesController extends Controller
|
|||||||
|
|
||||||
if ($invitation->contact->is_locked && !Cache::has("unsubscribe_notitfication_suppression:{$invitation_key}")) {
|
if ($invitation->contact->is_locked && !Cache::has("unsubscribe_notitfication_suppression:{$invitation_key}")) {
|
||||||
$nmo = new NinjaMailerObject();
|
$nmo = new NinjaMailerObject();
|
||||||
$nmo->mailable = new NinjaMailer((new ClientUnsubscribedObject($invitation->contact, $invitation->contact->company, $invitation->contact->company->owner()->company_users()->first()->portalType() ?? true))->build());
|
$nmo->mailable = new NinjaMailer((new ClientUnsubscribedObject($invitation->contact, $invitation->contact->company, true))->build());
|
||||||
$nmo->company = $invitation->contact->company;
|
$nmo->company = $invitation->contact->company;
|
||||||
$nmo->to_user = $invitation->contact->company->owner();
|
$nmo->to_user = $invitation->contact->company->owner();
|
||||||
$nmo->settings = $invitation->contact->company->settings;
|
$nmo->settings = $invitation->contact->company->settings;
|
||||||
|
@ -271,6 +271,7 @@ class InvitationController extends Controller
|
|||||||
->with('contact.client')
|
->with('contact.client')
|
||||||
->firstOrFail();
|
->firstOrFail();
|
||||||
|
|
||||||
|
|
||||||
if ($invitation->contact->trashed()) {
|
if ($invitation->contact->trashed()) {
|
||||||
$invitation->contact->restore();
|
$invitation->contact->restore();
|
||||||
}
|
}
|
||||||
@ -294,7 +295,10 @@ class InvitationController extends Controller
|
|||||||
'payable_invoices' => [
|
'payable_invoices' => [
|
||||||
['invoice_id' => $invitation->invoice->hashed_id, 'amount' => $amount],
|
['invoice_id' => $invitation->invoice->hashed_id, 'amount' => $amount],
|
||||||
],
|
],
|
||||||
'signature' => false
|
'signature' => false,
|
||||||
|
'contact_first_name' => $invitation->contact->first_name ?? '',
|
||||||
|
'contact_last_name' => $invitation->contact->last_name ?? '',
|
||||||
|
'contact_email' => $invitation->contact->email ?? ''
|
||||||
];
|
];
|
||||||
|
|
||||||
$request->replace($data);
|
$request->replace($data);
|
||||||
|
@ -25,6 +25,10 @@ class SubscriptionPurchaseController extends Controller
|
|||||||
{
|
{
|
||||||
App::setLocale($subscription->company->locale());
|
App::setLocale($subscription->company->locale());
|
||||||
|
|
||||||
|
if ($subscription->trashed()) {
|
||||||
|
return $this->render('generic.not_available', ['account' => $subscription->company->account, 'company' => $subscription->company]);
|
||||||
|
}
|
||||||
|
|
||||||
/* Make sure the contact is logged into the correct company for this subscription */
|
/* Make sure the contact is logged into the correct company for this subscription */
|
||||||
if (auth()->guard('contact')->user() && auth()->guard('contact')->user()->company_id != $subscription->company_id) {
|
if (auth()->guard('contact')->user() && auth()->guard('contact')->user()->company_id != $subscription->company_id) {
|
||||||
auth()->guard('contact')->logout();
|
auth()->guard('contact')->logout();
|
||||||
|
@ -158,7 +158,6 @@ class LicenseController extends BaseController
|
|||||||
|
|
||||||
/* Catch claim license requests */
|
/* Catch claim license requests */
|
||||||
if (config('ninja.environment') == 'selfhost') {
|
if (config('ninja.environment') == 'selfhost') {
|
||||||
// $response = Http::get( "http://ninja.test:8000/claim_license", [
|
|
||||||
$response = Http::get("https://invoicing.co/claim_license", [
|
$response = Http::get("https://invoicing.co/claim_license", [
|
||||||
'license_key' => $license_key,
|
'license_key' => $license_key,
|
||||||
'product_id' => 3,
|
'product_id' => 3,
|
||||||
|
@ -21,7 +21,7 @@ class ProtectedDownloadController extends BaseController
|
|||||||
public function index(Request $request, string $hash)
|
public function index(Request $request, string $hash)
|
||||||
{
|
{
|
||||||
/** @var string $hashed_path */
|
/** @var string $hashed_path */
|
||||||
$hashed_path = Cache::pull($hash);
|
$hashed_path = Cache::get($hash);
|
||||||
|
|
||||||
if (!$hashed_path) {
|
if (!$hashed_path) {
|
||||||
throw new SystemError('File no longer available', 404);
|
throw new SystemError('File no longer available', 404);
|
||||||
|
@ -30,16 +30,24 @@ class SmtpController extends BaseController
|
|||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
$company = $user->company();
|
$company = $user->company();
|
||||||
|
|
||||||
|
$smtp_host = $request->input('smtp_host', $company->smtp_host);
|
||||||
|
$smtp_port = $request->input('smtp_port', $company->smtp_port);
|
||||||
|
$smtp_username = $request->input('smtp_username', $company->smtp_username);
|
||||||
|
$smtp_password = $request->input('smtp_password', $company->smtp_password);
|
||||||
|
$smtp_encryption = $request->input('smtp_encryption', $company->smtp_encryption ?? 'tls');
|
||||||
|
$smtp_local_domain = $request->input('smtp_local_domain', strlen($company->smtp_local_domain) > 2 ? $company->smtp_local_domain : null);
|
||||||
|
$smtp_verify_peer = $request->input('verify_peer', $company->smtp_verify_peer ?? true);
|
||||||
|
|
||||||
config([
|
config([
|
||||||
'mail.mailers.smtp' => [
|
'mail.mailers.smtp' => [
|
||||||
'transport' => 'smtp',
|
'transport' => 'smtp',
|
||||||
'host' => $request->input('smtp_host', $company->smtp_host),
|
'host' => $smtp_host,
|
||||||
'port' => $request->input('smtp_port', $company->smtp_port),
|
'port' => $smtp_port,
|
||||||
'username' => $request->input('smtp_username', $company->smtp_username),
|
'username' => $smtp_username,
|
||||||
'password' => $request->input('smtp_password', $company->smtp_password),
|
'password' => $smtp_password,
|
||||||
'encryption' => $request->input('smtp_encryption', $company->smtp_encryption ?? 'tls'),
|
'encryption' => $smtp_encryption,
|
||||||
'local_domain' => $request->input('smtp_local_domain', strlen($company->smtp_local_domain) > 2 ? $company->smtp_local_domain : null),
|
'local_domain' => $smtp_local_domain,
|
||||||
'verify_peer' => $request->input('verify_peer', $company->smtp_verify_peer ?? true),
|
'verify_peer' => $smtp_verify_peer,
|
||||||
'timeout' => 5,
|
'timeout' => 5,
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
@ -47,7 +55,7 @@ class SmtpController extends BaseController
|
|||||||
(new \Illuminate\Mail\MailServiceProvider(app()))->register();
|
(new \Illuminate\Mail\MailServiceProvider(app()))->register();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Mail::to($user->email, $user->present()->name())->send(new TestMailServer('Email Server Works!', strlen($company->settings->custom_sending_email) > 1 ? $company->settings->custom_sending_email : $user->email));
|
Mail::mailer('smtp')->to($user->email, $user->present()->name())->send(new TestMailServer('Email Server Works!', strlen($company->settings->custom_sending_email) > 1 ? $company->settings->custom_sending_email : $user->email));
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
app('mail.manager')->forgetMailers();
|
app('mail.manager')->forgetMailers();
|
||||||
return response()->json(['message' => $e->getMessage()], 400);
|
return response()->json(['message' => $e->getMessage()], 400);
|
||||||
|
@ -65,6 +65,8 @@ class StripeConnectController extends BaseController
|
|||||||
return view('auth.connect.access_denied');
|
return view('auth.connect.access_denied');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$response = false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
/** @class \stdClass $response
|
/** @class \stdClass $response
|
||||||
* @property string $scope
|
* @property string $scope
|
||||||
@ -88,6 +90,11 @@ class StripeConnectController extends BaseController
|
|||||||
nlog($response);
|
nlog($response);
|
||||||
|
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$response) {
|
||||||
return view('auth.connect.access_denied');
|
return view('auth.connect.access_denied');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,11 +151,14 @@ class StripeConnectController extends BaseController
|
|||||||
if(isset($request->getTokenContent()['is_react']) && $request->getTokenContent()['is_react']) {
|
if(isset($request->getTokenContent()['is_react']) && $request->getTokenContent()['is_react']) {
|
||||||
$redirect_uri = config('ninja.react_url').'/#/settings/online_payments';
|
$redirect_uri = config('ninja.react_url').'/#/settings/online_payments';
|
||||||
} else {
|
} else {
|
||||||
$redirect_uri = config('ninja.app_url').'/stripe/completed';
|
$redirect_uri = config('ninja.app_url');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
\Illuminate\Support\Facades\Cache::pull($request->token);
|
||||||
|
|
||||||
//response here
|
//response here
|
||||||
return view('auth.connect.completed', ['url' => $redirect_uri]);
|
return view('auth.connect.completed', ['url' => $redirect_uri]);
|
||||||
|
// return redirect($redirect_uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -135,7 +135,7 @@ class Kernel extends HttpKernel
|
|||||||
'can' => Authorize::class,
|
'can' => Authorize::class,
|
||||||
'cors' => Cors::class,
|
'cors' => Cors::class,
|
||||||
'guest' => RedirectIfAuthenticated::class,
|
'guest' => RedirectIfAuthenticated::class,
|
||||||
'signed' => ValidateSignature::class,
|
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
|
||||||
'verified' => EnsureEmailIsVerified::class,
|
'verified' => EnsureEmailIsVerified::class,
|
||||||
'query_logging' => QueryLogging::class,
|
'query_logging' => QueryLogging::class,
|
||||||
'token_auth' => TokenAuth::class,
|
'token_auth' => TokenAuth::class,
|
||||||
|
@ -59,20 +59,6 @@ class StoreClientRequest extends Request
|
|||||||
$rules['file'] = $this->file_validation;
|
$rules['file'] = $this->file_validation;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($this->number)) {
|
|
||||||
$rules['number'] = Rule::unique('clients')->where('company_id', $user->company()->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
$rules['country_id'] = 'integer|nullable';
|
|
||||||
|
|
||||||
if (isset($this->currency_code)) {
|
|
||||||
$rules['currency_code'] = 'sometimes|exists:currencies,code';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($this->country_code)) {
|
|
||||||
$rules['country_code'] = new CountryCodeExistsRule();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ensure we have a client name, and that all emails are unique*/
|
/* Ensure we have a client name, and that all emails are unique*/
|
||||||
//$rules['name'] = 'required|min:1';
|
//$rules['name'] = 'required|min:1';
|
||||||
$rules['settings'] = new ValidClientGroupSettingsRule();
|
$rules['settings'] = new ValidClientGroupSettingsRule();
|
||||||
@ -97,6 +83,9 @@ class StoreClientRequest extends Request
|
|||||||
$rules['number'] = ['bail', 'nullable', Rule::unique('clients')->where('company_id', $user->company()->id)];
|
$rules['number'] = ['bail', 'nullable', Rule::unique('clients')->where('company_id', $user->company()->id)];
|
||||||
$rules['id_number'] = ['bail', 'nullable', Rule::unique('clients')->where('company_id', $user->company()->id)];
|
$rules['id_number'] = ['bail', 'nullable', Rule::unique('clients')->where('company_id', $user->company()->id)];
|
||||||
$rules['classification'] = 'bail|sometimes|nullable|in:individual,business,company,partnership,trust,charity,government,other';
|
$rules['classification'] = 'bail|sometimes|nullable|in:individual,business,company,partnership,trust,charity,government,other';
|
||||||
|
$rules['shipping_country_id'] = 'integer|nullable|exists:countries,id';
|
||||||
|
$rules['number'] = ['sometimes', 'nullable', 'bail', Rule::unique('clients')->where('company_id', $user->company()->id)];
|
||||||
|
$rules['country_id'] = 'integer|nullable|exists:countries,id';
|
||||||
|
|
||||||
return $rules;
|
return $rules;
|
||||||
}
|
}
|
||||||
@ -139,12 +128,16 @@ class StoreClientRequest extends Request
|
|||||||
if (! array_key_exists('currency_id', $input['settings']) && isset($input['group_settings_id'])) {
|
if (! array_key_exists('currency_id', $input['settings']) && isset($input['group_settings_id'])) {
|
||||||
$group_settings = GroupSetting::find($input['group_settings_id']);
|
$group_settings = GroupSetting::find($input['group_settings_id']);
|
||||||
|
|
||||||
if ($group_settings && property_exists($group_settings->settings, 'currency_id') && isset($group_settings->settings->currency_id)) {
|
if ($group_settings && property_exists($group_settings->settings, 'currency_id') && is_numeric($group_settings->settings->currency_id)) {
|
||||||
$input['settings']['currency_id'] = (string) $group_settings->settings->currency_id;
|
$input['settings']['currency_id'] = (string) $group_settings->settings->currency_id;
|
||||||
} else {
|
} else {
|
||||||
$input['settings']['currency_id'] = (string) $user->company()->settings->currency_id;
|
$input['settings']['currency_id'] = (string) $user->company()->settings->currency_id;
|
||||||
}
|
}
|
||||||
} elseif (! array_key_exists('currency_id', $input['settings'])) {
|
}
|
||||||
|
elseif (! array_key_exists('currency_id', $input['settings'])) {
|
||||||
|
$input['settings']['currency_id'] = (string) $user->company()->settings->currency_id;
|
||||||
|
}
|
||||||
|
elseif (empty($input['settings']['currency_id']) ?? true) {
|
||||||
$input['settings']['currency_id'] = (string) $user->company()->settings->currency_id;
|
$input['settings']['currency_id'] = (string) $user->company()->settings->currency_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,10 +153,13 @@ class StoreClientRequest extends Request
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// allow setting country_id by iso code
|
||||||
if (isset($input['country_code'])) {
|
if (isset($input['country_code'])) {
|
||||||
$input['country_id'] = $this->getCountryCode($input['country_code']);
|
$input['country_id'] = $this->getCountryCode($input['country_code']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// allow setting country_id by iso code
|
||||||
if (isset($input['shipping_country_code'])) {
|
if (isset($input['shipping_country_code'])) {
|
||||||
$input['shipping_country_id'] = $this->getCountryCode($input['shipping_country_code']);
|
$input['shipping_country_id'] = $this->getCountryCode($input['shipping_country_code']);
|
||||||
}
|
}
|
||||||
@ -173,10 +169,14 @@ class StoreClientRequest extends Request
|
|||||||
unset($input['number']);
|
unset($input['number']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// prevent xss injection
|
||||||
if (array_key_exists('name', $input)) {
|
if (array_key_exists('name', $input)) {
|
||||||
$input['name'] = strip_tags($input['name']);
|
$input['name'] = strip_tags($input['name']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//If you want to validate, the prop must be set.
|
||||||
|
$input['id'] = null;
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,17 +60,11 @@ class UpdateClientRequest extends Request
|
|||||||
$rules['company_logo'] = 'mimes:jpeg,jpg,png,gif|max:10000';
|
$rules['company_logo'] = 'mimes:jpeg,jpg,png,gif|max:10000';
|
||||||
$rules['industry_id'] = 'integer|nullable';
|
$rules['industry_id'] = 'integer|nullable';
|
||||||
$rules['size_id'] = 'integer|nullable';
|
$rules['size_id'] = 'integer|nullable';
|
||||||
$rules['country_id'] = 'integer|nullable';
|
$rules['country_id'] = 'integer|nullable|exists:countries,id';
|
||||||
$rules['shipping_country_id'] = 'integer|nullable';
|
$rules['shipping_country_id'] = 'integer|nullable|exists:countries,id';
|
||||||
$rules['classification'] = 'bail|sometimes|nullable|in:individual,business,company,partnership,trust,charity,government,other';
|
$rules['classification'] = 'bail|sometimes|nullable|in:individual,business,company,partnership,trust,charity,government,other';
|
||||||
|
$rules['id_number'] = ['sometimes', 'bail', 'nullable', Rule::unique('clients')->where('company_id', $user->company()->id)->ignore($this->client->id)];
|
||||||
if ($this->id_number) {
|
$rules['number'] = ['sometimes', 'bail', Rule::unique('clients')->where('company_id', $user->company()->id)->ignore($this->client->id)];
|
||||||
$rules['id_number'] = Rule::unique('clients')->where('company_id', $user->company()->id)->ignore($this->client->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->number) {
|
|
||||||
$rules['number'] = Rule::unique('clients')->where('company_id', $user->company()->id)->ignore($this->client->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
$rules['settings'] = new ValidClientGroupSettingsRule();
|
$rules['settings'] = new ValidClientGroupSettingsRule();
|
||||||
$rules['contacts'] = 'array';
|
$rules['contacts'] = 'array';
|
||||||
@ -112,6 +106,9 @@ class UpdateClientRequest extends Request
|
|||||||
if (array_key_exists('settings', $input) && ! array_key_exists('currency_id', $input['settings'])) {
|
if (array_key_exists('settings', $input) && ! array_key_exists('currency_id', $input['settings'])) {
|
||||||
$input['settings']['currency_id'] = (string) $user->company()->settings->currency_id;
|
$input['settings']['currency_id'] = (string) $user->company()->settings->currency_id;
|
||||||
}
|
}
|
||||||
|
elseif (empty($input['settings']['currency_id']) ?? true) {
|
||||||
|
$input['settings']['currency_id'] = (string) $user->company()->settings->currency_id;
|
||||||
|
}
|
||||||
|
|
||||||
if (isset($input['language_code'])) {
|
if (isset($input['language_code'])) {
|
||||||
$input['settings']['language_id'] = $this->getLanguageId($input['language_code']);
|
$input['settings']['language_id'] = $this->getLanguageId($input['language_code']);
|
||||||
@ -127,9 +124,35 @@ class UpdateClientRequest extends Request
|
|||||||
$input['name'] = strip_tags($input['name']);
|
$input['name'] = strip_tags($input['name']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// allow setting country_id by iso code
|
||||||
|
if (isset($input['country_code'])) {
|
||||||
|
$input['country_id'] = $this->getCountryCode($input['country_code']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// allow setting country_id by iso code
|
||||||
|
if (isset($input['shipping_country_code'])) {
|
||||||
|
$input['shipping_country_id'] = $this->getCountryCode($input['shipping_country_code']);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getCountryCode($country_code)
|
||||||
|
{
|
||||||
|
$countries = Cache::get('countries');
|
||||||
|
|
||||||
|
$country = $countries->filter(function ($item) use ($country_code) {
|
||||||
|
return $item->iso_3166_2 == $country_code || $item->iso_3166_3 == $country_code;
|
||||||
|
})->first();
|
||||||
|
|
||||||
|
if ($country) {
|
||||||
|
return (string) $country->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
private function getLanguageId($language_code)
|
private function getLanguageId($language_code)
|
||||||
{
|
{
|
||||||
$languages = Cache::get('languages');
|
$languages = Cache::get('languages');
|
||||||
|
@ -77,6 +77,7 @@ class StoreInvoiceRequest extends Request
|
|||||||
$rules['exchange_rate'] = 'bail|sometimes|numeric';
|
$rules['exchange_rate'] = 'bail|sometimes|numeric';
|
||||||
$rules['partial'] = 'bail|sometimes|nullable|numeric|gte:0';
|
$rules['partial'] = 'bail|sometimes|nullable|numeric|gte:0';
|
||||||
$rules['partial_due_date'] = ['bail', 'sometimes', 'exclude_if:partial,0', Rule::requiredIf(fn () => $this->partial > 0), 'date'];
|
$rules['partial_due_date'] = ['bail', 'sometimes', 'exclude_if:partial,0', Rule::requiredIf(fn () => $this->partial > 0), 'date'];
|
||||||
|
$rules['due_date'] = ['bail', 'sometimes', 'nullable', 'after:partial_due_date', Rule::requiredIf(fn () => strlen($this->partial_due_date) > 1), 'date'];
|
||||||
|
|
||||||
|
|
||||||
return $rules;
|
return $rules;
|
||||||
@ -112,6 +113,12 @@ class StoreInvoiceRequest extends Request
|
|||||||
$input['exchange_rate'] = 1;
|
$input['exchange_rate'] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//handles edge case where we need for force set the due date of the invoice.
|
||||||
|
if((isset($input['partial_due_date']) && strlen($input['partial_due_date']) > 1) && (!array_key_exists('due_date', $input) || (empty($input['due_date']) && empty($this->invoice->due_date)))) {
|
||||||
|
$client = \App\Models\Client::withTrashed()->find($input['client_id']);
|
||||||
|
$input['due_date'] = \Illuminate\Support\Carbon::parse($input['date'])->addDays($client->getSetting('payment_terms'))->format('Y-m-d');
|
||||||
|
}
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,6 +78,7 @@ class UpdateInvoiceRequest extends Request
|
|||||||
$rules['exchange_rate'] = 'bail|sometimes|numeric';
|
$rules['exchange_rate'] = 'bail|sometimes|numeric';
|
||||||
$rules['partial'] = 'bail|sometimes|nullable|numeric';
|
$rules['partial'] = 'bail|sometimes|nullable|numeric';
|
||||||
$rules['partial_due_date'] = ['bail', 'sometimes', 'exclude_if:partial,0', Rule::requiredIf(fn () => $this->partial > 0), 'date', 'before:due_date'];
|
$rules['partial_due_date'] = ['bail', 'sometimes', 'exclude_if:partial,0', Rule::requiredIf(fn () => $this->partial > 0), 'date', 'before:due_date'];
|
||||||
|
$rules['due_date'] = ['bail', 'sometimes', 'nullable', 'after:partial_due_date', Rule::requiredIf(fn () => strlen($this->partial_due_date) > 1), 'date'];
|
||||||
|
|
||||||
|
|
||||||
return $rules;
|
return $rules;
|
||||||
@ -107,6 +108,12 @@ class UpdateInvoiceRequest extends Request
|
|||||||
$input['exchange_rate'] = 1;
|
$input['exchange_rate'] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//handles edge case where we need for force set the due date of the invoice.
|
||||||
|
if((isset($input['partial_due_date']) && strlen($input['partial_due_date']) > 1) && (!array_key_exists('due_date', $input) || (empty($input['due_date']) && empty($this->invoice->due_date)))) {
|
||||||
|
$client = \App\Models\Client::withTrashed()->find($input['client_id']);
|
||||||
|
$input['due_date'] = \Illuminate\Support\Carbon::parse($input['date'])->addDays($client->getSetting('payment_terms'))->format('Y-m-d');
|
||||||
|
}
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ class StoreProjectRequest extends Request
|
|||||||
|
|
||||||
$rules['name'] = 'required';
|
$rules['name'] = 'required';
|
||||||
$rules['client_id'] = 'required|exists:clients,id,company_id,'.$user->company()->id;
|
$rules['client_id'] = 'required|exists:clients,id,company_id,'.$user->company()->id;
|
||||||
|
$rules['budgeted_hours'] = 'sometimes|numeric';
|
||||||
|
|
||||||
if (isset($this->number)) {
|
if (isset($this->number)) {
|
||||||
$rules['number'] = Rule::unique('projects')->where('company_id', $user->company()->id);
|
$rules['number'] = Rule::unique('projects')->where('company_id', $user->company()->id);
|
||||||
@ -74,6 +75,9 @@ class StoreProjectRequest extends Request
|
|||||||
$input['color'] = '';
|
$input['color'] = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(array_key_exists('budgeted_hours', $input) && empty($input['budgeted_hours']))
|
||||||
|
$input['budgeted_hours'] = 0;
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +45,8 @@ class UpdateProjectRequest extends Request
|
|||||||
$rules['number'] = Rule::unique('projects')->where('company_id', $user->company()->id)->ignore($this->project->id);
|
$rules['number'] = Rule::unique('projects')->where('company_id', $user->company()->id)->ignore($this->project->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$rules['budgeted_hours'] = 'sometimes|numeric';
|
||||||
|
|
||||||
if ($this->file('documents') && is_array($this->file('documents'))) {
|
if ($this->file('documents') && is_array($this->file('documents'))) {
|
||||||
$rules['documents.*'] = $this->file_validation;
|
$rules['documents.*'] = $this->file_validation;
|
||||||
} elseif ($this->file('documents')) {
|
} elseif ($this->file('documents')) {
|
||||||
@ -74,6 +76,10 @@ class UpdateProjectRequest extends Request
|
|||||||
$input['color'] = '';
|
$input['color'] = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(array_key_exists('budgeted_hours', $input) && empty($input['budgeted_hours'])) {
|
||||||
|
$input['budgeted_hours'] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,8 @@ class GenericReportRequest extends Request
|
|||||||
'start_date' => 'bail|required_if:date_range,custom|nullable|date',
|
'start_date' => 'bail|required_if:date_range,custom|nullable|date',
|
||||||
'report_keys' => 'present|array',
|
'report_keys' => 'present|array',
|
||||||
'send_email' => 'required|bool',
|
'send_email' => 'required|bool',
|
||||||
'document_email_attachment' => 'sometimes|bool'
|
'document_email_attachment' => 'sometimes|bool',
|
||||||
|
'include_deleted' => 'required|bool',
|
||||||
// 'status' => 'sometimes|string|nullable|in:all,draft,sent,viewed,paid,unpaid,overdue',
|
// 'status' => 'sometimes|string|nullable|in:all,draft,sent,viewed,paid,unpaid,overdue',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@ -63,6 +64,8 @@ class GenericReportRequest extends Request
|
|||||||
$input['end_date'] = null;
|
$input['end_date'] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$input['include_deleted'] = array_key_exists('include_deleted', $input) ? filter_var($input['include_deleted'], FILTER_VALIDATE_BOOLEAN) : false;
|
||||||
|
|
||||||
$input['user_id'] = auth()->user()->id;
|
$input['user_id'] = auth()->user()->id;
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
|
@ -36,18 +36,46 @@ class CheckSmtpRequest extends Request
|
|||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
'smtp_host' => 'sometimes|nullable|string|min:3',
|
||||||
|
'smtp_port' => 'sometimes|nullable|integer',
|
||||||
|
'smtp_username' => 'sometimes|nullable|string|min:3',
|
||||||
|
'smtp_password' => 'sometimes|nullable|string|min:3',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function prepareForValidation()
|
public function prepareForValidation()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/** @var \App\Models\User $user */
|
||||||
|
$user = auth()->user();
|
||||||
|
$company = $user->company();
|
||||||
|
|
||||||
$input = $this->input();
|
$input = $this->input();
|
||||||
|
|
||||||
if(isset($input['smtp_username']) && $input['smtp_username'] == '********')
|
if(isset($input['smtp_username']) && $input['smtp_username'] == '********'){
|
||||||
unset($input['smtp_username']);
|
// unset($input['smtp_username']);
|
||||||
|
$input['smtp_username'] = $company->smtp_username;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset($input['smtp_password'])&& $input['smtp_password'] == '********'){
|
||||||
|
// unset($input['smtp_password']);
|
||||||
|
$input['smtp_password'] = $company->smtp_password;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset($input['smtp_host']) && strlen($input['smtp_host']) >=3){
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$input['smtp_host'] = $company->smtp_host;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(isset($input['smtp_port']) && strlen($input['smtp_port']) >= 3) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$input['smtp_port'] = $company->smtp_port;
|
||||||
|
}
|
||||||
|
|
||||||
if(isset($input['smtp_password'])&& $input['smtp_password'] == '********')
|
|
||||||
unset($input['smtp_password']);
|
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
}
|
}
|
||||||
|
@ -13,11 +13,30 @@ namespace App\Http\Requests\TaskScheduler;
|
|||||||
|
|
||||||
use App\Http\Requests\Request;
|
use App\Http\Requests\Request;
|
||||||
use App\Http\ValidationRules\Scheduler\ValidClientIds;
|
use App\Http\ValidationRules\Scheduler\ValidClientIds;
|
||||||
use App\Utils\Traits\MakesHash;
|
|
||||||
|
|
||||||
class StoreSchedulerRequest extends Request
|
class StoreSchedulerRequest extends Request
|
||||||
{
|
{
|
||||||
use MakesHash;
|
public array $client_statuses = [
|
||||||
|
'all',
|
||||||
|
'draft',
|
||||||
|
'paid',
|
||||||
|
'unpaid',
|
||||||
|
'overdue',
|
||||||
|
'pending',
|
||||||
|
'invoiced',
|
||||||
|
'logged',
|
||||||
|
'partial',
|
||||||
|
'applied',
|
||||||
|
'active',
|
||||||
|
'paused',
|
||||||
|
'completed',
|
||||||
|
'approved',
|
||||||
|
'expired',
|
||||||
|
'upcoming',
|
||||||
|
'converted',
|
||||||
|
'uninvoiced',
|
||||||
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine if the user is authorized to make this request.
|
* Determine if the user is authorized to make this request.
|
||||||
*
|
*
|
||||||
@ -47,7 +66,7 @@ class StoreSchedulerRequest extends Request
|
|||||||
'parameters.end_date' => ['bail', 'sometimes', 'date:Y-m-d', 'required_if:parameters.date_rate,custom', 'after_or_equal:parameters.start_date'],
|
'parameters.end_date' => ['bail', 'sometimes', 'date:Y-m-d', 'required_if:parameters.date_rate,custom', 'after_or_equal:parameters.start_date'],
|
||||||
'parameters.entity' => ['bail', 'sometimes', 'string', 'in:invoice,credit,quote,purchase_order'],
|
'parameters.entity' => ['bail', 'sometimes', 'string', 'in:invoice,credit,quote,purchase_order'],
|
||||||
'parameters.entity_id' => ['bail', 'sometimes', 'string'],
|
'parameters.entity_id' => ['bail', 'sometimes', 'string'],
|
||||||
'parameters.report_name' => ['bail','sometimes', 'string', 'required_if:template,email_report','in:vendor,purchase_order_item,purchase_order,ar_detailed,ar_summary,client_balance,tax_summary,profitloss,client_sales,user_sales,product_sales,activity,client,contact,client_contact,credit,document,expense,invoice,invoice_item,quote,quote_item,recurring_invoice,payment,product,task'],
|
'parameters.report_name' => ['bail','sometimes', 'string', 'required_if:template,email_report','in:vendor,purchase_order_item,purchase_order,ar_detailed,ar_summary,client_balance,tax_summary,profitloss,client_sales,user_sales,product_sales,activity,activities,client,clients,client_contact,client_contacts,credit,credits,document,documents,expense,expenses,invoice,invoices,invoice_item,invoice_items,quote,quotes,quote_item,quote_items,recurring_invoice,recurring_invoices,payment,payments,product,products,task,tasks'],
|
||||||
'parameters.date_key' => ['bail','sometimes', 'string'],
|
'parameters.date_key' => ['bail','sometimes', 'string'],
|
||||||
'parameters.status' => ['bail','sometimes', 'nullable', 'string'],
|
'parameters.status' => ['bail','sometimes', 'nullable', 'string'],
|
||||||
];
|
];
|
||||||
@ -73,10 +92,18 @@ class StoreSchedulerRequest extends Request
|
|||||||
|
|
||||||
if(isset($input['parameters']['status'])) {
|
if(isset($input['parameters']['status'])) {
|
||||||
|
|
||||||
|
$task_statuses = [];
|
||||||
|
|
||||||
|
if(isset($input['parameters']['report_name']) && $input['parameters']['report_name'] == 'task') {
|
||||||
|
$task_statuses = array_diff(explode(",", $input['parameters']['status']), $this->client_statuses);
|
||||||
|
}
|
||||||
|
|
||||||
$input['parameters']['status'] = collect(explode(",", $input['parameters']['status']))
|
$input['parameters']['status'] = collect(explode(",", $input['parameters']['status']))
|
||||||
->filter(function ($status) {
|
->filter(function ($status) {
|
||||||
return in_array($status, ['all','draft','paid','unpaid','overdue']);
|
return in_array($status, $this->client_statuses);
|
||||||
})->implode(",") ?? '';
|
})->merge($task_statuses)
|
||||||
|
->implode(",") ?? '';
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
|
@ -16,6 +16,27 @@ use App\Http\ValidationRules\Scheduler\ValidClientIds;
|
|||||||
|
|
||||||
class UpdateSchedulerRequest extends Request
|
class UpdateSchedulerRequest extends Request
|
||||||
{
|
{
|
||||||
|
public array $client_statuses = [
|
||||||
|
'all',
|
||||||
|
'draft',
|
||||||
|
'paid',
|
||||||
|
'unpaid',
|
||||||
|
'overdue',
|
||||||
|
'pending',
|
||||||
|
'invoiced',
|
||||||
|
'logged',
|
||||||
|
'partial',
|
||||||
|
'applied',
|
||||||
|
'active',
|
||||||
|
'paused',
|
||||||
|
'completed',
|
||||||
|
'approved',
|
||||||
|
'expired',
|
||||||
|
'upcoming',
|
||||||
|
'converted',
|
||||||
|
'uninvoiced',
|
||||||
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine if the user is authorized to make this request.
|
* Determine if the user is authorized to make this request.
|
||||||
*
|
*
|
||||||
@ -45,9 +66,9 @@ class UpdateSchedulerRequest extends Request
|
|||||||
'parameters.end_date' => ['bail', 'sometimes', 'date:Y-m-d', 'required_if:parameters.date_rate,custom', 'after_or_equal:parameters.start_date'],
|
'parameters.end_date' => ['bail', 'sometimes', 'date:Y-m-d', 'required_if:parameters.date_rate,custom', 'after_or_equal:parameters.start_date'],
|
||||||
'parameters.entity' => ['bail', 'sometimes', 'string', 'in:invoice,credit,quote,purchase_order'],
|
'parameters.entity' => ['bail', 'sometimes', 'string', 'in:invoice,credit,quote,purchase_order'],
|
||||||
'parameters.entity_id' => ['bail', 'sometimes', 'string'],
|
'parameters.entity_id' => ['bail', 'sometimes', 'string'],
|
||||||
'parameters.report_name' => ['bail','sometimes', 'string', 'required_if:template,email_report','in:vendor,purchase_order_item,purchase_order,ar_detailed,ar_summary,client_balance,tax_summary,profitloss,client_sales,user_sales,product_sales,activity,client,contact,client_contact,credit,document,expense,invoice,invoice_item,quote,quote_item,recurring_invoice,payment,product,task'],
|
'parameters.report_name' => ['bail','sometimes', 'string', 'required_if:template,email_report','in:vendor,purchase_order_item,purchase_order,ar_detailed,ar_summary,client_balance,tax_summary,profitloss,client_sales,user_sales,product_sales,activity,activities,client,clients,client_contact,client_contacts,credit,credits,document,documents,expense,expenses,invoice,invoices,invoice_item,invoice_items,quote,quotes,quote_item,quote_items,recurring_invoice,recurring_invoices,payment,payments,product,products,task,tasks'],
|
||||||
'parameters.date_key' => ['bail','sometimes', 'string'],
|
'parameters.date_key' => ['bail','sometimes', 'string'],
|
||||||
'parameters.status' => ['bail','sometimes', 'string'],
|
'parameters.status' => ['bail','sometimes', 'nullable', 'string'],
|
||||||
];
|
];
|
||||||
|
|
||||||
return $rules;
|
return $rules;
|
||||||
@ -71,10 +92,18 @@ class UpdateSchedulerRequest extends Request
|
|||||||
|
|
||||||
if(isset($input['parameters']['status'])) {
|
if(isset($input['parameters']['status'])) {
|
||||||
|
|
||||||
|
|
||||||
|
$task_statuses = [];
|
||||||
|
|
||||||
|
if(isset($input['parameters']['report_name']) && $input['parameters']['report_name'] == 'task') {
|
||||||
|
$task_statuses = array_diff(explode(",", $input['parameters']['status']), $this->client_statuses);
|
||||||
|
}
|
||||||
|
|
||||||
$input['parameters']['status'] = collect(explode(",", $input['parameters']['status']))
|
$input['parameters']['status'] = collect(explode(",", $input['parameters']['status']))
|
||||||
->filter(function ($status) {
|
->filter(function ($status) {
|
||||||
return in_array($status, ['all','draft','paid','unpaid','overdue']);
|
return in_array($status, $this->client_statuses);
|
||||||
})->implode(",") ?? '';
|
})->merge($task_statuses)
|
||||||
|
->implode(",") ?? '';
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
|
@ -95,6 +95,8 @@ class StoreUserRequest extends Request
|
|||||||
$input['last_name'] = strip_tags($input['last_name']);
|
$input['last_name'] = strip_tags($input['last_name']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$input['id'] = null;
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,10 @@ class StoreWebhookRequest extends Request
|
|||||||
*/
|
*/
|
||||||
public function authorize(): bool
|
public function authorize(): bool
|
||||||
{
|
{
|
||||||
return auth()->user()->isAdmin() && auth()->user()->account->hasFeature(Account::FEATURE_API);
|
/** @var \App\Models\User $user */
|
||||||
|
$user = auth()->user();
|
||||||
|
|
||||||
|
return $user->isAdmin() && $user->account->hasFeature(Account::FEATURE_API);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function rules()
|
public function rules()
|
||||||
@ -31,7 +34,6 @@ class StoreWebhookRequest extends Request
|
|||||||
return [
|
return [
|
||||||
'target_url' => 'bail|required|url',
|
'target_url' => 'bail|required|url',
|
||||||
'event_id' => 'bail|required',
|
'event_id' => 'bail|required',
|
||||||
// 'headers' => 'bail|sometimes|json',
|
|
||||||
'rest_method' => 'required|in:post,put'
|
'rest_method' => 'required|in:post,put'
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@ -43,8 +45,6 @@ class StoreWebhookRequest extends Request
|
|||||||
if (!isset($input['rest_method'])) {
|
if (!isset($input['rest_method'])) {
|
||||||
$input['rest_method'] = 'post';
|
$input['rest_method'] = 'post';
|
||||||
}
|
}
|
||||||
// if(isset($input['headers']) && count($input['headers']) == 0)
|
|
||||||
// $input['headers'] = null;
|
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
}
|
}
|
||||||
|
@ -98,19 +98,19 @@ class InvoiceTransformer extends BaseTransformer
|
|||||||
$invoice_data,
|
$invoice_data,
|
||||||
'invoice.partial_due_date'
|
'invoice.partial_due_date'
|
||||||
),
|
),
|
||||||
'custom_surcharge1' => $this->getString(
|
'custom_surcharge1' => $this->getFloat(
|
||||||
$invoice_data,
|
$invoice_data,
|
||||||
'invoice.custom_surcharge1'
|
'invoice.custom_surcharge1'
|
||||||
),
|
),
|
||||||
'custom_surcharge2' => $this->getString(
|
'custom_surcharge2' => $this->getFloat(
|
||||||
$invoice_data,
|
$invoice_data,
|
||||||
'invoice.custom_surcharge2'
|
'invoice.custom_surcharge2'
|
||||||
),
|
),
|
||||||
'custom_surcharge3' => $this->getString(
|
'custom_surcharge3' => $this->getFloat(
|
||||||
$invoice_data,
|
$invoice_data,
|
||||||
'invoice.custom_surcharge3'
|
'invoice.custom_surcharge3'
|
||||||
),
|
),
|
||||||
'custom_surcharge4' => $this->getString(
|
'custom_surcharge4' => $this->getFloat(
|
||||||
$invoice_data,
|
$invoice_data,
|
||||||
'invoice.custom_surcharge4'
|
'invoice.custom_surcharge4'
|
||||||
),
|
),
|
||||||
|
@ -114,23 +114,26 @@ class ProcessBankTransactionsNordigen implements ShouldQueue
|
|||||||
|
|
||||||
private function updateAccount()
|
private function updateAccount()
|
||||||
{
|
{
|
||||||
if (!$this->nordigen->isAccountActive($this->bank_integration->nordigen_account_id)) {
|
$is_account_active = $this->nordigen->isAccountActive($this->bank_integration->nordigen_account_id);
|
||||||
|
$account = $this->nordigen->getAccount($this->bank_integration->nordigen_account_id);
|
||||||
|
|
||||||
|
if (!$is_account_active || !$account) {
|
||||||
$this->bank_integration->disabled_upstream = true;
|
$this->bank_integration->disabled_upstream = true;
|
||||||
$this->bank_integration->save();
|
$this->bank_integration->save();
|
||||||
$this->stop_loop = false;
|
$this->stop_loop = false;
|
||||||
|
|
||||||
nlog("Nordigen: account inactive: " . $this->bank_integration->nordigen_account_id);
|
nlog("Nordigen: account inactive: " . $this->bank_integration->nordigen_account_id);
|
||||||
// @turbo124 @todo send email for expired account
|
|
||||||
|
|
||||||
$this->nordigen->disabledAccountEmail($this->bank_integration);
|
$this->nordigen->disabledAccountEmail($this->bank_integration);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->nordigen_account = $this->nordigen->getAccount($this->bank_integration->nordigen_account_id);
|
$this->nordigen_account = $account;
|
||||||
|
|
||||||
$this->bank_integration->disabled_upstream = false;
|
$this->bank_integration->disabled_upstream = false;
|
||||||
$this->bank_integration->bank_account_status = $this->nordigen_account['account_status'];
|
$this->bank_integration->bank_account_status = $account['account_status'];
|
||||||
$this->bank_integration->balance = $this->nordigen_account['current_balance'];
|
$this->bank_integration->balance = $account['current_balance'];
|
||||||
|
|
||||||
$this->bank_integration->save();
|
$this->bank_integration->save();
|
||||||
}
|
}
|
||||||
|
@ -311,7 +311,10 @@ class CompanyImport implements ShouldQueue
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(file_exists($tmp_file))
|
||||||
unlink($tmp_file);
|
unlink($tmp_file);
|
||||||
|
|
||||||
|
if(Storage::exists($this->file_location))
|
||||||
unlink(Storage::path($this->file_location));
|
unlink(Storage::path($this->file_location));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +145,8 @@ class NinjaMailerJob implements ShouldQueue
|
|||||||
->send($mailable);
|
->send($mailable);
|
||||||
|
|
||||||
/* Count the amount of emails sent across all the users accounts */
|
/* Count the amount of emails sent across all the users accounts */
|
||||||
Cache::increment("email_quota".$this->company->account->key);
|
|
||||||
|
$this->incrementEmailCounter();
|
||||||
|
|
||||||
LightLogs::create(new EmailSuccess($this->nmo->company->company_key, $this->nmo->mailable->subject))
|
LightLogs::create(new EmailSuccess($this->nmo->company->company_key, $this->nmo->mailable->subject))
|
||||||
->send();
|
->send();
|
||||||
@ -221,6 +222,12 @@ class NinjaMailerJob implements ShouldQueue
|
|||||||
$this->cleanUpMailers();
|
$this->cleanUpMailers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function incrementEmailCounter(): void
|
||||||
|
{
|
||||||
|
if(in_array($this->mailer, ['default','mailgun']))
|
||||||
|
Cache::increment("email_quota".$this->company->account->key);
|
||||||
|
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Entity notification when an email fails to send
|
* Entity notification when an email fails to send
|
||||||
*
|
*
|
||||||
@ -279,13 +286,21 @@ class NinjaMailerJob implements ShouldQueue
|
|||||||
$this->mailer = 'postmark';
|
$this->mailer = 'postmark';
|
||||||
$this->client_postmark_secret = config('services.postmark-outlook.token');
|
$this->client_postmark_secret = config('services.postmark-outlook.token');
|
||||||
|
|
||||||
|
if (property_exists($this->nmo->settings, 'email_from_name') && strlen($this->nmo->settings->email_from_name) > 1) {
|
||||||
|
$email_from_name = $this->nmo->settings->email_from_name;
|
||||||
|
} else {
|
||||||
|
$email_from_name = $this->company->present()->name();
|
||||||
|
}
|
||||||
|
|
||||||
$this->nmo
|
$this->nmo
|
||||||
->mailable
|
->mailable
|
||||||
->from('maildelivery@invoice.services', 'Invoice Ninja');
|
->from(config('services.postmark-outlook.from.address'), $email_from_name);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
} catch(\Exception $e) {
|
} catch(\Exception $e) {
|
||||||
|
|
||||||
|
nlog("problem switching outlook driver - hosted");
|
||||||
nlog($e->getMessage());
|
nlog($e->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -316,7 +331,10 @@ class NinjaMailerJob implements ShouldQueue
|
|||||||
$this->mailer = 'mailgun';
|
$this->mailer = 'mailgun';
|
||||||
$this->setMailgunMailer();
|
$this->setMailgunMailer();
|
||||||
return $this;
|
return $this;
|
||||||
|
case 'smtp':
|
||||||
|
$this->mailer = 'smtp';
|
||||||
|
$this->configureSmtpMailer();
|
||||||
|
return $this;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -328,6 +346,48 @@ class NinjaMailerJob implements ShouldQueue
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function configureSmtpMailer(): void
|
||||||
|
{
|
||||||
|
|
||||||
|
$company = $this->company;
|
||||||
|
|
||||||
|
$smtp_host = $company->smtp_host;
|
||||||
|
$smtp_port = $company->smtp_port;
|
||||||
|
$smtp_username = $company->smtp_username;
|
||||||
|
$smtp_password = $company->smtp_password;
|
||||||
|
$smtp_encryption = $company->smtp_encryption ?? 'tls';
|
||||||
|
$smtp_local_domain = strlen($company->smtp_local_domain) > 2 ? $company->smtp_local_domain : null;
|
||||||
|
$smtp_verify_peer = $company->smtp_verify_peer ?? true;
|
||||||
|
|
||||||
|
config([
|
||||||
|
'mail.mailers.smtp' => [
|
||||||
|
'transport' => 'smtp',
|
||||||
|
'host' => $smtp_host,
|
||||||
|
'port' => $smtp_port,
|
||||||
|
'username' => $smtp_username,
|
||||||
|
'password' => $smtp_password,
|
||||||
|
'encryption' => $smtp_encryption,
|
||||||
|
'local_domain' => $smtp_local_domain,
|
||||||
|
'verify_peer' => $smtp_verify_peer,
|
||||||
|
'timeout' => 30,
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (property_exists($this->nmo->settings, 'email_from_name') && strlen($this->nmo->settings->email_from_name) > 1) {
|
||||||
|
$email_from_name = $this->nmo->settings->email_from_name;
|
||||||
|
} else {
|
||||||
|
$email_from_name = $this->company->present()->name();
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = $this->resolveSendingUser();
|
||||||
|
$sending_email = (isset($this->nmo->settings->custom_sending_email) && stripos($this->nmo->settings->custom_sending_email, "@")) ? $this->nmo->settings->custom_sending_email : $user->email;
|
||||||
|
|
||||||
|
$this->nmo
|
||||||
|
->mailable
|
||||||
|
->from($sending_email, $email_from_name);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows configuration of multiple mailers
|
* Allows configuration of multiple mailers
|
||||||
* per company for use by self hosted users
|
* per company for use by self hosted users
|
||||||
|
@ -60,6 +60,7 @@ class TaskScheduler implements ShouldQueue
|
|||||||
nlog("Doing job {$scheduler->name}");
|
nlog("Doing job {$scheduler->name}");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
//@var \App\Models\Schedule $scheduler
|
||||||
$scheduler->service()->runTask();
|
$scheduler->service()->runTask();
|
||||||
} catch(\Exception $e) {
|
} catch(\Exception $e) {
|
||||||
nlog($e->getMessage());
|
nlog($e->getMessage());
|
||||||
|
@ -26,7 +26,6 @@ use App\Utils\Traits\MakesReminders;
|
|||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
use Illuminate\Queue\SerializesModels;
|
use Illuminate\Queue\SerializesModels;
|
||||||
use Illuminate\Queue\InteractsWithQueue;
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
use Spatie\OpenTelemetry\Jobs\TraceAware;
|
|
||||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
use Illuminate\Foundation\Bus\Dispatchable;
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ class WebhookSingle implements ShouldQueue
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
(new SystemLogger(
|
(new SystemLogger(
|
||||||
array_merge((array) $response, $data),
|
['message' => $response->getHeaders(), 'body' => $data],
|
||||||
SystemLog::CATEGORY_WEBHOOK,
|
SystemLog::CATEGORY_WEBHOOK,
|
||||||
SystemLog::EVENT_WEBHOOK_SUCCESS,
|
SystemLog::EVENT_WEBHOOK_SUCCESS,
|
||||||
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
||||||
@ -136,7 +136,7 @@ class WebhookSingle implements ShouldQueue
|
|||||||
nlog($e->getMessage());
|
nlog($e->getMessage());
|
||||||
|
|
||||||
(new SystemLogger(
|
(new SystemLogger(
|
||||||
['message' => "Error connecting to ". $subscription->target_url],
|
['message' => "Error connecting to ". $subscription->target_url, 'body' => $data],
|
||||||
SystemLog::CATEGORY_WEBHOOK,
|
SystemLog::CATEGORY_WEBHOOK,
|
||||||
SystemLog::EVENT_WEBHOOK_FAILURE,
|
SystemLog::EVENT_WEBHOOK_FAILURE,
|
||||||
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
||||||
@ -152,7 +152,7 @@ class WebhookSingle implements ShouldQueue
|
|||||||
$message = "There was a problem when connecting to {$subscription->target_url} => status code ". $e->getResponse()->getStatusCode(). " This webhook call will be suspended until further action is taken.";
|
$message = "There was a problem when connecting to {$subscription->target_url} => status code ". $e->getResponse()->getStatusCode(). " This webhook call will be suspended until further action is taken.";
|
||||||
|
|
||||||
(new SystemLogger(
|
(new SystemLogger(
|
||||||
['message' => $message],
|
['message' => $message, 'body' => $data],
|
||||||
SystemLog::CATEGORY_WEBHOOK,
|
SystemLog::CATEGORY_WEBHOOK,
|
||||||
SystemLog::EVENT_WEBHOOK_FAILURE,
|
SystemLog::EVENT_WEBHOOK_FAILURE,
|
||||||
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
||||||
@ -170,7 +170,7 @@ class WebhookSingle implements ShouldQueue
|
|||||||
nlog($message);
|
nlog($message);
|
||||||
|
|
||||||
(new SystemLogger(
|
(new SystemLogger(
|
||||||
['message' => $message],
|
['message' => $message, 'body' => $data],
|
||||||
SystemLog::CATEGORY_WEBHOOK,
|
SystemLog::CATEGORY_WEBHOOK,
|
||||||
SystemLog::EVENT_WEBHOOK_FAILURE,
|
SystemLog::EVENT_WEBHOOK_FAILURE,
|
||||||
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
||||||
@ -192,7 +192,7 @@ class WebhookSingle implements ShouldQueue
|
|||||||
$message = "There was a problem when connecting to {$subscription->target_url} => status code ". $e->getResponse()->getStatusCode(). " no retry attempted.";
|
$message = "There was a problem when connecting to {$subscription->target_url} => status code ". $e->getResponse()->getStatusCode(). " no retry attempted.";
|
||||||
|
|
||||||
(new SystemLogger(
|
(new SystemLogger(
|
||||||
['message' => $message],
|
['message' => $message, 'body' => $data],
|
||||||
SystemLog::CATEGORY_WEBHOOK,
|
SystemLog::CATEGORY_WEBHOOK,
|
||||||
SystemLog::EVENT_WEBHOOK_FAILURE,
|
SystemLog::EVENT_WEBHOOK_FAILURE,
|
||||||
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
||||||
@ -208,7 +208,7 @@ class WebhookSingle implements ShouldQueue
|
|||||||
$error = json_decode($e->getResponse()->getBody()->getContents());
|
$error = json_decode($e->getResponse()->getBody()->getContents());
|
||||||
|
|
||||||
(new SystemLogger(
|
(new SystemLogger(
|
||||||
['message' => $error],
|
['message' => $error, 'body' => $data],
|
||||||
SystemLog::CATEGORY_WEBHOOK,
|
SystemLog::CATEGORY_WEBHOOK,
|
||||||
SystemLog::EVENT_WEBHOOK_FAILURE,
|
SystemLog::EVENT_WEBHOOK_FAILURE,
|
||||||
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
||||||
@ -220,7 +220,7 @@ class WebhookSingle implements ShouldQueue
|
|||||||
$error = json_decode($e->getResponse()->getBody()->getContents());
|
$error = json_decode($e->getResponse()->getBody()->getContents());
|
||||||
|
|
||||||
(new SystemLogger(
|
(new SystemLogger(
|
||||||
['message' => $error],
|
['message' => $error, 'body' => $data],
|
||||||
SystemLog::CATEGORY_WEBHOOK,
|
SystemLog::CATEGORY_WEBHOOK,
|
||||||
SystemLog::EVENT_WEBHOOK_FAILURE,
|
SystemLog::EVENT_WEBHOOK_FAILURE,
|
||||||
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
||||||
@ -232,7 +232,7 @@ class WebhookSingle implements ShouldQueue
|
|||||||
nlog($e->getCode());
|
nlog($e->getCode());
|
||||||
|
|
||||||
(new SystemLogger(
|
(new SystemLogger(
|
||||||
$e->getMessage(),
|
['message' => $e->getMessage(), 'body' => $data],
|
||||||
SystemLog::CATEGORY_WEBHOOK,
|
SystemLog::CATEGORY_WEBHOOK,
|
||||||
SystemLog::EVENT_WEBHOOK_FAILURE,
|
SystemLog::EVENT_WEBHOOK_FAILURE,
|
||||||
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
SystemLog::TYPE_WEBHOOK_RESPONSE,
|
||||||
|
@ -149,6 +149,7 @@ class PdfSlot extends Component
|
|||||||
return render('components.livewire.pdf-slot', [
|
return render('components.livewire.pdf-slot', [
|
||||||
'invitation' => $this->invitation,
|
'invitation' => $this->invitation,
|
||||||
'entity' => $this->entity,
|
'entity' => $this->entity,
|
||||||
|
'settings' => $this->settings,
|
||||||
'data' => $this->invitation->company->settings,
|
'data' => $this->invitation->company->settings,
|
||||||
'entity_type' => $this->entity_type,
|
'entity_type' => $this->entity_type,
|
||||||
'products' => $this->getProducts(),
|
'products' => $this->getProducts(),
|
||||||
|
@ -12,15 +12,17 @@
|
|||||||
|
|
||||||
namespace App\Livewire;
|
namespace App\Livewire;
|
||||||
|
|
||||||
|
use App\Models\Client;
|
||||||
|
use App\Models\Invoice;
|
||||||
|
use Livewire\Component;
|
||||||
use App\Libraries\MultiDB;
|
use App\Libraries\MultiDB;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
use App\Models\ClientContact;
|
use App\Models\ClientContact;
|
||||||
use App\Models\CompanyGateway;
|
use App\Models\CompanyGateway;
|
||||||
use App\Models\Invoice;
|
|
||||||
use App\Utils\Traits\MakesHash;
|
use App\Utils\Traits\MakesHash;
|
||||||
|
use Livewire\Attributes\Computed;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
use Illuminate\Support\Facades\Validator;
|
use Illuminate\Support\Facades\Validator;
|
||||||
use Illuminate\Support\Str;
|
|
||||||
use Livewire\Component;
|
|
||||||
|
|
||||||
class RequiredClientInfo extends Component
|
class RequiredClientInfo extends Component
|
||||||
{
|
{
|
||||||
@ -31,10 +33,7 @@ class RequiredClientInfo extends Component
|
|||||||
*/
|
*/
|
||||||
public $show_terms = false;
|
public $show_terms = false;
|
||||||
|
|
||||||
/**
|
public $invoice_terms;
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
public $invoice;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var bool
|
* @var bool
|
||||||
@ -49,18 +48,40 @@ class RequiredClientInfo extends Component
|
|||||||
/**
|
/**
|
||||||
* @var ClientContact
|
* @var ClientContact
|
||||||
*/
|
*/
|
||||||
public $contact;
|
public $contact_id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \App\Models\Client
|
* @var \App\Models\Client
|
||||||
*/
|
*/
|
||||||
public $client;
|
public $client_id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
public $countries;
|
public $countries;
|
||||||
|
|
||||||
|
|
||||||
|
public $client_name;
|
||||||
|
public $contact_first_name;
|
||||||
|
public $contact_last_name;
|
||||||
|
public $contact_email;
|
||||||
|
public $client_phone;
|
||||||
|
public $client_address_line_1;
|
||||||
|
public $client_city;
|
||||||
|
public $client_state;
|
||||||
|
public $client_country_id;
|
||||||
|
public $client_postal_code;
|
||||||
|
public $client_shipping_address_line_1;
|
||||||
|
public $client_shipping_city;
|
||||||
|
public $client_shipping_state;
|
||||||
|
public $client_shipping_postal_code;
|
||||||
|
public $client_shipping_country_id;
|
||||||
|
public $client_custom_value1;
|
||||||
|
public $client_custom_value2;
|
||||||
|
public $client_custom_value3;
|
||||||
|
public $client_custom_value4;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mappings for updating the database. Left side is mapping from gateway,
|
* Mappings for updating the database. Left side is mapping from gateway,
|
||||||
* right side is column in database.
|
* right side is column in database.
|
||||||
@ -113,50 +134,96 @@ class RequiredClientInfo extends Component
|
|||||||
];
|
];
|
||||||
|
|
||||||
protected $rules = [
|
protected $rules = [
|
||||||
'client.address1' => '',
|
// 'client.address1' => '',
|
||||||
'client.address2' => '',
|
// 'client.address2' => '',
|
||||||
'client.city' => '',
|
// 'client.city' => '',
|
||||||
'client.state' => '',
|
// 'client.state' => '',
|
||||||
'client.postal_code' => '',
|
// 'client.postal_code' => '',
|
||||||
'client.country_id' => '',
|
// 'client.country_id' => '',
|
||||||
'client.shipping_address1' => '',
|
// 'client.shipping_address1' => '',
|
||||||
'client.shipping_address2' => '',
|
// 'client.shipping_address2' => '',
|
||||||
'client.shipping_city' => '',
|
// 'client.shipping_city' => '',
|
||||||
'client.shipping_state' => '',
|
// 'client.shipping_state' => '',
|
||||||
'client.shipping_postal_code' => '',
|
// 'client.shipping_postal_code' => '',
|
||||||
'client.shipping_country_id' => '',
|
// 'client.shipping_country_id' => '',
|
||||||
'contact.first_name' => '',
|
// 'contact.first_name' => '',
|
||||||
'contact.last_name' => '',
|
// 'contact.last_name' => '',
|
||||||
'contact.email' => '',
|
// 'contact.email' => '',
|
||||||
'client.name' => '',
|
// 'client.name' => '',
|
||||||
'client.website' => '',
|
// 'client.website' => '',
|
||||||
'client.phone' => '',
|
// 'client.phone' => '',
|
||||||
'client.custom_value1' => '',
|
// 'client.custom_value1' => '',
|
||||||
'client.custom_value2' => '',
|
// 'client.custom_value2' => '',
|
||||||
'client.custom_value3' => '',
|
// 'client.custom_value3' => '',
|
||||||
'client.custom_value4' => '',
|
// 'client.custom_value4' => '',
|
||||||
|
'client_name' => '',
|
||||||
|
'client_website' => '',
|
||||||
|
'client_phone' => '',
|
||||||
|
'client_address_line_1' => '',
|
||||||
|
'client_address_line_2' => '',
|
||||||
|
'client_city' => '',
|
||||||
|
'client_state' => '',
|
||||||
|
'client_postal_code' => '',
|
||||||
|
'client_country_id' => '',
|
||||||
|
'client_shipping_address_line_1' => '',
|
||||||
|
'client_shipping_address_line_2' => '',
|
||||||
|
'client_shipping_city' => '',
|
||||||
|
'client_shipping_state' => '',
|
||||||
|
'client_shipping_postal_code' => '',
|
||||||
|
'client_shipping_country_id' => '',
|
||||||
|
'client_custom_value1' => '',
|
||||||
|
'client_custom_value2' => '',
|
||||||
|
'client_custom_value3' => '',
|
||||||
|
'client_custom_value4' => '',
|
||||||
|
'contact_first_name' => '',
|
||||||
|
'contact_last_name' => '',
|
||||||
|
'contact_email' => '',
|
||||||
];
|
];
|
||||||
|
|
||||||
public $show_form = false;
|
public $show_form = false;
|
||||||
|
|
||||||
public $company;
|
public $company_id;
|
||||||
|
|
||||||
public $company_gateway_id;
|
public $company_gateway_id;
|
||||||
|
|
||||||
|
public $db;
|
||||||
|
|
||||||
public function mount()
|
public function mount()
|
||||||
{
|
{
|
||||||
MultiDB::setDb($this->company->db);
|
MultiDB::setDb($this->db);
|
||||||
|
$contact = ClientContact::withTrashed()->find($this->contact_id);
|
||||||
|
$company = $contact->company;
|
||||||
|
|
||||||
$this->client = $this->contact->client;
|
$this->client_name = $contact->client->name;
|
||||||
|
$this->contact_first_name = $contact->first_name;
|
||||||
|
$this->contact_last_name = $contact->last_name;
|
||||||
|
$this->contact_email = $contact->email;
|
||||||
|
$this->client_phone = $contact->client->phone;
|
||||||
|
$this->client_address_line_1 = $contact->client->address1;
|
||||||
|
$this->client_city = $contact->client->city ;
|
||||||
|
$this->client_state = $contact->client->state;
|
||||||
|
$this->client_country_id = $contact->client->country_id;
|
||||||
|
$this->client_postal_code = $contact->client->postal_code;
|
||||||
|
$this->client_shipping_address_line_1 = $contact->client->shipping_address1;
|
||||||
|
$this->client_shipping_city = $contact->client->shipping_city;
|
||||||
|
$this->client_shipping_state = $contact->client->shipping_state;
|
||||||
|
$this->client_shipping_postal_code = $contact->client->shipping_postal_code;
|
||||||
|
$this->client_shipping_country_id = $contact->client->shipping_country_id;
|
||||||
|
$this->client_custom_value1 = $contact->client->custom_value1;
|
||||||
|
$this->client_custom_value2 = $contact->client->custom_value2;
|
||||||
|
$this->client_custom_value3 = $contact->client->custom_value3;
|
||||||
|
$this->client_custom_value4 = $contact->client->custom_value4;
|
||||||
|
|
||||||
if ($this->company->settings->show_accept_invoice_terms && request()->query('hash')) {
|
// $this->client = $this->contact->client;
|
||||||
|
|
||||||
|
if ($company->settings->show_accept_invoice_terms && request()->query('hash')) {
|
||||||
$this->show_terms = true;
|
$this->show_terms = true;
|
||||||
$this->terms_accepted = false;
|
$this->terms_accepted = false;
|
||||||
$this->show_form = true;
|
$this->show_form = true;
|
||||||
|
|
||||||
$hash = Cache::get(request()->input('hash'));
|
$hash = Cache::get(request()->input('hash'));
|
||||||
|
|
||||||
$this->invoice = Invoice::find($this->decodePrimaryKey($hash['invoice_id']));
|
$this->invoice_terms = Invoice::find($this->decodePrimaryKey($hash['invoice_id']))->terms;
|
||||||
}
|
}
|
||||||
|
|
||||||
count($this->fields) > 0 || $this->show_terms
|
count($this->fields) > 0 || $this->show_terms
|
||||||
@ -164,6 +231,24 @@ class RequiredClientInfo extends Component
|
|||||||
: $this->show_form = false;
|
: $this->show_form = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[Computed]
|
||||||
|
public function contact()
|
||||||
|
{
|
||||||
|
|
||||||
|
MultiDB::setDb($this->db);
|
||||||
|
return ClientContact::withTrashed()->find($this->contact_id);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#[Computed]
|
||||||
|
public function client()
|
||||||
|
{
|
||||||
|
|
||||||
|
MultiDB::setDb($this->db);
|
||||||
|
return ClientContact::withTrashed()->find($this->contact_id)->client;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public function toggleTermsAccepted()
|
public function toggleTermsAccepted()
|
||||||
{
|
{
|
||||||
$this->terms_accepted = !$this->terms_accepted;
|
$this->terms_accepted = !$this->terms_accepted;
|
||||||
@ -171,6 +256,10 @@ class RequiredClientInfo extends Component
|
|||||||
|
|
||||||
public function handleSubmit(array $data): bool
|
public function handleSubmit(array $data): bool
|
||||||
{
|
{
|
||||||
|
|
||||||
|
MultiDB::setDb($this->db);
|
||||||
|
$contact = ClientContact::withTrashed()->find($this->contact_id);
|
||||||
|
|
||||||
$rules = [];
|
$rules = [];
|
||||||
|
|
||||||
collect($this->fields)->map(function ($field) use (&$rules) {
|
collect($this->fields)->map(function ($field) use (&$rules) {
|
||||||
@ -192,7 +281,7 @@ class RequiredClientInfo extends Component
|
|||||||
if ($this->updateClientDetails($data)) {
|
if ($this->updateClientDetails($data)) {
|
||||||
$this->dispatch(
|
$this->dispatch(
|
||||||
'passed-required-fields-check',
|
'passed-required-fields-check',
|
||||||
client_postal_code: $this->contact->client->postal_code
|
client_postal_code: $contact->client->postal_code
|
||||||
);
|
);
|
||||||
|
|
||||||
//if stripe is enabled, we want to update the customer at this point.
|
//if stripe is enabled, we want to update the customer at this point.
|
||||||
@ -209,6 +298,11 @@ class RequiredClientInfo extends Component
|
|||||||
$client = [];
|
$client = [];
|
||||||
$contact = [];
|
$contact = [];
|
||||||
|
|
||||||
|
|
||||||
|
MultiDB::setDb($this->db);
|
||||||
|
$_contact = ClientContact::withTrashed()->find($this->contact_id);
|
||||||
|
|
||||||
|
|
||||||
foreach ($data as $field => $value) {
|
foreach ($data as $field => $value) {
|
||||||
if (Str::startsWith($field, 'client_')) {
|
if (Str::startsWith($field, 'client_')) {
|
||||||
$client[$this->mappings[$field]] = $value;
|
$client[$this->mappings[$field]] = $value;
|
||||||
@ -219,20 +313,43 @@ class RequiredClientInfo extends Component
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$contact_update = $this->contact
|
|
||||||
|
$_contact->first_name = $this->contact_first_name;
|
||||||
|
$_contact->last_name = $this->contact_last_name;
|
||||||
|
$_contact->client->name = $this->client_name;
|
||||||
|
$_contact->email = $this->contact_email;
|
||||||
|
$_contact->client->phone = $this->client_phone;
|
||||||
|
$_contact->client->address1 = $this->client_address_line_1;
|
||||||
|
$_contact->client->city = $this->client_city;
|
||||||
|
$_contact->client->state = $this->client_state;
|
||||||
|
$_contact->client->country_id = $this->client_country_id;
|
||||||
|
$_contact->client->postal_code = $this->client_postal_code;
|
||||||
|
$_contact->client->shipping_address1 = $this->client_shipping_address_line_1;
|
||||||
|
$_contact->client->shipping_city = $this->client_shipping_city;
|
||||||
|
$_contact->client->shipping_state = $this->client_shipping_state;
|
||||||
|
$_contact->client->shipping_postal_code = $this->client_shipping_postal_code;
|
||||||
|
$_contact->client->shipping_country_id = $this->client_shipping_country_id;
|
||||||
|
$_contact->client->custom_value1 = $this->client_custom_value1;
|
||||||
|
$_contact->client->custom_value2 = $this->client_custom_value2;
|
||||||
|
$_contact->client->custom_value3 = $this->client_custom_value3;
|
||||||
|
$_contact->client->custom_value4 = $this->client_custom_value4;
|
||||||
|
$_contact->push();
|
||||||
|
|
||||||
|
|
||||||
|
$contact_update = $_contact
|
||||||
->fill($contact)
|
->fill($contact)
|
||||||
->push();
|
->push();
|
||||||
|
|
||||||
$client_update = $this->contact->client
|
$client_update = $_contact->client
|
||||||
->fill($client)
|
->fill($client)
|
||||||
->push();
|
->push();
|
||||||
|
|
||||||
if ($contact_update && $client_update) {
|
if ($_contact) {
|
||||||
/** @var \App\Models\CompanyGateway $cg */
|
/** @var \App\Models\CompanyGateway $cg */
|
||||||
$cg = CompanyGateway::find($this->company_gateway_id);
|
$cg = CompanyGateway::find($this->company_gateway_id);
|
||||||
|
|
||||||
if ($cg && $cg->update_details) {
|
if ($cg && $cg->update_details) {
|
||||||
$payment_gateway = $cg->driver($this->client)->init();
|
$payment_gateway = $cg->driver($_contact->client)->init();
|
||||||
|
|
||||||
if (method_exists($payment_gateway, "updateCustomer")) {
|
if (method_exists($payment_gateway, "updateCustomer")) {
|
||||||
$payment_gateway->updateCustomer();
|
$payment_gateway->updateCustomer();
|
||||||
@ -247,11 +364,15 @@ class RequiredClientInfo extends Component
|
|||||||
|
|
||||||
public function checkFields()
|
public function checkFields()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
MultiDB::setDb($this->db);
|
||||||
|
$_contact = ClientContact::withTrashed()->find($this->contact_id);
|
||||||
|
|
||||||
foreach ($this->fields as $index => $field) {
|
foreach ($this->fields as $index => $field) {
|
||||||
$_field = $this->mappings[$field['name']];
|
$_field = $this->mappings[$field['name']];
|
||||||
|
|
||||||
if (Str::startsWith($field['name'], 'client_')) {
|
if (Str::startsWith($field['name'], 'client_')) {
|
||||||
if (empty($this->contact->client->{$_field}) || is_null($this->contact->client->{$_field}) || in_array($_field, $this->client_address_array)) {
|
if (empty($_contact->client->{$_field}) || is_null($_contact->client->{$_field}) || in_array($_field, $this->client_address_array)) {
|
||||||
$this->show_form = true;
|
$this->show_form = true;
|
||||||
} else {
|
} else {
|
||||||
$this->fields[$index]['filled'] = true;
|
$this->fields[$index]['filled'] = true;
|
||||||
@ -259,7 +380,7 @@ class RequiredClientInfo extends Component
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Str::startsWith($field['name'], 'contact_')) {
|
if (Str::startsWith($field['name'], 'contact_')) {
|
||||||
if (empty($this->contact->{$_field}) || is_null($this->contact->{$_field}) || str_contains($this->contact->{$_field}, '@example.com')) {
|
if (empty($_contact->{$_field}) || is_null($_contact->{$_field}) || str_contains($_contact->{$_field}, '@example.com')) {
|
||||||
$this->show_form = true;
|
$this->show_form = true;
|
||||||
} else {
|
} else {
|
||||||
$this->fields[$index]['filled'] = true;
|
$this->fields[$index]['filled'] = true;
|
||||||
@ -289,14 +410,18 @@ class RequiredClientInfo extends Component
|
|||||||
|
|
||||||
public function handleCopyBilling(): void
|
public function handleCopyBilling(): void
|
||||||
{
|
{
|
||||||
|
|
||||||
|
MultiDB::setDb($this->db);
|
||||||
|
$_contact = ClientContact::withTrashed()->find($this->contact_id);
|
||||||
|
|
||||||
$this->dispatch(
|
$this->dispatch(
|
||||||
'update-shipping-data',
|
'update-shipping-data',
|
||||||
client_shipping_address_line_1: $this->contact->client->address1,
|
client_shipping_address_line_1: $_contact->client->address1,
|
||||||
client_shipping_address_line_2: $this->contact->client->address2,
|
client_shipping_address_line_2: $_contact->client->address2,
|
||||||
client_shipping_city: $this->contact->client->city,
|
client_shipping_city: $_contact->client->city,
|
||||||
client_shipping_state: $this->contact->client->state,
|
client_shipping_state: $_contact->client->state,
|
||||||
client_shipping_postal_code: $this->contact->client->postal_code,
|
client_shipping_postal_code: $_contact->client->postal_code,
|
||||||
client_shipping_country_id: $this->contact->client->country_id,
|
client_shipping_country_id: $_contact->client->country_id,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ class ClientStatement extends Mailable
|
|||||||
public function content()
|
public function content()
|
||||||
{
|
{
|
||||||
return new Content(
|
return new Content(
|
||||||
view: $this->data['company']->account->isPremium() ? 'email.template.client_premium' : 'email.template.client',
|
view: 'email.template.client',
|
||||||
text: 'email.template.text',
|
text: 'email.template.text',
|
||||||
with: [
|
with: [
|
||||||
'text_body' => $this->data['body'],
|
'text_body' => $this->data['body'],
|
||||||
|
@ -75,7 +75,8 @@ class TemplateEmail extends Mailable
|
|||||||
$template_name = 'email.template.'.$this->build_email->getTemplate();
|
$template_name = 'email.template.'.$this->build_email->getTemplate();
|
||||||
|
|
||||||
if ($this->build_email->getTemplate() == 'light' || $this->build_email->getTemplate() == 'dark') {
|
if ($this->build_email->getTemplate() == 'light' || $this->build_email->getTemplate() == 'dark') {
|
||||||
$template_name = $this->company->account->isPremium() ? 'email.template.client_premium' : 'email.template.client';
|
// $template_name = $this->company->account->isPremium() ? 'email.template.client_premium' : 'email.template.client';
|
||||||
|
$template_name = 'email.template.client';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->build_email->getTemplate() == 'custom') {
|
if ($this->build_email->getTemplate() == 'custom') {
|
||||||
|
@ -72,7 +72,8 @@ class VendorTemplateEmail extends Mailable
|
|||||||
$template_name = 'email.template.'.$this->build_email->getTemplate();
|
$template_name = 'email.template.'.$this->build_email->getTemplate();
|
||||||
|
|
||||||
if ($this->build_email->getTemplate() == 'light' || $this->build_email->getTemplate() == 'dark') {
|
if ($this->build_email->getTemplate() == 'light' || $this->build_email->getTemplate() == 'dark') {
|
||||||
$template_name = $this->company->account->isPremium() ? 'email.template.client_premium' : 'email.template.client';
|
// $template_name = $this->company->account->isPremium() ? 'email.template.client_premium' : 'email.template.client';
|
||||||
|
$template_name = 'email.template.client';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->build_email->getTemplate() == 'custom') {
|
if ($this->build_email->getTemplate() == 'custom') {
|
||||||
|
@ -208,6 +208,29 @@ class Document extends BaseModel
|
|||||||
return ctrans('texts.document');
|
return ctrans('texts.document');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function link()
|
||||||
|
{
|
||||||
|
$entity_id = $this->encodePrimaryKey($this->documentable_id);
|
||||||
|
$link = '';
|
||||||
|
|
||||||
|
match($this->documentable_type) {
|
||||||
|
'App\Models\Vendor' => $link = "/vendors/{$entity_id}",
|
||||||
|
'App\Models\Project' => $link = "/projects/{$entity_id}",
|
||||||
|
'invoices' => $link = "/invoices/{$entity_id}/edit",
|
||||||
|
'App\Models\Quote' => $link = "/quotes/{$entity_id}/edit",
|
||||||
|
'App\Models\Credit' => $link = "/credits/{$entity_id}/edit",
|
||||||
|
'App\Models\Expense' => $link = "/expenses/{$entity_id}/edit",
|
||||||
|
'App\Models\Payment' => $link = "/payments/{$entity_id}/edit",
|
||||||
|
'App\Models\Task' => $link = "/tasks/{$entity_id}/edit",
|
||||||
|
'App\Models\Client' => $link = "/clients/{$entity_id}",
|
||||||
|
'App\Models\RecurringExpense' => $link = "/recurring_expenses/{$entity_id}/edit",
|
||||||
|
'App\Models\RecurringInvoice' => $link = "/recurring_invoices/{$entity_id}/edit",
|
||||||
|
default => $link = '',
|
||||||
|
};
|
||||||
|
|
||||||
|
return $link;
|
||||||
|
}
|
||||||
|
|
||||||
public function compress(): mixed
|
public function compress(): mixed
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -137,22 +137,22 @@ class Gateway extends StaticModel
|
|||||||
case 56:
|
case 56:
|
||||||
return [
|
return [
|
||||||
GatewayType::CREDIT_CARD => ['refund' => true, 'token_billing' => true, 'webhooks' => ['payment_intent.succeeded', 'payment_intent.payment_failed']],
|
GatewayType::CREDIT_CARD => ['refund' => true, 'token_billing' => true, 'webhooks' => ['payment_intent.succeeded', 'payment_intent.payment_failed']],
|
||||||
GatewayType::BANK_TRANSFER => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'customer.source.updated','payment_intent.processing', 'payment_intent.payment_failed']],
|
GatewayType::BANK_TRANSFER => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'customer.source.updated','payment_intent.processing', 'payment_intent.payment_failed', 'charge.failed']],
|
||||||
GatewayType::DIRECT_DEBIT => ['refund' => false, 'token_billing' => false, 'webhooks' => ['payment_intent.processing','payment_intent.succeeded','payment_intent.partially_funded', 'payment_intent.payment_failed']],
|
GatewayType::DIRECT_DEBIT => ['refund' => false, 'token_billing' => false, 'webhooks' => ['payment_intent.processing','payment_intent.succeeded','payment_intent.partially_funded', 'payment_intent.payment_failed']],
|
||||||
GatewayType::ALIPAY => ['refund' => false, 'token_billing' => false],
|
GatewayType::ALIPAY => ['refund' => false, 'token_billing' => false],
|
||||||
GatewayType::APPLE_PAY => ['refund' => false, 'token_billing' => false],
|
GatewayType::APPLE_PAY => ['refund' => false, 'token_billing' => false],
|
||||||
GatewayType::BACS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.processing', 'payment_intent.succeeded', 'mandate.updated', 'payment_intent.payment_failed']],
|
GatewayType::BACS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.processing', 'payment_intent.succeeded', 'mandate.updated', 'payment_intent.payment_failed']],
|
||||||
GatewayType::SOFORT => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
GatewayType::SOFORT => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
||||||
GatewayType::KLARNA => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
GatewayType::KLARNA => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
||||||
GatewayType::SEPA => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
GatewayType::SEPA => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
||||||
GatewayType::PRZELEWY24 => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
GatewayType::PRZELEWY24 => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
||||||
GatewayType::GIROPAY => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
GatewayType::GIROPAY => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
||||||
GatewayType::EPS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
GatewayType::EPS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
||||||
GatewayType::BANCONTACT => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
GatewayType::BANCONTACT => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
||||||
GatewayType::BECS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
GatewayType::BECS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
||||||
GatewayType::IDEAL => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
GatewayType::IDEAL => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
||||||
GatewayType::ACSS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
GatewayType::ACSS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']],
|
||||||
GatewayType::FPX => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded']],
|
GatewayType::FPX => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', ]],
|
||||||
];
|
];
|
||||||
case 39:
|
case 39:
|
||||||
return [GatewayType::CREDIT_CARD => ['refund' => true, 'token_billing' => true, 'webhooks' => [' ']]]; //Checkout
|
return [GatewayType::CREDIT_CARD => ['refund' => true, 'token_billing' => true, 'webhooks' => [' ']]]; //Checkout
|
||||||
|
@ -355,10 +355,12 @@ class RecurringInvoice extends BaseModel
|
|||||||
public function calculateStatus(bool $new_model = false) //15-02-2024 - $new_model needed
|
public function calculateStatus(bool $new_model = false) //15-02-2024 - $new_model needed
|
||||||
{
|
{
|
||||||
|
|
||||||
if($this->remaining_cycles == 0) {
|
if($this->remaining_cycles == 0)
|
||||||
return self::STATUS_COMPLETED;
|
return self::STATUS_COMPLETED;
|
||||||
} elseif ($new_model && $this->status_id == self::STATUS_ACTIVE && Carbon::parse($this->next_send_date)->isFuture())
|
elseif ($new_model && $this->status_id == self::STATUS_ACTIVE && Carbon::parse($this->next_send_date)->isFuture())
|
||||||
return self::STATUS_PENDING;
|
return self::STATUS_PENDING;
|
||||||
|
elseif($this->remaining_cycles != 0 && ($this->status_id == self::STATUS_COMPLETED))
|
||||||
|
return self::STATUS_ACTIVE;
|
||||||
|
|
||||||
return $this->status_id;
|
return $this->status_id;
|
||||||
|
|
||||||
|
@ -180,6 +180,7 @@ class Webhook extends BaseModel
|
|||||||
self::EVENT_DELETE_PURCHASE_ORDER,
|
self::EVENT_DELETE_PURCHASE_ORDER,
|
||||||
self::EVENT_RESTORE_PURCHASE_ORDER,
|
self::EVENT_RESTORE_PURCHASE_ORDER,
|
||||||
self::EVENT_ARCHIVE_PURCHASE_ORDER,
|
self::EVENT_ARCHIVE_PURCHASE_ORDER,
|
||||||
|
self::EVENT_CREATE_PRODUCT,
|
||||||
self::EVENT_UPDATE_PRODUCT,
|
self::EVENT_UPDATE_PRODUCT,
|
||||||
self::EVENT_DELETE_PRODUCT,
|
self::EVENT_DELETE_PRODUCT,
|
||||||
self::EVENT_RESTORE_PRODUCT,
|
self::EVENT_RESTORE_PRODUCT,
|
||||||
|
@ -271,7 +271,7 @@ class CreditCard implements MethodInterface
|
|||||||
$errors = $api_response->getErrors();
|
$errors = $api_response->getErrors();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (property_exists($customers, 'customers')) {
|
if ($customers && property_exists($customers, 'customers')) {
|
||||||
return $customers->customers[0]->id;
|
return $customers->customers[0]->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,6 +89,10 @@ class PaymentIntentWebhook implements ShouldQueue
|
|||||||
}
|
}
|
||||||
|
|
||||||
$company_gateway = CompanyGateway::query()->find($this->company_gateway_id);
|
$company_gateway = CompanyGateway::query()->find($this->company_gateway_id);
|
||||||
|
|
||||||
|
if(!$company_gateway)
|
||||||
|
return;
|
||||||
|
|
||||||
$stripe_driver = $company_gateway->driver()->init();
|
$stripe_driver = $company_gateway->driver()->init();
|
||||||
|
|
||||||
$charge_id = false;
|
$charge_id = false;
|
||||||
|
@ -44,7 +44,6 @@ class InstantPayment
|
|||||||
|
|
||||||
public function run()
|
public function run()
|
||||||
{
|
{
|
||||||
nlog($this->request->all());
|
|
||||||
|
|
||||||
$cc = auth()->guard('contact')->user();
|
$cc = auth()->guard('contact')->user();
|
||||||
|
|
||||||
|
@ -244,6 +244,12 @@ class Email implements ShouldQueue
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function incrementEmailCounter(): void
|
||||||
|
{
|
||||||
|
if(in_array($this->mailer, ['default','mailgun']))
|
||||||
|
Cache::increment("email_quota".$this->company->account->key);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to send the email
|
* Attempts to send the email
|
||||||
*
|
*
|
||||||
@ -270,7 +276,7 @@ class Email implements ShouldQueue
|
|||||||
|
|
||||||
$mailer->send($this->mailable);
|
$mailer->send($this->mailable);
|
||||||
|
|
||||||
Cache::increment("email_quota".$this->company->account->key);
|
$this->incrementEmailCounter();
|
||||||
|
|
||||||
LightLogs::create(new EmailSuccess($this->company->company_key, $this->mailable->subject))
|
LightLogs::create(new EmailSuccess($this->company->company_key, $this->mailable->subject))
|
||||||
->send();
|
->send();
|
||||||
@ -503,15 +509,22 @@ class Email implements ShouldQueue
|
|||||||
$server = $dns[0]["target"];
|
$server = $dns[0]["target"];
|
||||||
if(stripos($server, "outlook.com") !== false) {
|
if(stripos($server, "outlook.com") !== false) {
|
||||||
|
|
||||||
|
if (property_exists($this->email_object->settings, 'email_from_name') && strlen($this->email_object->settings->email_from_name) > 1) {
|
||||||
|
$email_from_name = $this->email_object->settings->email_from_name;
|
||||||
|
} else {
|
||||||
|
$email_from_name = $this->company->present()->name();
|
||||||
|
}
|
||||||
|
|
||||||
$this->mailer = 'postmark';
|
$this->mailer = 'postmark';
|
||||||
$this->client_postmark_secret = config('services.postmark-outlook.token');
|
$this->client_postmark_secret = config('services.postmark-outlook.token');
|
||||||
$this->mailable
|
$this->mailable
|
||||||
->from('maildelivery@invoice.services', 'Invoice Ninja');
|
->from(config('services.postmark-outlook.from.address'), $email_from_name);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
|
|
||||||
}
|
}
|
||||||
} catch(\Exception $e) {
|
} catch(\Exception $e) {
|
||||||
|
nlog("problem switching outlook driver - hosted");
|
||||||
nlog($e->getMessage());
|
nlog($e->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -542,7 +555,10 @@ class Email implements ShouldQueue
|
|||||||
$this->mailer = 'mailgun';
|
$this->mailer = 'mailgun';
|
||||||
$this->setMailgunMailer();
|
$this->setMailgunMailer();
|
||||||
return $this;
|
return $this;
|
||||||
|
case 'smtp':
|
||||||
|
$this->mailer = 'smtp';
|
||||||
|
$this->configureSmtpMailer();
|
||||||
|
return $this;
|
||||||
default:
|
default:
|
||||||
$this->mailer = config('mail.default');
|
$this->mailer = config('mail.default');
|
||||||
return $this;
|
return $this;
|
||||||
@ -555,6 +571,43 @@ class Email implements ShouldQueue
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function configureSmtpMailer(): void
|
||||||
|
{
|
||||||
|
|
||||||
|
$company = $this->company;
|
||||||
|
|
||||||
|
$smtp_host = $company->smtp_host;
|
||||||
|
$smtp_port = $company->smtp_port;
|
||||||
|
$smtp_username = $company->smtp_username;
|
||||||
|
$smtp_password = $company->smtp_password;
|
||||||
|
$smtp_encryption = $company->smtp_encryption ?? 'tls';
|
||||||
|
$smtp_local_domain = strlen($company->smtp_local_domain) > 2 ? $company->smtp_local_domain : null;
|
||||||
|
$smtp_verify_peer = $company->smtp_verify_peer ?? true;
|
||||||
|
|
||||||
|
config([
|
||||||
|
'mail.mailers.smtp' => [
|
||||||
|
'transport' => 'smtp',
|
||||||
|
'host' => $smtp_host,
|
||||||
|
'port' => $smtp_port,
|
||||||
|
'username' => $smtp_username,
|
||||||
|
'password' => $smtp_password,
|
||||||
|
'encryption' => $smtp_encryption,
|
||||||
|
'local_domain' => $smtp_local_domain,
|
||||||
|
'verify_peer' => $smtp_verify_peer,
|
||||||
|
'timeout' => 30,
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$user = $this->resolveSendingUser();
|
||||||
|
|
||||||
|
$sending_email = (isset($this->email_object->settings->custom_sending_email) && stripos($this->email_object->settings->custom_sending_email, "@")) ? $this->email_object->settings->custom_sending_email : $user->email;
|
||||||
|
$sending_user = (isset($this->email_object->settings->email_from_name) && strlen($this->email_object->settings->email_from_name) > 2) ? $this->email_object->settings->email_from_name : $user->name();
|
||||||
|
|
||||||
|
$this->mailable
|
||||||
|
->from($sending_email, $sending_user);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows configuration of multiple mailers
|
* Allows configuration of multiple mailers
|
||||||
* per company for use by self hosted users
|
* per company for use by self hosted users
|
||||||
|
@ -107,10 +107,10 @@ class EmailDefaults
|
|||||||
|
|
||||||
match ($this->email->email_object->settings->email_style) {
|
match ($this->email->email_object->settings->email_style) {
|
||||||
'plain' => $this->template = 'email.template.plain',
|
'plain' => $this->template = 'email.template.plain',
|
||||||
'light' => $this->template = $this->email->email_object->company->account->isPremium() ? 'email.template.client_premium' : 'email.template.client',
|
'light' => $this->template = 'email.template.client',
|
||||||
'dark' => $this->template = $this->email->email_object->company->account->isPremium() ? 'email.template.client_premium' :'email.template.client',
|
'dark' => $this->template = 'email.template.client',
|
||||||
'custom' => $this->template = 'email.template.custom',
|
'custom' => $this->template = 'email.template.custom',
|
||||||
default => $this->template = $this->email->email_object->company->account->isPremium() ? 'email.template.client_premium' :'email.template.client',
|
default => $this->template = 'email.template.client',
|
||||||
};
|
};
|
||||||
|
|
||||||
$this->email->email_object->html_template = $this->template;
|
$this->email->email_object->html_template = $this->template;
|
||||||
@ -123,7 +123,7 @@ class EmailDefaults
|
|||||||
*/
|
*/
|
||||||
private function setFrom(): self
|
private function setFrom(): self
|
||||||
{
|
{
|
||||||
if (Ninja::isHosted() && $this->email->email_object->settings->email_sending_method == 'default') {
|
if (Ninja::isHosted() && in_array($this->email->email_object->settings->email_sending_method,['default', 'mailgun'])) {
|
||||||
if ($this->email->company->account->isPaid() && property_exists($this->email->email_object->settings, 'email_from_name') && strlen($this->email->email_object->settings->email_from_name) > 1) {
|
if ($this->email->company->account->isPaid() && property_exists($this->email->email_object->settings, 'email_from_name') && strlen($this->email->email_object->settings->email_from_name) > 1) {
|
||||||
$email_from_name = $this->email->email_object->settings->email_from_name;
|
$email_from_name = $this->email->email_object->settings->email_from_name;
|
||||||
} else {
|
} else {
|
||||||
|
@ -11,34 +11,35 @@
|
|||||||
|
|
||||||
namespace App\Services\Scheduler;
|
namespace App\Services\Scheduler;
|
||||||
|
|
||||||
use App\Export\CSV\ClientExport;
|
|
||||||
use App\Export\CSV\ContactExport;
|
|
||||||
use App\Export\CSV\CreditExport;
|
|
||||||
use App\Export\CSV\DocumentExport;
|
|
||||||
use App\Export\CSV\ExpenseExport;
|
|
||||||
use App\Export\CSV\InvoiceExport;
|
|
||||||
use App\Export\CSV\InvoiceItemExport;
|
|
||||||
use App\Export\CSV\PaymentExport;
|
|
||||||
use App\Export\CSV\ProductExport;
|
|
||||||
use App\Export\CSV\ProductSalesExport;
|
|
||||||
use App\Export\CSV\QuoteExport;
|
|
||||||
use App\Export\CSV\QuoteItemExport;
|
|
||||||
use App\Export\CSV\RecurringInvoiceExport;
|
|
||||||
use App\Export\CSV\TaskExport;
|
|
||||||
use App\Jobs\Mail\NinjaMailerJob;
|
|
||||||
use App\Jobs\Mail\NinjaMailerObject;
|
|
||||||
use App\Mail\DownloadReport;
|
|
||||||
use App\Models\Client;
|
use App\Models\Client;
|
||||||
use App\Models\Scheduler;
|
use App\Models\Scheduler;
|
||||||
|
use App\Mail\DownloadReport;
|
||||||
|
use App\Export\CSV\TaskExport;
|
||||||
|
use App\Export\CSV\QuoteExport;
|
||||||
|
use App\Utils\Traits\MakesHash;
|
||||||
|
use App\Export\CSV\ClientExport;
|
||||||
|
use App\Export\CSV\CreditExport;
|
||||||
|
use App\Utils\Traits\MakesDates;
|
||||||
|
use App\Export\CSV\ContactExport;
|
||||||
|
use App\Export\CSV\ExpenseExport;
|
||||||
|
use App\Export\CSV\InvoiceExport;
|
||||||
|
use App\Export\CSV\PaymentExport;
|
||||||
|
use App\Export\CSV\ProductExport;
|
||||||
|
use App\Jobs\Mail\NinjaMailerJob;
|
||||||
|
use App\Export\CSV\ActivityExport;
|
||||||
|
use App\Export\CSV\DocumentExport;
|
||||||
|
use App\Export\CSV\QuoteItemExport;
|
||||||
|
use App\Services\Report\ProfitLoss;
|
||||||
|
use App\Jobs\Mail\NinjaMailerObject;
|
||||||
|
use App\Export\CSV\InvoiceItemExport;
|
||||||
|
use App\Export\CSV\ProductSalesExport;
|
||||||
use App\Services\Report\ARDetailReport;
|
use App\Services\Report\ARDetailReport;
|
||||||
use App\Services\Report\ARSummaryReport;
|
use App\Services\Report\ARSummaryReport;
|
||||||
use App\Services\Report\ClientBalanceReport;
|
|
||||||
use App\Services\Report\ClientSalesReport;
|
|
||||||
use App\Services\Report\ProfitLoss;
|
|
||||||
use App\Services\Report\TaxSummaryReport;
|
|
||||||
use App\Services\Report\UserSalesReport;
|
use App\Services\Report\UserSalesReport;
|
||||||
use App\Utils\Traits\MakesDates;
|
use App\Services\Report\TaxSummaryReport;
|
||||||
use App\Utils\Traits\MakesHash;
|
use App\Export\CSV\RecurringInvoiceExport;
|
||||||
|
use App\Services\Report\ClientSalesReport;
|
||||||
|
use App\Services\Report\ClientBalanceReport;
|
||||||
|
|
||||||
class EmailReport
|
class EmailReport
|
||||||
{
|
{
|
||||||
@ -77,19 +78,33 @@ class EmailReport
|
|||||||
'client_sales' => $export = (new ClientSalesReport($this->scheduler->company, $data)),
|
'client_sales' => $export = (new ClientSalesReport($this->scheduler->company, $data)),
|
||||||
'user_sales' => $export = (new UserSalesReport($this->scheduler->company, $data)),
|
'user_sales' => $export = (new UserSalesReport($this->scheduler->company, $data)),
|
||||||
'profitloss' => $export = (new ProfitLoss($this->scheduler->company, $data)),
|
'profitloss' => $export = (new ProfitLoss($this->scheduler->company, $data)),
|
||||||
|
'activity' => $export = (new ActivityExport($this->scheduler->company, $data)),
|
||||||
|
'activities' => $export = (new ActivityExport($this->scheduler->company, $data)),
|
||||||
'client' => $export = (new ClientExport($this->scheduler->company, $data)),
|
'client' => $export = (new ClientExport($this->scheduler->company, $data)),
|
||||||
|
'clients' => $export = (new ClientExport($this->scheduler->company, $data)),
|
||||||
'client_contact' => $export = (new ContactExport($this->scheduler->company, $data)),
|
'client_contact' => $export = (new ContactExport($this->scheduler->company, $data)),
|
||||||
|
'client_contacts' => $export = (new ContactExport($this->scheduler->company, $data)),
|
||||||
'credit' => $export = (new CreditExport($this->scheduler->company, $data)),
|
'credit' => $export = (new CreditExport($this->scheduler->company, $data)),
|
||||||
|
'credits' => $export = (new CreditExport($this->scheduler->company, $data)),
|
||||||
'document' => $export = (new DocumentExport($this->scheduler->company, $data)),
|
'document' => $export = (new DocumentExport($this->scheduler->company, $data)),
|
||||||
|
'documents' => $export = (new DocumentExport($this->scheduler->company, $data)),
|
||||||
'expense' => $export = (new ExpenseExport($this->scheduler->company, $data)),
|
'expense' => $export = (new ExpenseExport($this->scheduler->company, $data)),
|
||||||
|
'expenses' => $export = (new ExpenseExport($this->scheduler->company, $data)),
|
||||||
'invoice' => $export = (new InvoiceExport($this->scheduler->company, $data)),
|
'invoice' => $export = (new InvoiceExport($this->scheduler->company, $data)),
|
||||||
|
'invoices' => $export = (new InvoiceExport($this->scheduler->company, $data)),
|
||||||
'invoice_item' => $export = (new InvoiceItemExport($this->scheduler->company, $data)),
|
'invoice_item' => $export = (new InvoiceItemExport($this->scheduler->company, $data)),
|
||||||
|
'invoice_items' => $export = (new InvoiceItemExport($this->scheduler->company, $data)),
|
||||||
'quote' => $export = (new QuoteExport($this->scheduler->company, $data)),
|
'quote' => $export = (new QuoteExport($this->scheduler->company, $data)),
|
||||||
|
'quotes' => $export = (new QuoteExport($this->scheduler->company, $data)),
|
||||||
'quote_item' => $export = (new QuoteItemExport($this->scheduler->company, $data)),
|
'quote_item' => $export = (new QuoteItemExport($this->scheduler->company, $data)),
|
||||||
|
'quote_items' => $export = (new QuoteItemExport($this->scheduler->company, $data)),
|
||||||
'recurring_invoice' => $export = (new RecurringInvoiceExport($this->scheduler->company, $data)),
|
'recurring_invoice' => $export = (new RecurringInvoiceExport($this->scheduler->company, $data)),
|
||||||
|
'recurring_invoices' => $export = (new RecurringInvoiceExport($this->scheduler->company, $data)),
|
||||||
'payment' => $export = (new PaymentExport($this->scheduler->company, $data)),
|
'payment' => $export = (new PaymentExport($this->scheduler->company, $data)),
|
||||||
|
'payments' => $export = (new PaymentExport($this->scheduler->company, $data)),
|
||||||
'product' => $export = (new ProductExport($this->scheduler->company, $data)),
|
'product' => $export = (new ProductExport($this->scheduler->company, $data)),
|
||||||
'task' => $export = (new TaskExport($this->scheduler->company, $data)),
|
'products' => $export = (new ProductExport($this->scheduler->company, $data)),
|
||||||
|
'tasks' => $export = (new TaskExport($this->scheduler->company, $data)),
|
||||||
default => $export = false,
|
default => $export = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -717,7 +717,7 @@ class TemplateService
|
|||||||
return collect($payment->refund_meta)
|
return collect($payment->refund_meta)
|
||||||
->map(function ($refund) use ($payment) {
|
->map(function ($refund) use ($payment) {
|
||||||
|
|
||||||
$date = \Carbon\Carbon::parse($refund['date'])->addSeconds($payment->client->timezone_offset());
|
$date = \Carbon\Carbon::parse($refund['date'] ?? $payment->date)->addSeconds($payment->client->timezone_offset());
|
||||||
$date = $this->translateDate($date, $payment->client->date_format(), $payment->client->locale());
|
$date = $this->translateDate($date, $payment->client->date_format(), $payment->client->locale());
|
||||||
$entity = ctrans('texts.invoice');
|
$entity = ctrans('texts.invoice');
|
||||||
|
|
||||||
@ -1032,6 +1032,8 @@ class TemplateService
|
|||||||
'payment_balance' => $purchase_order->client->payment_balance,
|
'payment_balance' => $purchase_order->client->payment_balance,
|
||||||
'credit_balance' => $purchase_order->client->credit_balance,
|
'credit_balance' => $purchase_order->client->credit_balance,
|
||||||
'vat_number' => $purchase_order->client->vat_number ?? '',
|
'vat_number' => $purchase_order->client->vat_number ?? '',
|
||||||
|
'address' => $purchase_order->client->present()->address(),
|
||||||
|
'shipping_address' => $purchase_order->client->present()->shipping_address(),
|
||||||
] : [],
|
] : [],
|
||||||
'status_id' => (string)($purchase_order->status_id ?: 1),
|
'status_id' => (string)($purchase_order->status_id ?: 1),
|
||||||
'status' => PurchaseOrder::stringStatus($purchase_order->status_id ?? 1),
|
'status' => PurchaseOrder::stringStatus($purchase_order->status_id ?? 1),
|
||||||
|
@ -132,6 +132,8 @@ class CreditTransformer extends EntityTransformer
|
|||||||
'paid_to_date' => (float) $credit->paid_to_date,
|
'paid_to_date' => (float) $credit->paid_to_date,
|
||||||
'subscription_id' => $this->encodePrimaryKey($credit->subscription_id),
|
'subscription_id' => $this->encodePrimaryKey($credit->subscription_id),
|
||||||
'invoice_id' => $credit->invoice_id ? $this->encodePrimaryKey($credit->invoice_id) : '',
|
'invoice_id' => $credit->invoice_id ? $this->encodePrimaryKey($credit->invoice_id) : '',
|
||||||
|
'tax_info' => $credit->tax_data ?: new \stdClass(),
|
||||||
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,6 +52,7 @@ class DocumentTransformer extends EntityTransformer
|
|||||||
'created_at' => (int) $document->created_at,
|
'created_at' => (int) $document->created_at,
|
||||||
'is_deleted' => (bool) false,
|
'is_deleted' => (bool) false,
|
||||||
'is_public' => (bool) $document->is_public,
|
'is_public' => (bool) $document->is_public,
|
||||||
|
'link' => (string) $document->link(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,6 +49,12 @@ class ProjectTransformer extends EntityTransformer
|
|||||||
|
|
||||||
public function includeClient(Project $project): \League\Fractal\Resource\Item
|
public function includeClient(Project $project): \League\Fractal\Resource\Item
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (!$project->client) {
|
||||||
|
nlog("Project {$project->hashed_id} does not have a client attached - this project is in a bad state");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
$transformer = new ClientTransformer($this->serializer);
|
$transformer = new ClientTransformer($this->serializer);
|
||||||
|
|
||||||
return $this->includeItem($project->client, $transformer, Client::class);
|
return $this->includeItem($project->client, $transformer, Client::class);
|
||||||
|
@ -149,6 +149,7 @@ class PurchaseOrderTransformer extends EntityTransformer
|
|||||||
'subscription_id' => $this->encodePrimaryKey($purchase_order->subscription_id),
|
'subscription_id' => $this->encodePrimaryKey($purchase_order->subscription_id),
|
||||||
'expense_id' => $this->encodePrimaryKey($purchase_order->expense_id),
|
'expense_id' => $this->encodePrimaryKey($purchase_order->expense_id),
|
||||||
'currency_id' => $purchase_order->currency_id ? (string) $purchase_order->currency_id : '',
|
'currency_id' => $purchase_order->currency_id ? (string) $purchase_order->currency_id : '',
|
||||||
|
'tax_info' => $purchase_order->tax_data ?: new \stdClass(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@ class QuoteTransformer extends EntityTransformer
|
|||||||
'paid_to_date' => (float) $quote->paid_to_date,
|
'paid_to_date' => (float) $quote->paid_to_date,
|
||||||
'project_id' => $this->encodePrimaryKey($quote->project_id),
|
'project_id' => $this->encodePrimaryKey($quote->project_id),
|
||||||
'subscription_id' => $this->encodePrimaryKey($quote->subscription_id),
|
'subscription_id' => $this->encodePrimaryKey($quote->subscription_id),
|
||||||
|
'tax_info' => $quote->tax_data ?: new \stdClass(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -397,6 +397,7 @@ class HtmlEngine
|
|||||||
$data['$credit.date'] = ['value' => $this->translateDate($this->entity->date, $this->client->date_format(), $this->client->locale()), 'label' => ctrans('texts.credit_date')];
|
$data['$credit.date'] = ['value' => $this->translateDate($this->entity->date, $this->client->date_format(), $this->client->locale()), 'label' => ctrans('texts.credit_date')];
|
||||||
$data['$balance'] = ['value' => Number::formatMoney($this->getBalance(), $this->client) ?: ' ', 'label' => ctrans('texts.balance')];
|
$data['$balance'] = ['value' => Number::formatMoney($this->getBalance(), $this->client) ?: ' ', 'label' => ctrans('texts.balance')];
|
||||||
$data['$credit.balance'] = ['value' => Number::formatMoney($this->entity_calc->getBalance(), $this->client) ?: ' ', 'label' => ctrans('texts.credit_balance')];
|
$data['$credit.balance'] = ['value' => Number::formatMoney($this->entity_calc->getBalance(), $this->client) ?: ' ', 'label' => ctrans('texts.credit_balance')];
|
||||||
|
$data['$client.credit_balance'] = &$data['$credit.balance'];
|
||||||
|
|
||||||
$data['$invoice.balance'] = &$data['$balance'];
|
$data['$invoice.balance'] = &$data['$balance'];
|
||||||
$data['$taxes'] = ['value' => Number::formatMoney($this->entity_calc->getItemTotalTaxes(), $this->client) ?: ' ', 'label' => ctrans('texts.taxes')];
|
$data['$taxes'] = ['value' => Number::formatMoney($this->entity_calc->getItemTotalTaxes(), $this->client) ?: ' ', 'label' => ctrans('texts.taxes')];
|
||||||
@ -621,6 +622,33 @@ class HtmlEngine
|
|||||||
$data['$task.task3'] = ['value' => '', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'task3')];
|
$data['$task.task3'] = ['value' => '', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'task3')];
|
||||||
$data['$task.task4'] = ['value' => '', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'task4')];
|
$data['$task.task4'] = ['value' => '', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'task4')];
|
||||||
|
|
||||||
|
|
||||||
|
if($this->entity->vendor) {
|
||||||
|
|
||||||
|
$data['$vendor_name'] = ['value' => $this->entity->vendor->present()->name() ?: ' ', 'label' => ctrans('texts.vendor_name')];
|
||||||
|
$data['$vendor.name'] = &$data['$vendor_name'];
|
||||||
|
$data['$vendor'] = &$data['$vendor_name'];
|
||||||
|
$data['$vendor.address1'] = ['value' => $this->entity->vendor->address1 ?: ' ', 'label' => ctrans('texts.address1')];
|
||||||
|
$data['$vendor.address2'] = ['value' => $this->entity->vendor->address2 ?: ' ', 'label' => ctrans('texts.address2')];
|
||||||
|
$data['$vendor.id_number'] = ['value' => $this->entity->vendor->id_number ?: ' ', 'label' => ctrans('texts.id_number')];
|
||||||
|
$data['$vendor.number'] = ['value' => $this->entity->vendor->number ?: ' ', 'label' => ctrans('texts.number')];
|
||||||
|
$data['$vendor.vat_number'] = ['value' => $this->entity->vendor->vat_number ?: ' ', 'label' => ctrans('texts.vat_number')];
|
||||||
|
$data['$vendor.website'] = ['value' => $this->entity->vendor->present()->website() ?: ' ', 'label' => ctrans('texts.website')];
|
||||||
|
$data['$vendor.phone'] = ['value' => $this->entity->vendor->present()->phone() ?: ' ', 'label' => ctrans('texts.phone')];
|
||||||
|
$data['$vendor.country'] = ['value' => isset($this->entity->vendor->country->name) ? ctrans('texts.country_' . $this->entity->vendor->country->name) : '', 'label' => ctrans('texts.country')];
|
||||||
|
$data['$vendor.country_2'] = ['value' => isset($this->entity->vendor->country) ? $this->entity->vendor->country->iso_3166_2 : '', 'label' => ctrans('texts.country')];
|
||||||
|
$data['$vendor_address'] = ['value' => $this->entity->vendor->present()->address() ?: ' ', 'label' => ctrans('texts.address')];
|
||||||
|
$data['$vendor.address'] = &$data['$vendor_address'];
|
||||||
|
$data['$vendor.postal_code'] = ['value' => $this->entity->vendor->postal_code ?: ' ', 'label' => ctrans('texts.postal_code')];
|
||||||
|
$data['$vendor.public_notes'] = ['value' => $this->entity->vendor->public_notes ?: ' ', 'label' => ctrans('texts.notes')];
|
||||||
|
$data['$vendor.city'] = ['value' => $this->entity->vendor->city ?: ' ', 'label' => ctrans('texts.city')];
|
||||||
|
$data['$vendor.state'] = ['value' => $this->entity->vendor->state ?: ' ', 'label' => ctrans('texts.state')];
|
||||||
|
$data['$vendor.city_state_postal'] = ['value' => $this->entity->vendor->present()->cityStateZip($this->entity->vendor->city, $this->entity->vendor->state, $this->entity->vendor->postal_code, false) ?: ' ', 'label' => ctrans('texts.city_state_postal')];
|
||||||
|
$data['$vendor.postal_city_state'] = ['value' => $this->entity->vendor->present()->cityStateZip($this->entity->vendor->city, $this->entity->vendor->state, $this->entity->vendor->postal_code, true) ?: ' ', 'label' => ctrans('texts.postal_city_state')];
|
||||||
|
$data['$vendor.postal_city'] = ['value' => $this->entity->vendor->present()->cityStateZip($this->entity->vendor->city, null, $this->entity->vendor->postal_code, true) ?: ' ', 'label' => ctrans('texts.postal_city')];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->settings->signature_on_pdf) {
|
if ($this->settings->signature_on_pdf) {
|
||||||
$data['$contact.signature'] = ['value' => $this->invitation->signature_base64, 'label' => ctrans('texts.signature')];
|
$data['$contact.signature'] = ['value' => $this->invitation->signature_base64, 'label' => ctrans('texts.signature')];
|
||||||
$data['$contact.signature_date'] = ['value' => $this->translateDate($this->invitation->signature_date, $this->client->date_format(), $this->client->locale()), 'label' => ctrans('texts.date')];
|
$data['$contact.signature_date'] = ['value' => $this->translateDate($this->invitation->signature_date, $this->client->date_format(), $this->client->locale()), 'label' => ctrans('texts.date')];
|
||||||
|
@ -86,15 +86,9 @@ class Number
|
|||||||
return rtrim(rtrim(number_format($value, $precision, $decimal, $thousand), '0'), $decimal);
|
return rtrim(rtrim(number_format($value, $precision, $decimal, $thousand), '0'), $decimal);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Formats a given value based on the clients currency
|
|
||||||
* BACK to a float.
|
|
||||||
*
|
|
||||||
* @param string $value The formatted number to be converted back to float
|
|
||||||
* @return float The formatted value
|
|
||||||
*/
|
|
||||||
public static function parseFloat($value)
|
public static function parseFloat($value)
|
||||||
{
|
{
|
||||||
|
|
||||||
if(!$value)
|
if(!$value)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -104,44 +98,100 @@ class Number
|
|||||||
$decimal = strpos($value, '.');
|
$decimal = strpos($value, '.');
|
||||||
$comma = strpos($value, ',');
|
$comma = strpos($value, ',');
|
||||||
|
|
||||||
if(!$comma) //no comma must be a decimal number already
|
if($comma === false) //no comma must be a decimal number already
|
||||||
return (float) $value;
|
return (float) $value;
|
||||||
|
|
||||||
if($decimal < $comma){ //decimal before a comma = euro
|
if($decimal < $comma){ //decimal before a comma = euro
|
||||||
$value = str_replace(['.',','], ['','.'], $value);
|
$value = str_replace(['.',','], ['','.'], $value);
|
||||||
// $value = str_replace(',', '.', $value);
|
|
||||||
return (float) $value;
|
return (float) $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
//comma first = traditional thousan separator
|
//comma first = traditional thousand separator
|
||||||
$value = str_replace(',', '', $value);
|
$value = str_replace(',', '', $value);
|
||||||
|
|
||||||
return (float)$value;
|
return (float)$value;
|
||||||
|
|
||||||
|
|
||||||
// if(!$value)
|
|
||||||
// return 0;
|
|
||||||
|
|
||||||
// $multiplier = false;
|
|
||||||
|
|
||||||
// if(substr($value, 0,1) == '-')
|
|
||||||
// $multiplier = -1;
|
|
||||||
|
|
||||||
// $s = str_replace(',', '.', $value);
|
|
||||||
|
|
||||||
// $s = preg_replace("/[^0-9\.]/", '', $s);
|
|
||||||
|
|
||||||
// if ($s < 1) {
|
|
||||||
// return (float) $s;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// $s = str_replace('.', '', substr($s, 0, -3)).substr($s, -3);
|
|
||||||
|
|
||||||
// if($multiplier)
|
|
||||||
// $s = floatval($s)*-1;
|
|
||||||
|
|
||||||
// return (float) $s;
|
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Formats a given value based on the clients currency
|
||||||
|
* BACK to a float.
|
||||||
|
*
|
||||||
|
* @param string $value The formatted number to be converted back to float
|
||||||
|
* @return float The formatted value
|
||||||
|
*/
|
||||||
|
public static function parseFloatXX($value)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(!$value)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
$multiplier = false;
|
||||||
|
|
||||||
|
if(substr($value, 0,1) == '-')
|
||||||
|
$multiplier = -1;
|
||||||
|
|
||||||
|
$s = str_replace(',', '.', $value);
|
||||||
|
|
||||||
|
$s = preg_replace("/[^0-9\.]/", '', $s);
|
||||||
|
|
||||||
|
if ($s < 1) {
|
||||||
|
return (float) $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
$s = str_replace('.', '', substr($s, 0, -3)).substr($s, -3);
|
||||||
|
|
||||||
|
if($multiplier)
|
||||||
|
$s = floatval($s)*-1;
|
||||||
|
|
||||||
|
return (float) $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//next iteration of float parsing
|
||||||
|
public static function parseFloat2($value)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(!$value) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//remove everything except for numbers, decimals, commas and hyphens
|
||||||
|
$value = preg_replace('/[^0-9.,-]+/', '', $value);
|
||||||
|
|
||||||
|
$decimal = strpos($value, '.');
|
||||||
|
$comma = strpos($value, ',');
|
||||||
|
|
||||||
|
//check the 3rd last character
|
||||||
|
if(!in_array(substr($value, -3, 1), [".", ","])) {
|
||||||
|
|
||||||
|
if($comma && (substr($value, -3, 1) != ".")) {
|
||||||
|
$value .= ".00";
|
||||||
|
} elseif($decimal && (substr($value, -3, 1) != ",")) {
|
||||||
|
$value .= ",00";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$decimal = strpos($value, '.');
|
||||||
|
$comma = strpos($value, ',');
|
||||||
|
|
||||||
|
if($comma === false) { //no comma must be a decimal number already
|
||||||
|
return (float) $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($decimal < $comma) { //decimal before a comma = euro
|
||||||
|
$value = str_replace(['.',','], ['','.'], $value);
|
||||||
|
return (float) $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
//comma first = traditional thousand separator
|
||||||
|
$value = str_replace(',', '', $value);
|
||||||
|
|
||||||
|
return (float)$value;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static function parseStringFloat($value)
|
public static function parseStringFloat($value)
|
||||||
{
|
{
|
||||||
|
@ -84,6 +84,7 @@ class SystemHealth
|
|||||||
'trailing_slash' => (bool) self::checkUrlState(),
|
'trailing_slash' => (bool) self::checkUrlState(),
|
||||||
'file_permissions' => (string) self::checkFileSystem(),
|
'file_permissions' => (string) self::checkFileSystem(),
|
||||||
'exchange_rate_api_not_configured' => (bool)self::checkCurrencySanity(),
|
'exchange_rate_api_not_configured' => (bool)self::checkCurrencySanity(),
|
||||||
|
'api_version' => (string) config('ninja.app_version'),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
833
composer.lock
generated
833
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -17,8 +17,8 @@ return [
|
|||||||
'require_https' => env('REQUIRE_HTTPS', true),
|
'require_https' => env('REQUIRE_HTTPS', true),
|
||||||
'app_url' => rtrim(env('APP_URL', ''), '/'),
|
'app_url' => rtrim(env('APP_URL', ''), '/'),
|
||||||
'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
|
'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
|
||||||
'app_version' => env('APP_VERSION', '5.8.30'),
|
'app_version' => env('APP_VERSION', '5.8.37'),
|
||||||
'app_tag' => env('APP_TAG', '5.8.30'),
|
'app_tag' => env('APP_TAG', '5.8.37'),
|
||||||
'minimum_client_version' => '5.0.16',
|
'minimum_client_version' => '5.0.16',
|
||||||
'terms_version' => '1.0.1',
|
'terms_version' => '1.0.1',
|
||||||
'api_secret' => env('API_SECRET', false),
|
'api_secret' => env('API_SECRET', false),
|
||||||
|
@ -35,7 +35,10 @@ return [
|
|||||||
],
|
],
|
||||||
|
|
||||||
'postmark-outlook' => [
|
'postmark-outlook' => [
|
||||||
'token' => env('POSTMARK_OUTLOOK_SECRET','')
|
'token' => env('POSTMARK_OUTLOOK_SECRET',''),
|
||||||
|
'from' => [
|
||||||
|
'address' => env('POSTMARK_OUTLOOK_FROM_ADDRESS', '')
|
||||||
|
],
|
||||||
],
|
],
|
||||||
|
|
||||||
'microsoft' => [
|
'microsoft' => [
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
|
||||||
|
Schema::table('quotes', function (Blueprint $table) {
|
||||||
|
$table->mediumText('tax_data')->nullable(); //json object
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('credits', function (Blueprint $table) {
|
||||||
|
$table->mediumText('tax_data')->nullable(); //json object
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('purchase_orders', function (Blueprint $table) {
|
||||||
|
$table->mediumText('tax_data')->nullable(); //json object
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
|
||||||
|
Schema::table('invoices', function (Blueprint $table) {
|
||||||
|
$table->decimal('discount', 20, 6)->default(0)->change();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
Schema::table('credits', function (Blueprint $table) {
|
||||||
|
$table->decimal('discount', 20, 6)->default(0)->change();
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('quotes', function (Blueprint $table) {
|
||||||
|
$table->decimal('discount', 20, 6)->default(0)->change();
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('purchase_orders', function (Blueprint $table) {
|
||||||
|
$table->decimal('discount', 20, 6)->default(0)->change();
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('recurring_invoices', function (Blueprint $table) {
|
||||||
|
$table->decimal('discount', 20, 6)->default(0)->change();
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
};
|
@ -453,7 +453,7 @@ $lang = array(
|
|||||||
'edit_token' => 'تحرير الرمز',
|
'edit_token' => 'تحرير الرمز',
|
||||||
'delete_token' => 'حذف الرمز المميز',
|
'delete_token' => 'حذف الرمز المميز',
|
||||||
'token' => 'رمز',
|
'token' => 'رمز',
|
||||||
'add_gateway' => 'إضافة بوابة',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'حذف البوابة',
|
'delete_gateway' => 'حذف البوابة',
|
||||||
'edit_gateway' => 'تحرير البوابة',
|
'edit_gateway' => 'تحرير البوابة',
|
||||||
'updated_gateway' => 'تم تحديث البوابة بنجاح',
|
'updated_gateway' => 'تم تحديث البوابة بنجاح',
|
||||||
@ -499,8 +499,8 @@ $lang = array(
|
|||||||
'auto_wrap' => 'التفاف خط السيارات',
|
'auto_wrap' => 'التفاف خط السيارات',
|
||||||
'duplicate_post' => 'تحذير: الصفحة السابقة قدمت مرتين. تم تجاهل التقديم الثاني.',
|
'duplicate_post' => 'تحذير: الصفحة السابقة قدمت مرتين. تم تجاهل التقديم الثاني.',
|
||||||
'view_documentation' => 'عرض التوثيق',
|
'view_documentation' => 'عرض التوثيق',
|
||||||
'app_title' => 'Free Online Invoicing',
|
'app_title' => 'فواتير مجانية عبر الإنترنت',
|
||||||
'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.',
|
'app_description' => 'يعد Invoice Ninja حلاً مجانيًا مفتوح الرمز لإعداد الفواتير وإعداد الفواتير للعملاء. باستخدام Invoice Ninja، يمكنك بسهولة إنشاء وإرسال فواتير جميلة من أي جهاز لديه إمكانية الوصول إلى الويب. يمكن لعملائك طباعة فواتيرك، وتنزيلها كملفات pdf، وحتى الدفع لك عبر الإنترنت من داخل النظام.',
|
||||||
'rows' => 'صفوف',
|
'rows' => 'صفوف',
|
||||||
'www' => 'www',
|
'www' => 'www',
|
||||||
'logo' => 'شعار',
|
'logo' => 'شعار',
|
||||||
@ -686,9 +686,9 @@ $lang = array(
|
|||||||
'disable' => 'إبطال',
|
'disable' => 'إبطال',
|
||||||
'invoice_quote_number' => 'أرقام الفاتورة والاقتباس',
|
'invoice_quote_number' => 'أرقام الفاتورة والاقتباس',
|
||||||
'invoice_charges' => 'رسوم الفاتورة الإضافية',
|
'invoice_charges' => 'رسوم الفاتورة الإضافية',
|
||||||
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact. <br><br> :error',
|
'notification_invoice_bounced' => 'لم نتمكن من تسليم الفاتورة :invoice إلى :contact .<br><br> :error',
|
||||||
'notification_invoice_bounced_subject' => 'تعذر تسليم الفاتورة :invoice',
|
'notification_invoice_bounced_subject' => 'تعذر تسليم الفاتورة :invoice',
|
||||||
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact. <br><br> :error',
|
'notification_quote_bounced' => 'لم نتمكن من تسليم عرض الأسعار :invoice إلى :contact .<br><br> :error',
|
||||||
'notification_quote_bounced_subject' => 'غير قادر على تسليم اقتباس :invoice',
|
'notification_quote_bounced_subject' => 'غير قادر على تسليم اقتباس :invoice',
|
||||||
'custom_invoice_link' => 'رابط الفاتورة المخصصة',
|
'custom_invoice_link' => 'رابط الفاتورة المخصصة',
|
||||||
'total_invoiced' => 'إجمالي الفاتورة',
|
'total_invoiced' => 'إجمالي الفاتورة',
|
||||||
@ -2991,7 +2991,7 @@ $lang = array(
|
|||||||
'hosted_login' => 'مستضاف تسجيل الدخول',
|
'hosted_login' => 'مستضاف تسجيل الدخول',
|
||||||
'selfhost_login' => 'تسجيل الدخول إلى Selfhost',
|
'selfhost_login' => 'تسجيل الدخول إلى Selfhost',
|
||||||
'google_login' => 'جوجل تسجيل الدخول',
|
'google_login' => 'جوجل تسجيل الدخول',
|
||||||
'thanks_for_patience' => 'Thank for your patience while we work to implement these features.<br><br>We hope to have them completed in the next few months.<br><br>Until then we\'ll continue to support the',
|
'thanks_for_patience' => 'نشكرك على سعة صدرك بينما نعمل على تنفيذ هذه الميزات.<br><br> ونأمل أن يتم الانتهاء منها في الأشهر القليلة المقبلة.<br><br> وحتى ذلك الحين سنواصل دعمنا',
|
||||||
'legacy_mobile_app' => 'تطبيق جوال قديم',
|
'legacy_mobile_app' => 'تطبيق جوال قديم',
|
||||||
'today' => 'اليوم',
|
'today' => 'اليوم',
|
||||||
'current' => 'حاضِر',
|
'current' => 'حاضِر',
|
||||||
@ -3849,7 +3849,7 @@ $lang = array(
|
|||||||
'cancellation_pending' => 'الإلغاء معلق ، سنكون على اتصال!',
|
'cancellation_pending' => 'الإلغاء معلق ، سنكون على اتصال!',
|
||||||
'list_of_payments' => 'قائمة المدفوعات',
|
'list_of_payments' => 'قائمة المدفوعات',
|
||||||
'payment_details' => 'تفاصيل الدفع',
|
'payment_details' => 'تفاصيل الدفع',
|
||||||
'list_of_payment_invoices' => 'Associate invoices',
|
'list_of_payment_invoices' => 'الفواتير المرتبطة',
|
||||||
'list_of_payment_methods' => 'قائمة طرق الدفع',
|
'list_of_payment_methods' => 'قائمة طرق الدفع',
|
||||||
'payment_method_details' => 'تفاصيل طريقة الدفع',
|
'payment_method_details' => 'تفاصيل طريقة الدفع',
|
||||||
'permanently_remove_payment_method' => 'قم بإزالة طريقة الدفع هذه بشكل دائم.',
|
'permanently_remove_payment_method' => 'قم بإزالة طريقة الدفع هذه بشكل دائم.',
|
||||||
@ -4906,7 +4906,7 @@ $lang = array(
|
|||||||
'no_assigned_tasks' => 'لا توجد مهام قابلة للفوترة لهذا المشروع',
|
'no_assigned_tasks' => 'لا توجد مهام قابلة للفوترة لهذا المشروع',
|
||||||
'authorization_failure' => 'أذونات غير كافية لتنفيذ هذا الإجراء',
|
'authorization_failure' => 'أذونات غير كافية لتنفيذ هذا الإجراء',
|
||||||
'authorization_sms_failure' => 'يرجى التحقق من حسابك لإرسال رسائل البريد الإلكتروني.',
|
'authorization_sms_failure' => 'يرجى التحقق من حسابك لإرسال رسائل البريد الإلكتروني.',
|
||||||
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key <br><br> You can manage your license here: https://invoiceninja.invoicing.co/client/login',
|
'white_label_body' => 'شكرًا لك على شراء ترخيص العلامة البيضاء.<br><br> مفتاح الترخيص الخاص بك هو:<br><br> :license_key<br><br> يمكنك إدارة الترخيص الخاص بك هنا: https://invoiceninja.invoicing.co/client/login',
|
||||||
'payment_type_Klarna' => 'كلارنا',
|
'payment_type_Klarna' => 'كلارنا',
|
||||||
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
||||||
'xinvoice_payable' => 'مستحق الدفع paydate: صافي أيام الدفع payeddue: تاريخ الدفع',
|
'xinvoice_payable' => 'مستحق الدفع paydate: صافي أيام الدفع payeddue: تاريخ الدفع',
|
||||||
@ -5071,7 +5071,7 @@ $lang = array(
|
|||||||
'region' => 'منطقة',
|
'region' => 'منطقة',
|
||||||
'county' => 'مقاطعة',
|
'county' => 'مقاطعة',
|
||||||
'tax_details' => 'التفاصيل الضريبية',
|
'tax_details' => 'التفاصيل الضريبية',
|
||||||
'activity_10_online' => ':contact made payment :payment for invoice :invoice for :client',
|
'activity_10_online' => ':contact تم الدفع :payment للفاتورة :invoice لـ :client',
|
||||||
'activity_10_manual' => ':user الدفعة المدخلة :payment للفاتورة :invoice لـ :client',
|
'activity_10_manual' => ':user الدفعة المدخلة :payment للفاتورة :invoice لـ :client',
|
||||||
'default_payment_type' => 'نوع الدفع الافتراضي',
|
'default_payment_type' => 'نوع الدفع الافتراضي',
|
||||||
'number_precision' => 'دقة العدد',
|
'number_precision' => 'دقة العدد',
|
||||||
@ -5101,7 +5101,7 @@ $lang = array(
|
|||||||
'set_private' => 'تعيين خاص',
|
'set_private' => 'تعيين خاص',
|
||||||
'individual' => 'فردي',
|
'individual' => 'فردي',
|
||||||
'business' => 'عمل',
|
'business' => 'عمل',
|
||||||
'partnership' => 'Partnership',
|
'partnership' => 'شراكة',
|
||||||
'trust' => 'يثق',
|
'trust' => 'يثق',
|
||||||
'charity' => 'صدقة',
|
'charity' => 'صدقة',
|
||||||
'government' => 'حكومة',
|
'government' => 'حكومة',
|
||||||
@ -5182,42 +5182,59 @@ $lang = array(
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'غير جاهز',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'غير جاهز',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'لقد اتصلت بهذا الموقع مبكرًا جدًا. الرجاء إنهاء الترخيص وتحديث هذه الصفحة. اتصل بالدعم للحصول على المساعدة، إذا استمرت هذه المشكلة.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'لقد اتصلت بهذا الموقع مبكرًا جدًا. الرجاء إنهاء الترخيص وتحديث هذه الصفحة. اتصل بالدعم للحصول على المساعدة، إذا استمرت هذه المشكلة.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'لم يتم تحديد أي حسابات',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'لم يتم تحديد أي حسابات',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'لم تقم الخدمة بإرجاع أي حسابات صالحة. فكر في إعادة تشغيل التدفق.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'إعادة تشغيل التدفق.',
|
'nordigen_handler_restart' => 'إعادة تشغيل التدفق.',
|
||||||
'nordigen_handler_return' => 'العودة إلى التطبيق.',
|
'nordigen_handler_return' => 'العودة إلى التطبيق.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'لاو',
|
||||||
'currency_lao_kip' => 'Lao kip',
|
'currency_lao_kip' => 'لاو كيب',
|
||||||
'yodlee_regions' => 'Regions: USA, UK, Australia & India',
|
'yodlee_regions' => 'المناطق: الولايات المتحدة الأمريكية والمملكة المتحدة وأستراليا والهند',
|
||||||
'nordigen_regions' => 'Regions: Europe & UK',
|
'nordigen_regions' => 'المناطق: أوروبا والمملكة المتحدة',
|
||||||
'select_provider' => 'Select Provider',
|
'select_provider' => 'حدد الموفر',
|
||||||
'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.',
|
'nordigen_requisition_subject' => 'انتهت صلاحية الطلب، يرجى إعادة المصادقة.',
|
||||||
'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement. <br><br>Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.',
|
'nordigen_requisition_body' => 'انتهت صلاحية الوصول إلى خلاصات حساب البنك كما هو محدد في اتفاقية المستخدم النهائي.<br><br> يرجى تسجيل الدخول إلى Invoice Ninja وإعادة المصادقة مع البنوك التي تتعامل معها لمواصلة تلقي المعاملات.',
|
||||||
'participant' => 'Participant',
|
'participant' => 'مشارك',
|
||||||
'participant_name' => 'Participant name',
|
'participant_name' => 'اسم المشارك',
|
||||||
'client_unsubscribed' => 'Client unsubscribed from emails.',
|
'client_unsubscribed' => 'تم إلغاء اشتراك العميل من رسائل البريد الإلكتروني.',
|
||||||
'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.',
|
'client_unsubscribed_help' => 'لقد قام العميل :client بإلغاء اشتراكه في رسائل البريد الإلكتروني الخاصة بك. يحتاج العميل إلى الموافقة على تلقي رسائل البريد الإلكتروني المستقبلية منك.',
|
||||||
'resubscribe' => 'Resubscribe',
|
'resubscribe' => 'إعادة الاشتراك',
|
||||||
'subscribe' => 'Subscribe',
|
'subscribe' => 'يشترك',
|
||||||
'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.',
|
'subscribe_help' => 'أنت مشترك حاليًا وستستمر في تلقي اتصالات البريد الإلكتروني.',
|
||||||
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
'unsubscribe_help' => 'أنت غير مشترك حاليًا، وبالتالي لن تتلقى رسائل بريد إلكتروني في الوقت الحالي.',
|
||||||
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
'notification_purchase_order_bounced' => 'لم نتمكن من تسليم طلب الشراء :invoice إلى :contact .<br><br> :error',
|
||||||
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
'notification_purchase_order_bounced_subject' => 'غير قادر على تسليم أمر الشراء :invoice',
|
||||||
'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile',
|
'show_pdfhtml_on_mobile' => 'عرض إصدار HTML للكيان عند العرض على الهاتف المحمول',
|
||||||
'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.',
|
'show_pdfhtml_on_mobile_help' => 'لتحسين التصور، يتم عرض نسخة HTML من الفاتورة/عرض الأسعار عند عرضها على الهاتف المحمول.',
|
||||||
'please_select_an_invoice_or_credit' => 'Please select an invoice or credit',
|
'please_select_an_invoice_or_credit' => 'الرجاء تحديد فاتورة أو رصيد',
|
||||||
'mobile_version' => 'Mobile Version',
|
'mobile_version' => 'اصدار المحمول',
|
||||||
'venmo' => 'Venmo',
|
'venmo' => 'فينمو',
|
||||||
'my_bank' => 'MyBank',
|
'my_bank' => 'بنكي',
|
||||||
'pay_later' => 'Pay Later',
|
'pay_later' => 'ادفع لاحقا',
|
||||||
'local_domain' => 'Local Domain',
|
'local_domain' => 'المجال المحلي',
|
||||||
'verify_peer' => 'Verify Peer',
|
'verify_peer' => 'التحقق من النظير',
|
||||||
'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key',
|
'nordigen_help' => 'ملاحظة: يتطلب ربط حساب مفتاح GoCardless/Nordigen API',
|
||||||
'ar_detailed' => 'Accounts Receivable Detailed',
|
'ar_detailed' => 'حسابات القبض مفصلة',
|
||||||
'ar_summary' => 'Accounts Receivable Summary',
|
'ar_summary' => 'ملخص حسابات القبض',
|
||||||
'client_sales' => 'Client Sales',
|
'client_sales' => 'مبيعات العملاء',
|
||||||
'user_sales' => 'User Sales',
|
'user_sales' => 'مبيعات المستخدم',
|
||||||
'iframe_url' => 'iFrame URL',
|
'iframe_url' => 'عنوان URL لإطار iFrame',
|
||||||
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
'user_unsubscribed' => 'تم إلغاء اشتراك المستخدم من رسائل البريد الإلكتروني :link',
|
||||||
|
'use_available_payments' => 'استخدم المدفوعات المتاحة',
|
||||||
|
'test_email_sent' => 'تم إرسال البريد الإلكتروني بنجاح',
|
||||||
|
'gateway_type' => 'نوع البوابة',
|
||||||
|
'save_template_body' => 'هل ترغب في حفظ تعيين الاستيراد هذا كقالب لاستخدامه في المستقبل؟',
|
||||||
|
'save_as_template' => 'حفظ تعيين القالب',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'يضبط <b>تاريخ استحقاق الفاتورة</b> الافتراضي',
|
||||||
|
'payment_type_help' => 'يعيّن <b>نوع الدفع اليدوي</b> الافتراضي.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return $lang;
|
return $lang;
|
||||||
|
@ -461,7 +461,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Редакция на токън',
|
'edit_token' => 'Редакция на токън',
|
||||||
'delete_token' => 'Изтриване на токън',
|
'delete_token' => 'Изтриване на токън',
|
||||||
'token' => 'Токън',
|
'token' => 'Токън',
|
||||||
'add_gateway' => 'Добавяне на Gateway',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Изтриване на Gateway',
|
'delete_gateway' => 'Изтриване на Gateway',
|
||||||
'edit_gateway' => 'Редакция на Gateway',
|
'edit_gateway' => 'Редакция на Gateway',
|
||||||
'updated_gateway' => 'Успешно актуализиран Gateway',
|
'updated_gateway' => 'Успешно актуализиран Gateway',
|
||||||
@ -3869,7 +3869,7 @@ $lang = array(
|
|||||||
'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!',
|
'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!',
|
||||||
'list_of_payments' => 'List of payments',
|
'list_of_payments' => 'List of payments',
|
||||||
'payment_details' => 'Details of the payment',
|
'payment_details' => 'Details of the payment',
|
||||||
'list_of_payment_invoices' => 'List of invoices affected by the payment',
|
'list_of_payment_invoices' => 'Associate invoices',
|
||||||
'list_of_payment_methods' => 'List of payment methods',
|
'list_of_payment_methods' => 'List of payment methods',
|
||||||
'payment_method_details' => 'Details of payment method',
|
'payment_method_details' => 'Details of payment method',
|
||||||
'permanently_remove_payment_method' => 'Permanently remove this payment method.',
|
'permanently_remove_payment_method' => 'Permanently remove this payment method.',
|
||||||
@ -4926,7 +4926,7 @@ $lang = array(
|
|||||||
'no_assigned_tasks' => 'No billable tasks for this project',
|
'no_assigned_tasks' => 'No billable tasks for this project',
|
||||||
'authorization_failure' => 'Insufficient permissions to perform this action',
|
'authorization_failure' => 'Insufficient permissions to perform this action',
|
||||||
'authorization_sms_failure' => 'Please verify your account to send emails.',
|
'authorization_sms_failure' => 'Please verify your account to send emails.',
|
||||||
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key',
|
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key <br><br> You can manage your license here: https://invoiceninja.invoicing.co/client/login',
|
||||||
'payment_type_Klarna' => 'Klarna',
|
'payment_type_Klarna' => 'Klarna',
|
||||||
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
||||||
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
|
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
|
||||||
@ -5121,7 +5121,7 @@ $lang = array(
|
|||||||
'set_private' => 'Set private',
|
'set_private' => 'Set private',
|
||||||
'individual' => 'Individual',
|
'individual' => 'Individual',
|
||||||
'business' => 'Business',
|
'business' => 'Business',
|
||||||
'partnership' => 'partnership',
|
'partnership' => 'Partnership',
|
||||||
'trust' => 'Trust',
|
'trust' => 'Trust',
|
||||||
'charity' => 'Charity',
|
'charity' => 'Charity',
|
||||||
'government' => 'Government',
|
'government' => 'Government',
|
||||||
@ -5202,7 +5202,7 @@ $lang = array(
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Restart flow.',
|
'nordigen_handler_restart' => 'Restart flow.',
|
||||||
'nordigen_handler_return' => 'Return to application.',
|
'nordigen_handler_return' => 'Return to application.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Lao',
|
||||||
@ -5222,6 +5222,38 @@ $lang = array(
|
|||||||
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
||||||
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
||||||
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
||||||
|
'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile',
|
||||||
|
'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.',
|
||||||
|
'please_select_an_invoice_or_credit' => 'Please select an invoice or credit',
|
||||||
|
'mobile_version' => 'Mobile Version',
|
||||||
|
'venmo' => 'Venmo',
|
||||||
|
'my_bank' => 'MyBank',
|
||||||
|
'pay_later' => 'Pay Later',
|
||||||
|
'local_domain' => 'Local Domain',
|
||||||
|
'verify_peer' => 'Verify Peer',
|
||||||
|
'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key',
|
||||||
|
'ar_detailed' => 'Accounts Receivable Detailed',
|
||||||
|
'ar_summary' => 'Accounts Receivable Summary',
|
||||||
|
'client_sales' => 'Client Sales',
|
||||||
|
'user_sales' => 'User Sales',
|
||||||
|
'iframe_url' => 'iFrame URL',
|
||||||
|
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
||||||
|
'use_available_payments' => 'Use Available Payments',
|
||||||
|
'test_email_sent' => 'Successfully sent email',
|
||||||
|
'gateway_type' => 'Gateway Type',
|
||||||
|
'save_template_body' => 'Would you like to save this import mapping as a template for future use?',
|
||||||
|
'save_as_template' => 'Save Template Mapping',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'Задава <b>падеж на фактурата</b> по подразбиране',
|
||||||
|
'payment_type_help' => 'Задава <b>тип за ръчно плащане</b> по подразбиране.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -460,7 +460,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Edit Token',
|
'edit_token' => 'Edit Token',
|
||||||
'delete_token' => 'Delete Token',
|
'delete_token' => 'Delete Token',
|
||||||
'token' => 'Token',
|
'token' => 'Token',
|
||||||
'add_gateway' => 'Add Gateway',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Delete Gateway',
|
'delete_gateway' => 'Delete Gateway',
|
||||||
'edit_gateway' => 'Edit Gateway',
|
'edit_gateway' => 'Edit Gateway',
|
||||||
'updated_gateway' => 'Successfully updated gateway',
|
'updated_gateway' => 'Successfully updated gateway',
|
||||||
@ -5201,7 +5201,7 @@ $lang = array(
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Restart flow.',
|
'nordigen_handler_restart' => 'Restart flow.',
|
||||||
'nordigen_handler_return' => 'Return to application.',
|
'nordigen_handler_return' => 'Return to application.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Lao',
|
||||||
@ -5237,6 +5237,23 @@ $lang = array(
|
|||||||
'user_sales' => 'User Sales',
|
'user_sales' => 'User Sales',
|
||||||
'iframe_url' => 'iFrame URL',
|
'iframe_url' => 'iFrame URL',
|
||||||
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
||||||
|
'use_available_payments' => 'Use Available Payments',
|
||||||
|
'test_email_sent' => 'Successfully sent email',
|
||||||
|
'gateway_type' => 'Gateway Type',
|
||||||
|
'save_template_body' => 'Would you like to save this import mapping as a template for future use?',
|
||||||
|
'save_as_template' => 'Save Template Mapping',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'Sets the default <b>invoice due date</b>',
|
||||||
|
'payment_type_help' => 'Sets the default <b>manual payment type</b>.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return $lang;
|
return $lang;
|
||||||
|
@ -460,7 +460,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Editovat token',
|
'edit_token' => 'Editovat token',
|
||||||
'delete_token' => 'Smazat Token',
|
'delete_token' => 'Smazat Token',
|
||||||
'token' => 'Token',
|
'token' => 'Token',
|
||||||
'add_gateway' => 'Přidat platební bránu',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Smazat platební bránu',
|
'delete_gateway' => 'Smazat platební bránu',
|
||||||
'edit_gateway' => 'Editovat bránu',
|
'edit_gateway' => 'Editovat bránu',
|
||||||
'updated_gateway' => 'Brána úspěšně změněna',
|
'updated_gateway' => 'Brána úspěšně změněna',
|
||||||
@ -5202,7 +5202,7 @@ $lang = array(
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Restart flow.',
|
'nordigen_handler_restart' => 'Restart flow.',
|
||||||
'nordigen_handler_return' => 'Return to application.',
|
'nordigen_handler_return' => 'Return to application.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Lao',
|
||||||
@ -5238,6 +5238,23 @@ $lang = array(
|
|||||||
'user_sales' => 'User Sales',
|
'user_sales' => 'User Sales',
|
||||||
'iframe_url' => 'iFrame URL',
|
'iframe_url' => 'iFrame URL',
|
||||||
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
||||||
|
'use_available_payments' => 'Use Available Payments',
|
||||||
|
'test_email_sent' => 'Successfully sent email',
|
||||||
|
'gateway_type' => 'Gateway Type',
|
||||||
|
'save_template_body' => 'Would you like to save this import mapping as a template for future use?',
|
||||||
|
'save_as_template' => 'Save Template Mapping',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'Nastaví jako výchozí <b>datum splatnosti faktury</b>',
|
||||||
|
'payment_type_help' => 'Sets the default <b>manual payment type</b>.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return $lang;
|
return $lang;
|
||||||
|
@ -460,7 +460,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Redigér token',
|
'edit_token' => 'Redigér token',
|
||||||
'delete_token' => 'Slet token',
|
'delete_token' => 'Slet token',
|
||||||
'token' => 'Token',
|
'token' => 'Token',
|
||||||
'add_gateway' => 'Tilføj gateway',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Slet gateway',
|
'delete_gateway' => 'Slet gateway',
|
||||||
'edit_gateway' => 'Redigér gateway',
|
'edit_gateway' => 'Redigér gateway',
|
||||||
'updated_gateway' => 'Gateway blev opdateret',
|
'updated_gateway' => 'Gateway blev opdateret',
|
||||||
@ -5200,7 +5200,7 @@ $lang = array(
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Restart flow.',
|
'nordigen_handler_restart' => 'Restart flow.',
|
||||||
'nordigen_handler_return' => 'Return to application.',
|
'nordigen_handler_return' => 'Return to application.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Lao',
|
||||||
@ -5236,6 +5236,23 @@ $lang = array(
|
|||||||
'user_sales' => 'User Sales',
|
'user_sales' => 'User Sales',
|
||||||
'iframe_url' => 'iFrame URL',
|
'iframe_url' => 'iFrame URL',
|
||||||
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
||||||
|
'use_available_payments' => 'Use Available Payments',
|
||||||
|
'test_email_sent' => 'Successfully sent email',
|
||||||
|
'gateway_type' => 'Gateway Type',
|
||||||
|
'save_template_body' => 'Would you like to save this import mapping as a template for future use?',
|
||||||
|
'save_as_template' => 'Save Template Mapping',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'Sætter standard <b>faktura forfalds dato</b>',
|
||||||
|
'payment_type_help' => 'Indstiller den <b>manuelle Betaling</b> som standard.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return $lang;
|
return $lang;
|
||||||
|
@ -461,7 +461,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Token bearbeiten',
|
'edit_token' => 'Token bearbeiten',
|
||||||
'delete_token' => 'Token löschen',
|
'delete_token' => 'Token löschen',
|
||||||
'token' => 'Token',
|
'token' => 'Token',
|
||||||
'add_gateway' => 'Zahlungsanbieter hinzufügen',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Zahlungsanbieter löschen',
|
'delete_gateway' => 'Zahlungsanbieter löschen',
|
||||||
'edit_gateway' => 'Zahlungsanbieter bearbeiten',
|
'edit_gateway' => 'Zahlungsanbieter bearbeiten',
|
||||||
'updated_gateway' => 'Zahlungsanbieter aktualisiert',
|
'updated_gateway' => 'Zahlungsanbieter aktualisiert',
|
||||||
@ -507,8 +507,8 @@ $lang = array(
|
|||||||
'auto_wrap' => 'Automatischer Zeilenumbruch',
|
'auto_wrap' => 'Automatischer Zeilenumbruch',
|
||||||
'duplicate_post' => 'Achtung: Die vorherige Seite wurde zweimal übermittelt. Die zweite Übermittlung wurde ignoriert.',
|
'duplicate_post' => 'Achtung: Die vorherige Seite wurde zweimal übermittelt. Die zweite Übermittlung wurde ignoriert.',
|
||||||
'view_documentation' => 'Dokumentation anzeigen',
|
'view_documentation' => 'Dokumentation anzeigen',
|
||||||
'app_title' => 'Free Online Invoicing',
|
'app_title' => 'Kostenlose Online-Rechnung',
|
||||||
'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.',
|
'app_description' => 'Invoice Ninja ist eine kostenlose Open-Code-Lösung für die Rechnungsstellung und Abrechnung mit Kunden. Mit Invoice Ninja können Sie ganz einfach schöne Rechnungen erstellen und versenden, von jedem Gerät aus, das Zugriff auf das Internet hat. Ihre Kunden können Ihre Rechnungen ausdrucken, als PDF-Dateien herunterladen und sogar online über das System bezahlen.',
|
||||||
'rows' => 'Zeilen',
|
'rows' => 'Zeilen',
|
||||||
'www' => 'www',
|
'www' => 'www',
|
||||||
'logo' => 'Logo',
|
'logo' => 'Logo',
|
||||||
@ -1902,7 +1902,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
|
|||||||
'require_quote_signature_help' => 'Erfordern Sie die Unterschrift des Kunden bei Angeboten.',
|
'require_quote_signature_help' => 'Erfordern Sie die Unterschrift des Kunden bei Angeboten.',
|
||||||
'i_agree' => 'Ich stimme den Bedingungen zu',
|
'i_agree' => 'Ich stimme den Bedingungen zu',
|
||||||
'sign_here' => 'Bitte unterschreiben Sie hier:',
|
'sign_here' => 'Bitte unterschreiben Sie hier:',
|
||||||
'sign_here_ux_tip' => 'Use the mouse or your touchpad to trace your signature.',
|
'sign_here_ux_tip' => 'Verwenden Sie die Maus oder Ihr Touchpad, um Ihre Signatur nachzuzeichnen.',
|
||||||
'authorization' => 'Genehmigung',
|
'authorization' => 'Genehmigung',
|
||||||
'signed' => 'unterzeichnet',
|
'signed' => 'unterzeichnet',
|
||||||
|
|
||||||
@ -3011,7 +3011,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
|
|||||||
'hosted_login' => 'Hosted Login',
|
'hosted_login' => 'Hosted Login',
|
||||||
'selfhost_login' => 'Selfhost Login',
|
'selfhost_login' => 'Selfhost Login',
|
||||||
'google_login' => 'Google Login',
|
'google_login' => 'Google Login',
|
||||||
'thanks_for_patience' => 'Thank for your patience while we work to implement these features.<br><br>We hope to have them completed in the next few months.<br><br>Until then we\'ll continue to support the',
|
'thanks_for_patience' => 'Vielen Dank für Ihre Geduld, während wir an der Implementierung dieser Funktionen arbeiten.<br><br> Wir hoffen, sie in den nächsten Monaten fertigstellen zu können.<br><br> Bis dahin unterstützen wir weiterhin die',
|
||||||
'legacy_mobile_app' => 'legacy Mobile App',
|
'legacy_mobile_app' => 'legacy Mobile App',
|
||||||
'today' => 'Heute',
|
'today' => 'Heute',
|
||||||
'current' => 'Aktuell',
|
'current' => 'Aktuell',
|
||||||
@ -3329,7 +3329,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
|
|||||||
'credit_number_counter' => 'Gutschriftnummernzähler',
|
'credit_number_counter' => 'Gutschriftnummernzähler',
|
||||||
'reset_counter_date' => 'Zählerdatum zurücksetzen',
|
'reset_counter_date' => 'Zählerdatum zurücksetzen',
|
||||||
'counter_padding' => 'Zähler-Innenabstand',
|
'counter_padding' => 'Zähler-Innenabstand',
|
||||||
'shared_invoice_quote_counter' => 'Share Invoice/Quote Counter',
|
'shared_invoice_quote_counter' => 'Share Invoice/ Angebot / Kostenvoranschlag Counter',
|
||||||
'default_tax_name_1' => 'Standard-Steuername 1',
|
'default_tax_name_1' => 'Standard-Steuername 1',
|
||||||
'default_tax_rate_1' => 'Standard-Steuersatz 1',
|
'default_tax_rate_1' => 'Standard-Steuersatz 1',
|
||||||
'default_tax_name_2' => 'Standard-Steuername 2',
|
'default_tax_name_2' => 'Standard-Steuername 2',
|
||||||
@ -3870,7 +3870,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
|
|||||||
'cancellation_pending' => 'Kündigung in Bearbeitung! Wir melden uns bei Ihnen...',
|
'cancellation_pending' => 'Kündigung in Bearbeitung! Wir melden uns bei Ihnen...',
|
||||||
'list_of_payments' => 'Liste der Zahlungen',
|
'list_of_payments' => 'Liste der Zahlungen',
|
||||||
'payment_details' => 'Details zu der Zahlung',
|
'payment_details' => 'Details zu der Zahlung',
|
||||||
'list_of_payment_invoices' => 'Associate invoices',
|
'list_of_payment_invoices' => 'Rechnungen zuordnen',
|
||||||
'list_of_payment_methods' => 'Liste der Zahlungsmethoden',
|
'list_of_payment_methods' => 'Liste der Zahlungsmethoden',
|
||||||
'payment_method_details' => 'Details zu der Zahlungsmethode',
|
'payment_method_details' => 'Details zu der Zahlungsmethode',
|
||||||
'permanently_remove_payment_method' => 'Zahlungsmethode endgültig entfernen.',
|
'permanently_remove_payment_method' => 'Zahlungsmethode endgültig entfernen.',
|
||||||
@ -4219,7 +4219,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
|
|||||||
'direct_debit' => 'Lastschriftverfahren',
|
'direct_debit' => 'Lastschriftverfahren',
|
||||||
'clone_to_expense' => 'Klonen zu Ausgabe',
|
'clone_to_expense' => 'Klonen zu Ausgabe',
|
||||||
'checkout' => 'Kasse',
|
'checkout' => 'Kasse',
|
||||||
'acss' => 'ACSS Debit',
|
'acss' => 'ACSS-Lastschrift',
|
||||||
'invalid_amount' => 'Ungültiger Betrag. Nur Zahlen/Dezimalwerte.',
|
'invalid_amount' => 'Ungültiger Betrag. Nur Zahlen/Dezimalwerte.',
|
||||||
'client_payment_failure_body' => 'Zahlung für Rechnung :invoice for amount :amount fehlgeschlagen.',
|
'client_payment_failure_body' => 'Zahlung für Rechnung :invoice for amount :amount fehlgeschlagen.',
|
||||||
'browser_pay' => 'Google Pay, Apple Pay, Microsoft Pay',
|
'browser_pay' => 'Google Pay, Apple Pay, Microsoft Pay',
|
||||||
@ -4927,7 +4927,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
|
|||||||
'no_assigned_tasks' => 'Keine abzurechenden Aufgaben für diese Rechnung',
|
'no_assigned_tasks' => 'Keine abzurechenden Aufgaben für diese Rechnung',
|
||||||
'authorization_failure' => 'Unzureichende Berechtigungen um diese Aktion auszuführen',
|
'authorization_failure' => 'Unzureichende Berechtigungen um diese Aktion auszuführen',
|
||||||
'authorization_sms_failure' => 'Bitte bestätigen Sie Ihr Konto um E-Mails zu versenden',
|
'authorization_sms_failure' => 'Bitte bestätigen Sie Ihr Konto um E-Mails zu versenden',
|
||||||
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key <br><br> You can manage your license here: https://invoiceninja.invoicing.co/client/login',
|
'white_label_body' => 'Vielen Dank, dass Sie eine White-Label-Lizenz erworben haben.<br><br> Ihr Lizenzschlüssel lautet:<br><br> :license_key<br><br> Sie können Ihre Lizenz hier verwalten: https://invoiceninja.invoicing.co/ Kunde /login',
|
||||||
'payment_type_Klarna' => 'Klarna',
|
'payment_type_Klarna' => 'Klarna',
|
||||||
'payment_type_Interac E Transfer' => 'Interac E-Übertragung',
|
'payment_type_Interac E Transfer' => 'Interac E-Übertragung',
|
||||||
'xinvoice_payable' => 'Zahlbar innerhalb von :payeddue Tagen netto bis :paydate',
|
'xinvoice_payable' => 'Zahlbar innerhalb von :payeddue Tagen netto bis :paydate',
|
||||||
@ -5092,7 +5092,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
|
|||||||
'region' => 'Region',
|
'region' => 'Region',
|
||||||
'county' => 'Landkreis',
|
'county' => 'Landkreis',
|
||||||
'tax_details' => 'Steuerdetails',
|
'tax_details' => 'Steuerdetails',
|
||||||
'activity_10_online' => ':contact made payment :payment for invoice :invoice for :client',
|
'activity_10_online' => ':contact hat die Zahlung :payment für die Rechnung :invoice für :client geleistet',
|
||||||
'activity_10_manual' => ':user hat die Zahlung :payment für die Rechnung :invoice des Kunden :client eingegeben',
|
'activity_10_manual' => ':user hat die Zahlung :payment für die Rechnung :invoice des Kunden :client eingegeben',
|
||||||
'default_payment_type' => 'Standard Zahlungsart',
|
'default_payment_type' => 'Standard Zahlungsart',
|
||||||
'number_precision' => 'Genauigkeit der Nummern',
|
'number_precision' => 'Genauigkeit der Nummern',
|
||||||
@ -5150,7 +5150,7 @@ Leistungsempfängers',
|
|||||||
'payment_receipt' => 'Zahlungsbeleg #:number',
|
'payment_receipt' => 'Zahlungsbeleg #:number',
|
||||||
'load_template_description' => 'Das Template wird auf Folgendes angewendet:',
|
'load_template_description' => 'Das Template wird auf Folgendes angewendet:',
|
||||||
'run_template' => 'Template anwenden',
|
'run_template' => 'Template anwenden',
|
||||||
'statement_design' => 'Statement Design',
|
'statement_design' => 'Statement-Design',
|
||||||
'delivery_note_design' => 'Lieferschein Design',
|
'delivery_note_design' => 'Lieferschein Design',
|
||||||
'payment_receipt_design' => 'Zahlungsbeleg Design',
|
'payment_receipt_design' => 'Zahlungsbeleg Design',
|
||||||
'payment_refund_design' => 'Gutschrift Design',
|
'payment_refund_design' => 'Gutschrift Design',
|
||||||
@ -5159,88 +5159,105 @@ Leistungsempfängers',
|
|||||||
'view_extension' => 'Erweiterung ansehen',
|
'view_extension' => 'Erweiterung ansehen',
|
||||||
'reactivate_email' => 'E-Mail reaktivieren',
|
'reactivate_email' => 'E-Mail reaktivieren',
|
||||||
'email_reactivated' => 'Email erfolgreich reaktiviert',
|
'email_reactivated' => 'Email erfolgreich reaktiviert',
|
||||||
'template_help' => 'Enable using the design as a template',
|
'template_help' => 'Aktivieren Sie die Verwendung des Designs als Vorlage',
|
||||||
'quarter' => 'Quartal',
|
'quarter' => 'Quartal',
|
||||||
'item_description' => 'Item Description',
|
'item_description' => 'Artikelbeschreibung',
|
||||||
'task_item' => 'Task Item',
|
'task_item' => 'Aufgabe',
|
||||||
'record_state' => 'Record State',
|
'record_state' => 'Aufnahmestatus',
|
||||||
'save_files_to_this_folder' => 'Save files to this folder',
|
'save_files_to_this_folder' => 'Speichern Sie Dateien in diesem Ordner',
|
||||||
'downloads_folder' => 'Downloads Folder',
|
'downloads_folder' => 'Downloads-Ordner',
|
||||||
'total_invoiced_quotes' => 'Invoiced Quotes',
|
'total_invoiced_quotes' => 'Angebote auf Rechnung',
|
||||||
'total_invoice_paid_quotes' => 'Invoice Paid Quotes',
|
'total_invoice_paid_quotes' => 'Auf Rechnung bezahlte Angebote',
|
||||||
'downloads_folder_does_not_exist' => 'The downloads folder does not exist :value',
|
'downloads_folder_does_not_exist' => 'Der Download-Ordner existiert nicht :value',
|
||||||
'user_logged_in_notification' => 'User Logged in Notification',
|
'user_logged_in_notification' => 'Benachrichtigung über angemeldeten Benutzer',
|
||||||
'user_logged_in_notification_help' => 'Send an email when logging in from a new location',
|
'user_logged_in_notification_help' => 'Senden Sie eine E-Mail, wenn Sie sich von einem neuen Standort aus anmelden',
|
||||||
'payment_email_all_contacts' => 'Payment Email To All Contacts',
|
'payment_email_all_contacts' => 'Zahlungs-E-Mail an alle Kontakte',
|
||||||
'payment_email_all_contacts_help' => 'Sends the payment email to all contacts when enabled',
|
'payment_email_all_contacts_help' => 'Sendet die Zahlungs-E-Mail an alle Kontakte, wenn diese Option aktiviert ist',
|
||||||
'add_line' => 'Zeile hinzufügen',
|
'add_line' => 'Zeile hinzufügen',
|
||||||
'activity_139' => 'Expense :expense notification sent to :contact',
|
'activity_139' => 'Ausgabe :expense Benachrichtigung an :contact gesendet',
|
||||||
'vendor_notification_subject' => 'Confirmation of payment :amount sent to :vendor',
|
'vendor_notification_subject' => 'Zahlungsbestätigung :amount gesendet an :vendor',
|
||||||
'vendor_notification_body' => 'Payment processed for :amount dated :payment_date. <br>[Transaction Reference: :transaction_reference]',
|
'vendor_notification_body' => 'Zahlung für :amount vom :payment _date verarbeitet.<br> [Transaktionsreferenz: :transaction_reference ]',
|
||||||
'receipt' => 'Receipt',
|
'receipt' => 'Quittung',
|
||||||
'charges' => 'Charges',
|
'charges' => 'Gebühren',
|
||||||
'email_report' => 'E-Mail-Bericht',
|
'email_report' => 'E-Mail-Bericht',
|
||||||
'payment_type_Pay Later' => 'Später bezahlen',
|
'payment_type_Pay Later' => 'Später bezahlen',
|
||||||
'payment_type_credit' => 'Payment Type Credit',
|
'payment_type_credit' => 'Zahlungsart Gutschrift',
|
||||||
'payment_type_debit' => 'Payment Type Debit',
|
'payment_type_debit' => 'Zahlungsart Lastschrift',
|
||||||
'send_emails_to' => 'Sende E-Mails an',
|
'send_emails_to' => 'Sende E-Mails an',
|
||||||
'primary_contact' => 'Primärkontakt',
|
'primary_contact' => 'Primärkontakt',
|
||||||
'all_contacts' => 'Alle Kontakte',
|
'all_contacts' => 'Alle Kontakte',
|
||||||
'insert_below' => 'Darunter einfügen',
|
'insert_below' => 'Darunter einfügen',
|
||||||
'nordigen_handler_subtitle' => 'Bank account authentication. Selecting your institution to complete the request with your account credentials.',
|
'nordigen_handler_subtitle' => 'Authentifizierung des Bankkontos. Wählen Sie Ihre Institution aus, um die Anfrage mit Ihren Kontoanmeldeinformationen abzuschließen.',
|
||||||
'nordigen_handler_error_heading_unknown' => 'Ein Fehler ist aufgetreten',
|
'nordigen_handler_error_heading_unknown' => 'Ein Fehler ist aufgetreten',
|
||||||
'nordigen_handler_error_contents_unknown' => 'Ein unbekannter Fehler ist aufgetreten. Grund:',
|
'nordigen_handler_error_contents_unknown' => 'Ein unbekannter Fehler ist aufgetreten. Grund:',
|
||||||
'nordigen_handler_error_heading_token_invalid' => 'Ungültiges Token',
|
'nordigen_handler_error_heading_token_invalid' => 'Ungültiges Token',
|
||||||
'nordigen_handler_error_contents_token_invalid' => 'The provided token was invalid. Contact support for help, if this issue persists.',
|
'nordigen_handler_error_contents_token_invalid' => 'Das bereitgestellte Token war ungültig. Wenn das Problem weiterhin besteht, wenden Sie sich an den Support.',
|
||||||
'nordigen_handler_error_heading_account_config_invalid' => 'Fehlende Zugangsdaten',
|
'nordigen_handler_error_heading_account_config_invalid' => 'Fehlende Zugangsdaten',
|
||||||
'nordigen_handler_error_contents_account_config_invalid' => 'Invalid or missing credentials for Gocardless Bank Account Data. Contact support for help, if this issue persists.',
|
'nordigen_handler_error_contents_account_config_invalid' => 'Ungültige oder fehlende Zugangsdaten für Gocardless Bankverbindung . Wenn das Problem weiterhin besteht, wenden Sie sich an den Support.',
|
||||||
'nordigen_handler_error_heading_not_available' => 'Nicht verfügbar',
|
'nordigen_handler_error_heading_not_available' => 'Nicht verfügbar',
|
||||||
'nordigen_handler_error_contents_not_available' => 'Funktion ist nur im Enterprise-Tarif verfügbar.',
|
'nordigen_handler_error_contents_not_available' => 'Funktion ist nur im Enterprise-Tarif verfügbar.',
|
||||||
'nordigen_handler_error_heading_institution_invalid' => 'Invalid Institution',
|
'nordigen_handler_error_heading_institution_invalid' => 'Ungültige Institution',
|
||||||
'nordigen_handler_error_contents_institution_invalid' => 'The provided institution-id is invalid or no longer valid.',
|
'nordigen_handler_error_contents_institution_invalid' => 'Die angegebene Institutions-ID ist ungültig oder nicht mehr gültig.',
|
||||||
'nordigen_handler_error_heading_ref_invalid' => 'Ungültige Referenz',
|
'nordigen_handler_error_heading_ref_invalid' => 'Ungültige Referenz',
|
||||||
'nordigen_handler_error_contents_ref_invalid' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.',
|
'nordigen_handler_error_contents_ref_invalid' => 'GoCardless hat keine gültige Referenz angegeben. Bitte führen Sie Flow erneut aus und wenden Sie sich an den Support, wenn das Problem weiterhin besteht.',
|
||||||
'nordigen_handler_error_heading_not_found' => 'Invalid Requisition',
|
'nordigen_handler_error_heading_not_found' => 'Ungültige Anforderung',
|
||||||
'nordigen_handler_error_contents_not_found' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.',
|
'nordigen_handler_error_contents_not_found' => 'GoCardless hat keine gültige Referenz angegeben. Bitte führen Sie Flow erneut aus und wenden Sie sich an den Support, wenn das Problem weiterhin besteht.',
|
||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'Nicht bereit',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'Sie haben diese Seite zu früh aufgerufen. Bitte schließen Sie die Autorisierung ab und aktualisieren Sie diese Seite. Wenn das Problem weiterhin besteht, wenden Sie sich an den Support.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'Keine Konten ausgewählt',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Restart flow.',
|
'nordigen_handler_restart' => 'Fluss neu starten.',
|
||||||
'nordigen_handler_return' => 'Return to application.',
|
'nordigen_handler_return' => 'Zurück zur Bewerbung.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Laotisch',
|
||||||
'currency_lao_kip' => 'Lao kip',
|
'currency_lao_kip' => 'Laotischer Kip',
|
||||||
'yodlee_regions' => 'Regions: USA, UK, Australia & India',
|
'yodlee_regions' => 'Regionen: USA, Großbritannien, Australien und Indien',
|
||||||
'nordigen_regions' => 'Regions: Europe & UK',
|
'nordigen_regions' => 'Regionen: Europa und Großbritannien',
|
||||||
'select_provider' => 'Select Provider',
|
'select_provider' => 'Wählen Sie Anbieter aus',
|
||||||
'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.',
|
'nordigen_requisition_subject' => 'Die Anforderung ist abgelaufen. Bitte authentifizieren Sie sich erneut.',
|
||||||
'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement. <br><br>Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.',
|
'nordigen_requisition_body' => 'Der Zugriff auf Bankkonto-Feeds ist gemäß der Endbenutzervereinbarung abgelaufen.<br><br> Bitte melden Sie sich bei Invoice Ninja an und authentifizieren Sie sich erneut bei Ihren Banken, um weiterhin Transaktionen zu erhalten.',
|
||||||
'participant' => 'Participant',
|
'participant' => 'Teilnehmer',
|
||||||
'participant_name' => 'Participant name',
|
'participant_name' => 'Teilnehmername',
|
||||||
'client_unsubscribed' => 'Client unsubscribed from emails.',
|
'client_unsubscribed' => 'Kunde hat sich von E-Mails abgemeldet.',
|
||||||
'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.',
|
'client_unsubscribed_help' => 'Kunde :client hat sich von Ihren E-Mails abgemeldet. Der Kunde muss zustimmen, künftige E-Mails von Ihnen zu erhalten.',
|
||||||
'resubscribe' => 'Resubscribe',
|
'resubscribe' => 'Abonnieren Sie erneut',
|
||||||
'subscribe' => 'Subscribe',
|
'subscribe' => 'Abonnieren',
|
||||||
'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.',
|
'subscribe_help' => 'Sie sind derzeit angemeldet und erhalten weiterhin E-Mail-Mitteilungen.',
|
||||||
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
'unsubscribe_help' => 'Sie sind derzeit nicht abonniert und erhalten daher derzeit keine E-Mails.',
|
||||||
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
'notification_purchase_order_bounced' => 'Wir konnten die Bestellung :invoice nicht an :contact liefern.<br><br> :error',
|
||||||
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
'notification_purchase_order_bounced_subject' => 'Bestellung :invoice kann nicht geliefert werden',
|
||||||
'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile',
|
'show_pdfhtml_on_mobile' => 'Zeigt die HTML-Version der Entität an, wenn sie auf Mobilgeräten angezeigt wird',
|
||||||
'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.',
|
'show_pdfhtml_on_mobile_help' => 'Zur besseren Visualisierung wird bei der Anzeige auf Mobilgeräten eine HTML-Version der Rechnung/ Angebot / Kostenvoranschlag angezeigt.',
|
||||||
'please_select_an_invoice_or_credit' => 'Please select an invoice or credit',
|
'please_select_an_invoice_or_credit' => 'Bitte wählen Sie eine Rechnung oder Gutschrift aus',
|
||||||
'mobile_version' => 'Mobile Version',
|
'mobile_version' => 'Mobile Version',
|
||||||
'venmo' => 'Venmo',
|
'venmo' => 'Venmo',
|
||||||
'my_bank' => 'MyBank',
|
'my_bank' => 'Meine Bank',
|
||||||
'pay_later' => 'Später Zahlen',
|
'pay_later' => 'Später Zahlen',
|
||||||
'local_domain' => 'Local Domain',
|
'local_domain' => 'Lokale Domäne',
|
||||||
'verify_peer' => 'Verify Peer',
|
'verify_peer' => 'Peer überprüfen',
|
||||||
'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key',
|
'nordigen_help' => 'Hinweis: Für die Verbindung eines Kontos ist ein GoCardless/Nordigen-API-Schlüssel erforderlich',
|
||||||
'ar_detailed' => 'Accounts Receivable Detailed',
|
'ar_detailed' => 'Detaillierte Debitorenbuchhaltung',
|
||||||
'ar_summary' => 'Accounts Receivable Summary',
|
'ar_summary' => 'Zusammenfassung der Debitorenbuchhaltung',
|
||||||
'client_sales' => 'Client Sales',
|
'client_sales' => 'Kunde',
|
||||||
'user_sales' => 'User Sales',
|
'user_sales' => 'Benutzerverkäufe',
|
||||||
'iframe_url' => 'iFrame URL',
|
'iframe_url' => 'iFrame-URL',
|
||||||
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
'user_unsubscribed' => 'Der Benutzer hat die E-Mails :link abgemeldet',
|
||||||
|
'use_available_payments' => 'Verwenden Sie verfügbare Zahlungen',
|
||||||
|
'test_email_sent' => 'E-Mail erfolgreich gesendet',
|
||||||
|
'gateway_type' => 'Gateway-Typ',
|
||||||
|
'save_template_body' => 'Möchten Sie diese Importzuordnung als Vorlage für die zukünftige Verwendung speichern?',
|
||||||
|
'save_as_template' => 'Vorlagenzuordnung speichern',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'Setzt das <b>Standardfälligkeitsdatum</b>',
|
||||||
|
'payment_type_help' => 'Setze die Standard <b>manuelle Zahlungsmethode</b>.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return $lang;
|
return $lang;
|
||||||
|
@ -460,7 +460,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Επεξεργασία Διακριτικού',
|
'edit_token' => 'Επεξεργασία Διακριτικού',
|
||||||
'delete_token' => 'Διαγραφή Διακριτικού',
|
'delete_token' => 'Διαγραφή Διακριτικού',
|
||||||
'token' => 'Διακριτικό',
|
'token' => 'Διακριτικό',
|
||||||
'add_gateway' => 'Προσθήκη Πύλης Πληρωμών (Gateway)',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Διαγραφή Πύλης Πληρωμών (Gateway)',
|
'delete_gateway' => 'Διαγραφή Πύλης Πληρωμών (Gateway)',
|
||||||
'edit_gateway' => 'Επεξεργασία Πύλης Πληρωμών (Gateway)',
|
'edit_gateway' => 'Επεξεργασία Πύλης Πληρωμών (Gateway)',
|
||||||
'updated_gateway' => 'Επιτυχής ενημέρωση πύλης πληρωμών (Gateway)',
|
'updated_gateway' => 'Επιτυχής ενημέρωση πύλης πληρωμών (Gateway)',
|
||||||
@ -3868,7 +3868,7 @@ $lang = array(
|
|||||||
'cancellation_pending' => 'Η ακύρωση εκκρεμεί, θα επικοινωνήσουμε μαζί σας!',
|
'cancellation_pending' => 'Η ακύρωση εκκρεμεί, θα επικοινωνήσουμε μαζί σας!',
|
||||||
'list_of_payments' => 'Λίστα Πληρωμών',
|
'list_of_payments' => 'Λίστα Πληρωμών',
|
||||||
'payment_details' => 'Details of the payment',
|
'payment_details' => 'Details of the payment',
|
||||||
'list_of_payment_invoices' => 'List of invoices affected by the payment',
|
'list_of_payment_invoices' => 'Associate invoices',
|
||||||
'list_of_payment_methods' => 'List of payment methods',
|
'list_of_payment_methods' => 'List of payment methods',
|
||||||
'payment_method_details' => 'Details of payment method',
|
'payment_method_details' => 'Details of payment method',
|
||||||
'permanently_remove_payment_method' => 'Οριστική αφαίρεσηε αυτής της μεθόδου πληρωμής',
|
'permanently_remove_payment_method' => 'Οριστική αφαίρεσηε αυτής της μεθόδου πληρωμής',
|
||||||
@ -4925,7 +4925,7 @@ $lang = array(
|
|||||||
'no_assigned_tasks' => 'Δεν υπάρχουν χρεώσιμες εργασίες για αυτό το έργο',
|
'no_assigned_tasks' => 'Δεν υπάρχουν χρεώσιμες εργασίες για αυτό το έργο',
|
||||||
'authorization_failure' => 'Insufficient permissions to perform this action',
|
'authorization_failure' => 'Insufficient permissions to perform this action',
|
||||||
'authorization_sms_failure' => 'Please verify your account to send emails.',
|
'authorization_sms_failure' => 'Please verify your account to send emails.',
|
||||||
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key',
|
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key <br><br> You can manage your license here: https://invoiceninja.invoicing.co/client/login',
|
||||||
'payment_type_Klarna' => 'Klarna',
|
'payment_type_Klarna' => 'Klarna',
|
||||||
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
||||||
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
|
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
|
||||||
@ -5120,7 +5120,7 @@ $lang = array(
|
|||||||
'set_private' => 'Set private',
|
'set_private' => 'Set private',
|
||||||
'individual' => 'Individual',
|
'individual' => 'Individual',
|
||||||
'business' => 'Business',
|
'business' => 'Business',
|
||||||
'partnership' => 'partnership',
|
'partnership' => 'Partnership',
|
||||||
'trust' => 'Trust',
|
'trust' => 'Trust',
|
||||||
'charity' => 'Charity',
|
'charity' => 'Charity',
|
||||||
'government' => 'Government',
|
'government' => 'Government',
|
||||||
@ -5201,7 +5201,7 @@ $lang = array(
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Restart flow.',
|
'nordigen_handler_restart' => 'Restart flow.',
|
||||||
'nordigen_handler_return' => 'Return to application.',
|
'nordigen_handler_return' => 'Return to application.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Lao',
|
||||||
@ -5221,6 +5221,38 @@ $lang = array(
|
|||||||
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
||||||
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
||||||
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
||||||
|
'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile',
|
||||||
|
'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.',
|
||||||
|
'please_select_an_invoice_or_credit' => 'Please select an invoice or credit',
|
||||||
|
'mobile_version' => 'Mobile Version',
|
||||||
|
'venmo' => 'Venmo',
|
||||||
|
'my_bank' => 'MyBank',
|
||||||
|
'pay_later' => 'Pay Later',
|
||||||
|
'local_domain' => 'Local Domain',
|
||||||
|
'verify_peer' => 'Verify Peer',
|
||||||
|
'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key',
|
||||||
|
'ar_detailed' => 'Accounts Receivable Detailed',
|
||||||
|
'ar_summary' => 'Accounts Receivable Summary',
|
||||||
|
'client_sales' => 'Client Sales',
|
||||||
|
'user_sales' => 'User Sales',
|
||||||
|
'iframe_url' => 'iFrame URL',
|
||||||
|
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
||||||
|
'use_available_payments' => 'Use Available Payments',
|
||||||
|
'test_email_sent' => 'Successfully sent email',
|
||||||
|
'gateway_type' => 'Gateway Type',
|
||||||
|
'save_template_body' => 'Would you like to save this import mapping as a template for future use?',
|
||||||
|
'save_as_template' => 'Save Template Mapping',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'Ορίζει την προεπιλεγμένη <b>ημερομηνία ολοκλήρωσης<b> των τιμολογίων',
|
||||||
|
'payment_type_help' => 'Ορίζει τον προεπιλεγμένο <b>τρόπο χειροκίνητης πληρωμής</b>.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -460,7 +460,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Edit Token',
|
'edit_token' => 'Edit Token',
|
||||||
'delete_token' => 'Delete Token',
|
'delete_token' => 'Delete Token',
|
||||||
'token' => 'Token',
|
'token' => 'Token',
|
||||||
'add_gateway' => 'Add Gateway',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Delete Gateway',
|
'delete_gateway' => 'Delete Gateway',
|
||||||
'edit_gateway' => 'Edit Gateway',
|
'edit_gateway' => 'Edit Gateway',
|
||||||
'updated_gateway' => 'Successfully updated gateway',
|
'updated_gateway' => 'Successfully updated gateway',
|
||||||
@ -5203,7 +5203,7 @@ $lang = array(
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Restart flow.',
|
'nordigen_handler_restart' => 'Restart flow.',
|
||||||
'nordigen_handler_return' => 'Return to application.',
|
'nordigen_handler_return' => 'Return to application.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Lao',
|
||||||
@ -5242,6 +5242,22 @@ $lang = array(
|
|||||||
'use_available_payments' => 'Use Available Payments',
|
'use_available_payments' => 'Use Available Payments',
|
||||||
'test_email_sent' => 'Successfully sent email',
|
'test_email_sent' => 'Successfully sent email',
|
||||||
'gateway_type' => 'Gateway Type',
|
'gateway_type' => 'Gateway Type',
|
||||||
|
'save_template_body' => 'Would you like to save this import mapping as a template for future use?',
|
||||||
|
'save_as_template' => 'Save Template Mapping',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'The number of days after the invoice date that payment is due',
|
||||||
|
'payment_type_help' => 'The default payment type to be used for payments',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
'select_email_provider' => 'Set your email as the sending user',
|
||||||
|
'purchase_order_items' => 'Purchase Order Items',
|
||||||
|
'csv_rows_length' => 'No data found in this CSV file',
|
||||||
);
|
);
|
||||||
|
|
||||||
return $lang;
|
return $lang;
|
||||||
|
@ -460,7 +460,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Editar Token',
|
'edit_token' => 'Editar Token',
|
||||||
'delete_token' => 'Eliminar Token',
|
'delete_token' => 'Eliminar Token',
|
||||||
'token' => 'Token',
|
'token' => 'Token',
|
||||||
'add_gateway' => 'Agregar Gateway',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Eliminar Gateway',
|
'delete_gateway' => 'Eliminar Gateway',
|
||||||
'edit_gateway' => 'Editar Gateway',
|
'edit_gateway' => 'Editar Gateway',
|
||||||
'updated_gateway' => 'Gateway actualizado con éxito',
|
'updated_gateway' => 'Gateway actualizado con éxito',
|
||||||
@ -506,8 +506,8 @@ $lang = array(
|
|||||||
'auto_wrap' => 'Ajuste Automático de Línea',
|
'auto_wrap' => 'Ajuste Automático de Línea',
|
||||||
'duplicate_post' => 'Advertencia: la página anterior fue enviada dos veces. El segundo envío ha sido ignorado.',
|
'duplicate_post' => 'Advertencia: la página anterior fue enviada dos veces. El segundo envío ha sido ignorado.',
|
||||||
'view_documentation' => 'Ver Documentación',
|
'view_documentation' => 'Ver Documentación',
|
||||||
'app_title' => 'Free Online Invoicing',
|
'app_title' => 'Facturación en línea gratuita',
|
||||||
'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.',
|
'app_description' => 'Invoice Ninja es una solución gratuita de código abierto para facturar y facturar a los clientes. Con Invoice Ninja, puedes crear y enviar fácilmente hermosas facturas desde cualquier dispositivo que tenga acceso a la web. Sus clientes pueden imprimir sus facturas, descargarlas como archivos pdf e incluso pagarle en línea desde el sistema.',
|
||||||
'rows' => 'filas',
|
'rows' => 'filas',
|
||||||
'www' => 'www',
|
'www' => 'www',
|
||||||
'logo' => 'Logo',
|
'logo' => 'Logo',
|
||||||
@ -693,9 +693,9 @@ $lang = array(
|
|||||||
'disable' => 'Deshabilitado',
|
'disable' => 'Deshabilitado',
|
||||||
'invoice_quote_number' => 'Números de Cotización y Factura',
|
'invoice_quote_number' => 'Números de Cotización y Factura',
|
||||||
'invoice_charges' => 'Cargos de Factura',
|
'invoice_charges' => 'Cargos de Factura',
|
||||||
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact. <br><br> :error',
|
'notification_invoice_bounced' => 'No pudimos entregar la factura :invoice a :contact .<br><br> :error',
|
||||||
'notification_invoice_bounced_subject' => 'No fue posible entregar la Factura :invoice',
|
'notification_invoice_bounced_subject' => 'No fue posible entregar la Factura :invoice',
|
||||||
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact. <br><br> :error',
|
'notification_quote_bounced' => 'No pudimos entregar la cotización :invoice a :contact .<br><br> :error',
|
||||||
'notification_quote_bounced_subject' => 'No nos fue posible entregar la Cotización :invoice',
|
'notification_quote_bounced_subject' => 'No nos fue posible entregar la Cotización :invoice',
|
||||||
'custom_invoice_link' => 'Link Personalizado de Factura',
|
'custom_invoice_link' => 'Link Personalizado de Factura',
|
||||||
'total_invoiced' => 'Total Facturado',
|
'total_invoiced' => 'Total Facturado',
|
||||||
@ -3009,7 +3009,7 @@ $lang = array(
|
|||||||
'hosted_login' => 'Inicio de sesión alojado',
|
'hosted_login' => 'Inicio de sesión alojado',
|
||||||
'selfhost_login' => 'Iniciar sesión',
|
'selfhost_login' => 'Iniciar sesión',
|
||||||
'google_login' => 'Inicio de sesión de Google',
|
'google_login' => 'Inicio de sesión de Google',
|
||||||
'thanks_for_patience' => 'Thank for your patience while we work to implement these features.<br><br>We hope to have them completed in the next few months.<br><br>Until then we\'ll continue to support the',
|
'thanks_for_patience' => 'Gracias por su paciencia mientras trabajamos para implementar estas funciones.<br><br> Esperamos tenerlos terminados en los próximos meses.<br><br> Hasta entonces seguiremos apoyando a la',
|
||||||
'legacy_mobile_app' => 'aplicación móvil heredada',
|
'legacy_mobile_app' => 'aplicación móvil heredada',
|
||||||
'today' => 'Hoy',
|
'today' => 'Hoy',
|
||||||
'current' => 'Actual',
|
'current' => 'Actual',
|
||||||
@ -3867,7 +3867,7 @@ $lang = array(
|
|||||||
'cancellation_pending' => 'Cancelación pendiente, ¡nos pondremos en contacto!',
|
'cancellation_pending' => 'Cancelación pendiente, ¡nos pondremos en contacto!',
|
||||||
'list_of_payments' => 'Lista de pagos',
|
'list_of_payments' => 'Lista de pagos',
|
||||||
'payment_details' => 'Detalles del pago',
|
'payment_details' => 'Detalles del pago',
|
||||||
'list_of_payment_invoices' => 'Associate invoices',
|
'list_of_payment_invoices' => 'Facturas asociadas',
|
||||||
'list_of_payment_methods' => 'Lista de métodos de pago',
|
'list_of_payment_methods' => 'Lista de métodos de pago',
|
||||||
'payment_method_details' => 'Detalles del método de pago',
|
'payment_method_details' => 'Detalles del método de pago',
|
||||||
'permanently_remove_payment_method' => 'Eliminar permanentemente este método de pago.',
|
'permanently_remove_payment_method' => 'Eliminar permanentemente este método de pago.',
|
||||||
@ -4924,7 +4924,7 @@ $lang = array(
|
|||||||
'no_assigned_tasks' => 'No hay tareas facturables para este proyecto',
|
'no_assigned_tasks' => 'No hay tareas facturables para este proyecto',
|
||||||
'authorization_failure' => 'Permisos insuficientes para realizar esta acción',
|
'authorization_failure' => 'Permisos insuficientes para realizar esta acción',
|
||||||
'authorization_sms_failure' => 'Por favor verifique su cuenta para enviar correos electrónicos.',
|
'authorization_sms_failure' => 'Por favor verifique su cuenta para enviar correos electrónicos.',
|
||||||
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key <br><br> You can manage your license here: https://invoiceninja.invoicing.co/client/login',
|
'white_label_body' => 'Gracias por adquirir una licencia de marca blanca.<br><br> Su clave de licencia es:<br><br> :license_key<br><br> Puedes gestionar tu licencia aquí: https://invoiceninja.invoicing.co/client/login',
|
||||||
'payment_type_Klarna' => 'Klarna',
|
'payment_type_Klarna' => 'Klarna',
|
||||||
'payment_type_Interac E Transfer' => 'Transferencia Interac E',
|
'payment_type_Interac E Transfer' => 'Transferencia Interac E',
|
||||||
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
|
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
|
||||||
@ -5119,7 +5119,7 @@ $lang = array(
|
|||||||
'set_private' => 'Establecer privado',
|
'set_private' => 'Establecer privado',
|
||||||
'individual' => 'Individual',
|
'individual' => 'Individual',
|
||||||
'business' => 'Negocio',
|
'business' => 'Negocio',
|
||||||
'partnership' => 'Partnership',
|
'partnership' => 'Camaradería',
|
||||||
'trust' => 'Confianza',
|
'trust' => 'Confianza',
|
||||||
'charity' => 'Caridad',
|
'charity' => 'Caridad',
|
||||||
'government' => 'Gobierno',
|
'government' => 'Gobierno',
|
||||||
@ -5200,7 +5200,7 @@ $lang = array(
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'No está listo',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'No está listo',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'Llamaste a este sitio demasiado pronto. Finalice la autorización y actualice esta página. Póngase en contacto con el soporte para obtener ayuda si este problema persiste.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'Llamaste a este sitio demasiado pronto. Finalice la autorización y actualice esta página. Póngase en contacto con el soporte para obtener ayuda si este problema persiste.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'No hay cuentas seleccionadas',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'No hay cuentas seleccionadas',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'El servicio no ha devuelto ninguna cuenta válida. Considere reiniciar el flujo.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Reiniciar el flujo.',
|
'nordigen_handler_restart' => 'Reiniciar el flujo.',
|
||||||
'nordigen_handler_return' => 'Volver a la aplicación.',
|
'nordigen_handler_return' => 'Volver a la aplicación.',
|
||||||
'lang_Lao' => 'laosiano',
|
'lang_Lao' => 'laosiano',
|
||||||
@ -5210,32 +5210,49 @@ $lang = array(
|
|||||||
'select_provider' => 'Seleccionar Proveedor',
|
'select_provider' => 'Seleccionar Proveedor',
|
||||||
'nordigen_requisition_subject' => 'La solicitud expiró, vuelva a autenticarse.',
|
'nordigen_requisition_subject' => 'La solicitud expiró, vuelva a autenticarse.',
|
||||||
'nordigen_requisition_body' => 'El acceso a los feeds de cuentas bancarias ha caducado según lo establecido en el Acuerdo de usuario final.<br><br> Inicie sesión en Invoice Ninja y vuelva a autenticarse con sus bancos para continuar recibiendo transacciones.',
|
'nordigen_requisition_body' => 'El acceso a los feeds de cuentas bancarias ha caducado según lo establecido en el Acuerdo de usuario final.<br><br> Inicie sesión en Invoice Ninja y vuelva a autenticarse con sus bancos para continuar recibiendo transacciones.',
|
||||||
'participant' => 'Participant',
|
'participant' => 'Partícipe',
|
||||||
'participant_name' => 'Participant name',
|
'participant_name' => 'Nombre del participante',
|
||||||
'client_unsubscribed' => 'Client unsubscribed from emails.',
|
'client_unsubscribed' => 'El cliente se dio de baja de los correos electrónicos.',
|
||||||
'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.',
|
'client_unsubscribed_help' => 'El cliente :client se ha dado de baja de sus correos electrónicos. El cliente debe dar su consentimiento para recibir futuros correos electrónicos suyos.',
|
||||||
'resubscribe' => 'Resubscribe',
|
'resubscribe' => 'Volver a suscribirse',
|
||||||
'subscribe' => 'Subscribe',
|
'subscribe' => 'Suscribir',
|
||||||
'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.',
|
'subscribe_help' => 'Actualmente está suscrito y seguirá recibiendo comunicaciones por correo electrónico.',
|
||||||
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
'unsubscribe_help' => 'Actualmente no estás suscrito y, por lo tanto, no recibirás correos electrónicos en este momento.',
|
||||||
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
'notification_purchase_order_bounced' => 'No pudimos entregar la orden de compra :invoice a :contact .<br><br> :error',
|
||||||
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
'notification_purchase_order_bounced_subject' => 'No se puede entregar la orden de compra :invoice',
|
||||||
'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile',
|
'show_pdfhtml_on_mobile' => 'Mostrar la versión HTML de la entidad cuando se visualiza en un dispositivo móvil',
|
||||||
'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.',
|
'show_pdfhtml_on_mobile_help' => 'Para una visualización mejorada, muestra una versión HTML de la factura/cotización cuando se visualiza en el dispositivo móvil.',
|
||||||
'please_select_an_invoice_or_credit' => 'Please select an invoice or credit',
|
'please_select_an_invoice_or_credit' => 'Por favor seleccione una factura o crédito',
|
||||||
'mobile_version' => 'Mobile Version',
|
'mobile_version' => 'Version móvil',
|
||||||
'venmo' => 'Venmo',
|
'venmo' => 'Venmo',
|
||||||
'my_bank' => 'MyBank',
|
'my_bank' => 'Mi banco',
|
||||||
'pay_later' => 'Pay Later',
|
'pay_later' => 'Paga después',
|
||||||
'local_domain' => 'Local Domain',
|
'local_domain' => 'Dominio local',
|
||||||
'verify_peer' => 'Verify Peer',
|
'verify_peer' => 'Verificar par',
|
||||||
'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key',
|
'nordigen_help' => 'Nota: conectar una cuenta requiere una clave API de GoCardless/Nordigen',
|
||||||
'ar_detailed' => 'Accounts Receivable Detailed',
|
'ar_detailed' => 'Cuentas por cobrar detalladas',
|
||||||
'ar_summary' => 'Accounts Receivable Summary',
|
'ar_summary' => 'Resumen de cuentas por cobrar',
|
||||||
'client_sales' => 'Client Sales',
|
'client_sales' => 'Ventas al cliente',
|
||||||
'user_sales' => 'User Sales',
|
'user_sales' => 'Ventas de usuarios',
|
||||||
'iframe_url' => 'iFrame URL',
|
'iframe_url' => 'URL del marco flotante',
|
||||||
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
'user_unsubscribed' => 'Usuario dado de baja de los correos electrónicos :link',
|
||||||
|
'use_available_payments' => 'Usar pagos disponibles',
|
||||||
|
'test_email_sent' => 'Correo electrónico enviado correctamente',
|
||||||
|
'gateway_type' => 'Tipo de puerta de enlace',
|
||||||
|
'save_template_body' => '¿Le gustaría guardar este mapeo de importación como plantilla para uso futuro?',
|
||||||
|
'save_as_template' => 'Guardar asignación de plantilla',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'Establecer <b>fecha de vencimiento de la factura</b> por defecto',
|
||||||
|
'payment_type_help' => 'Establecer el <b>tipo de pago manual</b> por defecto.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return $lang;
|
return $lang;
|
||||||
|
@ -460,7 +460,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Editar Token',
|
'edit_token' => 'Editar Token',
|
||||||
'delete_token' => 'Eliminar Token',
|
'delete_token' => 'Eliminar Token',
|
||||||
'token' => 'Token',
|
'token' => 'Token',
|
||||||
'add_gateway' => 'Agregar Pasarela',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Eliminar Pasarela',
|
'delete_gateway' => 'Eliminar Pasarela',
|
||||||
'edit_gateway' => 'Editar Pasarela',
|
'edit_gateway' => 'Editar Pasarela',
|
||||||
'updated_gateway' => 'Pasarela actualizada correctamente',
|
'updated_gateway' => 'Pasarela actualizada correctamente',
|
||||||
@ -4921,7 +4921,7 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c
|
|||||||
'no_assigned_tasks' => 'No hay tareas facturables para este proyecto',
|
'no_assigned_tasks' => 'No hay tareas facturables para este proyecto',
|
||||||
'authorization_failure' => 'Permisos insuficientes para realizar esta acción',
|
'authorization_failure' => 'Permisos insuficientes para realizar esta acción',
|
||||||
'authorization_sms_failure' => 'Por favor verifique su cuenta para enviar correos electrónicos.',
|
'authorization_sms_failure' => 'Por favor verifique su cuenta para enviar correos electrónicos.',
|
||||||
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key <br><br> You can manage your license here: https://invoiceninja.invoicing.co/client/login',
|
'white_label_body' => 'Gracias por adquirir una licencia de marca blanca. <br><br> Su clave de licencia es: <br><br> :license_key <br><br> Puedes gestionar tu licencia aquí: https://invoiceninja.invoicing.co/client/login',
|
||||||
'payment_type_Klarna' => 'Klarna',
|
'payment_type_Klarna' => 'Klarna',
|
||||||
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
||||||
'xinvoice_payable' => 'Pagadero dentro de :payeddue días de pago vencido neto hasta :paydate',
|
'xinvoice_payable' => 'Pagadero dentro de :payeddue días de pago vencido neto hasta :paydate',
|
||||||
@ -5198,7 +5198,7 @@ De lo contrario, este campo deberá dejarse en blanco.',
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'No listo',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'No listo',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'Llamaste a este sitio demasiado pronto. Finalice la autorización y actualice esta página. Póngase en contacto con el soporte para obtener ayuda si este problema persiste.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'Llamaste a este sitio demasiado pronto. Finalice la autorización y actualice esta página. Póngase en contacto con el soporte para obtener ayuda si este problema persiste.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'No hay cuentas seleccionadas',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'No hay cuentas seleccionadas',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'El servicio no ha devuelto ninguna cuenta válida. Considere reiniciar el flujo.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Reiniciar el flujo.',
|
'nordigen_handler_restart' => 'Reiniciar el flujo.',
|
||||||
'nordigen_handler_return' => 'Volver a la aplicación.',
|
'nordigen_handler_return' => 'Volver a la aplicación.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Lao',
|
||||||
@ -5234,6 +5234,23 @@ De lo contrario, este campo deberá dejarse en blanco.',
|
|||||||
'user_sales' => 'Ventas de usuarios',
|
'user_sales' => 'Ventas de usuarios',
|
||||||
'iframe_url' => 'iFrame URL',
|
'iframe_url' => 'iFrame URL',
|
||||||
'user_unsubscribed' => 'Usuario dado de baja de los correos electrónicos :link',
|
'user_unsubscribed' => 'Usuario dado de baja de los correos electrónicos :link',
|
||||||
|
'use_available_payments' => 'Usar pagos disponibles',
|
||||||
|
'test_email_sent' => 'Correo electrónico enviado correctamente',
|
||||||
|
'gateway_type' => 'Tipo de puerta de enlace',
|
||||||
|
'save_template_body' => '¿Le gustaría guardar este mapeo de importación como plantilla para uso futuro?',
|
||||||
|
'save_as_template' => 'Guardar asignación de plantilla',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'Establezca la <b>fecha límite de pago de factura</b> por defecto',
|
||||||
|
'payment_type_help' => 'Establece el <b>tipo de pago manual</b> predeterminado.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return $lang;
|
return $lang;
|
||||||
|
@ -461,7 +461,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Redigeeri Tokenit',
|
'edit_token' => 'Redigeeri Tokenit',
|
||||||
'delete_token' => 'Kustuta Token',
|
'delete_token' => 'Kustuta Token',
|
||||||
'token' => 'Token',
|
'token' => 'Token',
|
||||||
'add_gateway' => 'Lisa Lüüs',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Kustuta Lüüs',
|
'delete_gateway' => 'Kustuta Lüüs',
|
||||||
'edit_gateway' => 'Muuda Lüüsi',
|
'edit_gateway' => 'Muuda Lüüsi',
|
||||||
'updated_gateway' => 'Makselahendus uuendatud',
|
'updated_gateway' => 'Makselahendus uuendatud',
|
||||||
@ -3868,7 +3868,7 @@ $lang = array(
|
|||||||
'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!',
|
'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!',
|
||||||
'list_of_payments' => 'List of payments',
|
'list_of_payments' => 'List of payments',
|
||||||
'payment_details' => 'Details of the payment',
|
'payment_details' => 'Details of the payment',
|
||||||
'list_of_payment_invoices' => 'List of invoices affected by the payment',
|
'list_of_payment_invoices' => 'Associate invoices',
|
||||||
'list_of_payment_methods' => 'List of payment methods',
|
'list_of_payment_methods' => 'List of payment methods',
|
||||||
'payment_method_details' => 'Details of payment method',
|
'payment_method_details' => 'Details of payment method',
|
||||||
'permanently_remove_payment_method' => 'Permanently remove this payment method.',
|
'permanently_remove_payment_method' => 'Permanently remove this payment method.',
|
||||||
@ -4925,7 +4925,7 @@ $lang = array(
|
|||||||
'no_assigned_tasks' => 'No billable tasks for this project',
|
'no_assigned_tasks' => 'No billable tasks for this project',
|
||||||
'authorization_failure' => 'Insufficient permissions to perform this action',
|
'authorization_failure' => 'Insufficient permissions to perform this action',
|
||||||
'authorization_sms_failure' => 'Please verify your account to send emails.',
|
'authorization_sms_failure' => 'Please verify your account to send emails.',
|
||||||
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key',
|
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key <br><br> You can manage your license here: https://invoiceninja.invoicing.co/client/login',
|
||||||
'payment_type_Klarna' => 'Klarna',
|
'payment_type_Klarna' => 'Klarna',
|
||||||
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
||||||
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
|
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
|
||||||
@ -5120,7 +5120,7 @@ $lang = array(
|
|||||||
'set_private' => 'Set private',
|
'set_private' => 'Set private',
|
||||||
'individual' => 'Individual',
|
'individual' => 'Individual',
|
||||||
'business' => 'Business',
|
'business' => 'Business',
|
||||||
'partnership' => 'partnership',
|
'partnership' => 'Partnership',
|
||||||
'trust' => 'Trust',
|
'trust' => 'Trust',
|
||||||
'charity' => 'Charity',
|
'charity' => 'Charity',
|
||||||
'government' => 'Government',
|
'government' => 'Government',
|
||||||
@ -5201,7 +5201,7 @@ $lang = array(
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Restart flow.',
|
'nordigen_handler_restart' => 'Restart flow.',
|
||||||
'nordigen_handler_return' => 'Return to application.',
|
'nordigen_handler_return' => 'Return to application.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Lao',
|
||||||
@ -5221,6 +5221,38 @@ $lang = array(
|
|||||||
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
||||||
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
||||||
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
||||||
|
'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile',
|
||||||
|
'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.',
|
||||||
|
'please_select_an_invoice_or_credit' => 'Please select an invoice or credit',
|
||||||
|
'mobile_version' => 'Mobile Version',
|
||||||
|
'venmo' => 'Venmo',
|
||||||
|
'my_bank' => 'MyBank',
|
||||||
|
'pay_later' => 'Pay Later',
|
||||||
|
'local_domain' => 'Local Domain',
|
||||||
|
'verify_peer' => 'Verify Peer',
|
||||||
|
'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key',
|
||||||
|
'ar_detailed' => 'Accounts Receivable Detailed',
|
||||||
|
'ar_summary' => 'Accounts Receivable Summary',
|
||||||
|
'client_sales' => 'Client Sales',
|
||||||
|
'user_sales' => 'User Sales',
|
||||||
|
'iframe_url' => 'iFrame URL',
|
||||||
|
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
||||||
|
'use_available_payments' => 'Use Available Payments',
|
||||||
|
'test_email_sent' => 'Successfully sent email',
|
||||||
|
'gateway_type' => 'Gateway Type',
|
||||||
|
'save_template_body' => 'Would you like to save this import mapping as a template for future use?',
|
||||||
|
'save_as_template' => 'Save Template Mapping',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'Määrab vaikimisi <b>arve tähtaeg</b>',
|
||||||
|
'payment_type_help' => 'Määrab vaikimisi <b>käsitsimakse tüüp</b>.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -460,7 +460,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Edit Token',
|
'edit_token' => 'Edit Token',
|
||||||
'delete_token' => 'Delete Token',
|
'delete_token' => 'Delete Token',
|
||||||
'token' => 'Token',
|
'token' => 'Token',
|
||||||
'add_gateway' => 'Add Gateway',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Delete Gateway',
|
'delete_gateway' => 'Delete Gateway',
|
||||||
'edit_gateway' => 'Edit Gateway',
|
'edit_gateway' => 'Edit Gateway',
|
||||||
'updated_gateway' => 'Successfully updated gateway',
|
'updated_gateway' => 'Successfully updated gateway',
|
||||||
@ -3868,7 +3868,7 @@ $lang = array(
|
|||||||
'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!',
|
'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!',
|
||||||
'list_of_payments' => 'List of payments',
|
'list_of_payments' => 'List of payments',
|
||||||
'payment_details' => 'Details of the payment',
|
'payment_details' => 'Details of the payment',
|
||||||
'list_of_payment_invoices' => 'List of invoices affected by the payment',
|
'list_of_payment_invoices' => 'Associate invoices',
|
||||||
'list_of_payment_methods' => 'List of payment methods',
|
'list_of_payment_methods' => 'List of payment methods',
|
||||||
'payment_method_details' => 'Details of payment method',
|
'payment_method_details' => 'Details of payment method',
|
||||||
'permanently_remove_payment_method' => 'Permanently remove this payment method.',
|
'permanently_remove_payment_method' => 'Permanently remove this payment method.',
|
||||||
@ -4925,7 +4925,7 @@ $lang = array(
|
|||||||
'no_assigned_tasks' => 'No billable tasks for this project',
|
'no_assigned_tasks' => 'No billable tasks for this project',
|
||||||
'authorization_failure' => 'Insufficient permissions to perform this action',
|
'authorization_failure' => 'Insufficient permissions to perform this action',
|
||||||
'authorization_sms_failure' => 'Please verify your account to send emails.',
|
'authorization_sms_failure' => 'Please verify your account to send emails.',
|
||||||
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key',
|
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key <br><br> You can manage your license here: https://invoiceninja.invoicing.co/client/login',
|
||||||
'payment_type_Klarna' => 'Klarna',
|
'payment_type_Klarna' => 'Klarna',
|
||||||
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
||||||
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
|
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
|
||||||
@ -5120,7 +5120,7 @@ $lang = array(
|
|||||||
'set_private' => 'Set private',
|
'set_private' => 'Set private',
|
||||||
'individual' => 'Individual',
|
'individual' => 'Individual',
|
||||||
'business' => 'Business',
|
'business' => 'Business',
|
||||||
'partnership' => 'partnership',
|
'partnership' => 'Partnership',
|
||||||
'trust' => 'Trust',
|
'trust' => 'Trust',
|
||||||
'charity' => 'Charity',
|
'charity' => 'Charity',
|
||||||
'government' => 'Government',
|
'government' => 'Government',
|
||||||
@ -5201,7 +5201,7 @@ $lang = array(
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Restart flow.',
|
'nordigen_handler_restart' => 'Restart flow.',
|
||||||
'nordigen_handler_return' => 'Return to application.',
|
'nordigen_handler_return' => 'Return to application.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Lao',
|
||||||
@ -5221,6 +5221,38 @@ $lang = array(
|
|||||||
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
||||||
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
||||||
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
||||||
|
'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile',
|
||||||
|
'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.',
|
||||||
|
'please_select_an_invoice_or_credit' => 'Please select an invoice or credit',
|
||||||
|
'mobile_version' => 'Mobile Version',
|
||||||
|
'venmo' => 'Venmo',
|
||||||
|
'my_bank' => 'MyBank',
|
||||||
|
'pay_later' => 'Pay Later',
|
||||||
|
'local_domain' => 'Local Domain',
|
||||||
|
'verify_peer' => 'Verify Peer',
|
||||||
|
'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key',
|
||||||
|
'ar_detailed' => 'Accounts Receivable Detailed',
|
||||||
|
'ar_summary' => 'Accounts Receivable Summary',
|
||||||
|
'client_sales' => 'Client Sales',
|
||||||
|
'user_sales' => 'User Sales',
|
||||||
|
'iframe_url' => 'iFrame URL',
|
||||||
|
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
||||||
|
'use_available_payments' => 'Use Available Payments',
|
||||||
|
'test_email_sent' => 'Successfully sent email',
|
||||||
|
'gateway_type' => 'Gateway Type',
|
||||||
|
'save_template_body' => 'Would you like to save this import mapping as a template for future use?',
|
||||||
|
'save_as_template' => 'Save Template Mapping',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'Sets the default <b>invoice due date</b>',
|
||||||
|
'payment_type_help' => 'Sets the default <b>manual payment type</b>.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -460,7 +460,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Muokkaa tokenia',
|
'edit_token' => 'Muokkaa tokenia',
|
||||||
'delete_token' => 'Poista token',
|
'delete_token' => 'Poista token',
|
||||||
'token' => 'Token',
|
'token' => 'Token',
|
||||||
'add_gateway' => 'Lisää maksunvälittäjä',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Poista maksunvälittäjä',
|
'delete_gateway' => 'Poista maksunvälittäjä',
|
||||||
'edit_gateway' => 'Muokkaa maksunvälittäjää',
|
'edit_gateway' => 'Muokkaa maksunvälittäjää',
|
||||||
'updated_gateway' => 'Maksunvälittäjä päivitetty onnistuneesti',
|
'updated_gateway' => 'Maksunvälittäjä päivitetty onnistuneesti',
|
||||||
@ -3868,7 +3868,7 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta
|
|||||||
'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!',
|
'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!',
|
||||||
'list_of_payments' => 'List of payments',
|
'list_of_payments' => 'List of payments',
|
||||||
'payment_details' => 'Details of the payment',
|
'payment_details' => 'Details of the payment',
|
||||||
'list_of_payment_invoices' => 'List of invoices affected by the payment',
|
'list_of_payment_invoices' => 'Associate invoices',
|
||||||
'list_of_payment_methods' => 'Lista maksutavoista',
|
'list_of_payment_methods' => 'Lista maksutavoista',
|
||||||
'payment_method_details' => 'Details of payment method',
|
'payment_method_details' => 'Details of payment method',
|
||||||
'permanently_remove_payment_method' => 'Permanently remove this payment method.',
|
'permanently_remove_payment_method' => 'Permanently remove this payment method.',
|
||||||
@ -4925,7 +4925,7 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta
|
|||||||
'no_assigned_tasks' => 'No billable tasks for this project',
|
'no_assigned_tasks' => 'No billable tasks for this project',
|
||||||
'authorization_failure' => 'Insufficient permissions to perform this action',
|
'authorization_failure' => 'Insufficient permissions to perform this action',
|
||||||
'authorization_sms_failure' => 'Please verify your account to send emails.',
|
'authorization_sms_failure' => 'Please verify your account to send emails.',
|
||||||
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key',
|
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key <br><br> You can manage your license here: https://invoiceninja.invoicing.co/client/login',
|
||||||
'payment_type_Klarna' => 'Klarna',
|
'payment_type_Klarna' => 'Klarna',
|
||||||
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
||||||
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
|
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
|
||||||
@ -5120,7 +5120,7 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta
|
|||||||
'set_private' => 'Set private',
|
'set_private' => 'Set private',
|
||||||
'individual' => 'Individual',
|
'individual' => 'Individual',
|
||||||
'business' => 'Business',
|
'business' => 'Business',
|
||||||
'partnership' => 'partnership',
|
'partnership' => 'Partnership',
|
||||||
'trust' => 'Trust',
|
'trust' => 'Trust',
|
||||||
'charity' => 'Charity',
|
'charity' => 'Charity',
|
||||||
'government' => 'Government',
|
'government' => 'Government',
|
||||||
@ -5201,7 +5201,7 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Restart flow.',
|
'nordigen_handler_restart' => 'Restart flow.',
|
||||||
'nordigen_handler_return' => 'Return to application.',
|
'nordigen_handler_return' => 'Return to application.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Lao',
|
||||||
@ -5221,6 +5221,38 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta
|
|||||||
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
||||||
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
||||||
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
||||||
|
'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile',
|
||||||
|
'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.',
|
||||||
|
'please_select_an_invoice_or_credit' => 'Please select an invoice or credit',
|
||||||
|
'mobile_version' => 'Mobile Version',
|
||||||
|
'venmo' => 'Venmo',
|
||||||
|
'my_bank' => 'MyBank',
|
||||||
|
'pay_later' => 'Pay Later',
|
||||||
|
'local_domain' => 'Local Domain',
|
||||||
|
'verify_peer' => 'Verify Peer',
|
||||||
|
'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key',
|
||||||
|
'ar_detailed' => 'Accounts Receivable Detailed',
|
||||||
|
'ar_summary' => 'Accounts Receivable Summary',
|
||||||
|
'client_sales' => 'Client Sales',
|
||||||
|
'user_sales' => 'User Sales',
|
||||||
|
'iframe_url' => 'iFrame URL',
|
||||||
|
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
||||||
|
'use_available_payments' => 'Use Available Payments',
|
||||||
|
'test_email_sent' => 'Successfully sent email',
|
||||||
|
'gateway_type' => 'Gateway Type',
|
||||||
|
'save_template_body' => 'Would you like to save this import mapping as a template for future use?',
|
||||||
|
'save_as_template' => 'Save Template Mapping',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'Asettaa <b>eräpäivään</b> vakioasetuksen',
|
||||||
|
'payment_type_help' => 'Asettaa oletuksena <b>manuaalisen maksutavan</b>.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -460,7 +460,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Éditer ce jeton',
|
'edit_token' => 'Éditer ce jeton',
|
||||||
'delete_token' => 'Supprimer ce jeton',
|
'delete_token' => 'Supprimer ce jeton',
|
||||||
'token' => 'Jeton',
|
'token' => 'Jeton',
|
||||||
'add_gateway' => 'Ajouter une passerelle',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Supprimer la passerelle',
|
'delete_gateway' => 'Supprimer la passerelle',
|
||||||
'edit_gateway' => 'Éditer la passerelle',
|
'edit_gateway' => 'Éditer la passerelle',
|
||||||
'updated_gateway' => 'Passerelle mise à jour avec succès',
|
'updated_gateway' => 'Passerelle mise à jour avec succès',
|
||||||
@ -506,8 +506,8 @@ $lang = array(
|
|||||||
'auto_wrap' => 'Retour à la ligne automatique',
|
'auto_wrap' => 'Retour à la ligne automatique',
|
||||||
'duplicate_post' => 'Attention: la page précédente a été soumise deux fois. La deuxième soumission a été ignorée.',
|
'duplicate_post' => 'Attention: la page précédente a été soumise deux fois. La deuxième soumission a été ignorée.',
|
||||||
'view_documentation' => 'Voir documentation',
|
'view_documentation' => 'Voir documentation',
|
||||||
'app_title' => 'Free Online Invoicing',
|
'app_title' => 'Facturation en ligne gratuite',
|
||||||
'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.',
|
'app_description' => 'Invoice Ninja est une solution gratuite et à code ouvert pour la facturation et la facturation des clients. Avec Invoice Ninja, vous pouvez facilement créer et envoyer de belles factures depuis n'importe quel appareil ayant accès au Web. Vos clients peuvent imprimer vos factures, les télécharger sous forme de fichiers PDF et même vous payer en ligne depuis le système.',
|
||||||
'rows' => 'lignes',
|
'rows' => 'lignes',
|
||||||
'www' => 'www',
|
'www' => 'www',
|
||||||
'logo' => 'Logo',
|
'logo' => 'Logo',
|
||||||
@ -693,9 +693,9 @@ $lang = array(
|
|||||||
'disable' => 'Désactiver',
|
'disable' => 'Désactiver',
|
||||||
'invoice_quote_number' => 'Numéro des devis & factures',
|
'invoice_quote_number' => 'Numéro des devis & factures',
|
||||||
'invoice_charges' => 'Majoration de facture',
|
'invoice_charges' => 'Majoration de facture',
|
||||||
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact. <br><br> :error',
|
'notification_invoice_bounced' => 'Nous n'avons pas pu transmettre la facture :invoice à :contact .<br><br> :error',
|
||||||
'notification_invoice_bounced_subject' => 'Impossible d\'envoyer la facture :invoice',
|
'notification_invoice_bounced_subject' => 'Impossible d\'envoyer la facture :invoice',
|
||||||
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact. <br><br> :error',
|
'notification_quote_bounced' => 'Nous n'avons pas pu transmettre le devis :invoice à :contact .<br><br> :error',
|
||||||
'notification_quote_bounced_subject' => 'Impossible d\'envoyer le devis :invoice',
|
'notification_quote_bounced_subject' => 'Impossible d\'envoyer le devis :invoice',
|
||||||
'custom_invoice_link' => 'Personnaliser le lien de la facture',
|
'custom_invoice_link' => 'Personnaliser le lien de la facture',
|
||||||
'total_invoiced' => 'Total facturé',
|
'total_invoiced' => 'Total facturé',
|
||||||
@ -3010,7 +3010,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
|||||||
'hosted_login' => 'Authentification Hosted',
|
'hosted_login' => 'Authentification Hosted',
|
||||||
'selfhost_login' => 'Authentification Selfhost',
|
'selfhost_login' => 'Authentification Selfhost',
|
||||||
'google_login' => 'Authentification Google',
|
'google_login' => 'Authentification Google',
|
||||||
'thanks_for_patience' => 'Thank for your patience while we work to implement these features.<br><br>We hope to have them completed in the next few months.<br><br>Until then we\'ll continue to support the',
|
'thanks_for_patience' => 'Merci de votre patience pendant que nous travaillons à la mise en œuvre de ces fonctionnalités.<br><br> Nous espérons les terminer dans les prochains mois.<br><br> D'ici là, nous continuerons à soutenir le',
|
||||||
'legacy_mobile_app' => 'Ancienne App mobile',
|
'legacy_mobile_app' => 'Ancienne App mobile',
|
||||||
'today' => 'Aujourd\'hui',
|
'today' => 'Aujourd\'hui',
|
||||||
'current' => 'Actuel',
|
'current' => 'Actuel',
|
||||||
@ -3868,7 +3868,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
|||||||
'cancellation_pending' => 'Annulation en cours, nous vous contacterons !',
|
'cancellation_pending' => 'Annulation en cours, nous vous contacterons !',
|
||||||
'list_of_payments' => 'Liste des paiements',
|
'list_of_payments' => 'Liste des paiements',
|
||||||
'payment_details' => 'Détails du paiement',
|
'payment_details' => 'Détails du paiement',
|
||||||
'list_of_payment_invoices' => 'Associate invoices',
|
'list_of_payment_invoices' => 'Factures associées',
|
||||||
'list_of_payment_methods' => 'Liste des moyens de paiement',
|
'list_of_payment_methods' => 'Liste des moyens de paiement',
|
||||||
'payment_method_details' => 'Détails du mode de paiement',
|
'payment_method_details' => 'Détails du mode de paiement',
|
||||||
'permanently_remove_payment_method' => 'Supprimer définitivement ce mode de paiement.',
|
'permanently_remove_payment_method' => 'Supprimer définitivement ce mode de paiement.',
|
||||||
@ -4925,7 +4925,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
|||||||
'no_assigned_tasks' => 'Aucune tâche facturable pour ce projet',
|
'no_assigned_tasks' => 'Aucune tâche facturable pour ce projet',
|
||||||
'authorization_failure' => 'Autorisations insuffisantes pour effectuer cette action',
|
'authorization_failure' => 'Autorisations insuffisantes pour effectuer cette action',
|
||||||
'authorization_sms_failure' => 'Veuillez vérifier votre compte pour envoyer des e-mails.',
|
'authorization_sms_failure' => 'Veuillez vérifier votre compte pour envoyer des e-mails.',
|
||||||
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key <br><br> You can manage your license here: https://invoiceninja.invoicing.co/client/login',
|
'white_label_body' => 'Merci d'avoir acheté une licence en marque blanche.<br><br> Votre clé de licence est :<br><br> :license_key<br><br> Vous pouvez gérer votre licence ici : https://invoiceninja.invoicing.co/client/login',
|
||||||
'payment_type_Klarna' => 'Klarna',
|
'payment_type_Klarna' => 'Klarna',
|
||||||
'payment_type_Interac E Transfer' => 'Virement Interac E',
|
'payment_type_Interac E Transfer' => 'Virement Interac E',
|
||||||
'xinvoice_payable' => 'Payable sous :payeddue days net jusqu\'au :paydate',
|
'xinvoice_payable' => 'Payable sous :payeddue days net jusqu\'au :paydate',
|
||||||
@ -5090,7 +5090,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
|||||||
'region' => 'Région',
|
'region' => 'Région',
|
||||||
'county' => 'Comté',
|
'county' => 'Comté',
|
||||||
'tax_details' => 'Détails fiscaux',
|
'tax_details' => 'Détails fiscaux',
|
||||||
'activity_10_online' => ':contact made payment :payment for invoice :invoice for :client',
|
'activity_10_online' => ':contact a effectué le paiement :payment pour la facture :invoice pour :client',
|
||||||
'activity_10_manual' => ':user a saisi le paiement :payment pour la facture :invoice pour :client',
|
'activity_10_manual' => ':user a saisi le paiement :payment pour la facture :invoice pour :client',
|
||||||
'default_payment_type' => 'Type de paiement par défaut',
|
'default_payment_type' => 'Type de paiement par défaut',
|
||||||
'number_precision' => 'Précision du nombre',
|
'number_precision' => 'Précision du nombre',
|
||||||
@ -5120,7 +5120,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
|||||||
'set_private' => 'Définir comme privé',
|
'set_private' => 'Définir comme privé',
|
||||||
'individual' => 'Individuel',
|
'individual' => 'Individuel',
|
||||||
'business' => 'Entreprise',
|
'business' => 'Entreprise',
|
||||||
'partnership' => 'Partnership',
|
'partnership' => 'Partenariat',
|
||||||
'trust' => 'Confiance',
|
'trust' => 'Confiance',
|
||||||
'charity' => 'Charité',
|
'charity' => 'Charité',
|
||||||
'government' => 'Gouvernement',
|
'government' => 'Gouvernement',
|
||||||
@ -5201,42 +5201,59 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'Pas prêt',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'Pas prêt',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'Vous avez appelé ce site trop tôt. Veuillez terminer l'autorisation et actualiser cette page. Contactez le support pour obtenir de l'aide si ce problème persiste.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'Vous avez appelé ce site trop tôt. Veuillez terminer l'autorisation et actualiser cette page. Contactez le support pour obtenir de l'aide si ce problème persiste.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'Aucun compte sélectionné',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'Aucun compte sélectionné',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'Le service n'a renvoyé aucun compte valide. Pensez à redémarrer le flux.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Redémarrez le flux.',
|
'nordigen_handler_restart' => 'Redémarrez le flux.',
|
||||||
'nordigen_handler_return' => 'Retour à la candidature.',
|
'nordigen_handler_return' => 'Retour à la candidature.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Laotien',
|
||||||
'currency_lao_kip' => 'Lao kip',
|
'currency_lao_kip' => 'Kip laotien',
|
||||||
'yodlee_regions' => 'Regions: USA, UK, Australia & India',
|
'yodlee_regions' => 'Régions : États-Unis, Royaume-Uni, Australie et Inde',
|
||||||
'nordigen_regions' => 'Regions: Europe & UK',
|
'nordigen_regions' => 'Régions : Europe et Royaume-Uni',
|
||||||
'select_provider' => 'Select Provider',
|
'select_provider' => 'Sélectionnez le fournisseur',
|
||||||
'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.',
|
'nordigen_requisition_subject' => 'La demande a expiré, veuillez vous authentifier à nouveau.',
|
||||||
'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement. <br><br>Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.',
|
'nordigen_requisition_body' => 'L'accès aux flux des comptes bancaires a expiré comme indiqué dans le Contrat de l'utilisateur final.<br><br> Veuillez vous connecter à Invoice Ninja et vous authentifier à nouveau auprès de vos banques pour continuer à recevoir des transactions.',
|
||||||
'participant' => 'Participant',
|
'participant' => 'Participant',
|
||||||
'participant_name' => 'Participant name',
|
'participant_name' => 'Nom du participant',
|
||||||
'client_unsubscribed' => 'Client unsubscribed from emails.',
|
'client_unsubscribed' => 'Client désabonné des e-mails.',
|
||||||
'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.',
|
'client_unsubscribed_help' => 'Le client :client s'est désabonné de vos e-mails. Le client doit consentir à recevoir de futurs e-mails de votre part.',
|
||||||
'resubscribe' => 'Resubscribe',
|
'resubscribe' => 'Réabonnez-vous',
|
||||||
'subscribe' => 'Subscribe',
|
'subscribe' => 'S'abonner',
|
||||||
'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.',
|
'subscribe_help' => 'Vous êtes actuellement abonné et continuerez à recevoir des communications par courrier électronique.',
|
||||||
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
'unsubscribe_help' => 'Vous n'êtes actuellement pas abonné et ne recevrez donc pas d'e-mails pour le moment.',
|
||||||
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
'notification_purchase_order_bounced' => 'Nous n'avons pas pu livrer le bon de commande :invoice à :contact .<br><br> :error',
|
||||||
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
'notification_purchase_order_bounced_subject' => 'Impossible de livrer le bon de commande :invoice',
|
||||||
'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile',
|
'show_pdfhtml_on_mobile' => 'Afficher la version HTML de l'entité lors de la visualisation sur mobile',
|
||||||
'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.',
|
'show_pdfhtml_on_mobile_help' => 'Pour une visualisation améliorée, affiche une version HTML de la facture/devis lors de la visualisation sur mobile.',
|
||||||
'please_select_an_invoice_or_credit' => 'Please select an invoice or credit',
|
'please_select_an_invoice_or_credit' => 'Veuillez sélectionner une facture ou un crédit',
|
||||||
'mobile_version' => 'Mobile Version',
|
'mobile_version' => 'Version mobile',
|
||||||
'venmo' => 'Venmo',
|
'venmo' => 'Venmo',
|
||||||
'my_bank' => 'MyBank',
|
'my_bank' => 'Ma banque',
|
||||||
'pay_later' => 'Pay Later',
|
'pay_later' => 'Payer plus tard',
|
||||||
'local_domain' => 'Local Domain',
|
'local_domain' => 'Domaine local',
|
||||||
'verify_peer' => 'Verify Peer',
|
'verify_peer' => 'Vérifier le pair',
|
||||||
'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key',
|
'nordigen_help' => 'Remarque : la connexion d'un compte nécessite une clé API GoCardless/Nordigen',
|
||||||
'ar_detailed' => 'Accounts Receivable Detailed',
|
'ar_detailed' => 'Comptes clients détaillés',
|
||||||
'ar_summary' => 'Accounts Receivable Summary',
|
'ar_summary' => 'Sommaire des comptes clients',
|
||||||
'client_sales' => 'Client Sales',
|
'client_sales' => 'Ventes clients',
|
||||||
'user_sales' => 'User Sales',
|
'user_sales' => 'Ventes aux utilisateurs',
|
||||||
'iframe_url' => 'iFrame URL',
|
'iframe_url' => 'URL iFrame',
|
||||||
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
'user_unsubscribed' => 'Utilisateur désabonné des e-mails :link',
|
||||||
|
'use_available_payments' => 'Utiliser les paiements disponibles',
|
||||||
|
'test_email_sent' => 'E-mail envoyé avec succès',
|
||||||
|
'gateway_type' => 'Type de passerelle',
|
||||||
|
'save_template_body' => 'Souhaitez-vous enregistrer ce mappage d’importation en tant que modèle pour une utilisation future ?',
|
||||||
|
'save_as_template' => 'Enregistrer le mappage de modèle',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'Définit <b>la date d\'échéance de la facture</b> par défaut ',
|
||||||
|
'payment_type_help' => 'Définit le <b>type de paiement manuel </b> par défaut.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return $lang;
|
return $lang;
|
||||||
|
@ -460,7 +460,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Éditer le jeton',
|
'edit_token' => 'Éditer le jeton',
|
||||||
'delete_token' => 'Supprimer le jeton',
|
'delete_token' => 'Supprimer le jeton',
|
||||||
'token' => 'Jeton',
|
'token' => 'Jeton',
|
||||||
'add_gateway' => 'Ajouter une passerelle',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Supprimer la passerelle',
|
'delete_gateway' => 'Supprimer la passerelle',
|
||||||
'edit_gateway' => 'Éditer la passerelle',
|
'edit_gateway' => 'Éditer la passerelle',
|
||||||
'updated_gateway' => 'La passerelle a été mise à jour',
|
'updated_gateway' => 'La passerelle a été mise à jour',
|
||||||
@ -5198,7 +5198,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'Pas prêt',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'Pas prêt',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'Vous avez contacté ce site trop tôt. Veuillez terminer l\'autorisation et rafraîchir cette page. Contactez le support pour obtenir de l\'aide si ce problème persiste.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'Vous avez contacté ce site trop tôt. Veuillez terminer l\'autorisation et rafraîchir cette page. Contactez le support pour obtenir de l\'aide si ce problème persiste.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'Aucun compte sélectionné',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'Aucun compte sélectionné',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'Le service n\'a retourné aucun compte valide. Veuillez redémarrer le processus.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'Le service n’a retourné aucun compte valide. Veuillez redémarrer le processus.',
|
||||||
'nordigen_handler_restart' => 'Redémarrer le processus',
|
'nordigen_handler_restart' => 'Redémarrer le processus',
|
||||||
'nordigen_handler_return' => 'Retour à l\'application',
|
'nordigen_handler_return' => 'Retour à l\'application',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Lao',
|
||||||
@ -5234,6 +5234,23 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
|||||||
'user_sales' => 'Ventes de l\'utilisateur',
|
'user_sales' => 'Ventes de l\'utilisateur',
|
||||||
'iframe_url' => 'URL de l\'iFrame',
|
'iframe_url' => 'URL de l\'iFrame',
|
||||||
'user_unsubscribed' => 'Utilisateur désabonné des courriels :link',
|
'user_unsubscribed' => 'Utilisateur désabonné des courriels :link',
|
||||||
|
'use_available_payments' => 'Utilisez les paiements disponibles',
|
||||||
|
'test_email_sent' => 'Le courriel a été envoyé',
|
||||||
|
'gateway_type' => 'Type de passerelle',
|
||||||
|
'save_template_body' => 'Souhaitez-vous enregistrer cette correspondance d\'importation en tant que modèle pour une utilisation future ?',
|
||||||
|
'save_as_template' => 'Enregistrer la correspondance de modèle',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Facturer automatiquement les factures régulières à la date d\'échéance',
|
||||||
|
'auto_bill_on_help' => 'Facturation automatique à la date d\'envoi OU à la date d\'échéance (factures récurrentes)',
|
||||||
|
'use_available_credits_help' => 'Appliquer tout solde de crédit aux paiements avant de facturer une méthode de paiement',
|
||||||
|
'use_unapplied_payments' => 'Utiliser les paiements non appliqués',
|
||||||
|
'use_unapplied_payments_help' => 'Appliquer tout solde de paiement avant de facturer une méthode de paiement',
|
||||||
|
'payment_terms_help' => 'Définit la <b>date d\'échéance de la facture</b> par défaut',
|
||||||
|
'payment_type_help' => 'Définit le <b>type de paiement manuel<b/> par défaut.',
|
||||||
|
'quote_valid_until_help' => 'Le nombre de jours pour lesquels la soumission est valide',
|
||||||
|
'expense_payment_type_help' => 'Le type de paiement de dépenses par défaut à utiliser',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return $lang;
|
return $lang;
|
||||||
|
@ -460,7 +460,7 @@ $lang = array(
|
|||||||
'edit_token' => 'Éditer le jeton',
|
'edit_token' => 'Éditer le jeton',
|
||||||
'delete_token' => 'Supprimer le jeton',
|
'delete_token' => 'Supprimer le jeton',
|
||||||
'token' => 'Jeton',
|
'token' => 'Jeton',
|
||||||
'add_gateway' => 'Ajouter une passerelle',
|
'add_gateway' => 'Add Payment Gateway',
|
||||||
'delete_gateway' => 'Supprimer la passerelle',
|
'delete_gateway' => 'Supprimer la passerelle',
|
||||||
'edit_gateway' => 'Éditer la passerelle',
|
'edit_gateway' => 'Éditer la passerelle',
|
||||||
'updated_gateway' => 'La passerelle a été mise à jour avec succès',
|
'updated_gateway' => 'La passerelle a été mise à jour avec succès',
|
||||||
@ -506,8 +506,8 @@ $lang = array(
|
|||||||
'auto_wrap' => 'Retour à la ligne automatique',
|
'auto_wrap' => 'Retour à la ligne automatique',
|
||||||
'duplicate_post' => 'Avertissement: la page précédente a été envoyée deux fois. Le deuxième envoi a été ignoré.',
|
'duplicate_post' => 'Avertissement: la page précédente a été envoyée deux fois. Le deuxième envoi a été ignoré.',
|
||||||
'view_documentation' => 'Voir la documentation',
|
'view_documentation' => 'Voir la documentation',
|
||||||
'app_title' => 'Free Online Invoicing',
|
'app_title' => 'Facturation en ligne gratuite',
|
||||||
'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.',
|
'app_description' => 'Invoice Ninja est une solution gratuite et à code ouvert pour la facturation et la facturation des clients. Avec Invoice Ninja, vous pouvez facilement créer et envoyer de belles factures depuis n'importe quel appareil ayant accès au Web. Vos clients peuvent imprimer vos factures, les télécharger sous forme de fichiers PDF et même vous payer en ligne depuis le système.',
|
||||||
'rows' => 'lignes',
|
'rows' => 'lignes',
|
||||||
'www' => 'www',
|
'www' => 'www',
|
||||||
'logo' => 'Logo',
|
'logo' => 'Logo',
|
||||||
@ -693,9 +693,9 @@ $lang = array(
|
|||||||
'disable' => 'Désactiver',
|
'disable' => 'Désactiver',
|
||||||
'invoice_quote_number' => 'Numéro des offres & factures',
|
'invoice_quote_number' => 'Numéro des offres & factures',
|
||||||
'invoice_charges' => 'Suppléments de facture',
|
'invoice_charges' => 'Suppléments de facture',
|
||||||
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact. <br><br> :error',
|
'notification_invoice_bounced' => 'Nous n'avons pas pu transmettre la facture :invoice à :contact .<br><br> :error',
|
||||||
'notification_invoice_bounced_subject' => 'Impossible d\'envoyer la facture :invoice',
|
'notification_invoice_bounced_subject' => 'Impossible d\'envoyer la facture :invoice',
|
||||||
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact. <br><br> :error',
|
'notification_quote_bounced' => 'Nous n'avons pas pu transmettre le devis :invoice à :contact .<br><br> :error',
|
||||||
'notification_quote_bounced_subject' => 'Impossible d\'envoyer l\'offre :invoice',
|
'notification_quote_bounced_subject' => 'Impossible d\'envoyer l\'offre :invoice',
|
||||||
'custom_invoice_link' => 'Lien de facture personnalisé',
|
'custom_invoice_link' => 'Lien de facture personnalisé',
|
||||||
'total_invoiced' => 'Total facturé',
|
'total_invoiced' => 'Total facturé',
|
||||||
@ -3007,7 +3007,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
|||||||
'hosted_login' => 'Connexion hébergée',
|
'hosted_login' => 'Connexion hébergée',
|
||||||
'selfhost_login' => 'Connexion autohébergée',
|
'selfhost_login' => 'Connexion autohébergée',
|
||||||
'google_login' => 'Connexion Google',
|
'google_login' => 'Connexion Google',
|
||||||
'thanks_for_patience' => 'Thank for your patience while we work to implement these features.<br><br>We hope to have them completed in the next few months.<br><br>Until then we\'ll continue to support the',
|
'thanks_for_patience' => 'Merci de votre patience pendant que nous travaillons à la mise en œuvre de ces fonctionnalités.<br><br> Nous espérons les terminer dans les prochains mois.<br><br> D'ici là, nous continuerons à soutenir le',
|
||||||
'legacy_mobile_app' => 'Ancienne App mobile',
|
'legacy_mobile_app' => 'Ancienne App mobile',
|
||||||
'today' => 'Aujourd\'hui',
|
'today' => 'Aujourd\'hui',
|
||||||
'current' => 'En cours',
|
'current' => 'En cours',
|
||||||
@ -3865,7 +3865,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
|||||||
'cancellation_pending' => 'Annulation en attente. Nous vous tiendrons au courant.',
|
'cancellation_pending' => 'Annulation en attente. Nous vous tiendrons au courant.',
|
||||||
'list_of_payments' => 'Liste des paiements',
|
'list_of_payments' => 'Liste des paiements',
|
||||||
'payment_details' => 'Détails du paiement',
|
'payment_details' => 'Détails du paiement',
|
||||||
'list_of_payment_invoices' => 'Associate invoices',
|
'list_of_payment_invoices' => 'Factures associées',
|
||||||
'list_of_payment_methods' => 'Liste des modes de paiement',
|
'list_of_payment_methods' => 'Liste des modes de paiement',
|
||||||
'payment_method_details' => 'Détails du mode de paiement',
|
'payment_method_details' => 'Détails du mode de paiement',
|
||||||
'permanently_remove_payment_method' => 'Supprimer de façon définitive ce mode de paiement',
|
'permanently_remove_payment_method' => 'Supprimer de façon définitive ce mode de paiement',
|
||||||
@ -4922,7 +4922,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
|||||||
'no_assigned_tasks' => 'Aucune intervetion facturable pour ce projet',
|
'no_assigned_tasks' => 'Aucune intervetion facturable pour ce projet',
|
||||||
'authorization_failure' => 'Insufficient permissions to perform this action',
|
'authorization_failure' => 'Insufficient permissions to perform this action',
|
||||||
'authorization_sms_failure' => 'Please verify your account to send emails.',
|
'authorization_sms_failure' => 'Please verify your account to send emails.',
|
||||||
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key <br><br> You can manage your license here: https://invoiceninja.invoicing.co/client/login',
|
'white_label_body' => 'Merci d'avoir acheté une licence en marque blanche.<br><br> Votre clé de licence est :<br><br> :license_key<br><br> Vous pouvez gérer votre licence ici : https://invoiceninja.invoicing.co/client/login',
|
||||||
'payment_type_Klarna' => 'Klarna',
|
'payment_type_Klarna' => 'Klarna',
|
||||||
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
||||||
'xinvoice_payable' => 'Payable sous :payeddue jours net jusqu'à :paydate',
|
'xinvoice_payable' => 'Payable sous :payeddue jours net jusqu'à :paydate',
|
||||||
@ -5117,7 +5117,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
|||||||
'set_private' => 'Définir comme privé',
|
'set_private' => 'Définir comme privé',
|
||||||
'individual' => 'Individuel',
|
'individual' => 'Individuel',
|
||||||
'business' => 'Entreprise',
|
'business' => 'Entreprise',
|
||||||
'partnership' => 'Partnership',
|
'partnership' => 'Partenariat',
|
||||||
'trust' => 'Confiance',
|
'trust' => 'Confiance',
|
||||||
'charity' => 'Charité',
|
'charity' => 'Charité',
|
||||||
'government' => 'Gouvernement',
|
'government' => 'Gouvernement',
|
||||||
@ -5198,42 +5198,59 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
|||||||
'nordigen_handler_error_heading_requisition_invalid_status' => 'Pas prêt',
|
'nordigen_handler_error_heading_requisition_invalid_status' => 'Pas prêt',
|
||||||
'nordigen_handler_error_contents_requisition_invalid_status' => 'Vous avez appelé ce site trop tôt. Veuillez terminer l'autorisation et actualiser cette page. Contactez le support pour obtenir de l'aide si ce problème persiste.',
|
'nordigen_handler_error_contents_requisition_invalid_status' => 'Vous avez appelé ce site trop tôt. Veuillez terminer l'autorisation et actualiser cette page. Contactez le support pour obtenir de l'aide si ce problème persiste.',
|
||||||
'nordigen_handler_error_heading_requisition_no_accounts' => 'Aucun compte sélectionné',
|
'nordigen_handler_error_heading_requisition_no_accounts' => 'Aucun compte sélectionné',
|
||||||
'nordigen_handler_error_contents_requisition_no_accounts' => 'Le service n'a renvoyé aucun compte valide. Pensez à redémarrer le flux.',
|
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
|
||||||
'nordigen_handler_restart' => 'Redémarrez le flux.',
|
'nordigen_handler_restart' => 'Redémarrez le flux.',
|
||||||
'nordigen_handler_return' => 'Retour à la candidature.',
|
'nordigen_handler_return' => 'Retour à la candidature.',
|
||||||
'lang_Lao' => 'Lao',
|
'lang_Lao' => 'Laotien',
|
||||||
'currency_lao_kip' => 'Lao kip',
|
'currency_lao_kip' => 'Kip laotien',
|
||||||
'yodlee_regions' => 'Regions: USA, UK, Australia & India',
|
'yodlee_regions' => 'Régions : États-Unis, Royaume-Uni, Australie et Inde',
|
||||||
'nordigen_regions' => 'Regions: Europe & UK',
|
'nordigen_regions' => 'Régions : Europe et Royaume-Uni',
|
||||||
'select_provider' => 'Select Provider',
|
'select_provider' => 'Sélectionnez le fournisseur',
|
||||||
'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.',
|
'nordigen_requisition_subject' => 'La demande a expiré, veuillez vous authentifier à nouveau.',
|
||||||
'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement. <br><br>Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.',
|
'nordigen_requisition_body' => 'L'accès aux flux des comptes bancaires a expiré comme indiqué dans le Contrat de l'utilisateur final.<br><br> Veuillez vous connecter à Invoice Ninja et vous authentifier à nouveau auprès de vos banques pour continuer à recevoir des transactions.',
|
||||||
'participant' => 'Participant',
|
'participant' => 'Participant',
|
||||||
'participant_name' => 'Participant name',
|
'participant_name' => 'Nom du participant',
|
||||||
'client_unsubscribed' => 'Client unsubscribed from emails.',
|
'client_unsubscribed' => 'Client désabonné des e-mails.',
|
||||||
'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.',
|
'client_unsubscribed_help' => 'Le client :client s'est désabonné de vos e-mails. Le client doit consentir à recevoir de futurs e-mails de votre part.',
|
||||||
'resubscribe' => 'Resubscribe',
|
'resubscribe' => 'Réabonnez-vous',
|
||||||
'subscribe' => 'Subscribe',
|
'subscribe' => 'S'abonner',
|
||||||
'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.',
|
'subscribe_help' => 'Vous êtes actuellement abonné et continuerez à recevoir des communications par courrier électronique.',
|
||||||
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
|
'unsubscribe_help' => 'Vous n'êtes actuellement pas abonné et ne recevrez donc pas d'e-mails pour le moment.',
|
||||||
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
|
'notification_purchase_order_bounced' => 'Nous n'avons pas pu livrer le bon de commande :invoice à :contact .<br><br> :error',
|
||||||
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
|
'notification_purchase_order_bounced_subject' => 'Impossible de livrer le bon de commande :invoice',
|
||||||
'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile',
|
'show_pdfhtml_on_mobile' => 'Afficher la version HTML de l'entité lors de la visualisation sur mobile',
|
||||||
'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.',
|
'show_pdfhtml_on_mobile_help' => 'Pour une visualisation améliorée, affiche une version HTML de la facture/devis lors de la visualisation sur mobile.',
|
||||||
'please_select_an_invoice_or_credit' => 'Please select an invoice or credit',
|
'please_select_an_invoice_or_credit' => 'Veuillez sélectionner une facture ou un crédit',
|
||||||
'mobile_version' => 'Mobile Version',
|
'mobile_version' => 'Version mobile',
|
||||||
'venmo' => 'Venmo',
|
'venmo' => 'Venmo',
|
||||||
'my_bank' => 'MyBank',
|
'my_bank' => 'Ma banque',
|
||||||
'pay_later' => 'Pay Later',
|
'pay_later' => 'Payer plus tard',
|
||||||
'local_domain' => 'Local Domain',
|
'local_domain' => 'Domaine local',
|
||||||
'verify_peer' => 'Verify Peer',
|
'verify_peer' => 'Vérifier le pair',
|
||||||
'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key',
|
'nordigen_help' => 'Remarque : la connexion d'un compte nécessite une clé API GoCardless/Nordigen',
|
||||||
'ar_detailed' => 'Accounts Receivable Detailed',
|
'ar_detailed' => 'Comptes clients détaillés',
|
||||||
'ar_summary' => 'Accounts Receivable Summary',
|
'ar_summary' => 'Sommaire des comptes clients',
|
||||||
'client_sales' => 'Client Sales',
|
'client_sales' => 'Ventes clients',
|
||||||
'user_sales' => 'User Sales',
|
'user_sales' => 'Ventes aux utilisateurs',
|
||||||
'iframe_url' => 'iFrame URL',
|
'iframe_url' => 'URL iFrame',
|
||||||
'user_unsubscribed' => 'User unsubscribed from emails :link',
|
'user_unsubscribed' => 'Utilisateur désabonné des e-mails :link',
|
||||||
|
'use_available_payments' => 'Utiliser les paiements disponibles',
|
||||||
|
'test_email_sent' => 'E-mail envoyé avec succès',
|
||||||
|
'gateway_type' => 'Type de passerelle',
|
||||||
|
'save_template_body' => 'Souhaitez-vous enregistrer ce mappage d’importation en tant que modèle pour une utilisation future ?',
|
||||||
|
'save_as_template' => 'Enregistrer le mappage de modèle',
|
||||||
|
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
|
||||||
|
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
|
||||||
|
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
|
||||||
|
'use_unapplied_payments' => 'Use unapplied payments',
|
||||||
|
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
|
||||||
|
'payment_terms_help' => 'Définit la <b>date d\'échéance de la facture</b> par défaut',
|
||||||
|
'payment_type_help' => 'Définit le <b>type de paiement manuel<b/> par défaut.',
|
||||||
|
'quote_valid_until_help' => 'The number of days that the quote is valid for',
|
||||||
|
'expense_payment_type_help' => 'The default expense payment type to be used',
|
||||||
|
'paylater' => 'Pay in 4',
|
||||||
|
'payment_provider' => 'Payment Provider',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return $lang;
|
return $lang;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user