Merge pull request #8951 from turbo124/v5-develop

v5.7.46
This commit is contained in:
David Bomba 2023-11-11 00:17:04 +11:00 committed by GitHub
commit 427b781da3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
61 changed files with 6222 additions and 5668 deletions

View File

@ -1 +1 @@
5.7.45
5.7.46

View File

@ -172,18 +172,13 @@ class SendRemindersCron extends Command
/**Refresh Invoice values*/
$invoice->calc()->getInvoice()->save();
$invoice->fresh();
// $invoice->service()->deletePdf()->save();
if ($invoice->client->getSetting('enable_e_invoice')) {
$invoice->service()->deleteEInvoice()->save();
}
$invoice = $invoice->fresh();
/* Refresh the client here to ensure the balance is fresh */
$client = $invoice->client;
$client = $client->fresh();
nlog('adjusting client balance and invoice balance by '.($invoice->balance - $temp_invoice_balance));
$client->service()->updateBalance($invoice->balance - $temp_invoice_balance)->save();
$client->service()->calculateBalance();
$invoice->ledger()->updateInvoiceBalance($invoice->balance - $temp_invoice_balance, "Late Fee Adjustment for invoice {$invoice->number}");
return $invoice;

View File

@ -168,6 +168,7 @@ class BaseExport
'tax_rate2' => 'invoice.tax_rate2',
'tax_rate3' => 'invoice.tax_rate3',
'recurring_invoice' => 'invoice.recurring_id',
'auto_bill' => 'invoice.auto_bill_enabled',
];
protected array $recurring_invoice_report_keys = [
@ -208,6 +209,9 @@ class BaseExport
'tax_rate1' => 'recurring_invoice.tax_rate1',
'tax_rate2' => 'recurring_invoice.tax_rate2',
'tax_rate3' => 'recurring_invoice.tax_rate3',
'auto_bill' => 'recurring_invoice.auto_bill',
'auto_bill_enabled' => 'recurring_invoice.auto_bill_enabled',
];
protected array $purchase_order_report_keys = [
@ -287,6 +291,7 @@ class BaseExport
'is_amount_discount' => 'item.is_amount_discount',
'line_total' => 'item.line_total',
'gross_line_total' => 'item.gross_line_total',
'tax_amount' => 'item.tax_amount',
];
protected array $quote_report_keys = [

View File

@ -147,6 +147,10 @@ class InvoiceExport extends BaseExport
$entity['invoice.recurring_id'] = $invoice->recurring_invoice->number ?? '';
}
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');
}
return $entity;
}

View File

@ -153,6 +153,10 @@ class RecurringInvoiceExport extends BaseExport
$entity['recurring_invoice.frequency_id'] = $invoice->frequencyForKey($invoice->frequency_id);
}
if (in_array('recurring_invoice.auto_bill_enabled', $this->input['report_keys'])) {
$entity['recurring_invoice.auto_bill_enabled'] = $invoice->auto_bill_enabled ? ctrans('texts.yes') : ctrans('texts.no');
}
return $entity;
}
}

View File

@ -1,30 +0,0 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Helpers\Document;
trait WithTypeHelpers
{
/**
* Returns boolean based on checks for image.
*
* @return bool
*/
public function isImage(): bool
{
if (in_array($this->type, ['png', 'jpeg', 'jpg', 'tiff', 'gif'])) {
return true;
}
return false;
}
}

View File

@ -223,8 +223,12 @@ class PreviewPurchaseOrderController extends BaseController
{
/** @var \App\Models\User $user */
$user = auth()->user();
$company = $user->company();
$file_path = (new PreviewPdf('<html></html>', $company))->handle();
$response = Response::make($file_path, 200);
$response->header('Content-Type', 'application/pdf');
return $response;
MultiDB::setDb($company->db);

View File

@ -25,7 +25,11 @@ class ShowStatementRequest extends FormRequest
public function rules()
{
return [
//
'start_date' => 'sometimes|nullable|date',
'end_date' => 'sometimes|nullable|date',
'show_payments_table' => 'sometimes|nullable|boolean',
'show_aging_table' => 'sometimes|nullable|boolean',
'show_credits_table' => 'sometimes|nullable|boolean',
];
}

View File

@ -19,6 +19,13 @@ class StoreDesignRequest extends Request
private array $valid_entities = [
'invoice',
'payment',
'client',
'quote',
'credit',
'purchase_order',
'project',
'task'
];
/**
@ -32,7 +39,7 @@ class StoreDesignRequest extends Request
$user = auth()->user();
return $user->isAdmin() && $user->account->hasFeature(Account::FEATURE_API);
;
}
public function rules()
@ -42,7 +49,6 @@ class StoreDesignRequest extends Request
$user = auth()->user();
return [
//'name' => 'required',
'name' => 'required|unique:designs,name,null,null,company_id,'.$user->companyId(),
'design' => 'required|array',
'design.header' => 'sometimes|string',

View File

@ -11,6 +11,7 @@
namespace App\Http\Requests\Design;
use App\Models\Account;
use App\Http\Requests\Request;
use App\Utils\Traits\ChecksEntityStatus;
@ -20,6 +21,13 @@ class UpdateDesignRequest extends Request
private array $valid_entities = [
'invoice',
'payment',
'client',
'quote',
'credit',
'purchase_order',
'project',
'task'
];
/**
@ -32,7 +40,7 @@ class UpdateDesignRequest extends Request
/** @var \App\Models\User $user */
$user = auth()->user();
return $user->isAdmin();
return $user->isAdmin() && $user->account->hasFeature(Account::FEATURE_API);
}
public function rules()

View File

@ -73,7 +73,7 @@ class StoreInvoiceRequest extends Request
$rules['tax_name2'] = 'bail|sometimes|string|nullable';
$rules['tax_name3'] = 'bail|sometimes|string|nullable';
$rules['exchange_rate'] = 'bail|sometimes|numeric';
$rules['partial'] = 'bail|sometimes|nullable|numeric';
$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'];
return $rules;

View File

@ -96,6 +96,10 @@ class StorePaymentRequest extends Request
$input['date'] = now()->addSeconds($user->company()->timezone()->utc_offset)->format('Y-m-d');
}
if (! isset($input['idempotency_key'])) {
$input['idempotency_key'] = substr(sha1(json_encode($input)).time()."{$input['date']}{$input['amount']}{$user->id}",0,64);
}
$this->replace($input);
}
@ -106,7 +110,6 @@ class StorePaymentRequest extends Request
$rules = [
'amount' => ['numeric', 'bail', new PaymentAmountsBalanceRule(), new ValidCreditsPresentRule($this->all())],
// 'client_id' => 'bail|required|exists:clients,id',
'client_id' => 'bail|required|exists:clients,id,company_id,'.$user->company()->id.',is_deleted,0',
'invoices.*.invoice_id' => 'bail|required|distinct|exists:invoices,id',
'invoices.*.amount' => 'bail|required',
@ -117,7 +120,6 @@ class StorePaymentRequest extends Request
'invoices' => new ValidPayableInvoicesRule(),
'number' => ['nullable', 'bail', Rule::unique('payments')->where('company_id', $user->company()->id)],
'idempotency_key' => ['nullable', 'bail', 'string','max:64', Rule::unique('payments')->where('company_id', $user->company()->id)],
];
if ($this->file('documents') && is_array($this->file('documents'))) {

View File

@ -1455,7 +1455,16 @@ class CompanyImport implements ShouldQueue
$obj_array['config'] = encrypt($obj_array['config']);
}
/**
* @class \stdClass $parameters
*
* @property string $entity
* @property string $entity_id
*/
if($class == 'App\Models\Scheduler') {
/** @var \stdClass $parameters */
$parameters = $obj_array['parameters'];
if(isset($parameters->clients)){

View File

@ -64,7 +64,7 @@ class InvoiceCheckLateWebhook implements ShouldQueue
->whereBetween('due_date', [now()->subDay()->startOfDay(), now()->startOfDay()->subSecond()])
->cursor()
->each(function ($invoice) {
WebhookHandler::dispatch(Webhook::EVENT_LATE_INVOICE, $invoice, $invoice->company, 'client')->delay(now()->addSeconds(2));
(new WebhookHandler(Webhook::EVENT_LATE_INVOICE, $invoice, $invoice->company, 'client'))->handle();
});
} else {
foreach (MultiDB::$dbs as $db) {
@ -91,7 +91,7 @@ class InvoiceCheckLateWebhook implements ShouldQueue
->whereBetween('due_date', [now()->subDay()->startOfDay(), now()->startOfDay()->subSecond()])
->cursor()
->each(function ($invoice) {
WebhookHandler::dispatch(Webhook::EVENT_LATE_INVOICE, $invoice, $invoice->company, 'client')->delay(now()->addSeconds(2));
(new WebhookHandler(Webhook::EVENT_LATE_INVOICE, $invoice, $invoice->company, 'client'))->handle();
});
}
}

View File

@ -25,8 +25,13 @@ use Illuminate\Queue\SerializesModels;
class ClientLedgerBalanceUpdate implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tries = 1;
public $deleteWhenMissingModels = true;
private ?CompanyLedger $next_balance_record;
public function __construct(public Company $company, public Client $client)
{
}
@ -39,31 +44,55 @@ class ClientLedgerBalanceUpdate implements ShouldQueue
*/
public function handle() :void
{
// nlog("Updating company ledger for client ". $this->client->id);
$uuid = \Illuminate\Support\Str::uuid();
// nlog("Updating company ledger for client {$this->client->id} {$uuid}");
MultiDB::setDb($this->company->db);
CompanyLedger::query()->where('balance', 0)->where('client_id', $this->client->id)->orderBy('updated_at', 'ASC')->cursor()->each(function ($company_ledger) {
if ($company_ledger->balance == 0) {
$last_record = CompanyLedger::query()->where('client_id', $company_ledger->client_id)
->where('company_id', $company_ledger->company_id)
->where('balance', '!=', 0)
->orderBy('id', 'DESC')
->first();
// $dupes = CompanyLedger::query()
// ->where('client_id', $this->client->id)
// ->where('balance', 0)
// ->where('hash', '<>', '')
// ->groupBy(['adjustment','hash'])
// ->havingRaw('COUNT(*) > 1')
// ->pluck('id');
if (! $last_record) {
$last_record = CompanyLedger::query()->where('client_id', $company_ledger->client_id)
->where('company_id', $company_ledger->company_id)
->orderBy('id', 'DESC')
->first();
}
}
// CompanyLedger::query()->whereIn('id', $dupes)->delete();
// $dupes = CompanyLedger::query()
// ->where('client_id', $this->client->id)
// ->where('balance', 0)
// ->where('hash', '<>', '')
// ->groupBy(['adjustment','hash'])
// ->havingRaw('COUNT(*) > 1')
// ->pluck('id');
// CompanyLedger::query()->whereIn('id', $dupes)->delete();
CompanyLedger::query()
->where('balance', 0)
->where('client_id', $this->client->id)
->orderBy('id', 'ASC')
->get()
->each(function ($company_ledger) {
$parent_ledger = CompanyLedger::query()
->where('id', '<', $company_ledger->id)
->where('client_id', $company_ledger->client_id)
->where('company_id', $company_ledger->company_id)
->where('balance', '!=', 0)
->orderBy('id', 'DESC')
->first();
// $company_ledger->balance = $last_record->balance + $company_ledger->adjustment;
$company_ledger->balance = ($parent_ledger ? $parent_ledger->balance : 0) + $company_ledger->adjustment;
$company_ledger->save();
$company_ledger->balance = $last_record->balance + $company_ledger->adjustment;
$company_ledger->save();
});
}
// nlog("finished job {$uuid}");
}
public function middleware()
{

View File

@ -0,0 +1,78 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Jobs\Ledger;
use App\Libraries\MultiDB;
use App\Models\CompanyLedger;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\Middleware\WithoutOverlapping;
//@deprecated
class UpdateLedger implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tries = 1;
public $deleteWhenMissingModels = true;
public function __construct(private int $company_ledger_id, private float $start_amount, private string $company_key, private string $db)
{
}
/**
* Execute the job.
*
*
* @return void
*/
public function handle() :void
{
nlog("Updating company ledger for client ". $this->company_ledger_id);
MultiDB::setDb($this->db);
$cl = CompanyLedger::find($this->company_ledger_id);
$ledger_item = $cl->company_ledgerable->company_ledger()->count() == 1;
nlog($cl->company_ledgerable->company_ledger()->count());
if(!$cl)
return;
$entity = $cl->company_ledgerable;
$balance = $entity->calc()->getBalance();
$cl->adjustment = $ledger_item ? $balance : ($balance - $this->start_amount);
$parent_ledger = CompanyLedger::query()
->where('id', '<', $cl->id)
->where('company_id', $cl->company_id)
->where('client_id', $cl->client_id)
->where('balance', '!=', 0)
->orderBy('id', 'DESC')
->first();
$cl->balance = ($parent_ledger ? $parent_ledger->balance : 0) + $cl->adjustment;
$cl->save();
}
public function middleware()
{
return [new WithoutOverlapping($this->company_key)];
}
}

View File

@ -312,7 +312,9 @@ class SendReminders implements ShouldQueue
/**Refresh Invoice values*/
$invoice = $invoice->calc()->getInvoice();
$invoice->client->service()->updateBalance($invoice->balance - $temp_invoice_balance)->save();
$invoice->client->service()->calculateBalance();
// $invoice->client->service()->updateBalance($invoice->balance - $temp_invoice_balance)->save();
$invoice->ledger()->updateInvoiceBalance($invoice->balance - $temp_invoice_balance, "Late Fee Adjustment for invoice {$invoice->number}");
return $invoice;

View File

@ -89,7 +89,6 @@ class EmailPayment implements ShouldQueue
}
}
$nmo->mailable = new TemplateEmail($email_builder, $this->contact, $invitation);
$nmo->to_user = $this->contact;
$nmo->settings = $this->settings;

View File

@ -44,7 +44,7 @@ class PreviewReport implements ShouldQueue
else
$report = $export->run();
// nlog($report);
nlog($report);
Cache::put($this->hash, $report, 60 * 60);
}

View File

@ -307,9 +307,10 @@ class ReminderJob implements ShouldQueue
/**Refresh Invoice values*/
$invoice = $invoice->calc()->getInvoice();
nlog('adjusting client balance and invoice balance by #'.$invoice->number.' '.($invoice->balance - $temp_invoice_balance));
$invoice->client->service()->updateBalance($invoice->balance - $temp_invoice_balance);
// nlog('adjusting client balance and invoice balance by #'.$invoice->number.' '.($invoice->balance - $temp_invoice_balance));
// $invoice->client->service()->updateBalance($invoice->balance - $temp_invoice_balance);
$invoice->ledger()->updateInvoiceBalance($invoice->balance - $temp_invoice_balance, "Late Fee Adjustment for invoice {$invoice->number}");
$invoice->client->service()->calculateBalance();
return $invoice;
}

View File

@ -58,7 +58,7 @@ class WebhookHandler implements ShouldQueue
->where('event_id', $this->event_id)
->cursor()
->each(function ($subscription) {
WebhookSingle::dispatch($subscription->id, $this->entity, $this->company->db, $this->includes);
(new WebhookSingle($subscription->id, $this->entity, $this->company->db, $this->includes))->handle();
});
}

View File

