Merge pull request #9074 from turbo124/v5-develop

Nordigen / GoCardless updates.
This commit is contained in:
David Bomba 2023-12-27 14:46:28 +11:00 committed by GitHub
commit 575adf88e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 690 additions and 414 deletions

View File

@ -66,21 +66,44 @@ class UserFilters extends QueryFilters
*/
public function entityFilter()
{
return $this->builder->whereHas('company_users', function ($q) {
$q->where('company_id', '=', auth()->user()->company()->id);
/** @var \App\Models\User $user */
$user = auth()->user();
return $this->builder->whereHas('company_users', function ($q) use ($user){
$q->where('company_id', '=', $user->company()->id);
});
}
/**
* Hides owner users from the list.
*
* @return Builder
*/
public function hideOwnerUsers(): Builder
{
/** @var \App\Models\User $user */
$user = auth()->user();
return $this->builder->whereHas('company_users', function ($q) use ($user) {
$q->where('company_id', '=', $user->company()->id)->where('is_owner', false);
});
}
/**
* Filters users that have been removed from the
* company, but not deleted from the system.
*
* @return void
* @return Builder
*/
public function hideRemovedUsers()
public function hideRemovedUsers(): Builder
{
return $this->builder->whereHas('company_users', function ($q) {
$q->where('company_id', '=', auth()->user()->company()->id)->whereNull('deleted_at');
/** @var \App\Models\User $user */
$user = auth()->user();
return $this->builder->whereHas('company_users', function ($q) use ($user) {
$q->where('company_id', '=', $user->company()->id)->whereNull('deleted_at');
});
}
@ -98,12 +121,21 @@ class UserFilters extends QueryFilters
return $this->builder;
}
/** @var \App\Models\User $user */
$user = auth()->user();
return $this->builder
->orWhere($this->with_property, $value)
->orderByRaw("{$this->with_property} = ? DESC", [$value])
->where('account_id', auth()->user()->account_id);
->where('account_id', $user->account_id);
}
/**
* Returns users with permissions to send emails via OAuth
*
* @param string $value
* @return Builder
*/
public function sending_users(string $value = ''): Builder
{
if (strlen($value) == 0 || $value != 'true') {

View File

@ -39,7 +39,7 @@ class Nordigen
$this->client = new \Nordigen\NordigenPHP\API\NordigenClient(config('ninja.nordigen.secret_id'), config('ninja.nordigen.secret_key'));
$this->client->createAccessToken(); // access_token is valid 24h -> so we dont have to implement a refresh-cycle
$this->client->createAccessToken();
}
// metadata-section for frontend
@ -52,12 +52,12 @@ class Nordigen
}
// requisition-section
public function createRequisition(string $redirect, string $initutionId, string $reference)
public function createRequisition(string $redirect, string $initutionId, string $reference, string $userLanguage)
{
if ($this->test_mode && $initutionId != $this->sandbox_institutionId)
throw new \Exception('invalid institutionId while in test-mode');
return $this->client->requisition->createRequisition($redirect, $initutionId, null, $reference);
return $this->client->requisition->createRequisition($redirect, $initutionId, null, $reference, $userLanguage);
}
public function getRequisition(string $requisitionId)
@ -85,6 +85,7 @@ class Nordigen
$it = new AccountTransformer();
return $it->transform($out);
} catch (\Exception $e) {
if (strpos($e->getMessage(), "Invalid Account ID") !== false)
return false;
@ -92,8 +93,14 @@ class Nordigen
throw $e;
}
}
public function isAccountActive(string $account_id)
/**
* isAccountActive
*
* @param string $account_id
* @return bool
*/
public function isAccountActive(string $account_id): bool
{
try {
$account = $this->client->account($account_id)->getAccountMetaData();
@ -112,11 +119,15 @@ class Nordigen
}
}
/**
* this method returns booked transactions from the bank_account, pending transactions are not part of the result
* @todo @turbo124 should we include pending transactions within the integration-process and mark them with a specific category?!
* getTransactions
*
* @param string $accountId
* @param string $dateFrom
* @return array
*/
public function getTransactions(string $accountId, string $dateFrom = null)
public function getTransactions(string $accountId, string $dateFrom = null): array
{
$transactionResponse = $this->client->account($accountId)->getAccountTransactions($dateFrom);

View File

@ -113,8 +113,8 @@ class TransactionTransformer implements BankRevenueInterface
'transaction_id' => $transaction["transactionId"],
'amount' => abs((int) $transaction["transactionAmount"]["amount"]),
'currency_id' => $this->convertCurrency($transaction["transactionAmount"]["currency"]),
'category_id' => null, // nordigen has no categories
'category_type' => array_key_exists('additionalInformation', $transaction) ? $transaction["additionalInformation"] : null, // TODO: institution specific keys like: GUTSCHRIFT, ABSCHLUSS, MONATSABSCHLUSS etc
'category_id' => null,
'category_type' => array_key_exists('additionalInformation', $transaction) ? $transaction["additionalInformation"] : '',
'date' => $transaction["bookingDate"],
'description' => $description,
'participant' => $participant,

View File

@ -31,8 +31,11 @@ class NordigenController extends BaseController
public function connect(ConnectNordigenBankIntegrationRequest $request)
{
$data = $request->all();
/** @var array $context */
$context = $request->getTokenContent();
$lang = $data['lang'] ?? 'en';
$company = $request->getCompany();
$lang = $company->locale();
$context["lang"] = $lang;
if (!$context)
@ -62,7 +65,7 @@ class NordigenController extends BaseController
"redirectUrl" => $context["redirect"] . "?action=nordigen_connect&status=failed&reason=account-config-invalid",
]);
if (!(Ninja::isSelfHost() || (Ninja::isHosted() && $account->isPaid() && $account->plan == 'enterprise')))
if (!(Ninja::isSelfHost() || (Ninja::isHosted() && $account->isEnterprisePaidClient())))
return view('bank.nordigen.handler', [
'lang' => $lang,
'company' => $company,
@ -85,7 +88,7 @@ class NordigenController extends BaseController
// redirect to requisition flow
try {
$requisition = $nordigen->createRequisition(config('ninja.app_url') . '/nordigen/confirm', $data['institution_id'], $request->token);
$requisition = $nordigen->createRequisition(config('ninja.app_url') . '/nordigen/confirm', $data['institution_id'], $request->token, $lang);
} catch (NordigenException $e) { // TODO: property_exists returns null in these cases... => why => therefore we just get unknown error everytime $responseBody is typeof GuzzleHttp\Psr7\Stream
$responseBody = (string) $e->getResponse()->getBody();
@ -128,15 +131,19 @@ class NordigenController extends BaseController
/**
* VIEW: Confirm Nordigen Bank Integration (redirect after nordigen flow)
* @param ConnectNordigenBankIntegrationRequest $request
* @param ConfirmNordigenBankIntegrationRequest $request
*/
public function confirm(ConfirmNordigenBankIntegrationRequest $request)
{
$data = $request->all();
$company = $request->getCompany();
$account = $company->account;
$lang = $company->locale();
/** @var array $context */
$context = $request->getTokenContent();
if (!array_key_exists('lang', $data) && $context['lang'] != 'en')
return redirect()->route('nordigen.confirm', array_merge(["lang" => $context['lang']], $request->query())); // redirect is required in order for the bank-ui to display everything properly
$lang = $data['lang'] ?? 'en';
return redirect()->route('nordigen.confirm', array_merge(["lang" => $context['lang']], $request->query()));
if (!$context || $context["context"] != "nordigen" || !array_key_exists("requisitionId", $context))
return view('bank.nordigen.handler', [
@ -145,9 +152,6 @@ class NordigenController extends BaseController
"redirectUrl" => ($context && array_key_exists("redirect", $context) ? $context["redirect"] : config('ninja.app_url')) . "?action=nordigen_connect&status=failed&reason=ref-invalid",
]);
$company = $request->getCompany();
$account = $company->account;
if (!(config('ninja.nordigen.secret_id') && config('ninja.nordigen.secret_key')))
return view('bank.nordigen.handler', [
'lang' => $lang,

View File

@ -212,7 +212,7 @@ class BankIntegrationController extends BaseController
ProcessBankTransactionsYodlee::dispatch($user_account->id, $bank_integration);
});
if (config('ninja.nordigen.secret_id') && config('ninja.nordigen.secret_key') && (Ninja::isSelfHost() || (Ninja::isHosted() && $user_account->isPaid() && $user_account->plan == 'enterprise')))
if (config('ninja.nordigen.secret_id') && config('ninja.nordigen.secret_key') && (Ninja::isSelfHost() || (Ninja::isHosted() && $user_account->isEnterprisePaidClient())))
$user_account->bank_integrations->where("integration_type", BankIntegration::INTEGRATION_TYPE_NORDIGEN)->each(function ($bank_integration) {
ProcessBankTransactionsNordigen::dispatch($bank_integration);
});
@ -298,11 +298,14 @@ class BankIntegrationController extends BaseController
$account = $user->account;
$bank_integration = BankIntegration::withTrashed()->where('bank_account_id', $acc_id)->orWhere('nordigen_account_id', $acc_id)->company()->firstOrFail(); // @turbo124 please check
$bank_integration = BankIntegration::withTrashed()
->where('bank_account_id', $acc_id)
->orWhere('nordigen_account_id', $acc_id)
->company()
->firstOrFail();
if ($bank_integration->integration_type == BankIntegration::INTEGRATION_TYPE_YODLEE)
$this->removeAccountYodlee($account, $bank_integration);
// we dont remove Accounts from nordigen, because they could be used within other companies
$this->bank_integration_repo->delete($bank_integration);

View File

@ -36,24 +36,19 @@ class ConnectNordigenBankIntegrationRequest extends Request
public function rules()
{
return [
'lang' => 'string',
'institution_id' => 'string',
'redirect' => 'string',
];
}
// @turbo124 @todo please check for validity, when request from frontend
public function prepareForValidation()
{
$input = $this->all();
if (!array_key_exists('redirect', $input)) {
$context = $this->getTokenContent();
$context = $this->getTokenContent();
$input["redirect"] = isset($context["is_react"]) && $context['is_react'] ? config('ninja.react_url') . "/#/settings/bank_accounts" : config('ninja.app_url');
$input["redirect"] = isset($context["is_react"]) && $context['is_react'] ? config('ninja.react_url') . "/#/settings/bank_accounts" : config('ninja.app_url');
$this->replace($input);
}
$this->replace($input);
}
public function getTokenContent()
{

View File

@ -11,14 +11,19 @@
namespace App\Http\ValidationRules\Account;
use Illuminate\Contracts\Validation\Rule;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
/**
* Class BlackListRule.
*/
class BlackListRule implements Rule
class BlackListRule implements ValidationRule
{
/** Bad domains +/- dispoable email domains */
private array $blacklist = [
'secure-coinspot.com',
'casasotombo.com',
'otpku.com',
'ckptr.com',
'pretreer.com',
'candassociates.com',
@ -57,6 +62,8 @@ class BlackListRule implements Rule
'10dk.email',
'10mail.com',
'10mail.org',
'10mail.tk',
'10minmail.de',
'10minut.com.pl',
'10minut.xyz',
'10minutemail.be',
@ -75,6 +82,7 @@ class BlackListRule implements Rule
'10minutemailbox.com',
'10minutemails.in',
'10minutenemail.de',
'10minutenmail.xyz',
'10minutesmail.com',
'10minutesmail.fr',
'10minutmail.pl',
@ -268,6 +276,7 @@ class BlackListRule implements Rule
'affinitywe.us',
'affluentwe.us',
'affordablewe.us',
'afia.pro',
'afrobacon.com',
'afterhourswe.us',
'agedmail.com',
@ -287,6 +296,8 @@ class BlackListRule implements Rule
'akapost.com',
'akerd.com',
'akgq701.com',
'akmail.in',
'akugu.com',
'al-qaeda.us',
'albionwe.us',
'alchemywe.us',
@ -294,6 +305,7 @@ class BlackListRule implements Rule
'aliaswe.us',
'alienware13.com',
'aligamel.com',
'alina-schiesser.ch',
'alisongamel.com',
'alivance.com',
'alivewe.us',
@ -376,6 +388,7 @@ class BlackListRule implements Rule
'antispam.de',
'antispam24.de',
'antispammail.de',
'any.pink',
'anyalias.com',
'aoeuhtns.com',
'apfelkorps.de',
@ -440,10 +453,12 @@ class BlackListRule implements Rule
'badoop.com',
'badpotato.tk',
'balaket.com',
'bangban.uk',
'banit.club',
'banit.me',
'bank-opros1.ru',
'bareed.ws',
'barooko.com',
'barryogorman.com',
'bartdevos.be',
'basscode.org',
@ -451,11 +466,15 @@ class BlackListRule implements Rule
'bazaaboom.com',
'bbbbyyzz.info',
'bbhost.us',
'bbitf.com',
'bbitj.com',
'bbitq.com',
'bcaoo.com',
'bcast.ws',
'bcb.ro',
'bccto.me',
'bdmuzic.pw',
'beaconmessenger.com',
'bearsarefuzzy.com',
'beddly.com',
'beefmilk.com',
@ -477,6 +496,7 @@ class BlackListRule implements Rule
'betr.co',
'bgtmail.com',
'bgx.ro',
'bheps.com',
'bidourlnks.com',
'big1.us',
'bigprofessor.so',
@ -520,9 +540,11 @@ class BlackListRule implements Rule
'bouncr.com',
'boxformail.in',
'boximail.com',
'boxmail.lol',
'boxomail.live',
'boxtemp.com.br',
'bptfp.net',
'brand-app.biz',
'brandallday.net',
'brasx.org',
'breakthru.com',
@ -543,8 +565,10 @@ class BlackListRule implements Rule
'budaya-tionghoa.com',
'budayationghoa.com',
'buffemail.com',
'bugfoo.com',
'bugmenever.com',
'bugmenot.com',
'bukhariansiddur.com',
'bulrushpress.com',
'bum.net',
'bumpymail.com',
@ -582,6 +606,7 @@ class BlackListRule implements Rule
'caseedu.tk',
'cashflow35.com',
'casualdx.com',
'catgroup.uk',
'cavi.mx',
'cbair.com',
'cbes.net',
@ -605,6 +630,7 @@ class BlackListRule implements Rule
'cheaphub.net',
'cheatmail.de',
'chenbot.email',
'chewydonut.com',
'chibakenma.ml',
'chickenkiller.com',
'chielo.com',
@ -621,6 +647,7 @@ class BlackListRule implements Rule
'chong-mail.org',
'chumpstakingdumps.com',
'cigar-auctions.com',
'civikli.com',
'civx.org',
'ckaazaza.tk',
'ckiso.com',
@ -637,6 +664,7 @@ class BlackListRule implements Rule
'clonemoi.tk',
'cloud-mail.top',
'cloudns.cx',
'clout.wiki',
'clrmail.com',
'cmail.club',
'cmail.com',
@ -678,6 +706,7 @@ class BlackListRule implements Rule
'crazymailing.com',
'cream.pink',
'crepeau12.com',
'cringemonster.com',
'cross-law.ga',
'cross-law.gq',
'crossmailjet.com',
@ -733,6 +762,7 @@ class BlackListRule implements Rule
'daymailonline.com',
'dayrep.com',
'dbunker.com',
'dcctb.com',
'dcemail.com',
'ddcrew.com',
'de-a.org',
@ -769,6 +799,7 @@ class BlackListRule implements Rule
'dev-null.ga',
'dev-null.gq',
'dev-null.ml',
'developermail.com',
'devnullmail.com',
'deyom.com',
'dharmatel.net',
@ -800,6 +831,7 @@ class BlackListRule implements Rule
'discardmail.com',
'discardmail.de',
'discos4.com',
'dishcatfish.com',
'disign-concept.eu',
'disign-revelation.com',
'dispo.in',
@ -851,10 +883,12 @@ class BlackListRule implements Rule
'domforfb8.tk',
'domforfb9.tk',
'domozmail.com',
'donebyngle.com',
'donemail.ru',
'dongqing365.com',
'dontreg.com',
'dontsendmespam.de',
'doojazz.com',
'doquier.tk',
'dotman.de',
'dotmsg.com',
@ -869,13 +903,17 @@ class BlackListRule implements Rule
'dred.ru',
'drevo.si',
'drivetagdev.com',
'drmail.in',
'droolingfanboy.de',
'dropcake.de',
'dropjar.com',
'droplar.com',
'dropmail.me',
'dropsin.net',
'drowblock.com',
'dsgvo.party',
'dsgvo.ru',
'dshfjdafd.cloud',
'dsiay.com',
'dspwebservices.com',
'duam.net',
@ -944,6 +982,7 @@ class BlackListRule implements Rule
'emailage.ml',
'emailage.tk',
'emailate.com',
'emailbin.net',
'emailcu.icu',
'emaildienst.de',
'emaildrop.io',
@ -1017,8 +1056,11 @@ class BlackListRule implements Rule
'eposta.buzz',
'eposta.work',
'eqiluxspam.ga',
'ereplyzy.com',
'ericjohnson.ml',
'eripo.net',
'ero-tube.org',
'esadverse.com',
'esbano-ru.ru',
'esc.la',
'escapehatchapp.com',
@ -1043,16 +1085,19 @@ class BlackListRule implements Rule
'evopo.com',
'evyush.com',
'exdonuts.com',
'exelica.com',
'existiert.net',
'exitstageleft.net',
'explodemail.com',
'express.net.ua',
'extracurricularsociety.com',
'extremail.ru',
'eyepaste.com',
'ez.lv',
'ezehe.com',
'ezfill.com',
'ezstest.com',
'ezztt.com',
'f4k.es',
'f5.si',
'facebook-email.cf',
@ -1108,12 +1153,14 @@ class BlackListRule implements Rule
'fbma.tk',
'fddns.ml',
'fdfdsfds.com',
'femailtor.com',
'fer-gabon.org',
'fermaxxi.ru',
'fettometern.com',
'fexbox.org',
'fexbox.ru',
'fexpost.com',
'fextemp.com',
'ficken.de',
'fictionsite.com',
'fightallspam.com',
@ -1127,6 +1174,7 @@ class BlackListRule implements Rule
'filzmail.com',
'findemail.info',
'findu.pl',
'finews.biz',
'fir.hk',
'firemailbox.club',
'fitnesrezink.ru',
@ -1135,12 +1183,14 @@ class BlackListRule implements Rule
'fizmail.com',
'fleckens.hu',
'flemail.ru',
'fliegender.fish',
'flowu.com',
'flu.cc',
'fluidsoft.us',
'flurred.com',
'fly-ts.de',
'flyinggeek.net',
'flymail.tk',
'flyspam.com',
'foobarbot.net',
'footard.com',
@ -1158,6 +1208,7 @@ class BlackListRule implements Rule
'fosil.pro',
'foxja.com',
'foxtrotter.info',
'fr.cr',
'fr.nf',
'fr33mail.info',
'fragolina2.tk',
@ -1204,11 +1255,15 @@ class BlackListRule implements Rule
'fuirio.com',
'fukaru.com',
'fukurou.ch',
'fullangle.org',
'fulvie.com',
'fun64.com',
'funnycodesnippets.com',
'funnymail.de',
'furzauflunge.de',
'futuramind.com',
'fuwa.be',
'fuwa.li',
'fuwamofu.com',
'fuwari.be',
'fux0ringduh.com',
@ -1291,6 +1346,7 @@ class BlackListRule implements Rule
'giveh2o.info',
'givememail.club',
'givmail.com',
'gixenmixen.com',
'glitch.sx',
'globaltouron.com',
'glubex.com',
@ -1304,6 +1360,7 @@ class BlackListRule implements Rule
'gnctr-calgary.com',
'go2usa.info',
'go2vpn.net',
'goatmail.uk',
'goemailgo.com',
'golemico.com',
'gomail.in',
@ -1363,6 +1420,7 @@ class BlackListRule implements Rule
'guerrillamail.net',
'guerrillamail.org',
'guerrillamailblock.com',
'gufum.com',
'gustr.com',
'gxemail.men',
'gynzi.co.uk',
@ -1389,6 +1447,7 @@ class BlackListRule implements Rule
'haltospam.com',
'hamham.uk',
'hangxomcuatoilatotoro.ml',
'happy2023year.com',
'happydomik.ru',
'harakirimail.com',
'haribu.com',
@ -1467,6 +1526,7 @@ class BlackListRule implements Rule
'huskion.net',
'hvastudiesucces.nl',
'hwsye.net',
'hypenated-domain.com',
'i2pmail.org',
'i6.cloudns.cc',
'iaoss.com',
@ -1476,6 +1536,7 @@ class BlackListRule implements Rule
'ichigo.me',
'icx.in',
'icx.ro',
'icznn.com',
'idx4.com',
'idxue.com',
'ieatspam.eu',
@ -1498,9 +1559,12 @@ class BlackListRule implements Rule
'imgof.com',
'imgv.de',
'immo-gerance.info',
'imperialcnk.com',
'imstations.com',
'imul.info',
'in-ulm.de',
'in2reach.com',
'inactivemachine.com',
'inbax.tk',
'inbound.plus',
'inbox.si',
@ -1530,6 +1594,7 @@ class BlackListRule implements Rule
'ineec.net',
'infocom.zp.ua',
'inggo.org',
'inkiny.com',
'inkomail.com',
'inmynetwork.tk',
'inoutmail.de',
@ -1540,12 +1605,16 @@ class BlackListRule implements Rule
'insanumingeniumhomebrew.com',
'insorg-mail.info',
'instaddr.ch',
'instaddr.uk',
'instaddr.win',
'instance-email.com',
'instant-mail.de',
'instantblingmail.info',
'instantemailaddress.com',
'instantmail.fr',
'instmail.uk',
'internet-v-stavropole.ru',
'internetkeno.com',
'internetoftags.com',
'interstats.org',
'intersteller.com',
@ -1577,6 +1646,7 @@ class BlackListRule implements Rule
'italy-mail.com',
'itcompu.com',
'itfast.net',
'itsjiff.com',
'itunesgiftcodegenerator.com',
'iubridge.com',
'iuemail.men',
@ -1585,6 +1655,7 @@ class BlackListRule implements Rule
'ixx.io',
'j-p.us',
'jafps.com',
'jaga.email',
'jajxz.com',
'janproz.com',
'jaqis.com',
@ -1599,11 +1670,15 @@ class BlackListRule implements Rule
'jetable.net',
'jetable.org',
'jetable.pp.ua',
'ji5.de',
'ji6.de',
'ji7.de',
'jiooq.com',
'jmail.ovh',
'jmail.ro',
'jnxjn.com',
'jobbikszimpatizans.hu',
'jobbrett.com',
'jobposts.net',
'jobs-to-be-done.net',
'joelpet.com',
@ -1660,6 +1735,8 @@ class BlackListRule implements Rule
'killmail.com',
'killmail.net',
'kimsdisk.com',
'kinda.email',
'kindamail.com',
'kingsq.ga',
'kino-100.ru',
'kiois.com',
@ -1668,16 +1745,20 @@ class BlackListRule implements Rule
'kitnastar.com',
'kjkszpjcompany.com',
'kkmail.be',
'kkoup.com',
'kksm.be',
'klassmaster.com',
'klassmaster.net',
'klick-tipp.us',
'klipschx12.com',
'kloap.com',
'klovenode.com',
'kludgemush.com',
'klzlk.com',
'kmail.li',
'kmail.live',
'kmhow.com',
'knickerbockerban.de',
'knol-power.nl',
'kobrandly.com',
'kommunity.biz',
@ -1711,6 +1792,7 @@ class BlackListRule implements Rule
'kwilco.net',
'kyal.pl',
'kyois.com',
'kzccv.com',
'l-c-a.us',
'l33r.eu',
'l6factors.com',
@ -1725,9 +1807,12 @@ class BlackListRule implements Rule
'lak.pp.ua',
'lakelivingstonrealestate.com',
'lakqs.com',
'lamasticots.com',
'lambsauce.de',
'landmail.co',
'laoeq.com',
'larisia.com',
'larland.com',
'last-chance.pro',
'lastmail.co',
'lastmail.com',
@ -1757,6 +1842,7 @@ class BlackListRule implements Rule
'ligsb.com',
'lillemap.net',
'lilo.me',
'lilspam.com',
'lindenbaumjapan.com',
'link2mail.net',
'linkedintuts2016.pw',
@ -1802,6 +1888,8 @@ class BlackListRule implements Rule
'lukop.dk',
'luv2.us',
'lyfestylecreditsolutions.com',
'lyft.live',
'lyricspad.net',
'lzoaq.com',
'm21.cc',
'm4ilweb.info',
@ -1847,6 +1935,7 @@ class BlackListRule implements Rule
'mailapp.top',
'mailback.com',
'mailbidon.com',
'mailbiscuit.com',
'mailbiz.biz',
'mailblocks.com',
'mailbox.in.ua',
@ -1876,6 +1965,7 @@ class BlackListRule implements Rule
'mailed.ro',
'maileimer.de',
'maileme101.com',
'mailers.edu.pl',
'mailexpire.com',
'mailf5.com',
'mailfa.tk',
@ -1943,6 +2033,7 @@ class BlackListRule implements Rule
'mailonaut.com',
'mailorc.com',
'mailorg.org',
'mailosaur.net',
'mailox.fun',
'mailpick.biz',
'mailpluss.com',
@ -2006,18 +2097,22 @@ class BlackListRule implements Rule
'mcache.net',
'mciek.com',
'mdhc.tk',
'mdz.email',
'meantinc.com',
'mebelnu.info',
'mechanicalresumes.com',
'medkabinet-uzi.ru',
'meepsheep.eu',
'meidecn.com',
'meinspamschutz.de',
'meltedbrownies.com',
'meltmail.com',
'memsg.site',
'mentonit.net',
'mepost.pw',
'merepost.com',
'merry.pink',
'meruado.uk',
'messagebeamer.de',
'messwiththebestdielikethe.rest',
'metadownload.org',
@ -2043,6 +2138,7 @@ class BlackListRule implements Rule
'migumail.com',
'mihep.com',
'mijnhva.nl',
'minimail.gq',
'ministry-of-silly-walks.de',
'minsmail.com',
'mintemail.com',
@ -2054,6 +2150,7 @@ class BlackListRule implements Rule
'mjukglass.nu',
'mkpfilm.com',
'ml8.ca',
'mliok.com',
'mm.my',
'mm5.se',
'mnode.me',
@ -2109,6 +2206,7 @@ class BlackListRule implements Rule
'mucincanon.com',
'muehlacker.tk',
'muell.icu',
'muell.io',
'muell.monster',
'muell.xyz',
'muellemail.com',
@ -2128,16 +2226,19 @@ class BlackListRule implements Rule
'mycleaninbox.net',
'mycorneroftheinter.net',
'myde.ml',
'mydefipet.live',
'mydemo.equipment',
'myecho.es',
'myemailboxy.com',
'mygeoweb.info',
'myindohome.services',
'myinfoinc.com',
'myinterserver.ml',
'mykickassideas.com',
'mymail-in.net',
'mymail90.com',
'mymailoasis.com',
'mymaily.lol',
'mynetstore.de',
'myopang.com',
'mypacks.net',
@ -2171,10 +2272,12 @@ class BlackListRule implements Rule
'naslazhdai.ru',
'nationalgardeningclub.com',
'nawmin.info',
'naymedia.com',
'nbzmr.com',
'negated.com',
'neko2.net',
'nekochan.fr',
'nekosan.uk',
'neomailbox.com',
'neotlozhniy-zaim.ru',
'nepwk.com',
@ -2263,6 +2366,7 @@ class BlackListRule implements Rule
'nwytg.com',
'nwytg.net',
'ny7.me',
'nyasan.com',
'nypato.com',
'nyrmusic.com',
'o2stk.org',
@ -2280,6 +2384,7 @@ class BlackListRule implements Rule
'oepia.com',
'oerpub.org',
'offshore-proxies.net',
'ofisher.net',
'ohaaa.de',
'ohi.tw',
'oida.icu',
@ -2305,6 +2410,7 @@ class BlackListRule implements Rule
'onlatedotcom.info',
'online.ms',
'onlineidea.info',
'onlyapp.net',
'onqin.com',
'ontyne.biz',
'oohioo.com',
@ -2330,6 +2436,7 @@ class BlackListRule implements Rule
'ourklips.com',
'ourpreviewdomain.com',
'outlawspam.com',
'outlook.edu.pl',
'outmail.win',
'ovomail.co',
'ovpn.to',
@ -2337,6 +2444,7 @@ class BlackListRule implements Rule
'owlpic.com',
'ownsyou.de',
'oxopoha.com',
'ozatvn.com',
'ozyl.de',
'p-banlis.ru',
'p33.org',
@ -2347,6 +2455,7 @@ class BlackListRule implements Rule
'pagamenti.tk',
'paharpurmim.ga',
'pakadebu.ga',
'pamaweb.com',
'pancakemail.com',
'papierkorb.me',
'paplease.com',
@ -2384,6 +2493,8 @@ class BlackListRule implements Rule
'pisls.com',
'pitaniezdorovie.ru',
'pivo-bar.ru',
'pixiil.com',
'pizzajunk.com',
'pjjkp.com',
'placebomail10.com',
'pleasenoham.org',
@ -2435,6 +2546,7 @@ class BlackListRule implements Rule
'prin.be',
'privacy.net',
'privatdemail.net',
'privmail.edu.pl',
'privy-mail.com',
'privy-mail.de',
'privymail.de',
@ -2454,6 +2566,7 @@ class BlackListRule implements Rule
'prtz.eu',
'psh.me',
'psles.com',
'psnator.com',
'psoxs.com',
'puglieisi.com',
'puji.pro',
@ -2464,11 +2577,13 @@ class BlackListRule implements Rule
'put2.net',
'puttanamaiala.tk',
'putthisinyourspamdatabase.com',
'pwpwa.com',
'pwrby.com',
'qasti.com',
'qbfree.us',
'qc.to',
'qibl.at',
'qiott.com',
'qipmail.net',
'qiq.us',
'qisdo.com',
@ -2485,6 +2600,7 @@ class BlackListRule implements Rule
'quickinbox.com',
'quickmail.nl',
'quicksend.ch',
'quipas.com',
'ququb.com',
'qvy.me',
'qwickmail.com',
@ -2496,6 +2612,7 @@ class BlackListRule implements Rule
'raetp9.com',
'rainbowly.ml',
'raketenmann.de',
'ramenmail.de',
'rancidhome.net',
'randomail.io',
'randomail.net',
@ -2512,6 +2629,7 @@ class BlackListRule implements Rule
're-gister.com',
'reality-concept.club',
'reallymymail.com',
'realquickemail.com',
'realtyalerts.ca',
'rebates.stream',
'receiveee.com',
@ -2542,6 +2660,7 @@ class BlackListRule implements Rule
'rippb.com',
'risingsuntouch.com',
'riski.cf',
'risu.be',
'rklips.com',
'rkomo.com',
'rm2rf.com',
@ -2578,6 +2697,7 @@ class BlackListRule implements Rule
's33db0x.com',
'sabrestlouis.com',
'sackboii.com',
'saeoil.com',
'safaat.cf',
'safermail.info',
'safersignup.de',
@ -2630,10 +2750,13 @@ class BlackListRule implements Rule
'sexforswingers.com',
'sexical.com',
'sexyalwasmi.top',
'sfolkar.com',
'shadap.org',
'shalar.net',
'sharedmailbox.org',
'sharkfaces.com',
'sharklasers.com',
'shchiba.uk',
'sheryli.com',
'shhmail.com',
'shhuut.org',
@ -2662,6 +2785,7 @@ class BlackListRule implements Rule
'sify.com',
'sika3.com',
'sikux.com',
'silenceofthespam.com',
'siliwangi.ga',
'silvercoin.life',
'sim-simka.ru',
@ -2681,6 +2805,7 @@ class BlackListRule implements Rule
'skrx.tk',
'sky-inbox.com',
'sky-ts.de',
'skygazerhub.com',
'skyrt.de',
'slapsfromlastnight.com',
'slaskpost.se',
@ -2698,6 +2823,7 @@ class BlackListRule implements Rule
'smapfree24.eu',
'smapfree24.info',
'smapfree24.org',
'smartnator.com',
'smarttalent.pw',
'smashmail.de',
'smellfear.com',
@ -2705,12 +2831,14 @@ class BlackListRule implements Rule
'smellypotato.tk',
'smtp99.com',
'smwg.info',
'snakebutt.com',
'snakemail.com',
'snapwet.com',
'sneakmail.de',
'snece.com',
'social-mailer.tk',
'socialfurry.org',
'sociallymediocre.com',
'sofia.re',
'sofimail.com',
'sofort-mail.de',
@ -2731,6 +2859,7 @@ class BlackListRule implements Rule
'soodmail.com',
'soodomail.com',
'soodonims.com',
'soombo.com',
'soon.it',
'spacebazzar.ru',
'spam-be-gone.com',
@ -2763,6 +2892,7 @@ class BlackListRule implements Rule
'spamday.com',
'spamdecoy.net',
'spamex.com',
'spamfellas.com',
'spamfighter.cf',
'spamfighter.ga',
'spamfighter.gq',
@ -2791,6 +2921,7 @@ class BlackListRule implements Rule
'spamobox.com',
'spamoff.de',
'spamsalad.in',
'spamsandwich.com',
'spamslicer.com',
'spamsphere.com',
'spamspot.com',
@ -2810,11 +2941,13 @@ class BlackListRule implements Rule
'spikio.com',
'spindl-e.com',
'spoofmail.de',
'sportrid.com',
'spr.io',
'spritzzone.de',
'spruzme.com',
'spybox.de',
'spymail.com',
'spymail.one',
'squizzy.de',
'squizzy.net',
'sroff.com',
@ -2852,10 +2985,12 @@ class BlackListRule implements Rule
'submic.com',
'suburbanthug.com',
'suckmyd.com',
'sudern.de',
'sueshaw.com',
'suexamplesb.com',
'suioe.com',
'super-auswahl.de',
'superblohey.com',
'supergreatmail.com',
'supermailer.jp',
'superplatyna.com',
@ -2872,6 +3007,7 @@ class BlackListRule implements Rule
'sweetxxx.de',
'swift-mail.net',
'swift10minutemail.com',
'syinxun.com',
'sylvannet.com',
'symphonyresume.com',
'syosetu.gq',
@ -2891,6 +3027,8 @@ class BlackListRule implements Rule
'tastrg.com',
'taukah.com',
'tb-on-line.net',
'tcwlm.com',
'tcwlx.com',
'tdtda.com',
'tech69.com',
'techblast.ch',
@ -2901,6 +3039,7 @@ class BlackListRule implements Rule
'teewars.org',
'tefl.ro',
'telecomix.pl',
'teleg.eu',
'teleworm.com',
'teleworm.us',
'tellos.xyz',
@ -2965,6 +3104,7 @@ class BlackListRule implements Rule
'thecloudindex.com',
'thediamants.org',
'thedirhq.info',
'theeyeoftruth.com',
'thejoker5.com',
'thelightningmail.net',
'thelimestones.com',
@ -2974,6 +3114,7 @@ class BlackListRule implements Rule
'thereddoors.online',
'theroyalweb.club',
'thescrappermovie.com',
'thespamfather.com',
'theteastory.info',
'thex.ro',
'thichanthit.com',
@ -3010,9 +3151,13 @@ class BlackListRule implements Rule
'tkitc.de',
'tlpn.org',
'tmail.com',
'tmail.io',
'tmail.ws',
'tmail3.com',
'tmail9.com',
'tmailinator.com',
'tmails.net',
'tmmbt.net',
'tmpbox.net',
'tmpemails.com',
'tmpeml.com',
@ -3020,6 +3165,7 @@ class BlackListRule implements Rule
'tmpjr.me',
'tmpmail.net',
'tmpmail.org',
'tmpx.sa.com',
'toddsbighug.com',
'tofeat.com',
'toiea.com',
@ -3049,6 +3195,7 @@ class BlackListRule implements Rule
'totoan.info',
'tourcc.com',
'tp-qa-mail.com',
'tpwlb.com',
'tqoai.com',
'tqosi.com',
'tradermail.info',
@ -3097,6 +3244,7 @@ class BlackListRule implements Rule
'trialmail.de',
'trickmail.net',
'trillianpro.com',
'triots.com',
'trixtrux1.ru',
'trollproject.com',
'tropicalbass.info',
@ -3112,6 +3260,7 @@ class BlackListRule implements Rule
'turoid.com',
'turual.com',
'turuma.com',
'tutuapp.bid',
'tvchd.com',
'tverya.com',
'twinmail.de',
@ -3150,6 +3299,7 @@ class BlackListRule implements Rule
'unit7lahaina.com',
'unmail.ru',
'uooos.com',
'uorak.com',
'upliftnow.com',
'uplipht.com',
'uploadnolimit.com',
@ -3268,6 +3418,7 @@ class BlackListRule implements Rule
'watchever.biz',
'watchfull.net',
'watchironman3onlinefreefullmovie.com',
'waterisgone.com',
'wazabi.club',
'wbdev.tech',
'wbml.net',
@ -3307,6 +3458,7 @@ class BlackListRule implements Rule
'wegwrfmail.de',
'wegwrfmail.net',
'wegwrfmail.org',
'weizixu.com',
'wekawa.com',
'welikecookies.com',
'wellsfargocomcardholders.com',
@ -3316,6 +3468,7 @@ class BlackListRule implements Rule
'wfgdfhj.tk',
'wg0.com',
'wh4f.org',
'whaaaaaaaaaat.com',
'whatiaas.com',
'whatifanalytics.com',
'whatpaas.com',
@ -3327,6 +3480,7 @@ class BlackListRule implements Rule
'wickmail.net',
'widaryanto.info',
'widget.gg',
'wiemei.com',
'wierie.tk',
'wifimaple.com',
'wifioak.com',
@ -3355,6 +3509,7 @@ class BlackListRule implements Rule
'wudet.men',
'wuespdj.xyz',
'wupics.com',
'wuuvo.com',
'wuzup.net',
'wuzupmail.net',
'wwjmp.com',
@ -3387,6 +3542,9 @@ class BlackListRule implements Rule
'xrap.de',
'xrho.com',
'xvx.us',
'xwaretech.com',
'xwaretech.info',
'xwaretech.net',
'xww.ro',
'xxhamsterxx.ga',
'xxi2.com',
@ -3463,6 +3621,7 @@ class BlackListRule implements Rule
'zebins.eu',
'zehnminuten.de',
'zehnminutenmail.de',
'zemzar.net',
'zepp.dk',
'zetmail.com',
'zfymail.com',
@ -3473,6 +3632,7 @@ class BlackListRule implements Rule
'zhorachu.com',
'zik.dj',
'zipcad.com',
'zipcatfish.com',
'zipo1.gq',
'zippymail.info',
'zipsendtest.com',
@ -3494,27 +3654,13 @@ class BlackListRule implements Rule
'zzz.com',
];
/**
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value): bool
public function validate(string $attribute, mixed $value, Closure $fail): void
{
$parts = explode("@", $value);
if (is_array($parts)) {
return ! in_array($parts[1], $this->blacklist);
} else {
return true;
if (is_array($parts) && in_array($parts[1], $this->blacklist)) {
$fail('This domain is blacklisted, if you think this is in error, please email contact@invoiceninja.com');
}
}
/**
* @return string
*/
public function message(): string
{
return 'This domain is blacklisted, if you think this is in error, please email contact@invoiceninja.com';
}
}

View File

@ -11,32 +11,26 @@
namespace App\Http\ValidationRules\Account;
use Illuminate\Contracts\Validation\Rule;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
/**
* Class EmailBlackListRule.
*/
class EmailBlackListRule implements Rule
class EmailBlackListRule implements ValidationRule
{
public array $blacklist = [
'noddy@invoiceninja.com',
];
/**
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
public function validate(string $attribute, mixed $value, Closure $fail): void
{
return ! in_array($value, $this->blacklist);
if (in_array($value, $this->blacklist)) {
$fail('This email address is blacklisted, if you think this is in error, please email contact@invoiceninja.com');
}
}
/**
* @return string
*/
public function message()
{
return 'This email address is blacklisted, if you think this is in error, please email contact@invoiceninja.com';
}
}

View File

@ -35,7 +35,7 @@ class ProcessBankTransactionsNordigen implements ShouldQueue
public Company $company;
public Nordigen $nordigen;
public $nordigen_account;
private bool $stop_loop = false;
/**
* Create a new job instance.
*/

View File

@ -162,7 +162,7 @@ class ProcessBankTransactionsYodlee implements ShouldQueue
$now = now();
foreach ($transactions as $transaction) {
if (BankTransaction::query()->where('transaction_id', $transaction['transaction_id'])->where('company_id', $this->company->id)->where('bank_integration_id', $this->bank_integration->id)->withTrashed()->exists()) { // @turbo124 was not scoped to bank_integration_id => from my pov this should be present, because when an account was historized (is_deleted) a transaction can occur multiple (in the archived bank_integration and in the new one
if (BankTransaction::query()->where('transaction_id', $transaction['transaction_id'])->where('company_id', $this->company->id)->where('bank_integration_id', $this->bank_integration->id)->withTrashed()->exists()) {
continue;
}

View File

@ -64,12 +64,12 @@ class BankTransactionSync implements ShouldQueue
private function processYodlee()
{
if (Ninja::isHosted()) { // @turbo124 @todo I migrated the schedule for the job within the kernel to execute on all platforms and use the same expression here to determine if yodlee can run or not. Please chek/verify
if (Ninja::isHosted()) {
nlog("syncing transactions - yodlee");
Account::with('bank_integrations')->whereNotNull('bank_integration_account_id')->cursor()->each(function ($account) {
if ($account->isPaid() && $account->plan == 'enterprise') {
if ($account->isEnterprisePaidClient()) {
$account->bank_integrations()->where('integration_type', BankIntegration::INTEGRATION_TYPE_YODLEE)->where('auto_sync', true)->cursor()->each(function ($bank_integration) use ($account) {
(new ProcessBankTransactionsYodlee($account->id, $bank_integration))->handle();
});
@ -80,12 +80,12 @@ class BankTransactionSync implements ShouldQueue
}
private function processNordigen()
{
if (config("ninja.nordigen.secret_id") && config("ninja.nordigen.secret_key")) { // @turbo124 check condition, when to execute this should be placed here (isSelfHosted || isPro/isEnterprise)
if (config("ninja.nordigen.secret_id") && config("ninja.nordigen.secret_key")) {
nlog("syncing transactions - nordigen");
Account::with('bank_integrations')->cursor()->each(function ($account) {
if ((Ninja::isSelfHost() || (Ninja::isHosted() && $account->isPaid() && $account->plan == 'enterprise'))) {
if ((Ninja::isSelfHost() || (Ninja::isHosted() && $account->isEnterprisePaidClient()))) {
$account->bank_integrations()->where('integration_type', BankIntegration::INTEGRATION_TYPE_NORDIGEN)->where('auto_sync', true)->cursor()->each(function ($bank_integration) {
(new ProcessBankTransactionsNordigen($bank_integration))->handle();
});

View File

@ -30,6 +30,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
use App\DataMapper\Analytics\Mail\EmailSpam;
use App\DataMapper\Analytics\Mail\EmailBounce;
use App\Notifications\Ninja\EmailSpamNotification;
use App\Notifications\Ninja\EmailBounceNotification;
class ProcessPostmarkWebhook implements ShouldQueue
{
@ -103,6 +104,11 @@ class ProcessPostmarkWebhook implements ShouldQueue
case 'Delivery':
return $this->processDelivery();
case 'Bounce':
if($this->request['Subject'] == ctrans('texts.confirmation_subject')) {
$company->notification(new EmailBounceNotification($this->request['Email']))->ninja();
}
return $this->processBounce();
case 'SpamComplaint':
return $this->processSpamComplaint();
@ -263,8 +269,6 @@ class ProcessPostmarkWebhook implements ShouldQueue
(new SystemLogger($data, SystemLog::CATEGORY_MAIL, SystemLog::EVENT_MAIL_BOUNCED, SystemLog::TYPE_WEBHOOK_RESPONSE, $this->invitation->contact->client, $this->invitation->company))->handle();
// if(config('ninja.notification.slack'))
// $this->invitation->company->notification(new EmailBounceNotification($this->invitation->company->account))->ninja();
}
// {

View File

@ -11,17 +11,19 @@
namespace App\Listeners\User;
use App\Jobs\Mail\NinjaMailerJob;
use App\Jobs\Mail\NinjaMailerObject;
use App\Jobs\Util\SystemLogger;
use App\Libraries\MultiDB;
use App\Mail\User\UserLoggedIn;
use App\Utils\Ninja;
use App\Models\SystemLog;
use Illuminate\Broadcasting\InteractsWithSockets;
use App\Libraries\MultiDB;
use App\Jobs\Util\SystemLogger;
use App\Mail\User\UserLoggedIn;
use App\Jobs\Mail\NinjaMailerJob;
use Illuminate\Support\Facades\App;
use App\Jobs\Mail\NinjaMailerObject;
use Illuminate\Support\Facades\Cache;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Cache;
use Illuminate\Broadcasting\InteractsWithSockets;
class UpdateUserLastLogin implements ShouldQueue
{
@ -46,6 +48,11 @@ class UpdateUserLastLogin implements ShouldQueue
{
MultiDB::setDb($event->company->db);
App::forgetInstance('translator');
$t = app('translator');
$t->replace(Ninja::transformTranslations($event->company->settings));
App::setLocale($event->company->locale());
$user = $event->user;
$user->last_login = now();
$user->save();

View File

@ -42,7 +42,6 @@ class VerifyUserObject
if($this->is_react) {
$react_redirect = '?react=true';
nlog("is react");
}
$data = [

View File

@ -21,11 +21,9 @@ class EmailBounceNotification extends Notification
*
* @return void
*/
protected $account;
public function __construct($account)
public function __construct(private string $email_address)
{
$this->account = $account;
}
/**
@ -64,11 +62,7 @@ class EmailBounceNotification extends Notification
public function toSlack($notifiable)
{
$content = "Email bounce notification for Account {$this->account->key} \n";
$owner = $this->account->companies()->first()->owner();
$content .= "Owner {$owner->present()->name() } | {$owner->email}";
$content = "Email bounce notification for {$this->email_address} \n";
return (new SlackMessage)
->success()

View File

@ -68,6 +68,7 @@ class BankIntegrationTransformer extends EntityTransformer
'created_at' => (int) $bank_integration->created_at,
'updated_at' => (int) $bank_integration->updated_at,
'archived_at' => (int) $bank_integration->deleted_at,
'integration_type' => (string) $bank_integration->integration_type ?: '',
];
}

View File

@ -5227,23 +5227,23 @@ $lang = array(
'primary_contact' => 'Primary Contact',
'all_contacts' => 'All Contacts',
'insert_below' => 'Insert Below',
'nordigen_handler_subtitle' => 'will gain access for your selected bank account. After selecting your institution you are redirected to theire front-page to complete the request with your account credentials.',
'nordigen_handler_error_heading_unknown' => 'An Error has occured',
'nordigen_handler_error_contents_unknown' => 'An unknown Error has occured! Reason:',
'nordigen_handler_subtitle' => 'Bank account authentication. Selecting your institution to complete the request with your account credentials.',
'nordigen_handler_error_heading_unknown' => 'An error has occured',
'nordigen_handler_error_contents_unknown' => 'An unknown error has occurred! Reason:',
'nordigen_handler_error_heading_token_invalid' => 'Invalid Token',
'nordigen_handler_error_contents_token_invalid' => 'The provided token was invalid. Please restart the flow, with a valid one_time_token. Contact support for help, if this issue persists.',
'nordigen_handler_error_contents_token_invalid' => 'The provided token was invalid. Contact support for help, if this issue persists.',
'nordigen_handler_error_heading_account_config_invalid' => 'Missing Credentials',
'nordigen_handler_error_contents_account_config_invalid' => 'The provided credentials for nordigen are eighter missing or invalid. Contact support for help, if this issue persists.',
'nordigen_handler_error_contents_account_config_invalid' => 'Invalid or missing credentials for Gocardless Bank Account Data. Contact support for help, if this issue persists.',
'nordigen_handler_error_heading_not_available' => 'Not Available',
'nordigen_handler_error_contents_not_available' => 'This flow is not available for your account. Considder upgrading to enterprise version. Contact support for help, if this issue persists.',
'nordigen_handler_error_contents_not_available' => 'Feature unavailable, enterprise plan only.',
'nordigen_handler_error_heading_institution_invalid' => 'Invalid Institution',
'nordigen_handler_error_contents_institution_invalid' => 'The provided institution-id is invalid or no longer valid. You can go to the bank selection page by clicking the button below or cancel the flow by clicking on the \'X\' above.',
'nordigen_handler_error_contents_institution_invalid' => 'The provided institution-id is invalid or no longer valid.',
'nordigen_handler_error_heading_ref_invalid' => 'Invalid Reference',
'nordigen_handler_error_contents_ref_invalid' => 'Nordigen did not provide a valid reference. Please run flow again and contact support, if this issue persists.',
'nordigen_handler_error_contents_ref_invalid' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.',
'nordigen_handler_error_heading_not_found' => 'Invalid Requisition',
'nordigen_handler_error_contents_not_found' => 'Nordigen did not provide a valid reference. Please run flow again and contact support, if this issue persists.',
'nordigen_handler_error_contents_not_found' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.',
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
'nordigen_handler_error_contents_requisition_invalid_status' => 'You may called this site to early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.',
'nordigen_handler_restart' => 'Restart flow.',

View File

@ -3364,7 +3364,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'credit_number_counter' => 'Compteur du numéro de crédit',
'reset_counter_date' => 'Réinitialiser le compteur de date',
'counter_padding' => 'Espacement du compteur',
'shared_invoice_quote_counter' => 'Share Invoice/Quote Counter',
'shared_invoice_quote_counter' => 'Partager le compteur des factures/soumissions',
'default_tax_name_1' => 'Nom de taxe par défaut 1',
'default_tax_rate_1' => 'Taux de taxe par défaut 1',
'default_tax_name_2' => 'Nom de taxe par défaut 2',
@ -3849,308 +3849,308 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'registration_url' => 'URL d\'inscription',
'show_product_cost' => 'Afficher le montant du produit',
'complete' => 'Terminé',
'next' => 'Suivant',
'next_step' => 'Étape suivante',
'notification_credit_sent_subject' => 'le crédit :invoice a été envoyé à :client',
'notification_credit_viewed_subject' => 'Le crédit :invoice a été consulté par :client',
'notification_credit_sent' => 'Un crédit de :amount a été envoyé par courriel au client :client.',
'notification_credit_viewed' => 'Un crédit de :amount a été consulté par le client :client.',
'reset_password_text' => 'Saisissez votre adresse courriel pour réinitialiser votre mot de passe.',
'password_reset' => 'Réinitialisation du mot de passe',
'account_login_text' => 'Bienvenue ! Heureux de vous voir.',
'request_cancellation' => 'Annuler la demande',
'delete_payment_method' => 'Supprimer le mode de paiement',
'about_to_delete_payment_method' => 'Le mode de paiement sera supprimé',
'action_cant_be_reversed' => 'Cette action ne peut être annulée',
'profile_updated_successfully' => 'Le profil a été mis à jour',
'currency_ethiopian_birr' => 'birr éthiopien',
'client_information_text' => 'Adresse permanente où vous recevez le courriel',
'status_id' => 'État de facture',
'email_already_register' => 'Cette adresse courriel est déjà liée à un compte',
'locations' => 'Emplacements',
'freq_indefinitely' => 'Indéfiniment',
'cycles_remaining' => 'Cycles restants',
'i_understand_delete' => 'Je comprends. Supprimer.',
'download_files' => 'Télécharger les fichiers',
'download_timeframe' => 'Utilisez ce lien pour télécharger vos fichiers. Le lien expirera dans 1 heure.',
'new_signup' => 'Nouvelle inscription',
'new_signup_text' => 'Un nouveau compte a été créé par :user - :email - de l\'adresse IP :ip',
'notification_payment_paid_subject' => 'Le paiement a été fait par :client',
'notification_partial_payment_paid_subject' => 'Le paiement partiel a été fait par :client',
'notification_payment_paid' => 'Un paiement de :amount a été fait par le client : pour la facture :invoice',
'notification_partial_payment_paid' => 'Un paiement partiel de :amount a été fait par le client : pour la facture :invoice',
'notification_bot' => 'Bot de notifications',
'invoice_number_placeholder' => 'Facture N° :invoice',
'entity_number_placeholder' => ':entity N° :entity_number',
'email_link_not_working' => 'Si le bouton ci-dessus ne fonctionne pas correctement, cliquez sur le lien',
'display_log' => 'Afficher le registre',
'send_fail_logs_to_our_server' => 'Rapporter les erreurs en temps réel',
'setup' => 'Configuration',
'quick_overview_statistics' => 'Aperçu et statistiques',
'update_your_personal_info' => 'Mettre à jour vos infos personnelles',
'name_website_logo' => 'Nom, site web et logo',
'make_sure_use_full_link' => 'Utilisez le lien complet vers votre site',
'personal_address' => 'Adresse personnelle',
'enter_your_personal_address' => 'Saisissez votre adresse personnelle',
'enter_your_shipping_address' => 'Saisissez votre adresse de livraison',
'list_of_invoices' => 'Liste des factures',
'with_selected' => 'Avec la sélection de',
'invoice_still_unpaid' => 'Cette facture est toujours impayée. Cliquez sur le bouton pour compléter le paiement',
'list_of_recurring_invoices' => 'Liste des factures récurrentes',
'details_of_recurring_invoice' => 'Détails à propos des factures récurrentes',
'cancellation' => 'Annulation',
'about_cancellation' => 'Pour cesser la facturation récurrente, cliquez sur la requête d\'annulation.',
'cancellation_warning' => 'Avertissement! Vous avez demandé une annulation de ce service. Votre service pourrait être annulé sans autre notification.',
'cancellation_pending' => 'Annulation en attente. Nous vous tiendrons au courant.',
'list_of_payments' => 'Liste des paiements',
'payment_details' => 'Détails du paiement',
'list_of_payment_invoices' => 'Liste des factures affectées par le paiement',
'list_of_payment_methods' => 'Liste des modes de paiement',
'payment_method_details' => 'Détails du mode de paiement',
'permanently_remove_payment_method' => 'Supprimer de façon définitive ce mode de paiement',
'warning_action_cannot_be_reversed' => 'Avertissement! Cette action ne peut être annulée!',
'confirmation' => 'Confirmation',
'list_of_quotes' => 'Soumissions',
'waiting_for_approval' => 'En attente d\'approbation',
'quote_still_not_approved' => 'Cette soumission n\'a pas encore été approuvée',
'list_of_credits' => 'Crédits',
'required_extensions' => 'Extensions requises',
'php_version' => 'Version PHP',
'writable_env_file' => 'Fichier .env inscriptible',
'env_not_writable' => 'Le fichier .env n\'est pas inscriptible par l\'utilisateur en cours',
'minumum_php_version' => 'Version PHP minimale',
'satisfy_requirements' => 'Assurez-vous que toutes les exigences sont satisfaites',
'oops_issues' => 'Oups, quelque chose cloche !',
'open_in_new_tab' => 'Ouvrir dans un nouvel onglet',
'complete_your_payment' => 'Paiement complet',
'authorize_for_future_use' => 'Autoriser ce mode de paiement pour usage ultérieur',
'page' => 'Page',
'per_page' => 'Par page',
'of' => 'De',
'view_credit' => 'Voir le crédit',
'to_view_entity_password' => 'Pour voir :entity, vous devez saisir votre mot de passe.',
'showing_x_of' => 'Affiche :first de :last de :total résultats',
'no_results' => 'Aucun résultat',
'payment_failed_subject' => 'Le paiement a échoué pour le client :client',
'payment_failed_body' => 'Un paiement fait par le client :client a échoué avec le message :message',
'register' => 'S\'inscrire',
'register_label' => 'Créer votre compte en quelques secondes',
'password_confirmation' => 'Confirmer votre mot de passe',
'verification' => 'Vérification',
'complete_your_bank_account_verification' => 'Avant d\'utiliser un compte bancaire, il doit être vérifié.',
'checkout_com' => 'Checkout.com',
'footer_label' => 'Tous droits réservés © :year :company.',
'credit_card_invalid' => 'Le numéro de carte de crédit fourni n\'est pas valide',
'month_invalid' => 'Le mois indiqué n\'est pas valide',
'year_invalid' => 'L\'année indiquée n\'est pas valide',
'https_required' => 'HTTPS est requis, l\'envoi du formulaire va échouer',
'if_you_need_help' => 'Si vous avez besoin d\'aide, vous pouvez écrire à notre',
'update_password_on_confirm' => 'Après la mise à jour du mot de passe, votre compte sera confirmé.',
'bank_account_not_linked' => 'Pour payer avec un compte bancaire, vous devez d\'abord l\'ajouter comme un mode de paiement.',
'application_settings_label' => 'Enregistrons les informations de base sur votre Ninja de la facture!',
'recommended_in_production' => 'Fortement recommandé en mode production',
'enable_only_for_development' => 'Activer seulement en mode développement',
'test_pdf' => 'Tester le PDF',
'checkout_authorize_label' => 'Checkout.com peut être enregistrer comme un mode de paiement pour usage ultérieur, lors de la première transaction. Cochez "Enregistrer les infos de carte de crédit" lors du processus de paiement.',
'sofort_authorize_label' => 'Le compte bancaire (SOFORT) peut être enregistré comme un mode de paiement pour usage ultérieur, lors de la première transaction. Cochez "Enregistrer les infos de paiement" lors du processus de paiement.',
'node_status' => 'État du noeud',
'npm_status' => 'État du NPM',
'node_status_not_found' => 'Nœud introuvable. Est-il installé ?',
'npm_status_not_found' => 'NPM introuvable. Est-il installé ?',
'locked_invoice' => 'La facture est verrouillée et ne peut être modifiée',
'downloads' => 'Téléchargements',
'resource' => 'Ressource',
'document_details' => 'Détails du document',
'hash' => 'Hash',
'resources' => 'Ressources',
'allowed_file_types' => 'Types de fichiers autorisés:',
'common_codes' => 'Codes communs et leurs significations',
'payment_error_code_20087' => '20087 : Données de suivi invalides (CVV et/ou date d\'expiration non valables)',
'download_selected' => 'Télécharger la sélection',
'to_pay_invoices' => 'Pour payer les factures, vous devez',
'add_payment_method_first' => 'ajouter un mode de paiement',
'no_items_selected' => 'Aucun article sélectionné',
'payment_due' => 'Paiement dû',
'account_balance' => 'Solde de compte',
'thanks' => 'Merci',
'minimum_required_payment' => 'Le paiement minimum requis est :amount',
'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',
'credit_message' => 'Pour voir le crédit de :amount, cliquez sur le lien ci-dessous.',
'payment_type_Crypto' => 'Cryptodevise',
'payment_type_Credit' => 'Crédit',
'store_for_future_use' => 'Enregistrer pour un usage ultérieur',
'pay_with_credit' => 'Payer avec un crédit',
'payment_method_saving_failed' => 'Ce mode de paiement ne peut pas être enregistré pour usage ultérieur.',
'pay_with' => 'Payer avec',
'n/a' => 'N/D',
'by_clicking_next_you_accept_terms' => 'En cliquant sur "Prochaine étape", vous acceptez les conditions.',
'not_specified' => 'Non spécifié',
'before_proceeding_with_payment_warning' => 'Avant de procéder au paiement, vous devez remplir les champs suivants',
'after_completing_go_back_to_previous_page' => 'Retournez à la page précédente après avoir complété',
'pay' => 'Payer',
'instructions' => 'Instructions',
'notification_invoice_reminder1_sent_subject' => 'Le rappel 1 pour la facture :invoice a été envoyé à :client',
'notification_invoice_reminder2_sent_subject' => 'Le rappel 2 pour la facture :invoice a été envoyé à :client',
'notification_invoice_reminder3_sent_subject' => 'Le rappel 3 pour la facture :invoice a été envoyé à :client',
'notification_invoice_custom_sent_subject' => 'Le rappel personnalisé pour la facture :invoice a été envoyé à :client',
'notification_invoice_reminder_endless_sent_subject' => 'Un rappel perpétuel pour la facture :invoice a été envoyé à :client',
'assigned_user' => 'Utilisateur affecté',
'setup_steps_notice' => 'Pour accéder à la prochaine étape, vous devez tester chaque section.',
'setup_phantomjs_note' => 'Notes à propos de Phantom JS. En savoir plus.',
'minimum_payment' => 'Paiement minimum',
'no_action_provided' => 'Aucune action reçue. Si cest une erreur, veuillez contacter le soutien technique.',
'no_payable_invoices_selected' => 'Aucune des factures sélectionnées porte un solde dû. Assurez-vous que vous n\'essayez pas de payer une facture provisoire ou une facture dont le solde est nul.',
'required_payment_information' => 'Détails de paiement requis',
'required_payment_information_more' => 'Pour terminer le paiement, nous avons besoin de plus d\'informations à propos de vous.',
'required_client_info_save_label' => 'Ces informations seront sauvegardées. Vous n\'aurez pas à les saisir la prochaine fois.',
'notification_credit_bounced' => 'Nous n\'avons pas pu émettre de Credit :invoice to :contact. \n :error',
'notification_credit_bounced_subject' => 'Impossible d\'émettre Crédit :invoice',
'save_payment_method_details' => 'Enregistrer les infos de mode de paiement',
'new_card' => 'Nouvelle carte',
'new_bank_account' => 'Nouveau compte bancaire',
'company_limit_reached' => 'Limite de :limit entreprises par compte.',
'credits_applied_validation' => 'Le total des crédits octroyés ne peut être supérieur au total des factures',
'credit_number_taken' => 'Ce numéro de crédit est déjà utilisé',
'credit_not_found' => 'Crédit introuvable',
'invoices_dont_match_client' => 'Les factures sélectionnées proviennent de plus d\'un client',
'duplicate_credits_submitted' => 'Crédits soumis en double.',
'duplicate_invoices_submitted' => 'Factures soumises en double.',
'credit_with_no_invoice' => 'Vous devez avoir une facture en règle avant de pouvoir utiliser un crédit lors d\'un paiement',
'client_id_required' => 'Le numéro d\'identification du client est requis',
'expense_number_taken' => 'Numéro de remboursement déjà utilisé',
'invoice_number_taken' => 'Numéro de facture déjà utilisé',
'payment_id_required' => 'Numéro de paiement requis.',
'unable_to_retrieve_payment' => 'Impossible de récupérer le numéro de paiement spécifié',
'invoice_not_related_to_payment' => 'La facture #:invoice n\'est pas liée à ce paiement',
'credit_not_related_to_payment' => 'Le crédit #:credit n\'est pas lié à ce paiement',
'max_refundable_invoice' => 'Essai de remboursement plus élevé que permis pour la facture #:invoice. Le maximum remboursable est :amount.',
'refund_without_invoices' => 'Essai de remboursement d\'un paiement avec factures jointes. Veuillez spécifier une ou des factures valides à rembourser.',
'refund_without_credits' => 'Essai de remboursement d\'un paiement avec crédits jointes. Veuillez spécifier un ou des crédits valides à rembourser.',
'max_refundable_credit' => 'Essai de remboursement plus élevé que permis pour le crédit :credit. Le maximum remboursable est :amount.',
'project_client_do_not_match' => 'Partiellement non-appliquée',
'quote_number_taken' => 'Ce numéro de soumission est déjà pris',
'recurring_invoice_number_taken' => 'Le numéro de facture récurrente :number est déjà pris',
'user_not_associated_with_account' => 'L\'utilisateur n\'est pas associé à ce compte',
'amounts_do_not_balance' => 'Les montants ne balancent pas correctement.',
'insufficient_applied_amount_remaining' => 'Montant restant affecté insuffisant pour couvrir ce paiement.',
'insufficient_credit_balance' => 'Solde insuffisant sur le crédit',
'one_or_more_invoices_paid' => 'Une ou plusieurs factures ont été payées',
'invoice_cannot_be_refunded' => 'La facture #:number ne peut être remboursée',
'attempted_refund_failed' => 'Essai de remboursement du montant :amount seulement :refundable_amount  disponible pour remboursement.',
'user_not_associated_with_this_account' => 'Cet utilisateur ne peut être rattaché à cette entreprise. Peut-être a-t-il déjà enregistré un utilisateur sur un autre compte?',
'migration_completed' => 'Migration complétée',
'migration_completed_description' => 'La migration est complétée. Veuillez vérifier vos données après la connexion.',
'api_404' => '404 | Rien à voir ici!',
'large_account_update_parameter' => 'Le chargement d\'un gros compte est impossible sans un paramètre updated_at',
'no_backup_exists' => 'Aucune sauvegarde n\'existe pour cette activité',
'company_user_not_found' => 'L\'enregistrement de l\'entreprise de l\'utilisateur introuvable.',
'no_credits_found' => 'Aucun crédit trouvé.',
'action_unavailable' => 'L\'action :action demandée n\'est pas disponible',
'no_documents_found' => 'Aucun document trouvé',
'no_group_settings_found' => 'Aucun paramètre de groupe trouvé',
'access_denied' => 'Permissions insuffisantes pour accéder/modifier cette ressource',
'invoice_cannot_be_marked_paid' => 'La facture ne peut pas être marquée comme payée',
'invoice_license_or_environment' => 'License invalide, ou environnement :environment invalide',
'route_not_available' => 'La route n\'est pas disponible',
'invalid_design_object' => 'Objet de modèle personnalisé invalide',
'quote_not_found' => 'Soumission(s) introuvable(s)',
'quote_unapprovable' => 'L\'approbation de cette soumission ne peut se faire puisqu\'elle est expirée.',
'scheduler_has_run' => 'Le planificateur a démarré',
'scheduler_has_never_run' => 'Le planificateur n\'a jamais démarré',
'self_update_not_available' => 'La mise à jour manuelle n\'est pas disponible sur ce système',
'user_detached' => 'L\'utilisateur a été détaché de l\'entreprise',
'create_webhook_failure' => 'Création Webhook impossible',
'payment_message_extended' => 'Merci pour votre paiement d\'un montant de :amount',
'online_payments_minimum_note' => 'Note: Les paiements en ligne sont acceptés seulement si le montant est plus élevé que 1$ ou en devise équivalente.',
'payment_token_not_found' => 'Le jeton de paiement est introuvable. Veuillez essayer de nouveau. Si le problème persiste, essayez avec un autre mode de paiement',
'vendor_address1' => 'Rue du fournisseur',
'vendor_address2' => 'App du fournisseur',
'partially_unapplied' => 'Partiellement non-appliquée',
'select_a_gmail_user' => 'Veuillez sélectionner un utilisateur authentifié avec Gmail',
'list_long_press' => 'Longue pression pour liste',
'show_actions' => 'Afficher les actions',
'start_multiselect' => 'Démarrer la multisélection',
'email_sent_to_confirm_email' => 'Un courriel a été envoyé pour confirmer l\'adresse courriel',
'converted_paid_to_date' => 'Payé à ce jour converti',
'converted_credit_balance' => 'Solde de crédit converti',
'converted_total' => 'Total converti',
'reply_to_name' => 'Répondre à',
'payment_status_-2' => 'Partiellement non-appliquée',
'color_theme' => 'Couleur de thème',
'start_migration' => 'Démarrer la migration',
'recurring_cancellation_request' => 'Demande d\'annulation de facture récurrente de :contact',
'recurring_cancellation_request_body' => ':contact du client :client a demandé l\'annulation de la facture récurrente : invoice',
'hello' => 'Bonjour',
'group_documents' => 'Grouper les documents',
'quote_approval_confirmation_label' => 'Êtes-vous certain de vouloir approuver cette soumission ?',
'migration_select_company_label' => 'Sélectionnez les entreprises pour la migration',
'force_migration' => 'Forcer la migration',
'require_password_with_social_login' => 'Requiert un mot de passe avec une connexion de réseau social',
'stay_logged_in' => 'Restez connecté',
'session_about_to_expire' => 'Avertissement: Votre session va expirer bientôt',
'count_hours' => ':count heures',
'count_day' => '1 jour',
'count_days' => ':count jours',
'web_session_timeout' => 'Expiration de la session web',
'security_settings' => 'Paramètres de sécurité',
'resend_email' => 'Renvoyer le courriel',
'confirm_your_email_address' => 'Veuillez confirmer votre adresse courriel',
'freshbooks' => 'FreshBooks',
'invoice2go' => 'Invoice2go',
'invoicely' => 'Invoicely',
'waveaccounting' => 'Wave Accounting',
'zoho' => 'Zoho',
'accounting' => 'Comptabilité',
'required_files_missing' => 'Veuillez fournir tous les CSV.',
'migration_auth_label' => 'Continuez en vous authentifiant.',
'api_secret' => 'API secret',
'migration_api_secret_notice' => 'Vous pouvez trouver API_SECRET dans le fichier .env ou Invoice Ninja v5. Si la propriété est manquante, laissez le champ vide.',
'billing_coupon_notice' => 'Votre rabais sera appliqué au moment de régler votre facture.',
'use_last_email' => 'Utiliser le dernier e-mail',
'activate_company' => 'Activer l\'entreprise',
'activate_company_help' => 'Activez les courriels, les factures récurrentes et les notifications',
'an_error_occurred_try_again' => 'Une erreur s\'est produite, veuillez réessayer',
'please_first_set_a_password' => 'Veuillez d\'abord définir un mot de passe',
'changing_phone_disables_two_factor' => 'Attention: modifier votre numéro de téléphone désactivera l\'authentification à deux facteurs 2FA',
'help_translate' => 'Aide à la traduction',
'please_select_a_country' => 'Veuillez sélectionner un pays',
'disabled_two_factor' => 'L\'authentification à deux facteurs 2FA a été désactivée',
'connected_google' => 'Le compte a été connecté',
'disconnected_google' => 'Le compte a été déconnecté',
'delivered' => 'Livré',
'spam' => 'Pourriel',
'view_docs' => 'Afficher la documentation',
'enter_phone_to_enable_two_factor' => 'Veuillez fournir un numéro de téléphone mobile pour activer l\'authentification à deux facteurs',
'send_sms' => 'Envoyer un SMS',
'sms_code' => 'Code SMS',
'connect_google' => 'Connecter Google',
'disconnect_google' => 'Déconnecter Google',
'disable_two_factor' => 'Désactiver l\'authentification à deux facteurs',
'invoice_task_datelog' => 'Facturer le journal des dates des tâches',
'invoice_task_datelog_help' => 'Ajouter les détails de date aux lignes d\'articles des factures',
'promo_code' => 'Code promo',
'recurring_invoice_issued_to' => 'Facture récurrente émise à',
'subscription' => 'Abonnement',
'new_subscription' => 'Nouvel abonnement',
'deleted_subscription' => 'L\'abonnement a été supprimé',
'removed_subscription' => 'L\'abonnement a été retiré',
'restored_subscription' => 'L\'abonnement a été restauré',
'search_subscription' => 'Recherche de 1 abonnement',
'search_subscriptions' => 'Recherche :count abonnements',
'subdomain_is_not_available' => 'Le sous-domaine n\'est pas disponible',
'connect_gmail' => 'Connectez Gmail',
'disconnect_gmail' => 'Déconnecter Gmail',
'connected_gmail' => 'Gmail a été connecté',
'disconnected_gmail' => 'Gmail a été déconnecté',
'update_fail_help' => 'Les modifications apportées au code de base peuvent bloquer la mise à jour, vous pouvez exécuter cette commande pour annuler les modifications:',
'client_id_number' => 'Numéro d\'identification du client',
'count_minutes' => ':count minutes',
'password_timeout' => 'Délai d\'expiration du mot de passe',
'shared_invoice_credit_counter' => 'Partager le compteur pour les factures et les crédits',
'next' => 'Suivant',
'next_step' => 'Étape suivante',
'notification_credit_sent_subject' => 'le crédit :invoice a été envoyé à :client',
'notification_credit_viewed_subject' => 'Le crédit :invoice a été consulté par :client',
'notification_credit_sent' => 'Un crédit de :amount a été envoyé par courriel au client :client.',
'notification_credit_viewed' => 'Un crédit de :amount a été consulté par le client :client.',
'reset_password_text' => 'Saisissez votre adresse courriel pour réinitialiser votre mot de passe.',
'password_reset' => 'Réinitialisation du mot de passe',
'account_login_text' => 'Bienvenue ! Heureux de vous voir.',
'request_cancellation' => 'Annuler la demande',
'delete_payment_method' => 'Supprimer le mode de paiement',
'about_to_delete_payment_method' => 'Le mode de paiement sera supprimé',
'action_cant_be_reversed' => 'Cette action ne peut être annulée',
'profile_updated_successfully' => 'Le profil a été mis à jour',
'currency_ethiopian_birr' => 'birr éthiopien',
'client_information_text' => 'Adresse permanente où vous recevez le courriel',
'status_id' => 'État de facture',
'email_already_register' => 'Cette adresse courriel est déjà liée à un compte',
'locations' => 'Emplacements',
'freq_indefinitely' => 'Indéfiniment',
'cycles_remaining' => 'Cycles restants',
'i_understand_delete' => 'Je comprends. Supprimer.',
'download_files' => 'Télécharger les fichiers',
'download_timeframe' => 'Utilisez ce lien pour télécharger vos fichiers. Le lien expirera dans 1 heure.',
'new_signup' => 'Nouvelle inscription',
'new_signup_text' => 'Un nouveau compte a été créé par :user - :email - de l\'adresse IP :ip',
'notification_payment_paid_subject' => 'Le paiement a été fait par :client',
'notification_partial_payment_paid_subject' => 'Le paiement partiel a été fait par :client',
'notification_payment_paid' => 'Un paiement de :amount a été fait par le client : pour la facture :invoice',
'notification_partial_payment_paid' => 'Un paiement partiel de :amount a été fait par le client : pour la facture :invoice',
'notification_bot' => 'Bot de notifications',
'invoice_number_placeholder' => 'Facture N° :invoice',
'entity_number_placeholder' => ':entity N° :entity_number',
'email_link_not_working' => 'Si le bouton ci-dessus ne fonctionne pas correctement, cliquez sur le lien',
'display_log' => 'Afficher le registre',
'send_fail_logs_to_our_server' => 'Rapporter les erreurs en temps réel',
'setup' => 'Configuration',
'quick_overview_statistics' => 'Aperçu et statistiques',
'update_your_personal_info' => 'Mettre à jour vos infos personnelles',
'name_website_logo' => 'Nom, site web et logo',
'make_sure_use_full_link' => 'Utilisez le lien complet vers votre site',
'personal_address' => 'Adresse personnelle',
'enter_your_personal_address' => 'Saisissez votre adresse personnelle',
'enter_your_shipping_address' => 'Saisissez votre adresse de livraison',
'list_of_invoices' => 'Liste des factures',
'with_selected' => 'Avec la sélection de',
'invoice_still_unpaid' => 'Cette facture est toujours impayée. Cliquez sur le bouton pour compléter le paiement',
'list_of_recurring_invoices' => 'Liste des factures récurrentes',
'details_of_recurring_invoice' => 'Détails à propos des factures récurrentes',
'cancellation' => 'Annulation',
'about_cancellation' => 'Pour cesser la facturation récurrente, cliquez sur la requête d\'annulation.',
'cancellation_warning' => 'Avertissement! Vous avez demandé une annulation de ce service. Votre service pourrait être annulé sans autre notification.',
'cancellation_pending' => 'Annulation en attente. Nous vous tiendrons au courant.',
'list_of_payments' => 'Liste des paiements',
'payment_details' => 'Détails du paiement',
'list_of_payment_invoices' => 'Liste des factures affectées par le paiement',
'list_of_payment_methods' => 'Liste des modes de paiement',
'payment_method_details' => 'Détails du mode de paiement',
'permanently_remove_payment_method' => 'Supprimer de façon définitive ce mode de paiement',
'warning_action_cannot_be_reversed' => 'Avertissement! Cette action ne peut être annulée!',
'confirmation' => 'Confirmation',
'list_of_quotes' => 'Soumissions',
'waiting_for_approval' => 'En attente d\'approbation',
'quote_still_not_approved' => 'Cette soumission n\'a pas encore été approuvée',
'list_of_credits' => 'Crédits',
'required_extensions' => 'Extensions requises',
'php_version' => 'Version PHP',
'writable_env_file' => 'Fichier .env inscriptible',
'env_not_writable' => 'Le fichier .env n\'est pas inscriptible par l\'utilisateur en cours',
'minumum_php_version' => 'Version PHP minimale',
'satisfy_requirements' => 'Assurez-vous que toutes les exigences sont satisfaites',
'oops_issues' => 'Oups, quelque chose cloche !',
'open_in_new_tab' => 'Ouvrir dans un nouvel onglet',
'complete_your_payment' => 'Paiement complet',
'authorize_for_future_use' => 'Autoriser ce mode de paiement pour usage ultérieur',
'page' => 'Page',
'per_page' => 'Par page',
'of' => 'De',
'view_credit' => 'Voir le crédit',
'to_view_entity_password' => 'Pour voir :entity, vous devez saisir votre mot de passe.',
'showing_x_of' => 'Affiche :first de :last de :total résultats',
'no_results' => 'Aucun résultat',
'payment_failed_subject' => 'Le paiement a échoué pour le client :client',
'payment_failed_body' => 'Un paiement fait par le client :client a échoué avec le message :message',
'register' => 'S\'inscrire',
'register_label' => 'Créer votre compte en quelques secondes',
'password_confirmation' => 'Confirmer votre mot de passe',
'verification' => 'Vérification',
'complete_your_bank_account_verification' => 'Avant d\'utiliser un compte bancaire, il doit être vérifié.',
'checkout_com' => 'Checkout.com',
'footer_label' => 'Tous droits réservés © :year :company.',
'credit_card_invalid' => 'Le numéro de carte de crédit fourni n\'est pas valide',
'month_invalid' => 'Le mois indiqué n\'est pas valide',
'year_invalid' => 'L\'année indiquée n\'est pas valide',
'https_required' => 'HTTPS est requis, l\'envoi du formulaire va échouer',
'if_you_need_help' => 'Si vous avez besoin d\'aide, vous pouvez écrire à notre',
'update_password_on_confirm' => 'Après la mise à jour du mot de passe, votre compte sera confirmé.',
'bank_account_not_linked' => 'Pour payer avec un compte bancaire, vous devez d\'abord l\'ajouter comme un mode de paiement.',
'application_settings_label' => 'Enregistrons les informations de base sur votre Ninja de la facture!',
'recommended_in_production' => 'Fortement recommandé en mode production',
'enable_only_for_development' => 'Activer seulement en mode développement',
'test_pdf' => 'Tester le PDF',
'checkout_authorize_label' => 'Checkout.com peut être enregistrer comme un mode de paiement pour usage ultérieur, lors de la première transaction. Cochez "Enregistrer les infos de carte de crédit" lors du processus de paiement.',
'sofort_authorize_label' => 'Le compte bancaire (SOFORT) peut être enregistré comme un mode de paiement pour usage ultérieur, lors de la première transaction. Cochez "Enregistrer les infos de paiement" lors du processus de paiement.',
'node_status' => 'État du noeud',
'npm_status' => 'État du NPM',
'node_status_not_found' => 'Nœud introuvable. Est-il installé ?',
'npm_status_not_found' => 'NPM introuvable. Est-il installé ?',
'locked_invoice' => 'La facture est verrouillée et ne peut être modifiée',
'downloads' => 'Téléchargements',
'resource' => 'Ressource',
'document_details' => 'Détails du document',
'hash' => 'Hash',
'resources' => 'Ressources',
'allowed_file_types' => 'Types de fichiers autorisés:',
'common_codes' => 'Codes communs et leurs significations',
'payment_error_code_20087' => '20087 : Données de suivi invalides (CVV et/ou date d\'expiration non valables)',
'download_selected' => 'Télécharger la sélection',
'to_pay_invoices' => 'Pour payer les factures, vous devez',
'add_payment_method_first' => 'ajouter un mode de paiement',
'no_items_selected' => 'Aucun article sélectionné',
'payment_due' => 'Paiement dû',
'account_balance' => 'Solde de compte',
'thanks' => 'Merci',
'minimum_required_payment' => 'Le paiement minimum requis est :amount',
'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',
'credit_message' => 'Pour voir le crédit de :amount, cliquez sur le lien ci-dessous.',
'payment_type_Crypto' => 'Cryptodevise',
'payment_type_Credit' => 'Crédit',
'store_for_future_use' => 'Enregistrer pour un usage ultérieur',
'pay_with_credit' => 'Payer avec un crédit',
'payment_method_saving_failed' => 'Ce mode de paiement ne peut pas être enregistré pour usage ultérieur.',
'pay_with' => 'Payer avec',
'n/a' => 'N/D',
'by_clicking_next_you_accept_terms' => 'En cliquant sur "Prochaine étape", vous acceptez les conditions.',
'not_specified' => 'Non spécifié',
'before_proceeding_with_payment_warning' => 'Avant de procéder au paiement, vous devez remplir les champs suivants',
'after_completing_go_back_to_previous_page' => 'Retournez à la page précédente après avoir complété',
'pay' => 'Payer',
'instructions' => 'Instructions',
'notification_invoice_reminder1_sent_subject' => 'Le rappel 1 pour la facture :invoice a été envoyé à :client',
'notification_invoice_reminder2_sent_subject' => 'Le rappel 2 pour la facture :invoice a été envoyé à :client',
'notification_invoice_reminder3_sent_subject' => 'Le rappel 3 pour la facture :invoice a été envoyé à :client',
'notification_invoice_custom_sent_subject' => 'Le rappel personnalisé pour la facture :invoice a été envoyé à :client',
'notification_invoice_reminder_endless_sent_subject' => 'Un rappel perpétuel pour la facture :invoice a été envoyé à :client',
'assigned_user' => 'Utilisateur affecté',
'setup_steps_notice' => 'Pour accéder à la prochaine étape, vous devez tester chaque section.',
'setup_phantomjs_note' => 'Notes à propos de Phantom JS. En savoir plus.',
'minimum_payment' => 'Paiement minimum',
'no_action_provided' => 'Aucune action reçue. Si cest une erreur, veuillez contacter le soutien technique.',
'no_payable_invoices_selected' => 'Aucune des factures sélectionnées porte un solde dû. Assurez-vous que vous n\'essayez pas de payer une facture provisoire ou une facture dont le solde est nul.',
'required_payment_information' => 'Détails de paiement requis',
'required_payment_information_more' => 'Pour terminer le paiement, nous avons besoin de plus d\'informations à propos de vous.',
'required_client_info_save_label' => 'Ces informations seront sauvegardées. Vous n\'aurez pas à les saisir la prochaine fois.',
'notification_credit_bounced' => 'Nous n\'avons pas pu émettre de Credit :invoice to :contact. \n :error',
'notification_credit_bounced_subject' => 'Impossible d\'émettre Crédit :invoice',
'save_payment_method_details' => 'Enregistrer les infos de mode de paiement',
'new_card' => 'Nouvelle carte',
'new_bank_account' => 'Nouveau compte bancaire',
'company_limit_reached' => 'Limite de :limit entreprises par compte.',
'credits_applied_validation' => 'Le total des crédits octroyés ne peut être supérieur au total des factures',
'credit_number_taken' => 'Ce numéro de crédit est déjà utilisé',
'credit_not_found' => 'Crédit introuvable',
'invoices_dont_match_client' => 'Les factures sélectionnées proviennent de plus d\'un client',
'duplicate_credits_submitted' => 'Crédits soumis en double.',
'duplicate_invoices_submitted' => 'Factures soumises en double.',
'credit_with_no_invoice' => 'Vous devez avoir une facture en règle avant de pouvoir utiliser un crédit lors d\'un paiement',
'client_id_required' => 'Le numéro d\'identification du client est requis',
'expense_number_taken' => 'Numéro de remboursement déjà utilisé',
'invoice_number_taken' => 'Numéro de facture déjà utilisé',
'payment_id_required' => 'Numéro de paiement requis.',
'unable_to_retrieve_payment' => 'Impossible de récupérer le numéro de paiement spécifié',
'invoice_not_related_to_payment' => 'La facture #:invoice n\'est pas liée à ce paiement',
'credit_not_related_to_payment' => 'Le crédit #:credit n\'est pas lié à ce paiement',
'max_refundable_invoice' => 'Essai de remboursement plus élevé que permis pour la facture #:invoice. Le maximum remboursable est :amount.',
'refund_without_invoices' => 'Essai de remboursement d\'un paiement avec factures jointes. Veuillez spécifier une ou des factures valides à rembourser.',
'refund_without_credits' => 'Essai de remboursement d\'un paiement avec crédits jointes. Veuillez spécifier un ou des crédits valides à rembourser.',
'max_refundable_credit' => 'Essai de remboursement plus élevé que permis pour le crédit :credit. Le maximum remboursable est :amount.',
'project_client_do_not_match' => 'Partiellement non-appliquée',
'quote_number_taken' => 'Ce numéro de soumission est déjà pris',
'recurring_invoice_number_taken' => 'Le numéro de facture récurrente :number est déjà pris',
'user_not_associated_with_account' => 'L\'utilisateur n\'est pas associé à ce compte',
'amounts_do_not_balance' => 'Les montants ne balancent pas correctement.',
'insufficient_applied_amount_remaining' => 'Montant restant affecté insuffisant pour couvrir ce paiement.',
'insufficient_credit_balance' => 'Solde insuffisant sur le crédit',
'one_or_more_invoices_paid' => 'Une ou plusieurs factures ont été payées',
'invoice_cannot_be_refunded' => 'La facture #:number ne peut être remboursée',
'attempted_refund_failed' => 'Essai de remboursement du montant :amount seulement :refundable_amount  disponible pour remboursement.',
'user_not_associated_with_this_account' => 'Cet utilisateur ne peut être rattaché à cette entreprise. Peut-être a-t-il déjà enregistré un utilisateur sur un autre compte?',
'migration_completed' => 'Migration complétée',
'migration_completed_description' => 'La migration est complétée. Veuillez vérifier vos données après la connexion.',
'api_404' => '404 | Rien à voir ici!',
'large_account_update_parameter' => 'Le chargement d\'un gros compte est impossible sans un paramètre updated_at',
'no_backup_exists' => 'Aucune sauvegarde n\'existe pour cette activité',
'company_user_not_found' => 'L\'enregistrement de l\'entreprise de l\'utilisateur introuvable.',
'no_credits_found' => 'Aucun crédit trouvé.',
'action_unavailable' => 'L\'action :action demandée n\'est pas disponible',
'no_documents_found' => 'Aucun document trouvé',
'no_group_settings_found' => 'Aucun paramètre de groupe trouvé',
'access_denied' => 'Permissions insuffisantes pour accéder/modifier cette ressource',
'invoice_cannot_be_marked_paid' => 'La facture ne peut pas être marquée comme payée',
'invoice_license_or_environment' => 'License invalide, ou environnement :environment invalide',
'route_not_available' => 'La route n\'est pas disponible',
'invalid_design_object' => 'Objet de modèle personnalisé invalide',
'quote_not_found' => 'Soumission(s) introuvable(s)',
'quote_unapprovable' => 'L\'approbation de cette soumission ne peut se faire puisqu\'elle est expirée.',
'scheduler_has_run' => 'Le planificateur a démarré',
'scheduler_has_never_run' => 'Le planificateur n\'a jamais démarré',
'self_update_not_available' => 'La mise à jour manuelle n\'est pas disponible sur ce système',
'user_detached' => 'L\'utilisateur a été détaché de l\'entreprise',
'create_webhook_failure' => 'Création Webhook impossible',
'payment_message_extended' => 'Merci pour votre paiement d\'un montant de :amount',
'online_payments_minimum_note' => 'Note: Les paiements en ligne sont acceptés seulement si le montant est plus élevé que 1$ ou en devise équivalente.',
'payment_token_not_found' => 'Le jeton de paiement est introuvable. Veuillez essayer de nouveau. Si le problème persiste, essayez avec un autre mode de paiement',
'vendor_address1' => 'Rue du fournisseur',
'vendor_address2' => 'App du fournisseur',
'partially_unapplied' => 'Partiellement non-appliquée',
'select_a_gmail_user' => 'Veuillez sélectionner un utilisateur authentifié avec Gmail',
'list_long_press' => 'Longue pression pour liste',
'show_actions' => 'Afficher les actions',
'start_multiselect' => 'Démarrer la multisélection',
'email_sent_to_confirm_email' => 'Un courriel a été envoyé pour confirmer l\'adresse courriel',
'converted_paid_to_date' => 'Payé à ce jour converti',
'converted_credit_balance' => 'Solde de crédit converti',
'converted_total' => 'Total converti',
'reply_to_name' => 'Répondre à',
'payment_status_-2' => 'Partiellement non-appliquée',
'color_theme' => 'Couleur de thème',
'start_migration' => 'Démarrer la migration',
'recurring_cancellation_request' => 'Demande d\'annulation de facture récurrente de :contact',
'recurring_cancellation_request_body' => ':contact du client :client a demandé l\'annulation de la facture récurrente : invoice',
'hello' => 'Bonjour',
'group_documents' => 'Grouper les documents',
'quote_approval_confirmation_label' => 'Êtes-vous certain de vouloir approuver cette soumission ?',
'migration_select_company_label' => 'Sélectionnez les entreprises pour la migration',
'force_migration' => 'Forcer la migration',
'require_password_with_social_login' => 'Requiert un mot de passe avec une connexion de réseau social',
'stay_logged_in' => 'Restez connecté',
'session_about_to_expire' => 'Avertissement: Votre session va expirer bientôt',
'count_hours' => ':count heures',
'count_day' => '1 jour',
'count_days' => ':count jours',
'web_session_timeout' => 'Expiration de la session web',
'security_settings' => 'Paramètres de sécurité',
'resend_email' => 'Renvoyer le courriel',
'confirm_your_email_address' => 'Veuillez confirmer votre adresse courriel',
'freshbooks' => 'FreshBooks',
'invoice2go' => 'Invoice2go',
'invoicely' => 'Invoicely',
'waveaccounting' => 'Wave Accounting',
'zoho' => 'Zoho',
'accounting' => 'Comptabilité',
'required_files_missing' => 'Veuillez fournir tous les CSV.',
'migration_auth_label' => 'Continuez en vous authentifiant.',
'api_secret' => 'API secret',
'migration_api_secret_notice' => 'Vous pouvez trouver API_SECRET dans le fichier .env ou Invoice Ninja v5. Si la propriété est manquante, laissez le champ vide.',
'billing_coupon_notice' => 'Votre rabais sera appliqué au moment de régler votre facture.',
'use_last_email' => 'Utiliser le dernier e-mail',
'activate_company' => 'Activer l\'entreprise',
'activate_company_help' => 'Activez les courriels, les factures récurrentes et les notifications',
'an_error_occurred_try_again' => 'Une erreur s\'est produite, veuillez réessayer',
'please_first_set_a_password' => 'Veuillez d\'abord définir un mot de passe',
'changing_phone_disables_two_factor' => 'Attention: modifier votre numéro de téléphone désactivera l\'authentification à deux facteurs 2FA',
'help_translate' => 'Aide à la traduction',
'please_select_a_country' => 'Veuillez sélectionner un pays',
'disabled_two_factor' => 'L\'authentification à deux facteurs 2FA a été désactivée',
'connected_google' => 'Le compte a été connecté',
'disconnected_google' => 'Le compte a été déconnecté',
'delivered' => 'Livré',
'spam' => 'Pourriel',
'view_docs' => 'Afficher la documentation',
'enter_phone_to_enable_two_factor' => 'Veuillez fournir un numéro de téléphone mobile pour activer l\'authentification à deux facteurs',
'send_sms' => 'Envoyer un SMS',
'sms_code' => 'Code SMS',
'connect_google' => 'Connecter Google',
'disconnect_google' => 'Déconnecter Google',
'disable_two_factor' => 'Désactiver l\'authentification à deux facteurs',
'invoice_task_datelog' => 'Facturer le journal des dates des tâches',
'invoice_task_datelog_help' => 'Ajouter les détails de date aux lignes d\'articles des factures',
'promo_code' => 'Code promo',
'recurring_invoice_issued_to' => 'Facture récurrente émise à',
'subscription' => 'Abonnement',
'new_subscription' => 'Nouvel abonnement',
'deleted_subscription' => 'L\'abonnement a été supprimé',
'removed_subscription' => 'L\'abonnement a été retiré',
'restored_subscription' => 'L\'abonnement a été restauré',
'search_subscription' => 'Recherche de 1 abonnement',
'search_subscriptions' => 'Recherche :count abonnements',
'subdomain_is_not_available' => 'Le sous-domaine n\'est pas disponible',
'connect_gmail' => 'Connectez Gmail',
'disconnect_gmail' => 'Déconnecter Gmail',
'connected_gmail' => 'Gmail a été connecté',
'disconnected_gmail' => 'Gmail a été déconnecté',
'update_fail_help' => 'Les modifications apportées au code de base peuvent bloquer la mise à jour, vous pouvez exécuter cette commande pour annuler les modifications:',
'client_id_number' => 'Numéro d\'identification du client',
'count_minutes' => ':count minutes',
'password_timeout' => 'Délai d\'expiration du mot de passe',
'shared_invoice_credit_counter' => 'Partager le compteur pour les factures et les crédits',
'activity_80' => ':user a créé l\'abonnement :subscription',
'activity_81' => ':user a mis à jour l\'abonnement :subscription',
'activity_82' => ':user a archivé l\'abonnement :subscription',
@ -5212,6 +5212,34 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'receipt' => 'Reçu',
'charges' => 'Charges',
'email_report' => 'Envoyer le rapport',
'payment_type_Pay Later' => 'Payer plus tard',
'payment_type_credit' => 'Type de paiement crédit',
'payment_type_debit' => 'Type de paiement débit',
'send_emails_to' => 'Envoyer les courriels à',
'primary_contact' => 'Contact principal',
'all_contacts' => 'Tous les contacts',
'insert_below' => 'Insérer ci-dessous',
'nordigen_handler_subtitle' => 'will gain access for your selected bank account. After selecting your institution you are redirected to theire front-page to complete the request with your account credentials.',
'nordigen_handler_error_heading_unknown' => 'An Error has occured',
'nordigen_handler_error_contents_unknown' => 'An unknown Error has occured! Reason:',
'nordigen_handler_error_heading_token_invalid' => 'Invalid Token',
'nordigen_handler_error_contents_token_invalid' => 'The provided token was invalid. Please restart the flow, with a valid one_time_token. Contact support for help, if this issue persists.',
'nordigen_handler_error_heading_account_config_invalid' => 'Missing Credentials',
'nordigen_handler_error_contents_account_config_invalid' => 'The provided credentials for nordigen are eighter missing or invalid. Contact support for help, if this issue persists.',
'nordigen_handler_error_heading_not_available' => 'Not Available',
'nordigen_handler_error_contents_not_available' => 'This flow is not available for your account. Considder upgrading to enterprise version. Contact support for help, if this issue persists.',
'nordigen_handler_error_heading_institution_invalid' => 'Invalid Institution',
'nordigen_handler_error_contents_institution_invalid' => 'The provided institution-id is invalid or no longer valid. You can go to the bank selection page by clicking the button below or cancel the flow by clicking on the \'X\' above.',
'nordigen_handler_error_heading_ref_invalid' => 'Invalid Reference',
'nordigen_handler_error_contents_ref_invalid' => 'Nordigen did not provide a valid reference. Please run flow again and contact support, if this issue persists.',
'nordigen_handler_error_heading_not_found' => 'Invalid Requisition',
'nordigen_handler_error_contents_not_found' => 'Nordigen did not provide a valid reference. Please run flow again and contact support, if this issue persists.',
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready',
'nordigen_handler_error_contents_requisition_invalid_status' => 'You may called this site to early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.',
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected',
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.',
'nordigen_handler_restart' => 'Restart flow.',
'nordigen_handler_return' => 'Return to application.',
);
return $lang;

View File

@ -11,8 +11,9 @@
namespace Tests\Unit\ValidationRules;
use App\Http\ValidationRules\Account\BlackListRule;
use Tests\TestCase;
use App\Http\ValidationRules\Account\BlackListRule;
use App\Http\ValidationRules\Account\EmailBlackListRule;
/**
* @test
@ -25,6 +26,35 @@ class BlacklistValidationTest extends TestCase
parent::setUp();
}
public function testValidEmailRule3()
{
$rules = [
'email' => [new EmailBlackListRule],
];
$data = [
'email' => 'contact@invoiceninja.com',
];
$v = $this->app['validator']->make($data, $rules);
$this->assertTrue($v->passes());
}
public function testValidEmailRule2()
{
$rules = [
'email' => [new EmailBlackListRule],
];
$data = [
'email' => 'noddy@invoiceninja.com',
];
$v = $this->app['validator']->make($data, $rules);
$this->assertFalse($v->passes());
}
public function testValidEmailRule()
{
$rules = [
@ -52,4 +82,32 @@ class BlacklistValidationTest extends TestCase
$v = $this->app['validator']->make($data, $rules);
$this->assertFalse($v->passes());
}
public function testInValidEmailRule2()
{
$rules = [
'email' => [new BlackListRule],
];
$data = [
'email' => 'jimmy@zzz.com',
];
$v = $this->app['validator']->make($data, $rules);
$this->assertFalse($v->passes());
}
public function testInValidEmailRule3()
{
$rules = [
'email' => [new BlackListRule],
];
$data = [
'email' => 'jimmy@gmail.com',
];
$v = $this->app['validator']->make($data, $rules);
$this->assertTrue($v->passes());
}
}