@ -63,9 +63,7 @@ class WebhookSingle implements ShouldQueue
public function backoff()
{
// return [15, 35, 65, 185, 3605];
return [rand(10, 15), rand(30, 40), rand(60, 79), rand(160, 200), rand(3000, 5000)];
}
/**
@ -77,16 +75,10 @@ class WebhookSingle implements ShouldQueue
MultiDB::setDb($this->db);
$subscription = Webhook::query()->with('company')->find($this->subscription_id);
if ($subscription) {
// nlog("firing event ID {$subscription->event_id} company_id {$subscription->company_id}");
}
if (!$subscription) {
$this->fail();
nlog("failed to fire event, could not find webhook ID {$this->subscription_id}");
return;
}
@ -150,8 +142,28 @@ class WebhookSingle implements ShouldQueue
))->handle();
} catch (BadResponseException $e) {
if ($e->getResponse()->getStatusCode() >= 400 && $e->getResponse()->getStatusCode() < 500) {
/* Some 400's should never be repeated */
if (in_array($e->getResponse()->getStatusCode(), [404, 410, 405])) {
$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(
['message' => $message],
SystemLog::CATEGORY_WEBHOOK,
SystemLog::EVENT_WEBHOOK_FAILURE,
SystemLog::TYPE_WEBHOOK_RESPONSE,
$this->resolveClient(),
$this->company
))->handle();
$subscription->delete();
$this->fail();
return;
}
$message = "There was a problem when connecting to {$subscription->target_url} => status code ". $e->getResponse()->getStatusCode();
nlog($message);
(new SystemLogger(
@ -163,8 +175,7 @@ class WebhookSingle implements ShouldQueue
$this->company
))->handle();
/* Some 400's should never be repeated */
if (in_array($e->getResponse()->getStatusCode(), [404, 410])) {
if (in_array($e->getResponse()->getStatusCode(), [400])) {
$this->fail();
return;
}

View File

@ -255,7 +255,7 @@ class BaseModel extends Model
$formatted_number = preg_replace('/\s+/', '_', $formatted_number);
return $formatted_number;
return \Illuminate\Support\Str::ascii($formatted_number);
}
public function translate_entity()
@ -278,7 +278,7 @@ class BaseModel extends Model
->exists();
if ($subscriptions) {
WebhookHandler::dispatch($event_id, $this, $this->company, $additional_data);
WebhookHandler::dispatch($event_id, $this->withoutRelations(), $this->company, $additional_data);
}
}

View File

@ -778,7 +778,12 @@ class Client extends BaseModel implements HasLocalePreference
$timezone = $this->company->timezone();
$offset -= $timezone->utc_offset;
//2023-11-08 adjustments for DST
date_default_timezone_set('GMT');
$date = new \DateTime("now", new \DateTimeZone($timezone->name));
$offset -= $date->getOffset();
// $offset -= $timezone->utc_offset;
$offset += ($entity_send_time * 3600);
return $offset;

View File

@ -928,7 +928,11 @@ class Company extends BaseModel
$timezone = $this->timezone();
$offset -= $timezone->utc_offset;
date_default_timezone_set('GMT');
$date = new \DateTime("now", new \DateTimeZone($timezone->name));
$offset -= $date->getOffset();
// $offset -= $timezone->utc_offset;
$offset += ($entity_send_time * 3600);
return $offset;

View File

@ -21,8 +21,8 @@ use Illuminate\Database\Eloquent\Model;
* @property int|null $client_id
* @property int|null $user_id
* @property int|null $activity_id
* @property string|null $adjustment
* @property string|null $balance
* @property float|null $adjustment
* @property float|null $balance
* @property string|null $notes
* @property string|null $hash
* @property int $company_ledgerable_id

View File

@ -64,7 +64,6 @@ class Document extends BaseModel
{
use SoftDeletes;
use Filterable;
use WithTypeHelpers;
const DOCUMENT_PREVIEW_SIZE = 300; // pixels
@ -205,4 +204,47 @@ class Document extends BaseModel
{
return ctrans('texts.document');
}
public function compress(): mixed
{
$image = $this->getFile();
$catch_image = $image;
if(extension_loaded('imagick'))
return $catch_image;
try {
$file = base64_encode($image);
$img = new \Imagick();
$img->readImageBlob($file);
$img->setImageCompression(true);
$img->setImageCompressionQuality(50);
return $img->getImageBlob();
}
catch(\Exception $e){
nlog($e->getMessage());
return $catch_image;
}
}
/**
* Returns boolean based on checks for image.
*
* @return bool
*/
public function isImage(): bool
{
if (in_array($this->type, ['png', 'jpeg', 'jpg', 'tiff', 'gif'])) {
return true;
}
return false;
}
}

View File

@ -158,6 +158,7 @@ class Payment extends BaseModel
'custom_value3',
'custom_value4',
'category_id',
'idempotency_key',
];
protected $casts = [

View File

@ -46,6 +46,7 @@ class AuthorizeCreditCard
$tokens = ClientGatewayToken::where('client_id', $this->authorize->client->id)
->where('company_gateway_id', $this->authorize->company_gateway->id)
->where('gateway_type_id', GatewayType::CREDIT_CARD)
->orderBy('is_default', 'desc')
->get();
$data['tokens'] = $tokens;

View File

@ -161,7 +161,7 @@ class BaseRepository
$lcfirst_resource_id = $this->resolveEntityKey($model); //ie invoice_id
$state['starting_amount'] = $model->amount;
$state['starting_amount'] = $model->balance;
if (! $model->id) {
$company_defaults = $client->setCompanyDefaults($data, lcfirst($resource));
@ -199,7 +199,7 @@ class BaseRepository
});
}
}
nlog($model->toArray());
$model->saveQuietly();
/* Model now persisted, now lets do some child tasks */
@ -273,7 +273,7 @@ nlog($model->toArray());
$model = $model->calc()->getInvoice();
/* We use this to compare to our starting amount */
$state['finished_amount'] = $model->amount;
$state['finished_amount'] = $model->balance;
/* Apply entity number */
$model = $model->service()->applyNumber()->save();
@ -290,10 +290,14 @@ nlog($model->toArray());
/* Perform model specific tasks */
if ($model instanceof Invoice) {
if (($state['finished_amount'] != $state['starting_amount']) && ($model->status_id != Invoice::STATUS_DRAFT)) {
if ($model->status_id != Invoice::STATUS_DRAFT) {
$model->service()->updateStatus()->save();
$model->client->service()->updateBalance(($state['finished_amount'] - $state['starting_amount']))->save();
$model->ledger()->updateInvoiceBalance(($state['finished_amount'] - $state['starting_amount']), "Update adjustment for invoice {$model->number}");
$model->client->service()->calculateBalance($model);
// $diff = $state['finished_amount'] - $state['starting_amount'];
// nlog("{$diff} - {$state['finished_amount']} - {$state['starting_amount']}");
// if(floatval($state['finished_amount']) != floatval($state['starting_amount']))
// $model->ledger()->updateInvoiceBalance(($state['finished_amount'] - $state['starting_amount']), "Update adjustment for invoice {$model->number}");
}
if (! $model->design_id) {

View File

@ -11,6 +11,7 @@
namespace App\Services\Client;
use Carbon\Carbon;
use App\Utils\Number;
use App\Models\Client;
use App\Models\Credit;
@ -34,6 +35,39 @@ class ClientService
{
}
public function calculateBalance(?Invoice $invoice = null)
{
$balance = Invoice::where('client_id', $this->client->id)
->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL])
->where('is_deleted', false)
->sum('balance');
$pre_client_balance = $this->client->balance;
try {
DB::connection(config('database.default'))->transaction(function () use ($balance) {
$this->client = Client::withTrashed()->where('id', $this->client->id)->lockForUpdate()->first();
$this->client->balance = $balance;
$this->client->saveQuietly();
}, 2);
} catch (\Throwable $throwable) {
nlog("DB ERROR " . $throwable->getMessage());
}
if($invoice && floatval($this->client->balance) != floatval($pre_client_balance)) {
$diff = $this->client->balance - $pre_client_balance;
$invoice->ledger()->insertInvoiceBalance($diff, $this->client->balance, "Update Adjustment Invoice # {$invoice->number} => {$diff}");
}
return $this;
}
/**
* Seeing too many race conditions under heavy load here.
*
* @param float $amount
* @return ClientService
*/
public function updateBalance(float $amount)
{
try {

View File

@ -80,17 +80,25 @@ class PaymentMethod
return array_search($model->id, $transformed_ids); // this closure sorts for us
});
if($this->gateways->count() == 0 && count($transformed_ids) >=1) {
//2023-10-11 - Roll back, do not show any gateways, if they have been archived upstream.
//removing this logic now to prevent any
// if($this->gateways->count() == 0 && count($transformed_ids) >=1) {
/** This is a fallback in case a user archives some gateways that have been ordered preferentially. */
$this->gateways = CompanyGateway::query()
->with('gateway')
->where('company_id', $this->client->company_id)
->where('gateway_key', '!=', '54faab2ab6e3223dbe848b1686490baa')
->whereNull('deleted_at')
->where('is_deleted', false)->get();
// /**
// * This is a fallback in case a user archives some gateways that have been ordered preferentially.
// *
// * If the user archives a parent gateway upstream, it may leave a client setting in a state where no payment gateways are available.
// *
// * In this case we fall back to all gateways.
// */
// $this->gateways = CompanyGateway::query()
// ->with('gateway')
// ->where('company_id', $this->client->company_id)
// ->where('gateway_key', '!=', '54faab2ab6e3223dbe848b1686490baa')
// ->whereNull('deleted_at')
// ->where('is_deleted', false)->get();
}
// }
} else {
$this->gateways = CompanyGateway::query()

View File

@ -54,6 +54,7 @@ class Statement
public function run() :?string
{
$this
->setupOptions()
->setupEntity();

View File

@ -96,14 +96,17 @@ class AddGatewayFee extends AbstractService
if (floatval($new_balance) - floatval($balance) != 0) {
$adjustment = $new_balance - $balance;
$this->invoice
->client
->service()
->updateBalance($adjustment);
// $this->invoice
// ->client
// ->service()
// ->updateBalance($adjustment);
$this->invoice
->ledger()
->updateInvoiceBalance($adjustment, 'Adjustment for adding gateway fee');
$this->invoice->client->service()->calculateBalance();
}
return $this->invoice;
@ -142,15 +145,18 @@ class AddGatewayFee extends AbstractService
if (floatval($new_balance) - floatval($balance) != 0) {
$adjustment = $new_balance - $balance;
$this->invoice
->client
->service()
->updateBalance($adjustment * -1)
->save();
// $this->invoice
// ->client
// ->service()
// ->updateBalance($adjustment * -1)
// ->save();
$this->invoice
->ledger()
->updateInvoiceBalance($adjustment * -1, 'Adjustment for adding gateway DISCOUNT');
$this->invoice->client->service()->calculateBalance();
}
return $this->invoice;

View File

@ -174,8 +174,12 @@ class AutoBillInvoice extends AbstractService
$amount = array_sum(array_column($this->used_credit, 'amount'));
$payment = PaymentFactory::create($this->invoice->company_id, $this->invoice->user_id);
$payment->amount = $amount;
$payment->applied = $amount;
$payment->amount = 0;
$payment->applied = 0;
// $payment->amount = $amount;
// $payment->applied = $amount;
$payment->client_id = $this->invoice->client_id;
$payment->currency_id = $this->invoice->client->getSetting('currency_id');
$payment->date = now()->addSeconds($this->invoice->company->timezone()->utc_offset)->format('Y-m-d');

View File

@ -558,7 +558,7 @@ class FacturaEInvoice extends AbstractService
'centres' => $this->setFace(),
// "cnoCnae" => "04791", // Clasif. Nacional de Act. Económicas
// "ineTownCode" => "280796" // Cód. de municipio del INE
];
];
if($this->invoice->client->classification === 'individual') {
$buyer_array['name'] = $this->invoice->client->present()->first_name();

View File

@ -34,7 +34,7 @@ class HandleCancellation extends AbstractService
return $this->invoice;
}
$adjustment = $this->invoice->balance * -1;
$adjustment =($this->invoice->balance < 0) ? abs($this->invoice->balance) : $this->invoice->balance * -1;
$this->backupCancellation($adjustment);
@ -44,7 +44,8 @@ class HandleCancellation extends AbstractService
$this->invoice->balance = 0;
$this->invoice = $this->invoice->service()->setStatus(Invoice::STATUS_CANCELLED)->save();
$this->invoice->client->service()->updateBalance($adjustment)->save();
// $this->invoice->client->service()->updateBalance($adjustment)->save();
$this->invoice->client->service()->calculateBalance();
$this->invoice->service()->workFlow()->save();
@ -64,7 +65,8 @@ class HandleCancellation extends AbstractService
$adjustment = $cancellation->adjustment * -1;
$this->invoice->ledger()->updateInvoiceBalance($adjustment, "Invoice {$this->invoice->number} reversal");
$this->invoice->fresh();
$this->invoice = $this->invoice->fresh();
/* Reverse the invoice status and balance */
$this->invoice->balance += $adjustment;
@ -72,6 +74,9 @@ class HandleCancellation extends AbstractService
$this->invoice->client->service()->updateBalance($adjustment)->save();
$this->invoice->client->service()->calculateBalance();
/* Pop the cancellation out of the backup*/
$backup = $this->invoice->backup;
unset($backup->cancellation);

View File

@ -51,6 +51,7 @@ class HandleRestore extends AbstractService
//adjust ledger balance
$this->invoice->ledger()->updateInvoiceBalance($this->invoice->balance, "Restored invoice {$this->invoice->number}")->save();
//@todo
$this->invoice->client
->service()
->updateBalanceAndPaidToDate($this->invoice->balance, $this->invoice->paid_to_date)

View File

@ -452,15 +452,18 @@ class InvoiceService
if ((int) $pre_count != (int) $post_count) {
$adjustment = $balance - $new_balance;
$this->invoice
->client
->service()
->updateBalance($adjustment * -1)
->save();
// $this->invoice
// ->client
// ->service()
// ->updateBalance($adjustment * -1)
// ->save();
$this->invoice
->ledger()
->updateInvoiceBalance($adjustment * -1, 'Adjustment for removing gateway fee');
$this->invoice->client->service()->calculateBalance();
}
return $this;

View File

@ -45,6 +45,8 @@ class MarkSent extends AbstractService
->ledger()
->updateInvoiceBalance($adjustment, "Invoice {$this->invoice->number} marked as sent.");
$this->invoice->client->service()->calculateBalance();
/* Perform additional actions on invoice */
$this->invoice
->service()
@ -53,9 +55,6 @@ class MarkSent extends AbstractService
->setReminder()
->save();
/*Adjust client balance*/
$this->invoice->client->service()->updateBalance($adjustment)->save();
$this->invoice->markInvitationsSent();
event(new InvoiceWasUpdated($this->invoice, $this->invoice->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null)));

View File

@ -11,9 +11,11 @@
namespace App\Services\Ledger;
use App\Models\Activity;
use App\Models\CompanyLedger;
use App\Jobs\Ledger\UpdateLedger;
use App\Factory\CompanyLedgerFactory;
use App\Jobs\Ledger\ClientLedgerBalanceUpdate;
use App\Models\Activity;
class LedgerService
{
@ -24,18 +26,60 @@ class LedgerService
$this->entity = $entity;
}
public function updateInvoiceBalance($adjustment, $notes = '')
public function insertInvoiceBalance($adjustment, $balance, $notes)
{
$company_ledger = CompanyLedgerFactory::create($this->entity->company_id, $this->entity->user_id);
$company_ledger->client_id = $this->entity->client_id;
$company_ledger->adjustment = $adjustment;
$company_ledger->notes = $notes;
$company_ledger->balance = $balance;
$company_ledger->activity_id = Activity::UPDATE_INVOICE;
$company_ledger->save();
$this->entity->company_ledger()->save($company_ledger);
ClientLedgerBalanceUpdate::dispatch($this->entity->company, $this->entity->client)->delay(rand(3, 13));
return $this;
}
public function updateInvoiceBalance($adjustment, $notes = '')
{
if($adjustment == 0)
return $this;
// $timestamp = \Carbon\Carbon::createFromTimestamp($this->entity->updated_at)->format('ymdhhmmssSS');
// $hash = sha1($adjustment.$notes.$this->entity->status_id.$this->entity->client_id.$this->entity->amount.$this->entity->balance.$this->entity->company_id.Activity::UPDATE_INVOICE);
// $hash = sha1($hash);
// $hash = sha1("{$this->entity->amount}.{$this->entity->balance}");
// $hash = "{$adjustment}.{$this->entity->amount}.{$this->entity->balance}";
// $exists = CompanyLedger::query()
// ->where('client_id', $this->entity->client_id)
// ->where('company_id', $this->entity->company_id)
// ->where('activity_id', Activity::UPDATE_INVOICE)
// ->where('adjustment', $adjustment)
// ->where('hash', $hash)
// ->where('notes', $notes)
// ->where('created_at', '>=', now()->subSeconds(1))
// ->exists();
// if($exists) {
// nlog("Collision {$adjustment} {$notes}");
// return $this;
// }
$company_ledger = CompanyLedgerFactory::create($this->entity->company_id, $this->entity->user_id);
$company_ledger->client_id = $this->entity->client_id;
$company_ledger->adjustment = $adjustment;
$company_ledger->notes = $notes;
// $company_ledger->hash = $hash;
$company_ledger->activity_id = Activity::UPDATE_INVOICE;
$company_ledger->save();
$this->entity->company_ledger()->save($company_ledger);
ClientLedgerBalanceUpdate::dispatch($this->entity->company, $this->entity->client)->delay(rand(3, 7));
return $this;
}
@ -51,7 +95,7 @@ class LedgerService
$this->entity->company_ledger()->save($company_ledger);
ClientLedgerBalanceUpdate::dispatch($this->entity->company, $this->entity->client)->delay(rand(3, 13));
ClientLedgerBalanceUpdate::dispatch($this->entity->company, $this->entity->client)->delay(rand(1, 3));
return $this;
}
@ -67,7 +111,7 @@ class LedgerService
$this->entity->company_ledger()->save($company_ledger);
ClientLedgerBalanceUpdate::dispatch($this->entity->company, $this->entity->client)->delay(rand(3, 13));
ClientLedgerBalanceUpdate::dispatch($this->entity->company, $this->entity->client)->delay(rand(1, 3));
return $this;
}

View File

@ -101,6 +101,7 @@ class DeletePayment
->updateInvoiceBalance($net_deletable, "Adjusting invoice {$paymentable_invoice->number} due to deletion of Payment {$this->payment->number}")
->save();
//@todo refactor
$this->payment
->client
->service()

View File

@ -1038,6 +1038,7 @@ html {
$container = $dom->createElement('div');
$container->setAttribute('style', 'display:grid; grid-auto-flow: row; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(2, 1fr);justify-items: center;');
/** @var \App\Models\Document $document */
foreach ($this->entity->documents()->where('is_public', true)->get() as $document) {
if (!$document->isImage()) {
continue;
@ -1045,7 +1046,7 @@ html {
$image = $dom->createElement('img');
$image->setAttribute('src', "data:image/png;base64,".base64_encode($document->getFile()));
$image->setAttribute('src', "data:image/png;base64,".base64_encode($document->compress()));
$image->setAttribute('style', 'max-width: 50%; margin-top: 20px;');
$container->appendChild($image);

202
composer.lock generated
View File

@ -485,16 +485,16 @@
},
{
"name": "aws/aws-sdk-php",
"version": "3.283.16",
"version": "3.285.3",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
"reference": "cb629771356d6a4d12bb030a072b832044440672"
"reference": "afa1e722f1b2c95644f375dc1a19072e4daf67be"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/cb629771356d6a4d12bb030a072b832044440672",
"reference": "cb629771356d6a4d12bb030a072b832044440672",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/afa1e722f1b2c95644f375dc1a19072e4daf67be",
"reference": "afa1e722f1b2c95644f375dc1a19072e4daf67be",
"shasum": ""
},
"require": {
@ -574,9 +574,9 @@
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.283.16"
"source": "https://github.com/aws/aws-sdk-php/tree/3.285.3"
},
"time": "2023-10-31T18:21:09+00:00"
"time": "2023-11-09T19:07:19+00:00"
},
{
"name": "bacon/bacon-qr-code",
@ -634,16 +634,16 @@
},
{
"name": "beganovich/snappdf",
"version": "v4.0.1",
"version": "v4.0.2",
"source": {
"type": "git",
"url": "https://github.com/beganovich/snappdf.git",
"reference": "37b782fa14034f91657f2490bcd1380bb5532d69"
"reference": "afb188d8370a35db3b6ce4b6f2ef2963d7005891"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/beganovich/snappdf/zipball/37b782fa14034f91657f2490bcd1380bb5532d69",
"reference": "37b782fa14034f91657f2490bcd1380bb5532d69",
"url": "https://api.github.com/repos/beganovich/snappdf/zipball/afb188d8370a35db3b6ce4b6f2ef2963d7005891",
"reference": "afb188d8370a35db3b6ce4b6f2ef2963d7005891",
"shasum": ""
},
"require": {
@ -680,22 +680,22 @@
"description": "Convert webpages or HTML into the PDF file using Chromium or Google Chrome.",
"support": {
"issues": "https://github.com/beganovich/snappdf/issues",
"source": "https://github.com/beganovich/snappdf/tree/v4.0.1"
"source": "https://github.com/beganovich/snappdf/tree/v4.0.2"
},
"time": "2023-08-24T12:47:07+00:00"
"time": "2023-11-06T21:44:50+00:00"
},
{
"name": "braintree/braintree_php",
"version": "6.14.0",
"version": "6.15.0",
"source": {
"type": "git",
"url": "https://github.com/braintree/braintree_php.git",
"reference": "084ed5bb728bc32ad444c6d043c87b409cca72d7"
"reference": "16efb08e19cb6c579deba11e119ef6409d28eae3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/braintree/braintree_php/zipball/084ed5bb728bc32ad444c6d043c87b409cca72d7",
"reference": "084ed5bb728bc32ad444c6d043c87b409cca72d7",
"url": "https://api.github.com/repos/braintree/braintree_php/zipball/16efb08e19cb6c579deba11e119ef6409d28eae3",
"reference": "16efb08e19cb6c579deba11e119ef6409d28eae3",
"shasum": ""
},
"require": {
@ -729,9 +729,9 @@
"description": "Braintree PHP Client Library",
"support": {
"issues": "https://github.com/braintree/braintree_php/issues",
"source": "https://github.com/braintree/braintree_php/tree/6.14.0"
"source": "https://github.com/braintree/braintree_php/tree/6.15.0"
},
"time": "2023-10-18T22:00:15+00:00"
"time": "2023-11-08T00:15:11+00:00"
},
{
"name": "brick/math",
@ -2487,16 +2487,16 @@
},
{
"name": "google/apiclient-services",
"version": "v0.322.0",
"version": "v0.323.0",
"source": {
"type": "git",
"url": "https://github.com/googleapis/google-api-php-client-services.git",
"reference": "e892db67c88eb119de0c12aa2419b48401555ded"
"reference": "d5497d30ddfafe7592102ca48bedaf222a4ca7a6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/e892db67c88eb119de0c12aa2419b48401555ded",
"reference": "e892db67c88eb119de0c12aa2419b48401555ded",
"url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/d5497d30ddfafe7592102ca48bedaf222a4ca7a6",
"reference": "d5497d30ddfafe7592102ca48bedaf222a4ca7a6",
"shasum": ""
},
"require": {
@ -2525,9 +2525,9 @@
],
"support": {
"issues": "https://github.com/googleapis/google-api-php-client-services/issues",
"source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.322.0"
"source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.323.0"
},
"time": "2023-10-29T01:10:18+00:00"
"time": "2023-11-06T01:08:38+00:00"
},
{
"name": "google/auth",
@ -4230,16 +4230,16 @@
},
{
"name": "laravel/framework",
"version": "v10.30.0",
"version": "v10.31.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "3dd85d9dbea82b937f8eaf344b50d613c5d1127a"
"reference": "507ce9b28bce4b5e4140c28943092ca38e9a52e4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/3dd85d9dbea82b937f8eaf344b50d613c5d1127a",
"reference": "3dd85d9dbea82b937f8eaf344b50d613c5d1127a",
"url": "https://api.github.com/repos/laravel/framework/zipball/507ce9b28bce4b5e4140c28943092ca38e9a52e4",
"reference": "507ce9b28bce4b5e4140c28943092ca38e9a52e4",
"shasum": ""
},
"require": {
@ -4428,7 +4428,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2023-10-31T13:19:45+00:00"
"time": "2023-11-07T13:48:30+00:00"
},
{
"name": "laravel/prompts",
@ -5225,16 +5225,16 @@
},
{
"name": "league/flysystem",
"version": "3.18.0",
"version": "3.19.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
"reference": "015633a05aee22490495159237a5944091d8281e"
"reference": "1b2aa10f2326e0351399b8ce68e287d8e9209a83"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/015633a05aee22490495159237a5944091d8281e",
"reference": "015633a05aee22490495159237a5944091d8281e",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1b2aa10f2326e0351399b8ce68e287d8e9209a83",
"reference": "1b2aa10f2326e0351399b8ce68e287d8e9209a83",
"shasum": ""
},
"require": {
@ -5299,7 +5299,7 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/3.18.0"
"source": "https://github.com/thephpleague/flysystem/tree/3.19.0"
},
"funding": [
{
@ -5311,20 +5311,20 @@
"type": "github"
}
],
"time": "2023-10-20T17:59:40+00:00"
"time": "2023-11-07T09:04:28+00:00"
},
{
"name": "league/flysystem-aws-s3-v3",
"version": "3.16.0",
"version": "3.19.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git",
"reference": "ded9ba346bb01cb9cc4cc7f2743c2c0e14d18e1c"
"reference": "03be643c8ed4dea811d946101be3bc875b5cf214"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/ded9ba346bb01cb9cc4cc7f2743c2c0e14d18e1c",
"reference": "ded9ba346bb01cb9cc4cc7f2743c2c0e14d18e1c",
"url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/03be643c8ed4dea811d946101be3bc875b5cf214",
"reference": "03be643c8ed4dea811d946101be3bc875b5cf214",
"shasum": ""
},
"require": {
@ -5365,7 +5365,7 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues",
"source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.16.0"
"source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.19.0"
},
"funding": [
{
@ -5377,20 +5377,20 @@
"type": "github"
}
],
"time": "2023-08-30T10:14:57+00:00"
"time": "2023-11-06T20:35:28+00:00"
},
{
"name": "league/flysystem-local",
"version": "3.18.0",
"version": "3.19.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-local.git",
"reference": "e7381ef7643f658b87efb7dbe98fe538fb1bbf32"
"reference": "8d868217f9eeb4e9a7320db5ccad825e9a7a4076"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e7381ef7643f658b87efb7dbe98fe538fb1bbf32",
"reference": "e7381ef7643f658b87efb7dbe98fe538fb1bbf32",
"url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/8d868217f9eeb4e9a7320db5ccad825e9a7a4076",
"reference": "8d868217f9eeb4e9a7320db5ccad825e9a7a4076",
"shasum": ""
},
"require": {
@ -5425,7 +5425,7 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem-local/issues",
"source": "https://github.com/thephpleague/flysystem-local/tree/3.18.0"
"source": "https://github.com/thephpleague/flysystem-local/tree/3.19.0"
},
"funding": [
{
@ -5437,7 +5437,7 @@
"type": "github"
}
],
"time": "2023-10-19T20:07:13+00:00"
"time": "2023-11-06T20:35:28+00:00"
},
{
"name": "league/fractal",
@ -5779,16 +5779,16 @@
},
{
"name": "microsoft/microsoft-graph",
"version": "1.108.0",
"version": "1.109.0",
"source": {
"type": "git",
"url": "https://github.com/microsoftgraph/msgraph-sdk-php.git",
"reference": "96b940ab530c693832648bdf5ffbb975e29d2233"
"reference": "14b1b9f24a6b6ace91323b1121030c96a0988ee0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/96b940ab530c693832648bdf5ffbb975e29d2233",
"reference": "96b940ab530c693832648bdf5ffbb975e29d2233",
"url": "https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/14b1b9f24a6b6ace91323b1121030c96a0988ee0",
"reference": "14b1b9f24a6b6ace91323b1121030c96a0988ee0",
"shasum": ""
},
"require": {
@ -5825,22 +5825,22 @@
"homepage": "https://developer.microsoft.com/en-us/graph",
"support": {
"issues": "https://github.com/microsoftgraph/msgraph-sdk-php/issues",
"source": "https://github.com/microsoftgraph/msgraph-sdk-php/tree/1.108.0"
"source": "https://github.com/microsoftgraph/msgraph-sdk-php/tree/1.109.0"
},
"time": "2023-10-11T11:00:38+00:00"
"time": "2023-11-02T10:25:39+00:00"
},
{
"name": "mollie/mollie-api-php",
"version": "v2.62.0",
"version": "v2.63.0",
"source": {
"type": "git",
"url": "https://github.com/mollie/mollie-api-php.git",
"reference": "feb6d52859ed1ea7a65b25bb6cbfaadb04b33827"
"reference": "642f1b87624bd1535cd198134113e14bc01ba245"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/feb6d52859ed1ea7a65b25bb6cbfaadb04b33827",
"reference": "feb6d52859ed1ea7a65b25bb6cbfaadb04b33827",
"url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/642f1b87624bd1535cd198134113e14bc01ba245",
"reference": "642f1b87624bd1535cd198134113e14bc01ba245",
"shasum": ""
},
"require": {
@ -5917,9 +5917,9 @@
],
"support": {
"issues": "https://github.com/mollie/mollie-api-php/issues",
"source": "https://github.com/mollie/mollie-api-php/tree/v2.62.0"
"source": "https://github.com/mollie/mollie-api-php/tree/v2.63.0"
},
"time": "2023-10-23T11:22:58+00:00"
"time": "2023-11-06T09:20:50+00:00"
},
{
"name": "moneyphp/money",
@ -6648,16 +6648,16 @@
},
{
"name": "nwidart/laravel-modules",
"version": "10.0.2",
"version": "10.0.3",
"source": {
"type": "git",
"url": "https://github.com/nWidart/laravel-modules.git",
"reference": "ef67a7367223ab96539136116d69405d1c21c321"
"reference": "786da1e6dfa2df6caa8718acb9c37a8fe94595b3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nWidart/laravel-modules/zipball/ef67a7367223ab96539136116d69405d1c21c321",
"reference": "ef67a7367223ab96539136116d69405d1c21c321",
"url": "https://api.github.com/repos/nWidart/laravel-modules/zipball/786da1e6dfa2df6caa8718acb9c37a8fe94595b3",
"reference": "786da1e6dfa2df6caa8718acb9c37a8fe94595b3",
"shasum": ""
},
"require": {
@ -6717,15 +6717,19 @@
],
"support": {
"issues": "https://github.com/nWidart/laravel-modules/issues",
"source": "https://github.com/nWidart/laravel-modules/tree/10.0.2"
"source": "https://github.com/nWidart/laravel-modules/tree/10.0.3"
},
"funding": [
{
"url": "https://github.com/dcblogdev",
"type": "github"
},
{
"url": "https://github.com/nwidart",
"type": "github"
}
],
"time": "2023-10-18T19:14:29+00:00"
"time": "2023-11-02T17:47:33+00:00"
},
{
"name": "nyholm/psr7",
@ -7609,16 +7613,16 @@
},
{
"name": "php-http/promise",
"version": "1.2.0",
"version": "1.2.1",
"source": {
"type": "git",
"url": "https://github.com/php-http/promise.git",
"reference": "ef4905bfb492ff389eb7f12e26925a0f20073050"
"reference": "44a67cb59f708f826f3bec35f22030b3edb90119"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/promise/zipball/ef4905bfb492ff389eb7f12e26925a0f20073050",
"reference": "ef4905bfb492ff389eb7f12e26925a0f20073050",
"url": "https://api.github.com/repos/php-http/promise/zipball/44a67cb59f708f826f3bec35f22030b3edb90119",
"reference": "44a67cb59f708f826f3bec35f22030b3edb90119",
"shasum": ""
},
"require": {
@ -7655,9 +7659,9 @@
],
"support": {
"issues": "https://github.com/php-http/promise/issues",
"source": "https://github.com/php-http/promise/tree/1.2.0"
"source": "https://github.com/php-http/promise/tree/1.2.1"
},
"time": "2023-10-24T09:20:26+00:00"
"time": "2023-11-08T12:57:08+00:00"
},
{
"name": "php-jsonpointer/php-jsonpointer",
@ -8908,16 +8912,16 @@
},
{
"name": "ramsey/uuid",
"version": "4.7.4",
"version": "4.7.5",
"source": {
"type": "git",
"url": "https://github.com/ramsey/uuid.git",
"reference": "60a4c63ab724854332900504274f6150ff26d286"
"reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286",
"reference": "60a4c63ab724854332900504274f6150ff26d286",
"url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e",
"reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e",
"shasum": ""
},
"require": {
@ -8984,7 +8988,7 @@
],
"support": {
"issues": "https://github.com/ramsey/uuid/issues",
"source": "https://github.com/ramsey/uuid/tree/4.7.4"
"source": "https://github.com/ramsey/uuid/tree/4.7.5"
},
"funding": [
{
@ -8996,7 +9000,7 @@
"type": "tidelift"
}
],
"time": "2023-04-15T23:01:58+00:00"
"time": "2023-11-08T05:53:05+00:00"
},
{
"name": "razorpay/razorpay",
@ -9065,16 +9069,16 @@
},
{
"name": "rmccue/requests",
"version": "v2.0.8",
"version": "v2.0.9",
"source": {
"type": "git",
"url": "https://github.com/WordPress/Requests.git",
"reference": "fae75bcb83d9d00d0e31ee86a472a036f9f91519"
"reference": "422612952ff3bd5163039f8889eaaaab95a432eb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/WordPress/Requests/zipball/fae75bcb83d9d00d0e31ee86a472a036f9f91519",
"reference": "fae75bcb83d9d00d0e31ee86a472a036f9f91519",
"url": "https://api.github.com/repos/WordPress/Requests/zipball/422612952ff3bd5163039f8889eaaaab95a432eb",
"reference": "422612952ff3bd5163039f8889eaaaab95a432eb",
"shasum": ""
},
"require": {
@ -9148,7 +9152,7 @@
"issues": "https://github.com/WordPress/Requests/issues",
"source": "https://github.com/WordPress/Requests"
},
"time": "2023-09-11T08:27:57+00:00"
"time": "2023-11-08T19:22:04+00:00"
},
{
"name": "sabre/uri",
@ -14750,16 +14754,16 @@
},
{
"name": "filp/whoops",
"version": "2.15.3",
"version": "2.15.4",
"source": {
"type": "git",
"url": "https://github.com/filp/whoops.git",
"reference": "c83e88a30524f9360b11f585f71e6b17313b7187"
"reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/filp/whoops/zipball/c83e88a30524f9360b11f585f71e6b17313b7187",
"reference": "c83e88a30524f9360b11f585f71e6b17313b7187",
"url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546",
"reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546",
"shasum": ""
},
"require": {
@ -14809,7 +14813,7 @@
],
"support": {
"issues": "https://github.com/filp/whoops/issues",
"source": "https://github.com/filp/whoops/tree/2.15.3"
"source": "https://github.com/filp/whoops/tree/2.15.4"
},
"funding": [
{
@ -14817,20 +14821,20 @@
"type": "github"
}
],
"time": "2023-07-13T12:00:00+00:00"
"time": "2023-11-03T12:00:00+00:00"
},
{
"name": "friendsofphp/php-cs-fixer",
"version": "v3.37.1",
"version": "v3.38.0",
"source": {
"type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "c3fe76976081ab871aa654e872da588077e19679"
"reference": "7e6070026e76aa09d77a47519625c86593fb8e31"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/c3fe76976081ab871aa654e872da588077e19679",
"reference": "c3fe76976081ab871aa654e872da588077e19679",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7e6070026e76aa09d77a47519625c86593fb8e31",
"reference": "7e6070026e76aa09d77a47519625c86593fb8e31",
"shasum": ""
},
"require": {
@ -14902,7 +14906,7 @@
],
"support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.37.1"
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.38.0"
},
"funding": [
{
@ -14910,7 +14914,7 @@
"type": "github"
}
],
"time": "2023-10-29T20:51:23+00:00"
"time": "2023-11-07T08:44:54+00:00"
},
{
"name": "hamcrest/hamcrest-php",
@ -15624,16 +15628,16 @@
},
{
"name": "phpstan/phpstan",
"version": "1.10.40",
"version": "1.10.41",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
"reference": "93c84b5bf7669920d823631e39904d69b9c7dc5d"
"reference": "c6174523c2a69231df55bdc65b61655e72876d76"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/93c84b5bf7669920d823631e39904d69b9c7dc5d",
"reference": "93c84b5bf7669920d823631e39904d69b9c7dc5d",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/c6174523c2a69231df55bdc65b61655e72876d76",
"reference": "c6174523c2a69231df55bdc65b61655e72876d76",
"shasum": ""
},
"require": {
@ -15682,7 +15686,7 @@
"type": "tidelift"
}
],
"time": "2023-10-30T14:48:31+00:00"
"time": "2023-11-05T12:57:57+00:00"
},
{
"name": "phpunit/php-code-coverage",

View File

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

View File

@ -645,7 +645,7 @@ $LANG = array(
'primary_user' => 'المستخدم الأساسي',
'help' => 'يساعد',
'playground' => 'ملعب',
'support_forum' => 'Support Forums',
'support_forum' => 'منتديات الدعم',
'invoice_due_date' => 'تاريخ الاستحقاق',
'quote_due_date' => 'صالح حتى',
'valid_until' => 'صالح حتى',
@ -739,7 +739,7 @@ $LANG = array(
'activity_7' => ':contact الفاتورة المعروضة :invoice لـ :client',
'activity_8' => ':user الفاتورة المؤرشفة :invoice',
'activity_9' => ':user الفاتورة المحذوفة :invoice',
'activity_10' => ':user entered payment :payment for :payment_amount on invoice :invoice for :client',
'activity_10' => ':user الدفعة المدخلة :payment لـ :payment _المبلغ الموجود في الفاتورة :invoice لـ :client',
'activity_11' => ':user الدفع المحدث :payment',
'activity_12' => ':user الدفع المؤرشف :payment',
'activity_13' => ':user الدفعة المحذوفة :payment',
@ -1123,7 +1123,7 @@ $LANG = array(
'plan_status' => 'حالة الخطة',
'plan_upgrade' => 'يرقي',
'plan_change' => 'Manage Plan',
'plan_change' => 'إدارة الخطة',
'pending_change_to' => 'تغيير الى',
'plan_changes_to' => ': خطة على a0b70e20 definitelyeeaz0',
'plan_term_changes_to' => ': خطة (: term) في a0b70e20 definitelyeeaz0',
@ -1970,7 +1970,7 @@ $LANG = array(
'current_quarter' => 'الربع الحالي',
'last_quarter' => 'الربع الأخير',
'last_year' => 'العام الماضي',
'all_time' => 'All Time',
'all_time' => 'كل الوقت',
'custom_range' => 'نطاق مخصص',
'url' => 'URL',
'debug' => 'تصحيح',
@ -2230,7 +2230,7 @@ $LANG = array(
'restore_recurring_expense' => 'استعادة النفقات المتكررة',
'restored_recurring_expense' => 'تمت استعادة النفقات المتكررة بنجاح',
'delete_recurring_expense' => 'حذف المصاريف المتكررة',
'deleted_recurring_expense' => 'Successfully deleted recurring expense',
'deleted_recurring_expense' => 'تم حذف النفقات المتكررة بنجاح',
'view_recurring_expense' => 'عرض المصاريف المتكررة',
'taxes_and_fees' => 'الضرائب والرسوم',
'import_failed' => 'فشل الاستيراد',
@ -2374,9 +2374,12 @@ $LANG = array(
'currency_cuban_peso' => 'بيزو كوبي',
'currency_bz_dollar' => 'دولار BZ',
'currency_libyan_dinar' => 'Libyan Dinar',
'currency_silver_troy_ounce' => 'Silver Troy Ounce',
'currency_gold_troy_ounce' => 'Gold Troy Ounce',
'currency_libyan_dinar' => 'الدينار الليبي',
'currency_silver_troy_ounce' => 'أونصة تروي فضية',
'currency_gold_troy_ounce' => 'أونصة تروي ذهبية',
'currency_nicaraguan_córdoba' => 'قرطبة نيكاراغوا',
'currency_malagasy_ariary' => 'أرياري مدغشقر',
"currency_tongan_pa_anga" => "تونجا بانجا",
'review_app_help' => 'نأمل أن تستمتع باستخدام التطبيق.<br/> إذا كنت تفكر في :link فإننا نقدر ذلك كثيرًا!',
'writing_a_review' => 'كتابة مراجعة',
@ -2488,8 +2491,8 @@ $LANG = array(
'partial_due_date' => 'تاريخ الاستحقاق الجزئي',
'task_fields' => 'مجالات المهام',
'product_fields_help' => 'قم بسحب وإسقاط الحقول لتغيير ترتيبها',
'custom_value1' => 'Custom Value 1',
'custom_value2' => 'Custom Value 2',
'custom_value1' => 'القيمة المخصصة 1',
'custom_value2' => 'القيمة المخصصة 2',
'enable_two_factor' => 'توثيق ذو عاملين',
'enable_two_factor_help' => 'استخدم هاتفك لتأكيد هويتك عند تسجيل الدخول',
'two_factor_setup' => 'إعداد ثنائي',
@ -3312,9 +3315,9 @@ $LANG = array(
'freq_three_years' => 'ثلاث سنوات',
'military_time_help' => 'عرض 24 ساعة',
'click_here_capital' => 'انقر هنا',
'marked_invoice_as_paid' => 'Successfully marked invoice as paid',
'marked_invoice_as_paid' => 'تم وضع علامة على الفاتورة على أنها مدفوعة بنجاح',
'marked_invoices_as_sent' => 'نجح وضع علامة على الفواتير على أنها مرسلة',
'marked_invoices_as_paid' => 'Successfully marked invoices as paid',
'marked_invoices_as_paid' => 'تم وضع علامة على الفواتير على أنها مدفوعة بنجاح',
'activity_57' => 'فشل النظام في إرسال الفاتورة بالبريد الإلكتروني :invoice',
'custom_value3' => 'القيمة المخصصة 3',
'custom_value4' => 'القيمة المخصصة 4',
@ -3654,9 +3657,9 @@ $LANG = array(
'send_date' => 'تاريخ الإرسال',
'auto_bill_on' => 'فوترة تلقائية في',
'minimum_under_payment_amount' => 'الحد الأدنى لمبلغ الدفع',
'allow_over_payment' => 'السماح بدفع أكثر من اللازم',
'allow_over_payment' => 'السماح بالدفع الزائد',
'allow_over_payment_help' => 'دعم دفع مبلغ إضافي لقبول الإكراميات',
'allow_under_payment' => 'السماح تحت السداد',
'allow_under_payment' => 'السماح بالدفع الناقص',
'allow_under_payment_help' => 'دعم دفع الحد الأدنى من مبلغ الإيداع / الجزئي',
'test_mode' => 'الوضع التجريبي',
'calculated_rate' => 'السعر المحسوب',
@ -3836,7 +3839,7 @@ $LANG = array(
'notification_credit_viewed' => 'عرض العميل التالي :client الائتمان :credit لـ :amount.',
'reset_password_text' => 'أدخل بريدك الإلكتروني لإعادة تعيين كلمة المرور الخاصة بك.',
'password_reset' => 'إعادة تعيين كلمة المرور',
'account_login_text' => 'Welcome! Glad to see you.',
'account_login_text' => 'مرحباً! سعيد برؤيتك.',
'request_cancellation' => 'طلب الغاء',
'delete_payment_method' => 'حذف وسيلة الدفع',
'about_to_delete_payment_method' => 'أنت على وشك حذف طريقة الدفع.',
@ -3950,11 +3953,11 @@ $LANG = array(
'add_payment_method_first' => 'إضافة طريقة دفع',
'no_items_selected' => 'لم يتم تحديد عناصر.',
'payment_due' => 'استحقاق الدفع',
'account_balance' => 'Account Balance',
'account_balance' => 'رصيد حساب',
'thanks' => 'شكرًا',
'minimum_required_payment' => 'الحد الأدنى للدفع المطلوب هو :amount',
'under_payments_disabled' => 'لا تدعم الشركة بموجب المدفوعات.',
'over_payments_disabled' => 'لا تدعم الشركة المدفوعات.',
'under_payments_disabled' => 'الشركة لا تدعم الدفعات المنخفضة.',
'over_payments_disabled' => 'الشركة لا تدعم المدفوعات الزائدة.',
'saved_at' => 'تم الحفظ في :time',
'credit_payment' => 'تم تطبيق الائتمان على الفاتورة :invoice_number',
'credit_subject' => 'رصيد جديد :number من :account',
@ -4300,7 +4303,7 @@ $LANG = array(
'include_drafts' => 'قم بتضمين المسودات',
'include_drafts_help' => 'تضمين مسودة السجلات في التقارير',
'is_invoiced' => 'مفوتر',
'change_plan' => 'Manage Plan',
'change_plan' => 'إدارة الخطة',
'persist_data' => 'استمرارية البيانات',
'customer_count' => 'عدد العملاء',
'verify_customers' => 'تحقق من العملاء',
@ -4629,8 +4632,8 @@ $LANG = array(
'search_purchase_order' => 'بحث طلب الشراء',
'search_purchase_orders' => 'بحث طلبات الشراء',
'login_url' => 'رابط تسجيل الدخول',
'enable_applying_payments' => 'تمكين تطبيق المدفوعات',
'enable_applying_payments_help' => 'دعم إنشاء وتطبيق المدفوعات بشكل منفصل',
'enable_applying_payments' => 'المدفوعات الزائدة اليدوية',
'enable_applying_payments_help' => 'دعم إضافة مبلغ الدفع الزائد يدويًا على الدفع',
'stock_quantity' => 'كمية المخزون',
'notification_threshold' => 'عتبة الإخطار',
'track_inventory' => 'حساب المخزون',
@ -4881,7 +4884,7 @@ $LANG = array(
'all_clients' => 'كل العملاء',
'show_aging_table' => 'عرض جدول التقادم',
'show_payments_table' => 'إظهار جدول المدفوعات',
'only_clients_with_invoices' => 'Only Clients with Invoices',
'only_clients_with_invoices' => 'فقط العملاء الذين لديهم فواتير',
'email_statement' => 'بيان البريد الإلكتروني',
'once' => 'مرة واحدة',
'schedules' => 'جداول',
@ -4925,7 +4928,7 @@ $LANG = array(
'sync_from' => 'مزامنة من',
'gateway_payment_text' => 'الفواتير: :invoices لـ :amount للعميل :client',
'gateway_payment_text_no_invoice' => 'الدفع بدون فاتورة للمبلغ :amount للعميل :client',
'click_to_variables' => 'Click here to see all variables.',
'click_to_variables' => 'انقر هنا لرؤية كافة المتغيرات.',
'ship_to' => 'سافر على متن سفينة لِـ',
'stripe_direct_debit_details' => 'يرجى التحويل إلى الحساب المصرفي المحدد أعلاه.',
'branch_name' => 'اسم الفرع',
@ -5031,117 +5034,136 @@ $LANG = array(
'tax_exempt' => 'معفاة من الضرائب',
'late_fee_added_locked_invoice' => 'تمت إضافة الرسوم المتأخرة للفاتورة :invoice على a0b70e20 XXeeaz0',
'lang_Khmer' => 'الخمير',
'routing_id' => 'Routing ID',
'enable_e_invoice' => 'Enable E-Invoice',
'e_invoice_type' => 'E-Invoice Type',
'reduced_tax' => 'Reduced Tax',
'override_tax' => 'Override Tax',
'zero_rated' => 'Zero Rated',
'reverse_tax' => 'Reverse Tax',
'updated_tax_category' => 'Successfully updated the tax category',
'updated_tax_categories' => 'Successfully updated the tax categories',
'set_tax_category' => 'Set Tax Category',
'payment_manual' => 'Payment Manual',
'expense_payment_type' => 'Expense Payment Type',
'payment_type_Cash App' => 'Cash App',
'rename' => 'Rename',
'renamed_document' => 'Successfully renamed document',
'e_invoice' => 'E-Invoice',
'light_dark_mode' => 'Light/Dark Mode',
'activities' => 'Activities',
'recent_transactions' => "Here are your company's most recent transactions:",
'country_Palestine' => "Palestine",
'country_Taiwan' => 'Taiwan',
'duties' => 'Duties',
'order_number' => 'Order Number',
'order_id' => 'Order',
'total_invoices_outstanding' => 'Total Invoices Outstanding',
'recent_activity' => 'Recent Activity',
'enable_auto_bill' => 'Enable auto billing',
'email_count_invoices' => 'Email :count invoices',
'invoice_task_item_description' => 'Invoice Task Item Description',
'invoice_task_item_description_help' => 'Add the item description to the invoice line items',
'next_send_time' => 'Next Send Time',
'uploaded_certificate' => 'Successfully uploaded certificate',
'certificate_set' => 'Certificate set',
'certificate_not_set' => 'Certificate not set',
'passphrase_set' => 'Passphrase set',
'passphrase_not_set' => 'Passphrase not set',
'upload_certificate' => 'Upload Certificate',
'certificate_passphrase' => 'Certificate Passphrase',
'valid_vat_number' => 'Valid VAT Number',
'react_notification_link' => 'React Notification Links',
'react_notification_link_help' => 'Admin emails will contain links to the react application',
'show_task_billable' => 'Show Task Billable',
'credit_item' => 'Credit Item',
'drop_file_here' => 'Drop file here',
'files' => 'Files',
'camera' => 'Camera',
'gallery' => 'Gallery',
'project_location' => 'Project Location',
'add_gateway_help_message' => 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments',
'lang_Hungarian' => 'Hungarian',
'use_mobile_to_manage_plan' => 'Use your phone subscription settings to manage your plan',
'item_tax3' => 'Item Tax3',
'item_tax_rate1' => 'Item Tax Rate 1',
'item_tax_rate2' => 'Item Tax Rate 2',
'item_tax_rate3' => 'Item Tax Rate 3',
'buy_price' => 'Buy Price',
'country_Macedonia' => 'Macedonia',
'admin_initiated_payments' => 'Admin Initiated Payments',
'admin_initiated_payments_help' => 'Support entering a payment in the admin portal without an invoice',
'paid_date' => 'Paid Date',
'downloaded_entities' => 'An email will be sent with the PDFs',
'lang_French - Swiss' => 'French - Swiss',
'currency_swazi_lilangeni' => 'Swazi Lilangeni',
'income' => 'Income',
'amount_received_help' => 'Enter a value here if the total amount received was MORE than the invoice amount, or when recording a payment with no invoices. Otherwise this field should be left blank.',
'vendor_phone' => 'Vendor Phone',
'mercado_pago' => 'Mercado Pago',
'mybank' => 'MyBank',
'paypal_paylater' => 'Pay in 4',
'paid_date' => 'Paid Date',
'district' => 'District',
'region' => 'Region',
'county' => 'County',
'tax_details' => 'Tax Details',
'activity_10_online' => ':contact entered payment :payment for invoice :invoice for :client',
'activity_10_manual' => ':user entered payment :payment for invoice :invoice for :client',
'default_payment_type' => 'Default Payment Type',
'number_precision' => 'Number precision',
'number_precision_help' => 'Controls the number of decimals supported in the interface',
'is_tax_exempt' => 'Tax Exempt',
'drop_files_here' => 'Drop files here',
'upload_files' => 'Upload Files',
'download_e_invoice' => 'Download E-Invoice',
'triangular_tax_info' => 'Intra-community triangular transaction',
'intracommunity_tax_info' => 'Tax-free intra-community delivery',
'reverse_tax_info' => 'Please note that this supply is subject to reverse charge',
'currency_nicaraguan_cordoba' => 'Nicaraguan Córdoba',
'public' => 'Public',
'private' => 'Private',
'image' => 'Image',
'other' => 'Other',
'linked_to' => 'Linked To',
'file_saved_in_path' => 'The file has been saved in :path',
'unlinked_transactions' => 'Successfully unlinked :count transactions',
'unlinked_transaction' => 'Successfully unlinked transaction',
'view_dashboard_permission' => 'Allow user to access the dashboard, data is limited to available permissions',
'marked_sent_credits' => 'Successfully marked credits sent',
'show_document_preview' => 'Show Document Preview',
'cash_accounting' => 'Cash accounting',
'click_or_drop_files_here' => 'Click or drop files here',
'set_public' => 'Set public',
'set_private' => 'Set private',
'individual' => 'Individual',
'business' => 'Business',
'partnership' => 'partnership',
'trust' => 'Trust',
'charity' => 'Charity',
'government' => 'Government',
'in_stock_quantity' => 'Stock quantity',
'vendor_contact' => 'Vendor Contact',
'routing_id' => 'معرف التوجيه',
'enable_e_invoice' => 'تفعيل الفاتورة الإلكترونية',
'e_invoice_type' => 'نوع الفاتورة الإلكترونية',
'reduced_tax' => 'تخفيض الضرائب',
'override_tax' => 'تجاوز الضريبة',
'zero_rated' => 'تصنيف صفر',
'reverse_tax' => 'عكس الضريبة',
'updated_tax_category' => 'تم تحديث فئة الضريبة بنجاح',
'updated_tax_categories' => 'تم تحديث فئات الضرائب بنجاح',
'set_tax_category' => 'تعيين فئة الضريبة',
'payment_manual' => 'دليل الدفع',
'expense_payment_type' => 'نوع دفع المصاريف',
'payment_type_Cash App' => 'التطبيق النقدي',
'rename' => 'إعادة تسمية',
'renamed_document' => 'تمت إعادة تسمية المستند بنجاح',
'e_invoice' => 'الفاتورة الإلكترونية',
'light_dark_mode' => 'وضع الضوء/الظلام',
'activities' => 'أنشطة',
'recent_transactions' => "فيما يلي أحدث معاملات شركتك:",
'country_Palestine' => "فلسطين",
'country_Taiwan' => 'تايوان',
'duties' => 'الواجبات',
'order_number' => 'رقم الأمر',
'order_id' => 'طلب',
'total_invoices_outstanding' => 'إجمالي الفواتير المعلقة',
'recent_activity' => 'النشاط الأخير',
'enable_auto_bill' => 'تمكين الفوترة التلقائية',
'email_count_invoices' => 'إرسال الفواتير عبر البريد الإلكتروني :count',
'invoice_task_item_description' => 'وصف عنصر مهمة الفاتورة',
'invoice_task_item_description_help' => 'اضافة وصف الصنف إلى بنود الفاتورة',
'next_send_time' => 'وقت الإرسال التالي',
'uploaded_certificate' => 'تم تحميل الشهادة بنجاح',
'certificate_set' => 'مجموعة الشهادات',
'certificate_not_set' => 'لم يتم تعيين الشهادة',
'passphrase_set' => 'مجموعة عبارة المرور',
'passphrase_not_set' => 'لم يتم تعيين عبارة المرور',
'upload_certificate' => 'تحميل الشهادة',
'certificate_passphrase' => 'عبارة مرور الشهادة',
'valid_vat_number' => 'رقم ضريبة القيمة المضافة صالح',
'react_notification_link' => 'رد فعل روابط الإخطار',
'react_notification_link_help' => 'ستحتوي رسائل البريد الإلكتروني الخاصة بالمسؤول على روابط لتطبيق التفاعل',
'show_task_billable' => 'إظهار المهمة القابلة للفوترة',
'credit_item' => 'عنصر الائتمان',
'drop_file_here' => 'قم بإسقاط الملف هنا',
'files' => 'ملفات',
'camera' => 'آلة تصوير',
'gallery' => 'صالة عرض',
'project_location' => 'موقع المشروع',
'add_gateway_help_message' => 'اضافة بوابة دفع (مثل Stripe أو WePay أو PayPal) لقبول الدفع عبر الإنترنت',
'lang_Hungarian' => 'المجرية',
'use_mobile_to_manage_plan' => 'استخدم إعدادات اشتراك هاتفك لإدارة خطتك',
'item_tax3' => 'ضريبة السلعة3',
'item_tax_rate1' => 'البند معدل الضريبة 1',
'item_tax_rate2' => 'معدل ضريبة السلعة 2',
'item_tax_rate3' => 'معدل ضريبة السلعة 3',
'buy_price' => 'سعر شراء',
'country_Macedonia' => 'مقدونيا',
'admin_initiated_payments' => 'بدأ المشرف المدفوعات',
'admin_initiated_payments_help' => 'دعم إدخال دفعة في بوابة الإدارة بدون فاتورة',
'paid_date' => 'تاريخ المدفوعة',
'downloaded_entities' => 'سيتم إرسال بريد إلكتروني مع ملفات PDF',
'lang_French - Swiss' => 'الفرنسية - السويسرية',
'currency_swazi_lilangeni' => 'ليلانجيني السوازي',
'income' => 'دخل',
'amount_received_help' => 'أدخل قيمة هنا إذا كان إجمالي المبلغ المستلم أكثر من مبلغ الفاتورة، أو عند تسجيل دفعة بدون فواتير. وإلا فيجب ترك هذا الحقل فارغًا.',
'vendor_phone' => 'هاتف البائع',
'mercado_pago' => 'ميركادو باجو',
'mybank' => 'بنكي',
'paypal_paylater' => 'الدفع في 4',
'paid_date' => 'تاريخ المدفوعة',
'district' => 'يصرف',
'region' => 'منطقة',
'county' => 'مقاطعة',
'tax_details' => 'التفاصيل الضريبية',
'activity_10_online' => ':contact تم إدخال الدفعة :payment للفاتورة :invoice لـ :client',
'activity_10_manual' => ':user الدفعة المدخلة :payment للفاتورة :invoice لـ :client',
'default_payment_type' => 'نوع الدفع الافتراضي',
'number_precision' => 'دقة العدد',
'number_precision_help' => 'التحكم في عدد الكسور العشرية المدعومة في الواجهة',
'is_tax_exempt' => 'معفاة من الضرائب',
'drop_files_here' => 'قم بوضع الملفات هنا',
'upload_files' => 'تحميل الملفات',
'download_e_invoice' => 'تحميل الفاتورة الإلكترونية',
'triangular_tax_info' => 'المعاملات الثلاثية داخل المجتمع',
'intracommunity_tax_info' => 'التوصيل داخل المجتمع معفي من الضرائب',
'reverse_tax_info' => 'يرجى ملاحظة أن هذا العرض يخضع لرسوم عكسية',
'currency_nicaraguan_cordoba' => 'قرطبة نيكاراغوا',
'public' => 'عام',
'private' => 'خاص',
'image' => 'صورة',
'other' => 'آخر',
'linked_to' => 'مرتبط ب',
'file_saved_in_path' => 'تم حفظ الملف في :path',
'unlinked_transactions' => 'تم إلغاء ربط معاملات :count بنجاح',
'unlinked_transaction' => 'تم إلغاء ربط المعاملة بنجاح',
'view_dashboard_permission' => 'السماح للمستخدم بالوصول إلى لوحة المعلومات، تقتصر البيانات على الأذونات المتاحة',
'marked_sent_credits' => 'تم وضع علامة على الاعتمادات المرسلة بنجاح',
'show_document_preview' => 'إظهار معاينة المستند',
'cash_accounting' => 'المحاسبة النقدية',
'click_or_drop_files_here' => 'انقر أو أسقط الملفات هنا',
'set_public' => 'تعيين عام',
'set_private' => 'تعيين خاص',
'individual' => 'فردي',
'business' => 'عمل',
'partnership' => 'شراكة',
'trust' => 'يثق',
'charity' => 'صدقة',
'government' => 'حكومة',
'in_stock_quantity' => 'كمية المخزون',
'vendor_contact' => 'الاتصال بالبائع',
'expense_status_4' => 'غير مدفوعة الأجر',
'expense_status_5' => 'مدفوع',
'ziptax_help' => 'ملاحظة: تتطلب هذه الميزة مفتاح Zip-Tax API للبحث عن ضريبة المبيعات الأمريكية حسب العنوان',
'cache_data' => 'بيانات ذاكرة التخزين المؤقت',
'unknown' => 'مجهول',
'webhook_failure' => 'فشل خطاف الويب',
'email_opened' => 'تم فتح البريد الإلكتروني',
'email_delivered' => 'تم تسليم البريد الإلكتروني',
'log' => 'سجل',
'classification' => 'تصنيف',
'stock_quantity_number' => 'كمية المخزون',
'upcoming' => 'القادمة',
'client_contact' => 'الاتصال بالعميل',
'uncategorized' => 'غير مصنف',
'login_notification' => 'إشعار تسجيل الدخول',
'login_notification_help' => 'يرسل بريدًا إلكترونيًا لإعلامك بأنه قد تم تسجيل الدخول.',
'payment_refund_receipt' => 'إيصال استرداد المبلغ رقم :number',
'payment_receipt' => 'إيصال الدفع رقم :number',
'load_template_description' => 'سيتم تطبيق القالب على ما يلي:',
'run_template' => 'تشغيل القالب',
);
return $LANG;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1127,7 +1127,7 @@ $LANG = array(
'documents_from_expenses' => 'Von Kosten:',
'dropzone_default_message' => 'Dateien hierhin ziehen oder klicken, um Dateien hochzuladen',
'dropzone_default_message_disabled' => 'Uploads deaktiviert',
'dropzone_fallback_message' => 'Ihr Browser unterstützt keine "Drag \'n Drop" Datei-Uploads.',
'dropzone_fallback_message' => 'Ihr Browser unterstützt keine "Drag and Drop"-Datei-Uploads.',
'dropzone_fallback_text' => 'Bitte verwenden Sie das untere Formular als Ausweichlösung, um Ihre Dateien wie in alten Zeiten hochladen zu können.',
'dropzone_file_too_big' => 'Die Datei ist zu groß ({{filesize}}MiB). max. Dateigröße: {{maxFilesize}}MiB.',
'dropzone_invalid_file_type' => 'Du kannst Dateien von diesem Typ nicht hochladen.',
@ -2403,9 +2403,9 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'currency_libyan_dinar' => 'Libyscher Dinar',
'currency_silver_troy_ounce' => 'Silberne Feinunze',
'currency_gold_troy_ounce' => 'Goldene Feinunze',
'currency_nicaraguan_córdoba' => 'Nicaraguan Córdoba',
'currency_malagasy_ariary' => 'Malagasy ariary',
"currency_tongan_pa_anga" => "Tongan Pa'anga",
'currency_nicaraguan_córdoba' => 'Nicaraguanischer Córdoba',
'currency_malagasy_ariary' => 'Madagassischer Ariary',
"currency_tongan_pa_anga" => "Tongaischer Paʻanga",
'review_app_help' => 'Wir hoffen, dass Ihnen die App gefällt. Wenn Sie :link in Betracht ziehen würden, wären wir Ihnen sehr dankbar!',
'writing_a_review' => 'Schreiben einer Rezension',
@ -3072,7 +3072,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'custom_js' => 'Benutzerdefiniert JS',
'adjust_fee_percent_help' => 'Gebühren Prozentsatz an das Konto anpassen',
'show_product_notes' => 'Produktdetails anzeigen',
'show_product_notes_help' => 'Fügt die <b>Beschreibung und die Kosten</b> in die Produkt-Dropdown-Liste ein',
'show_product_notes_help' => 'Fügt die <b>Beschreibung und Kosten</b> in die Produkt-Dropdown-Liste ein',
'important' => 'Wichtig',
'thank_you_for_using_our_app' => 'Vielen Dank, dass Sie unsere App nutzen!',
'if_you_like_it' => 'Wenn es dir gefällt, bitte',
@ -3690,7 +3690,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'allow_under_payment_help' => 'Teilzahlungen zulassen',
'test_mode' => 'Test Modus',
'calculated_rate' => 'Berechneter Satz',
'default_task_rate' => 'Standard Stundenlohn',
'default_task_rate' => 'Standard-Stundenlohn',
'clear_cache' => 'Zwischenspeicher leeren',
'sort_order' => 'Sortierreihenfolge',
'task_status' => 'Status',
@ -3706,8 +3706,8 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'search_task_statuses' => 'Suche :count Aufgaben Status',
'show_tasks_table' => 'Zeige Aufgaben Tabelle',
'show_tasks_table_help' => 'Beim Erstellen von Rechnungen immer die Aufgabenauswahl anzeigen',
'invoice_task_timelog' => 'Aufgaben Zeiterfassung in Rechnung stellen',
'invoice_task_timelog_help' => 'Zeitdetails in der Rechnungsposition ausweisen',
'invoice_task_timelog' => 'In Aufgabe erfasste Zeiten in Rechnungen ausweisen',
'invoice_task_timelog_help' => 'Zeigt Zeitdetails in den Rechnungspositionen an',
'auto_start_tasks_help' => 'Beginne Aufgabe vor dem Speichern',
'configure_statuses' => 'Status bearbeiten',
'task_settings' => 'Aufgaben-Einstellungen',
@ -4139,8 +4139,8 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'connect_google' => 'Google-Konto verbinden',
'disconnect_google' => 'Google-Konto entfernen',
'disable_two_factor' => 'Zwei-Faktor-Authentifizierung deaktivieren',
'invoice_task_datelog' => 'Aufgabenzeiterfassung in Rechnung stellen',
'invoice_task_datelog_help' => 'Datumsdetails zu den Rechnungsposten hinzufügen',
'invoice_task_datelog' => 'In Aufgabe erfasste Daten in Rechnungen ausweisen',
'invoice_task_datelog_help' => 'Zeigt Datumsdetails in den Rechnungspositionen an',
'promo_code' => 'Gutscheincode',
'recurring_invoice_issued_to' => 'Wiederkehrende Rechnung ausgestellt an',
'subscription' => 'Abonnement',
@ -4732,8 +4732,8 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'mark_paid_payment_email' => 'E-Mail bei Zahlungsmarkierung',
'convert_to_project' => 'In Projekt umwandeln',
'client_email' => 'Kunden E-Mail',
'invoice_task_project' => 'Rechnung Aufgabe Projekt',
'invoice_task_project_help' => 'Fügen Sie das Projekt zu den Rechnungspositionen hinzu',
'invoice_task_project' => 'In Aufgabe erfasstes Projekt in Rechnungen ausweisen',
'invoice_task_project_help' => 'Zeigt den Projektnamen in den Rechnungspositionen an',
'bulk_action' => 'Massenaktion',
'phone_validation_error' => 'Diese Handynummer ist ungültig, bitte im E.164-Format eingeben',
'transaction' => 'Transaktion',
@ -4885,8 +4885,8 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'inventory_threshold' => 'Inventargrenzwert',
'emailed_statement' => 'Erfolgreich in die Versandwarteschlange eingereiht',
'show_email_footer' => 'E-Mail Fußzeile anzeigen',
'invoice_task_hours' => 'Aufgabenstunden in Rechnung stellen',
'invoice_task_hours_help' => 'Fügen Sie die Stunden zu den Rechnungspositionen hinzu.',
'invoice_task_hours' => 'In Aufgabe erfasste Stunden in Rechnungen ausweisen',
'invoice_task_hours_help' => 'Zeigt die Stunden in den Rechnungspositionen an',
'auto_bill_standard_invoices' => 'Auto Bill Standardrechnungen',
'auto_bill_recurring_invoices' => 'Wiederkehrende Rechnungen automatisch abrechnen',
'email_alignment' => 'E-Mail Ausrichtung',
@ -5108,7 +5108,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'files' => 'Dateien',
'camera' => 'Kamera',
'gallery' => 'Gallerie',
'project_location' => 'Projektstandort',
'project_location' => 'Feld, in dem das Projekt genannt wird',
'add_gateway_help_message' => 'Payment-Gateway hinzufügen (z. B. Stripe, WePay oder PayPal), um Online-Zahlungen anbieten zu können',
'lang_Hungarian' => 'Ungarisch',
'use_mobile_to_manage_plan' => 'Verwenden der Telefon-Abonnementeinstellungen, um Ihren Tarif zu verwalten',
@ -5125,7 +5125,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'lang_French - Swiss' => 'Französisch - Schweiz',
'currency_swazi_lilangeni' => 'Lilangeni',
'income' => 'Einnahmen',
'amount_received_help' => 'Enter a value here if the total amount received was MORE than the invoice amount, or when recording a payment with no invoices. Otherwise this field should be left blank.',
'amount_received_help' => 'Geben Sie hier einen Wert ein, wenn der erhaltene Gesamtbetrag MEHR als der Rechnungsbetrag war oder wenn Sie eine Zahlung ohne Rechnungen erfassen. Andernfalls sollte dieses Feld leer bleiben.',
'vendor_phone' => 'Lieferanten-Telefonnummer',
'mercado_pago' => 'Mercado Pago',
'mybank' => 'MeineBank',
@ -5166,33 +5166,33 @@ Leistungsempfängers',
'set_public' => 'Als "öffentlich" setzen',
'set_private' => 'Als "privat" setzen',
'individual' => 'Indiviuell',
'business' => 'Business',
'business' => 'Unternehmen',
'partnership' => 'Partnerschaft',
'trust' => 'Vertrauen',
'charity' => 'Charity',
'government' => 'Regierung',
'trust' => 'Treuhand/Stiftung',
'charity' => 'Wohltätigkeitsorganisation',
'government' => 'Regierungsbehörde',
'in_stock_quantity' => 'Lagerbestand',
'vendor_contact' => 'Lieferantenkontakt',
'expense_status_4' => 'Unbezahlt',
'expense_status_5' => 'Bezahlt',
'ziptax_help' => 'Note: this feature requires a Zip-Tax API key to lookup US sales tax by address',
'cache_data' => 'Cache Data',
'ziptax_help' => 'Hinweis: Für diese Funktion ist ein "Zip-Tax"-API-Schlüssel erforderlich, um die US-Umsatzsteuer anhand der Adresse zu ermitteln',
'cache_data' => 'Cache Daten',
'unknown' => 'Unbekannt',
'webhook_failure' => 'Webhook-Fehler',
'email_opened' => 'E-Mail geöffnet',
'email_delivered' => 'E-Mail zugestellt',
'log' => 'Log',
'classification' => 'Klassifizierung',
'stock_quantity_number' => 'Stock :quantity',
'stock_quantity_number' => 'Lagerbestand :quantity',
'upcoming' => 'Bevorstehend',
'client_contact' => 'Kundenkontakt',
'uncategorized' => 'Unkategorisiert',
'login_notification' => 'Login Notification',
'login_notification_help' => 'Sends an email notifying that a login has taken place.',
'payment_refund_receipt' => 'Payment Refund Receipt # :number',
'payment_receipt' => 'Payment Receipt # :number',
'load_template_description' => 'The template will be applied to following:',
'run_template' => 'Run template',
'login_notification' => 'Anmelde-Benachrichtigung',
'login_notification_help' => 'Sendet eine Benachrichtigungs-Mail, sobald eine Anmeldung erfolgt ist.',
'payment_refund_receipt' => 'Zahlungs-Rückerstattungsbeleg #:number',
'payment_receipt' => 'Zahlungsbeleg #:number',
'load_template_description' => 'Das Template wird auf Folgendes angewendet:',
'run_template' => 'Template anwenden',
);
return $LANG;

View File

@ -657,7 +657,7 @@ $LANG = array(
'primary_user' => 'Usuario Principal',
'help' => 'Ayuda',
'playground' => 'playground',
'support_forum' => 'Support Forums',
'support_forum' => 'Foros de soporte',
'invoice_due_date' => 'Fecha de Vencimiento',
'quote_due_date' => 'Válida Hasta',
'valid_until' => 'Válida Hasta',
@ -1146,7 +1146,7 @@ $LANG = array(
'plan_status' => 'Plan Status',
'plan_upgrade' => 'Upgrade',
'plan_change' => 'Manage Plan',
'plan_change' => 'Gestionar plan',
'pending_change_to' => 'Changes To',
'plan_changes_to' => ':plan on :date',
'plan_term_changes_to' => ':plan (:term) on :date',
@ -2400,6 +2400,9 @@ $LANG = array(
'currency_libyan_dinar' => 'dinar libio',
'currency_silver_troy_ounce' => 'Onza troy de plata',
'currency_gold_troy_ounce' => 'Onza troy de oro',
'currency_nicaraguan_córdoba' => 'Córdoba nicaragüense',
'currency_malagasy_ariary' => 'ariary malgache',
"currency_tongan_pa_anga" => "Pa&#39;anga tongano",
'review_app_help' => 'Esperamos que estés disfrutando de usar la aplicación.<br/>Si consideras :link lo apreciaremos mucho!',
'writing_a_review' => 'escribiendo una reseña',
@ -3335,9 +3338,9 @@ $LANG = array(
'freq_three_years' => 'Tres años',
'military_time_help' => 'Pantalla de 24 horas',
'click_here_capital' => 'haga clic aquí',
'marked_invoice_as_paid' => 'Successfully marked invoice as paid',
'marked_invoice_as_paid' => 'Factura marcada correctamente como pagada',
'marked_invoices_as_sent' => 'Facturas marcadas correctamente como enviadas',
'marked_invoices_as_paid' => 'Successfully marked invoices as paid',
'marked_invoices_as_paid' => 'Facturas marcadas correctamente como pagadas',
'activity_57' => 'El sistema no envió la factura por correo electrónico :invoice',
'custom_value3' => 'Valor personalizado 3',
'custom_value4' => 'Valor personalizado 4',
@ -3677,9 +3680,9 @@ $LANG = array(
'send_date' => 'Fecha de envio',
'auto_bill_on' => 'Factura automática activada',
'minimum_under_payment_amount' => 'Cantidad mínima de pago inferior',
'allow_over_payment' => 'Permitir sobrepago',
'allow_over_payment' => 'Permitir pago en exceso',
'allow_over_payment_help' => 'Admite pagar extra para aceptar propinas',
'allow_under_payment' => 'Permitir bajo pago',
'allow_under_payment' => 'Permitir pago insuficiente',
'allow_under_payment_help' => 'Soporte pagando como mínimo el monto parcial/depósito',
'test_mode' => 'Modo de prueba',
'calculated_rate' => 'Tasa calculada',
@ -3976,8 +3979,8 @@ $LANG = array(
'account_balance' => 'Saldo de la cuenta',
'thanks' => 'Gracias',
'minimum_required_payment' => 'El pago mínimo requerido es :amount',
'under_payments_disabled' => 'La empresa no admite pagos inferiores.',
'over_payments_disabled' => 'La empresa no admite pagos excesivos.',
'under_payments_disabled' => 'La empresa no admite pagos insuficientes.',
'over_payments_disabled' => 'La empresa no admite pagos en exceso.',
'saved_at' => 'Guardado en :time',
'credit_payment' => 'Crédito aplicado a Factura :invoice_number',
'credit_subject' => 'Nuevo crédito :number de :account',
@ -4323,7 +4326,7 @@ $LANG = array(
'include_drafts' => 'Incluir borradores',
'include_drafts_help' => 'Incluir borradores de registros en informes',
'is_invoiced' => 'es facturado',
'change_plan' => 'Manage Plan',
'change_plan' => 'Gestionar plan',
'persist_data' => 'Persistir datos',
'customer_count' => 'Número de clientes',
'verify_customers' => 'Verificar clientes',
@ -4652,8 +4655,8 @@ $LANG = array(
'search_purchase_order' => 'Buscar orden de compra',
'search_purchase_orders' => 'Buscar órdenes de compra',
'login_url' => 'URL de inicio de sesión',
'enable_applying_payments' => 'Habilitar la aplicación de pagos',
'enable_applying_payments_help' => 'Admite la creación y aplicación de pagos por separado',
'enable_applying_payments' => 'Sobrepagos manuales',
'enable_applying_payments_help' => 'Admite agregar un monto de sobrepago manualmente en un pago',
'stock_quantity' => 'Cantidad de stock',
'notification_threshold' => 'Umbral de notificación',
'track_inventory' => 'Seguimiento de inventario',
@ -5136,35 +5139,54 @@ $LANG = array(
'is_tax_exempt' => 'Exento de Impuestos',
'drop_files_here' => 'Suelte archivos aquí',
'upload_files' => 'Subir archivos',
'download_e_invoice' => 'Download E-Invoice',
'triangular_tax_info' => 'Intra-community triangular transaction',
'intracommunity_tax_info' => 'Tax-free intra-community delivery',
'reverse_tax_info' => 'Please note that this supply is subject to reverse charge',
'currency_nicaraguan_cordoba' => 'Nicaraguan Córdoba',
'public' => 'Public',
'private' => 'Private',
'image' => 'Image',
'other' => 'Other',
'linked_to' => 'Linked To',
'file_saved_in_path' => 'The file has been saved in :path',
'unlinked_transactions' => 'Successfully unlinked :count transactions',
'unlinked_transaction' => 'Successfully unlinked transaction',
'view_dashboard_permission' => 'Allow user to access the dashboard, data is limited to available permissions',
'marked_sent_credits' => 'Successfully marked credits sent',
'show_document_preview' => 'Show Document Preview',
'cash_accounting' => 'Cash accounting',
'click_or_drop_files_here' => 'Click or drop files here',
'set_public' => 'Set public',
'set_private' => 'Set private',
'download_e_invoice' => 'Descargar factura electrónica',
'triangular_tax_info' => 'Transacción triangular intracomunitaria',
'intracommunity_tax_info' => 'Entrega intracomunitaria libre de impuestos',
'reverse_tax_info' => 'Tenga en cuenta que este suministro está sujeto a inversión de cargo.',
'currency_nicaraguan_cordoba' => 'Córdoba nicaragüense',
'public' => 'Público',
'private' => 'Privado',
'image' => 'Imagen',
'other' => 'Otro',
'linked_to' => 'Vinculado a',
'file_saved_in_path' => 'El archivo se ha guardado en: ruta',
'unlinked_transactions' => 'Transacciones :count desvinculadas correctamente',
'unlinked_transaction' => 'Transacción desvinculada exitosamente',
'view_dashboard_permission' => 'Permitir que el usuario acceda al panel, los datos están limitados a los permisos disponibles',
'marked_sent_credits' => 'Créditos marcados exitosamente enviados',
'show_document_preview' => 'Mostrar vista previa del documento',
'cash_accounting' => 'contabilidad de caja',
'click_or_drop_files_here' => 'Haga clic o suelte archivos aquí',
'set_public' => 'Establecer público',
'set_private' => 'Establecer privado',
'individual' => 'Individual',
'business' => 'Business',
'partnership' => 'partnership',
'trust' => 'Trust',
'charity' => 'Charity',
'government' => 'Government',
'in_stock_quantity' => 'Stock quantity',
'vendor_contact' => 'Vendor Contact',
'business' => 'Negocio',
'partnership' => 'camaradería',
'trust' => 'Confianza',
'charity' => 'Caridad',
'government' => 'Gobierno',
'in_stock_quantity' => 'Cantidad de stock',
'vendor_contact' => 'Contacto del proveedor',
'expense_status_4' => 'No pagado',
'expense_status_5' => 'Pagado',
'ziptax_help' => 'Nota: esta función requiere una clave API Zip-Tax para buscar impuestos sobre las ventas de EE. UU. por dirección',
'cache_data' => 'Datos de caché',
'unknown' => 'Desconocido',
'webhook_failure' => 'Fallo del webhook',
'email_opened' => 'Correo electrónico abierto',
'email_delivered' => 'Correo electrónico entregado',
'log' => 'Registro',
'classification' => 'Clasificación',
'stock_quantity_number' => 'Cantidad de stock',
'upcoming' => 'Próximo',
'client_contact' => 'Contacto con el cliente',
'uncategorized' => 'Sin categoría',
'login_notification' => 'Notificación de inicio de sesión',
'login_notification_help' => 'Envía un correo electrónico notificando que se ha realizado un inicio de sesión.',
'payment_refund_receipt' => 'Recibo de reembolso de pago n.° :number',
'payment_receipt' => 'Recibo de pago # :number',
'load_template_description' => 'La plantilla se aplicará a lo siguiente:',
'run_template' => 'Ejecutar plantilla',
);
return $LANG;

View File

@ -652,7 +652,7 @@ $LANG = array(
'primary_user' => 'Utilisateur principal',
'help' => 'Aide',
'playground' => 'cour de récréation',
'support_forum' => 'Support Forums',
'support_forum' => 'Forums d&#39;assistance',
'invoice_due_date' => 'Date limite',
'quote_due_date' => 'Date limite',
'valid_until' => 'Valide jusqu\'au',
@ -1142,7 +1142,7 @@ $LANG = array(
'plan_status' => 'Statut du Plan',
'plan_upgrade' => 'Mettre à niveau',
'plan_change' => 'Manage Plan',
'plan_change' => 'Gérer le forfait',
'pending_change_to' => 'Change vers',
'plan_changes_to' => ':plan au :date',
'plan_term_changes_to' => ':plan (:term) le :date',
@ -2396,6 +2396,9 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'currency_libyan_dinar' => 'Dinar libyen',
'currency_silver_troy_ounce' => 'Once troy d&#39;argent',
'currency_gold_troy_ounce' => 'Once troy d&#39;or',
'currency_nicaraguan_córdoba' => 'Cordoue nicaraguayenne',
'currency_malagasy_ariary' => 'Ariary malgache',
"currency_tongan_pa_anga" => "Pa&#39;anga tongien",
'review_app_help' => 'Nous espérons que votre utilisation de cette application vous est agréable.<br/>Un commentaire de votre part serait grandement apprécié!',
'writing_a_review' => 'écrire un commentaire',
@ -3331,9 +3334,9 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'freq_three_years' => 'Trois ans',
'military_time_help' => 'Affichage sur 24h',
'click_here_capital' => 'Cliquer ici',
'marked_invoice_as_paid' => 'Successfully marked invoice as paid',
'marked_invoice_as_paid' => 'Facture marquée avec succès comme payée',
'marked_invoices_as_sent' => 'Les factures ont été marquées envoyées',
'marked_invoices_as_paid' => 'Successfully marked invoices as paid',
'marked_invoices_as_paid' => 'Factures marquées avec succès comme payées',
'activity_57' => 'La facture :invoice n\'a pu être envoyée',
'custom_value3' => 'Valeur personnalisée 3',
'custom_value4' => 'Valeur personnalisée 4',
@ -3673,9 +3676,9 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'send_date' => 'Date d\'envoi',
'auto_bill_on' => 'Autofacturer le',
'minimum_under_payment_amount' => 'Montant minimum de sous-paiement',
'allow_over_payment' => 'Accepter Sur-paiement',
'allow_over_payment' => 'Autoriser le trop-payé',
'allow_over_payment_help' => 'Accepter le paiement supplémentaire pour pourboire',
'allow_under_payment' => 'Accepter Sous-paiement',
'allow_under_payment' => 'Autoriser le sous-paiement',
'allow_under_payment_help' => 'Supporter le paiement au minimum du montant de l\'acompte',
'test_mode' => 'Mode test',
'calculated_rate' => 'Taux Calculé',
@ -3972,8 +3975,8 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'account_balance' => 'Solde du compte',
'thanks' => 'Merci',
'minimum_required_payment' => 'Le paiement minimum requis est :amount',
'under_payments_disabled' => 'La société ne prend pas en charge les sous-paiements.',
'over_payments_disabled' => 'La société ne prend pas en charge les paiements excessifs.',
'under_payments_disabled' => 'L&#39;entreprise ne prend pas en charge les sous-paiements.',
'over_payments_disabled' => 'L&#39;entreprise ne prend pas en charge les trop-payés.',
'saved_at' => 'Enregistré à :time',
'credit_payment' => 'Crédit appliqué à la facture :invoice_number',
'credit_subject' => 'Nouveau crédit :number de :account',
@ -4319,7 +4322,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'include_drafts' => 'Inclure les brouillons',
'include_drafts_help' => 'Inclure les brouillons d\'enregistrements dans les rapports',
'is_invoiced' => 'Est facturé',
'change_plan' => 'Manage Plan',
'change_plan' => 'Gérer le forfait',
'persist_data' => 'Mémoriser les données',
'customer_count' => 'Nombre de clients',
'verify_customers' => 'Vérifier les clients',
@ -4648,8 +4651,8 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'search_purchase_order' => 'Rechercher un bon de commande',
'search_purchase_orders' => 'Rechercher des bons de commande',
'login_url' => 'URL de connexion',
'enable_applying_payments' => 'Active la fonction \'Appliquer les paiements\'',
'enable_applying_payments_help' => 'Permet de créer et d\'appliquer les paiements séparément',
'enable_applying_payments' => 'Trop-payés manuels',
'enable_applying_payments_help' => 'Prise en charge de l&#39;ajout manuel d&#39;un montant de trop-payé sur un paiement',
'stock_quantity' => 'Quantité en stock',
'notification_threshold' => 'Seuil de notification',
'track_inventory' => 'Gérer l\'inventaire',
@ -5132,7 +5135,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'is_tax_exempt' => 'Exonéré d&#39;impôt',
'drop_files_here' => 'Déposez les fichiers ici',
'upload_files' => 'Télécharger des fichiers',
'download_e_invoice' => 'Download E-Invoice',
'download_e_invoice' => 'Télécharger la facture électronique',
'triangular_tax_info' => 'Article 141 de la directive 2006/112/CE opération triangulaire',
'intracommunity_tax_info' => 'Livraison désignée à l\'article 262 ter du CGI TVA due par le preneur',
'reverse_tax_info' => 'Exonération des TVA article 283-2 du CGI TVA due par le preneur',
@ -5146,21 +5149,40 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'unlinked_transactions' => 'Transactions :count dissociées avec succès',
'unlinked_transaction' => 'Transaction dissociée avec succès',
'view_dashboard_permission' => 'Autoriser l&#39;utilisateur à accéder au tableau de bord, les données sont limitées aux autorisations disponibles',
'marked_sent_credits' => 'Successfully marked credits sent',
'show_document_preview' => 'Show Document Preview',
'cash_accounting' => 'Cash accounting',
'click_or_drop_files_here' => 'Click or drop files here',
'set_public' => 'Set public',
'set_private' => 'Set private',
'individual' => 'Individual',
'business' => 'Business',
'partnership' => 'partnership',
'trust' => 'Trust',
'charity' => 'Charity',
'government' => 'Government',
'in_stock_quantity' => 'Stock quantity',
'vendor_contact' => 'Vendor Contact',
'marked_sent_credits' => 'Crédits marqués avec succès envoyés',
'show_document_preview' => 'Afficher l&#39;aperçu du document',
'cash_accounting' => 'Comptabilité de trésorerie',
'click_or_drop_files_here' => 'Cliquez ou déposez les fichiers ici',
'set_public' => 'Définir comme public',
'set_private' => 'Définir comme privé',
'individual' => 'Individuel',
'business' => 'Entreprise',
'partnership' => 'Partenariat',
'trust' => 'Confiance',
'charity' => 'Charité',
'government' => 'Gouvernement',
'in_stock_quantity' => 'Quantité en stock',
'vendor_contact' => 'Contacter le fournisseur',
'expense_status_4' => 'Non payé',
'expense_status_5' => 'Payé',
'ziptax_help' => 'Remarque : cette fonctionnalité nécessite une clé API Zip-Tax pour rechercher la taxe de vente américaine par adresse.',
'cache_data' => 'Données en cache',
'unknown' => 'Inconnu',
'webhook_failure' => 'Échec du webhook',
'email_opened' => 'E-mail ouvert',
'email_delivered' => 'E-mail livré',
'log' => 'Enregistrer',
'classification' => 'Classification',
'stock_quantity_number' => 'Quantité en stock',
'upcoming' => 'A venir',
'client_contact' => 'Contact client',
'uncategorized' => 'Non classé',
'login_notification' => 'Notification de connexion',
'login_notification_help' => 'Envoie un e-mail informant qu&#39;une connexion a eu lieu.',
'payment_refund_receipt' => 'Reçu de remboursement de paiement # :number',
'payment_receipt' => 'Reçu de paiement # :number',
'load_template_description' => 'Le modèle sera appliqué aux éléments suivants :',
'run_template' => 'Exécuter le modèle',
);
return $LANG;

View File

@ -652,7 +652,7 @@ $LANG = array(
'primary_user' => 'Utilisateur principal',
'help' => 'Aide',
'playground' => 'environnement',
'support_forum' => 'Support Forums',
'support_forum' => 'Forums d&#39;assistance',
'invoice_due_date' => 'Échéance',
'quote_due_date' => 'Valide jusqu\'au',
'valid_until' => 'Valide jusqu\'au',
@ -1139,7 +1139,7 @@ $LANG = array(
'plan_status' => 'État du plan',
'plan_upgrade' => 'Mise à jour',
'plan_change' => 'Manage Plan',
'plan_change' => 'Gérer le forfait',
'pending_change_to' => 'Changer pour',
'plan_changes_to' => ':plan le :date',
'plan_term_changes_to' => ':plan (:term) le :date',
@ -2391,9 +2391,12 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'currency_cuban_peso' => 'Cuban Peso',
'currency_bz_dollar' => 'BZ Dollar',
'currency_libyan_dinar' => 'Libyan Dinar',
'currency_silver_troy_ounce' => 'Silver Troy Ounce',
'currency_gold_troy_ounce' => 'Gold Troy Ounce',
'currency_libyan_dinar' => 'Dinar libyen',
'currency_silver_troy_ounce' => 'Once Troy d&#39;argent',
'currency_gold_troy_ounce' => 'Once troy d&#39;or',
'currency_nicaraguan_córdoba' => 'Cordoue nicaraguayenne',
'currency_malagasy_ariary' => 'Ariary malgache',
"currency_tongan_pa_anga" => "Pa&#39;anga tongien",
'review_app_help' => 'Nous espérons que votre utilisation de cette application vous est agréable.<br/>Un commentaire de votre part serait grandement apprécié!',
'writing_a_review' => 'rédiger un commentaire',
@ -3329,9 +3332,9 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'freq_three_years' => 'Trois ans',
'military_time_help' => 'Affichage 24h',
'click_here_capital' => 'Cliquez ici',
'marked_invoice_as_paid' => 'Successfully marked invoice as paid',
'marked_invoice_as_paid' => 'La facture a été marquée comme payée',
'marked_invoices_as_sent' => 'Les factures ont été marquées comme envoyées avec succès',
'marked_invoices_as_paid' => 'Successfully marked invoices as paid',
'marked_invoices_as_paid' => 'Les factures ont été marquées comme payées',
'activity_57' => 'Le système n\'a pas pu envoyer le courriel de la facture :invoice',
'custom_value3' => 'Valeur personnalisée 3',
'custom_value4' => 'Valeur personnalisée 4',
@ -3671,9 +3674,9 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'send_date' => 'Date d\'envoi',
'auto_bill_on' => 'Autofacturer le',
'minimum_under_payment_amount' => 'Montant minimum de sous-paiement',
'allow_over_payment' => 'Accepter Sur-paiement',
'allow_over_payment' => 'Autoriser le surpaiement',
'allow_over_payment_help' => 'Accepter paiement supplémentaire pour pourboire',
'allow_under_payment' => 'Accepter Sous-paiement',
'allow_under_payment' => 'Autoriser le souspaiement',
'allow_under_payment_help' => 'Accepter paiement au minimum le montant partiel/dépôt',
'test_mode' => 'Mode test',
'calculated_rate' => 'Taux calculé',
@ -3970,8 +3973,8 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'account_balance' => 'Solde du compte',
'thanks' => 'Merci',
'minimum_required_payment' => 'Le paiement minimum requis est :amount',
'under_payments_disabled' => 'La société ne tolère pas le sous-paiement.',
'over_payments_disabled' => 'La société ne tolère pas le sur-paiement.',
'under_payments_disabled' => 'L\'entreprise d\'autorise pas les surpaiements.',
'over_payments_disabled' => 'L\'entreprise d\'autorise pas les souspaiements.',
'saved_at' => 'Enregistré à :time',
'credit_payment' => 'Le crédit a été appliqué à la facture :invoice_number',
'credit_subject' => 'Nouveau crédit :credit de :account',
@ -4317,7 +4320,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'include_drafts' => 'Include Drafts',
'include_drafts_help' => 'Include draft records in reports',
'is_invoiced' => 'Is Invoiced',
'change_plan' => 'Manage Plan',
'change_plan' => 'Gérer le forfait',
'persist_data' => 'Persist Data',
'customer_count' => 'Customer Count',
'verify_customers' => 'Verify Customers',
@ -4646,8 +4649,8 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'search_purchase_order' => 'Rechercher un bon de commande',
'search_purchase_orders' => 'Rechercher des bons de commande',
'login_url' => 'Login URL',
'enable_applying_payments' => 'Active la fonction \'Appliquer les paiements\'',
'enable_applying_payments_help' => 'Permet de créer et d\'appliquer les paiements séparément',
'enable_applying_payments' => 'Trop-payés manuels',
'enable_applying_payments_help' => 'Prise en charge de l&#39;ajout manuel d&#39;un montant de trop-payé sur un paiement',
'stock_quantity' => 'Stock Quantity',
'notification_threshold' => 'Notification Threshold',
'track_inventory' => 'Suivre l\'inventaire',
@ -4942,7 +4945,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'sync_from' => 'Sync From',
'gateway_payment_text' => 'Invoices: :invoices for :amount for client :client',
'gateway_payment_text_no_invoice' => 'Paiement sans facture d\'un montant de :amount pour le client :client',
'click_to_variables' => 'Click here to see all variables.',
'click_to_variables' => 'Cliquez ici pour voir toutes les variables.',
'ship_to' => 'Ship to',
'stripe_direct_debit_details' => 'Please transfer into the nominated bank account above.',
'branch_name' => 'Branch Name',
@ -5115,50 +5118,69 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'amount_received_help' => 'Saisissez une valeur si le montant total reçu été PLUS élevé que le montant de la facture, ou lors de l\'enregistrement d\'un paiement sans factures. Sinon, ce champ devrait rester vide.',
'vendor_phone' => 'Téléphone du fournisseur',
'mercado_pago' => 'Mercado Pago',
'mybank' => 'MyBank',
'paypal_paylater' => 'Pay in 4',
'mybank' => 'Ma banque',
'paypal_paylater' => 'Payez en 4',
'paid_date' => 'La date de paiement',
'district' => 'District',
'region' => 'Region',
'county' => 'County',
'tax_details' => 'Tax Details',
'activity_10_online' => ':contact entered payment :payment for invoice :invoice for :client',
'activity_10_manual' => ':user entered payment :payment for invoice :invoice for :client',
'default_payment_type' => 'Default Payment Type',
'number_precision' => 'Number precision',
'number_precision_help' => 'Controls the number of decimals supported in the interface',
'is_tax_exempt' => 'Tax Exempt',
'drop_files_here' => 'Drop files here',
'upload_files' => 'Upload Files',
'download_e_invoice' => 'Download E-Invoice',
'triangular_tax_info' => 'Intra-community triangular transaction',
'intracommunity_tax_info' => 'Tax-free intra-community delivery',
'reverse_tax_info' => 'Please note that this supply is subject to reverse charge',
'currency_nicaraguan_cordoba' => 'Nicaraguan Córdoba',
'public' => 'Public',
'private' => 'Private',
'district' => 'Canton',
'region' => 'Région',
'county' => 'Pays',
'tax_details' => 'Détails de la TVA',
'activity_10_online' => ':contact paiement saisi :payment pour facture :invoice pour :client',
'activity_10_manual' => ':user paiement saisi :payment pour facture :invoice pour :client',
'default_payment_type' => 'Type de paiement par défaut',
'number_precision' => 'Précision du nombre',
'number_precision_help' => 'Contrôle le nombre de décimales prises en charge dans l&#39;interface',
'is_tax_exempt' => 'TVA non applicable',
'drop_files_here' => 'Déposez les fichiers ici',
'upload_files' => 'Téléverser les fichiers',
'download_e_invoice' => 'Télécharger la facture électronique',
'triangular_tax_info' => 'Transaction triangulaire intracommunautaire',
'intracommunity_tax_info' => 'Livraison intracommunautaire hors taxes',
'reverse_tax_info' => 'Veuillez noter que cette fourniture est soumise à l&#39;autoliquidation',
'currency_nicaraguan_cordoba' => 'Cordoue nicaraguayenne',
'public' => 'Publique',
'private' => 'Privé',
'image' => 'Image',
'other' => 'Other',
'linked_to' => 'Linked To',
'file_saved_in_path' => 'The file has been saved in :path',
'unlinked_transactions' => 'Successfully unlinked :count transactions',
'unlinked_transaction' => 'Successfully unlinked transaction',
'view_dashboard_permission' => 'Allow user to access the dashboard, data is limited to available permissions',
'marked_sent_credits' => 'Successfully marked credits sent',
'show_document_preview' => 'Show Document Preview',
'cash_accounting' => 'Cash accounting',
'click_or_drop_files_here' => 'Click or drop files here',
'set_public' => 'Set public',
'set_private' => 'Set private',
'individual' => 'Individual',
'business' => 'Business',
'partnership' => 'partnership',
'trust' => 'Trust',
'charity' => 'Charity',
'government' => 'Government',
'in_stock_quantity' => 'Stock quantity',
'vendor_contact' => 'Vendor Contact',
'other' => 'Autre',
'linked_to' => 'Lié à',
'file_saved_in_path' => 'Le fichier a été enregistré dans :path',
'unlinked_transactions' => 'Transactions :count dissociées avec succès',
'unlinked_transaction' => 'Transaction dissociée avec succès',
'view_dashboard_permission' => 'Autoriser l&#39;utilisateur à accéder au tableau de bord, les données sont limitées aux autorisations disponibles',
'marked_sent_credits' => 'Crédits marqués avec succès envoyés',
'show_document_preview' => 'Afficher l&#39;aperçu du document',
'cash_accounting' => 'Comptabilité de trésorerie',
'click_or_drop_files_here' => 'Cliquez ou déposez les fichiers ici',
'set_public' => 'Définir comme public',
'set_private' => 'Définir comme privé',
'individual' => 'Individuel',
'business' => 'Entreprise',
'partnership' => 'partenaire',
'trust' => 'Confiance',
'charity' => 'Charité',
'government' => 'Gouvernement',
'in_stock_quantity' => 'Quantité en stock',
'vendor_contact' => 'Contact du fournisseur',
'expense_status_4' => 'Non payé',
'expense_status_5' => 'Payé',
'ziptax_help' => 'Remarque : cette fonctionnalité nécessite une clé API Zip-Tax pour rechercher la taxe de vente américaine par adresse.',
'cache_data' => 'Données en cache',
'unknown' => 'Inconnu',
'webhook_failure' => 'Échec du webhook',
'email_opened' => 'E-mail ouvert',
'email_delivered' => 'E-mail livré',
'log' => 'Enregistrer',
'classification' => 'Classification',
'stock_quantity_number' => 'Quantité en stock',
'upcoming' => 'A venir',
'client_contact' => 'Contact client',
'uncategorized' => 'Non classé',
'login_notification' => 'Notification de connexion',
'login_notification_help' => 'Envoie un e-mail informant qu&#39;une connexion a eu lieu.',
'payment_refund_receipt' => 'Reçu de remboursement de paiement # :number',
'payment_receipt' => 'Reçu de paiement # :number',
'load_template_description' => 'Le modèle sera appliqué aux éléments suivants :',
'run_template' => 'Exécuter le modèle',
);
return $LANG;

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -119,19 +119,18 @@ Route::get('payments/process/response', [App\Http\Controllers\ClientPortal\Payme
Route::get('client/subscriptions/{subscription}/purchase', [App\Http\Controllers\ClientPortal\SubscriptionPurchaseController::class, 'index'])->name('client.subscription.purchase')->middleware('domain_db');
Route::get('client/subscriptions/{subscription}/purchase/v2', [App\Http\Controllers\ClientPortal\SubscriptionPurchaseController::class, 'upgrade'])->name('client.subscription.upgrade')->middleware('domain_db');
Route::group(['middleware' => ['invite_db'], 'prefix' => 'client', 'as' => 'client.'], function () {
/*Invitation catches*/
Route::get('recurring_invoice/{invitation_key}', [App\Http\Controllers\ClientPortal\InvitationController::class, 'recurringRouter']);
Route::get('invoice/{invitation_key}', [App\Http\Controllers\ClientPortal\InvitationController::class, 'invoiceRouter']);
Route::get('quote/{invitation_key}', [App\Http\Controllers\ClientPortal\InvitationController::class, 'quoteRouter']);
Route::get('credit/{invitation_key}', [App\Http\Controllers\ClientPortal\InvitationController::class, 'creditRouter']);
Route::get('recurring_invoice/{invitation_key}/download_pdf', [RecurringInvoiceController::class, 'downloadPdf'])->name('recurring_invoice.download_invitation_key');
Route::get('invoice/{invitation_key}/download_pdf', [InvoiceController::class, 'downloadPdf'])->name('invoice.download_invitation_key');
Route::get('invoice/{invitation_key}/download_e_invoice', [InvoiceController::class, 'downloadEInvoice'])->name('invoice.download_e_invoice');
Route::get('quote/{invitation_key}/download_pdf', [QuoteController::class, 'downloadPdf'])->name('quote.download_invitation_key');
Route::get('credit/{invitation_key}/download_pdf', [CreditController::class, 'downloadPdf'])->name('credit.download_invitation_key');
Route::get('{entity}/{invitation_key}/download', [App\Http\Controllers\ClientPortal\InvitationController::class, 'routerForDownload']);
Route::get('recurring_invoice/{invitation_key}/download_pdf', [RecurringInvoiceController::class, 'downloadPdf'])->name('recurring_invoice.download_invitation_key');//->middleware('token_auth');
Route::get('invoice/{invitation_key}/download_pdf', [InvoiceController::class, 'downloadPdf'])->name('invoice.download_invitation_key');//->middleware('token_auth');
Route::get('invoice/{invitation_key}/download_e_invoice', [InvoiceController::class, 'downloadEInvoice'])->name('invoice.download_e_invoice');//->middleware('token_auth');
Route::get('quote/{invitation_key}/download_pdf', [QuoteController::class, 'downloadPdf'])->name('quote.download_invitation_key');//->middleware('token_auth');
Route::get('credit/{invitation_key}/download_pdf', [CreditController::class, 'downloadPdf'])->name('credit.download_invitation_key');//->middleware('token_auth');
Route::get('{entity}/{invitation_key}/download', [App\Http\Controllers\ClientPortal\InvitationController::class, 'routerForDownload']);//->middleware('token_auth');
Route::get('pay/{invitation_key}', [App\Http\Controllers\ClientPortal\InvitationController::class, 'payInvoice'])->name('pay.invoice');
Route::get('unsubscribe/{entity}/{invitation_key}', [App\Http\Controllers\ClientPortal\InvitationController::class, 'unsubscribe'])->name('unsubscribe');

View File

@ -24,7 +24,7 @@ Route::get('vendor/key_login/{contact_key}', [VendorContactHashLoginController::
Route::group(['middleware' => ['invite_db'], 'prefix' => 'vendor', 'as' => 'vendor.'], function () {
/*Invitation catches*/
Route::get('purchase_order/{invitation_key}', [InvitationController::class, 'purchaseOrder']);
Route::get('purchase_order/{invitation_key}/download', [InvitationController::class, 'download']);
Route::get('purchase_order/{invitation_key}/download', [InvitationController::class, 'download']);//->middleware('token_auth');
});
Route::group(['middleware' => ['auth:vendor', 'vendor_locale', 'domain_db'], 'prefix' => 'vendor', 'as' => 'vendor.'], function () {

View File

@ -223,6 +223,7 @@ class MultiPaymentDeleteTest extends TestCase
$data = [
'amount' => 162.0,
'transaction_reference' => 'something',
'client_id' => $this->encodePrimaryKey($client->id),
'invoices' => [
[

View File

@ -83,7 +83,7 @@ class PaymentTest extends TestCase
],
],
'date' => '2020/12/11',
'idempotency_key' => 'dsjafhajklsfhlaksjdhlkajsdjdfjdfljasdfhkjlsafhljfkfhsjlfhiuwayerfiuwaskjgbzmvnjzxnjcbgfkjhdgfoiwwrasdfasdfkashjdfkaskfjdasfda'
'idempotency_key' => sha1(time()).\Illuminate\Support\Str::uuid()->toString()
];

View File

@ -322,15 +322,29 @@ class ReminderTest extends TestCase
$this->travelTo(now()->startOfDay());
for($x=0; $x<46; $x++) {
$travel_date = Carbon::parse($this->invoice->next_send_date);
$x = false;
for($x=0; $x<50; $x++) {
// nlog("traveller {$x} ".now()->format('Y-m-d h:i:s'));
(new ReminderJob())->handle();
$this->invoice = $this->invoice->fresh();
$this->assertNull($this->invoice->reminder1_sent);
$this->assertNull($this->invoice->reminder_last_sent);
if(now()->gt($travel_date) && !$x) {
$this->assertNotNull($this->invoice->reminder1_sent);
$this->assertNotNull($this->invoice->reminder_last_sent);
$x=true;
}
if(!$x){
$this->invoice = $this->invoice->fresh();
$this->assertNull($this->invoice->reminder1_sent);
$this->assertNull($this->invoice->reminder_last_sent);
}
$this->travelTo(now()->addHours(1));
}
// nlog("traveller ".now()->format('Y-m-d'));

View File

@ -11,21 +11,24 @@
namespace Tests\Integration;
use App\DataMapper\CompanySettings;
use App\Factory\CompanyUserFactory;
use App\Models\Account;
use Tests\TestCase;
use App\Models\User;
use App\Models\Client;
use App\Models\ClientContact;
use App\Models\Account;
use App\Models\Company;
use App\Models\CompanyToken;
use App\Models\Invoice;
use App\Models\Payment;
use App\Models\User;
use App\Models\CompanyToken;
use App\Models\ClientContact;
use App\Models\CompanyLedger;
use App\DataMapper\InvoiceItem;
use App\Utils\Traits\MakesHash;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use App\Jobs\Ledger\UpdateLedger;
use App\DataMapper\CompanySettings;
use App\Factory\CompanyUserFactory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
use Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseTransactions;
/** @test*/
class CompanyLedgerTest extends TestCase
@ -86,7 +89,7 @@ class CompanyLedgerTest extends TestCase
$user = User::whereEmail($fake_email)->first();
if (! $user) {
$user = User::factory()->create([
'email' => $fake_email,
@ -95,6 +98,7 @@ class CompanyLedgerTest extends TestCase
'confirmation_code' => $this->createDbHash(config('database.default')),
]);
}
$this->user = $user;
$cu = CompanyUserFactory::create($user->id, $this->company->id, $this->account->id);
$cu->is_owner = true;
@ -126,6 +130,78 @@ class CompanyLedgerTest extends TestCase
]);
}
public function testLedgerAdjustments()
{
$c = Client::factory()->create([
'user_id' => $this->user->id,
'company_id' => $this->company->id,
'balance' => 0,
'paid_to_date' => 0
]);
$i = Invoice::factory()->create([
'client_id' => $c->id,
'user_id' => $this->user->id,
'company_id' => $this->company->id,
'status_id' => Invoice::STATUS_DRAFT,
'tax_name1' => '',
'tax_name2' => '',
'tax_name3' => '',
'tax_rate1' => 0,
'tax_rate2' => 0,
'tax_rate3' => 0,
'discount' => 0,
]);
$item = new InvoiceItem();
$item->cost = 10;
$item->quantity = 10;
$i->line_items = [$item];
$i->calc()->getInvoice();
$this->assertEquals(0, $c->balance);
$this->assertEquals(100, $i->amount);
$this->assertEquals(0, $i->balance);
$this->assertEquals(0, $i->company_ledger()->count());
// $i->service()->markSent()->save();
// $i = $i->fresh();
// // \Illuminate\Support\Facades\Bus::fake();
// // \Illuminate\Support\Facades\Bus::assertDispatched(UpdateLedger::class);
// $this->assertEquals(1, $i->company_ledger()->count());
// $cl = $i->company_ledger()->first();
// (new UpdateLedger($cl->id, $i->amount, $i->company->company_key, $i->company->db))->handle();
// $cl = $cl->fresh();
// $this->assertEquals(100, $cl->adjustment);
// $this->assertEquals(100, $cl->balance);
// $i->service()->applyPaymentAmount(40, "notes")->save();
// $i = $i->fresh();
// $cl = CompanyLedger::where('client_id', $i->client_id)
// ->orderBy('id', 'desc')
// ->first();
// $cl = $i->company_ledger()->orderBy('id','desc')->first();
// (new UpdateLedger($cl->id, $i->amount, $i->company->company_key, $i->company->db))->handle();
// $cl = $cl->fresh();
// nlog($cl->toArray());
// $this->assertEquals(-40, $cl->adjustment);
// $this->assertEquals(60, $cl->balance);
}
public function testBaseLine()
{
$this->assertEquals($this->company->invoices->count(), 0);

View File

@ -40,7 +40,9 @@ class AutoBillInvoiceTest extends TestCase
$this->invoice->service()->markSent()->autoBill();
$this->assertNotNull($this->invoice->payments());
$this->assertEquals(10, $this->invoice->payments()->sum('payments.amount'));
$this->assertEquals(0, $this->invoice->payments()->sum('payments.amount'));
$this->assertEquals(10, $this->invoice->payments()->get()->sum('pivot.amount'));
$this->assertEquals($this->client->fresh()->balance, 0);
$this->assertEquals($this->client->fresh()->paid_to_date, 10);