Merge pull request #8471 from turbo124/v5-develop

Improve Cancel URL experience with Paypal
This commit is contained in:
David Bomba 2023-04-25 09:33:30 +10:00 committed by GitHub
commit e499aab5c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 232 additions and 174 deletions

View File

@ -12,34 +12,35 @@
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use Google_Client;
use App\Models\User;
use App\Utils\Ninja;
use App\Models\Account;
use App\Libraries\MultiDB;
use App\Utils\TruthSource;
use Microsoft\Graph\Model;
use App\Models\CompanyUser;
use App\Models\CompanyToken;
use Illuminate\Http\Request;
use App\Libraries\OAuth\OAuth;
use App\Events\User\UserLoggedIn;
use PragmaRX\Google2FA\Google2FA;
use App\Jobs\Account\CreateAccount;
use Illuminate\Support\Facades\Auth;
use App\Utils\Traits\User\LoginCache;
use Illuminate\Support\Facades\Cache;
use Turbo124\Beacon\Facades\LightLogs;
use App\Http\Controllers\BaseController;
use App\Jobs\Company\CreateCompanyToken;
use Laravel\Socialite\Facades\Socialite;
use App\Http\Requests\Login\LoginRequest;
use App\Libraries\OAuth\Providers\Google;
use Illuminate\Database\Eloquent\Builder;
use App\DataMapper\Analytics\LoginFailure; use App\DataMapper\Analytics\LoginFailure;
use App\DataMapper\Analytics\LoginSuccess; use App\DataMapper\Analytics\LoginSuccess;
use App\Events\User\UserLoggedIn;
use App\Http\Controllers\BaseController;
use App\Http\Requests\Login\LoginRequest;
use App\Jobs\Account\CreateAccount;
use App\Jobs\Company\CreateCompanyToken;
use App\Libraries\MultiDB;
use App\Libraries\OAuth\OAuth;
use App\Libraries\OAuth\Providers\Google;
use App\Models\Account;
use App\Models\CompanyToken;
use App\Models\CompanyUser;
use App\Models\User;
use App\Transformers\CompanyUserTransformer;
use App\Utils\Ninja;
use App\Utils\Traits\User\LoginCache;
use App\Utils\Traits\UserSessionAttributes; use App\Utils\Traits\UserSessionAttributes;
use App\Utils\TruthSource; use App\Transformers\CompanyUserTransformer;
use Google_Client;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Laravel\Socialite\Facades\Socialite;
use Microsoft\Graph\Model;
use PragmaRX\Google2FA\Google2FA;
use Turbo124\Beacon\Facades\LightLogs;
class LoginController extends BaseController class LoginController extends BaseController
{ {
@ -610,6 +611,9 @@ class LoginController extends BaseController
$parameters = ['response_type' => 'code', 'redirect_uri' => config('ninja.app_url') . "/auth/microsoft"]; $parameters = ['response_type' => 'code', 'redirect_uri' => config('ninja.app_url') . "/auth/microsoft"];
} }
if(request()->hasHeader('X-REACT'))
Cache::put("react_redir:".auth()->user()->account->key, 'true', 300);
if (request()->has('code')) { if (request()->has('code')) {
return $this->handleProviderCallback($provider); return $this->handleProviderCallback($provider);
} else { } else {
@ -649,16 +653,27 @@ class LoginController extends BaseController
'email' => $socialite_user->getEmail(), 'email' => $socialite_user->getEmail(),
'oauth_user_id' => $socialite_user->getId(), 'oauth_user_id' => $socialite_user->getId(),
'oauth_provider_id' => $provider, 'oauth_provider_id' => $provider,
'oauth_user_token' => $oauth_user_token, // 'oauth_user_token' => $oauth_user_token,
'oauth_user_refresh_token' => $socialite_user->refreshToken, // 'oauth_user_refresh_token' => $socialite_user->refreshToken,
]; ];
$user->update($update_user); $user->update($update_user);
$user->oauth_user_token = $oauth_user_token;
$user->oauth_user_refresh_token = $socialite_user->refreshToken;
$user->save();
} else { } else {
nlog('user not found for oauth'); nlog('user not found for oauth');
} }
return redirect('/#/'); $redirect_url = '/#/';
$request_from_react = Cache::pull("react_redir:".auth()->user()->account->key);
if($request_from_react)
$redirect_url = config('ninja.react_url')."/#/settings/user_details/connect";
return redirect($redirect_url);
} }
public function handleMicrosoftProviderCallback($provider = 'microsoft') public function handleMicrosoftProviderCallback($provider = 'microsoft')
@ -679,12 +694,16 @@ class LoginController extends BaseController
'email' => $socialite_user->getEmail(), 'email' => $socialite_user->getEmail(),
'oauth_user_id' => $socialite_user->getId(), 'oauth_user_id' => $socialite_user->getId(),
'oauth_provider_id' => $provider, 'oauth_provider_id' => $provider,
'oauth_user_token' => $oauth_user_token, // 'oauth_user_token' => $oauth_user_token,
'oauth_user_refresh_token' => $socialite_user->accessTokenResponseBody['refresh_token'], // 'oauth_user_refresh_token' => $socialite_user->accessTokenResponseBody['refresh_token'],
'oauth_user_token_expiry' => $oauth_expiry, 'oauth_user_token_expiry' => $oauth_expiry,
]; ];
$user->update($update_user); $user->update($update_user);
$user->oauth_user_refresh_token = $socialite_user->accessTokenResponseBody['refresh_token'];
$user->oauth_user_token = $oauth_user_token;
$user->save();
} else { } else {
nlog('user not found for oauth'); nlog('user not found for oauth');
} }

View File

@ -203,10 +203,10 @@ class ConnectedAccountController extends BaseController
$connected_account = [ $connected_account = [
'email' => $google->harvestEmail($user), 'email' => $google->harvestEmail($user),
'oauth_user_id' => $google->harvestSubField($user), 'oauth_user_id' => $google->harvestSubField($user),
'oauth_user_token' => $token, // 'oauth_user_token' => $token,
'oauth_user_refresh_token' => $refresh_token, // 'oauth_user_refresh_token' => $refresh_token,
'oauth_provider_id' => 'google', 'oauth_provider_id' => 'google',
'email_verified_at' =>now(), // 'email_verified_at' =>now(),
]; ];
if (auth()->user()->email != $google->harvestEmail($user)) { if (auth()->user()->email != $google->harvestEmail($user)) {
@ -215,6 +215,9 @@ class ConnectedAccountController extends BaseController
auth()->user()->update($connected_account); auth()->user()->update($connected_account);
auth()->user()->email_verified_at = now(); auth()->user()->email_verified_at = now();
auth()->user()->oauth_user_token = $token;
auth()->user()->oauth_user_refresh_token = $refresh_token;
auth()->user()->save(); auth()->user()->save();
$this->activateGmail(auth()->user()); $this->activateGmail(auth()->user());

View File

@ -545,7 +545,7 @@ class CreditController extends BaseController
} }
}); });
return $this->listResponse(Credit::withTrashed()->company()->whereIn('id', $request->ids)); return $this->listResponse(Credit::with(['invitations','documents'])->withTrashed()->company()->whereIn('id', $request->ids));
} }
public function action(ActionCreditRequest $request, Credit $credit, $action) public function action(ActionCreditRequest $request, Credit $credit, $action)

View File

@ -30,7 +30,10 @@ class TokenAuth
*/ */
public function handle($request, Closure $next) public function handle($request, Closure $next)
{ {
if ($request->header('X-API-TOKEN') && ($company_token = CompanyToken::with(['user', 'company'])->where('token', $request->header('X-API-TOKEN'))->first())) { if ($request->header('X-API-TOKEN') && ($company_token = CompanyToken::with([
'user' => [
'account',
], 'company'])->where('token', $request->header('X-API-TOKEN'))->first())) {
$user = $company_token->user; $user = $company_token->user;
$error = [ $error = [
@ -51,7 +54,6 @@ class TokenAuth
return response()->json($error, 403); return response()->json($error, 403);
} }
/* /*
| |
| Necessary evil here: As we are authenticating on CompanyToken, | Necessary evil here: As we are authenticating on CompanyToken,
@ -59,7 +61,6 @@ class TokenAuth
| us to decouple a $user and their attached companies completely. | us to decouple a $user and their attached companies completely.
| |
*/ */
$truth = app()->make(TruthSource::class); $truth = app()->make(TruthSource::class);
$truth->setCompanyUser($company_token->cu); $truth->setCompanyUser($company_token->cu);

View File

@ -347,6 +347,10 @@ class RecurringInvoice extends BaseModel
'status', 'status',
]; ];
protected $with = [
'client.company',
];
protected $touches = []; protected $touches = [];
public function getEntityType() public function getEntityType()

View File

@ -257,7 +257,8 @@ class User extends Authenticatable implements MustVerifyEmail
'custom_value3', 'custom_value3',
'custom_value4', 'custom_value4',
'is_deleted', 'is_deleted',
'oauth_user_token', // 'oauth_user_token',
// 'oauth_user_refresh_token',
]; ];
/** /**

View File

@ -143,7 +143,7 @@ class DirectDebit implements MethodInterface
/** /**
* Handle unsuccessful authorization. * Handle unsuccessful authorization.
* *
* @param Exception $exception * @param \Exception $exception
* @throws PaymentFailed * @throws PaymentFailed
* @return void * @return void
*/ */

View File

@ -385,9 +385,6 @@ class GoCardlessPaymentDriver extends BaseDriver
); );
} }
public function ensureMandateIsReady($token) public function ensureMandateIsReady($token)
{ {
try { try {
@ -542,4 +539,9 @@ class GoCardlessPaymentDriver extends BaseDriver
return $client; return $client;
} }
public function verificationView()
{
return render('gateways.gocardless.verification');
}
} }

View File

@ -123,13 +123,18 @@ class PayPalExpressPaymentDriver extends BaseDriver
{ {
$this->initializeOmnipayGateway(); $this->initializeOmnipayGateway();
dd('here');
$response = $this->omnipay_gateway $response = $this->omnipay_gateway
->completePurchase(['amount' => $this->payment_hash->data->amount, 'currency' => $this->client->getCurrencyCode()]) ->completePurchase(['amount' => $this->payment_hash->data->amount, 'currency' => $this->client->getCurrencyCode()])
->send(); ->send();
if ($response->isCancelled()) { if ($response->isCancelled() && $this->client->getSetting('enable_client_portal')) {
return redirect()->route('client.invoices.index')->with('warning', ctrans('texts.status_cancelled')); return redirect()->route('client.invoices.index')->with('warning', ctrans('texts.status_cancelled'));
} }
elseif($response->isCancelled() && !$this->client->getSetting('enable_client_portal')){
redirect()->route('client.invoices.show', ['invoice' => $this->payment_hash->fee_invoice])->with('warning', ctrans('texts.status_cancelled'));
}
if ($response->isSuccessful()) { if ($response->isSuccessful()) {
$data = [ $data = [
@ -195,7 +200,7 @@ class PayPalExpressPaymentDriver extends BaseDriver
'payment_hash' => $this->payment_hash->hash, 'payment_hash' => $this->payment_hash->hash,
'payment_method_id' => GatewayType::PAYPAL, 'payment_method_id' => GatewayType::PAYPAL,
]), ]),
'cancelUrl' => $this->client->company->domain().'/client/invoices', 'cancelUrl' => $this->client->company->domain()."/client/invoices/{$invoice->hashed_id}",
'description' => implode(',', collect($this->payment_hash->data->invoices) 'description' => implode(',', collect($this->payment_hash->data->invoices)
->map(function ($invoice) { ->map(function ($invoice) {
return sprintf('%s: %s', ctrans('texts.invoice_number'), $invoice->invoice_number); return sprintf('%s: %s', ctrans('texts.invoice_number'), $invoice->invoice_number);

View File

@ -90,7 +90,6 @@ class RecurringInvoiceTransformer extends EntityTransformer
'po_number' => $invoice->po_number ?: '', 'po_number' => $invoice->po_number ?: '',
'date' => $invoice->date ?: '', 'date' => $invoice->date ?: '',
'last_sent_date' => $invoice->last_sent_date ?: '', 'last_sent_date' => $invoice->last_sent_date ?: '',
// 'next_send_date' => $invoice->next_send_date ?: '',
'next_send_date' => $invoice->next_send_date_client ?: '', 'next_send_date' => $invoice->next_send_date_client ?: '',
'due_date' => $invoice->due_date ?: '', 'due_date' => $invoice->due_date ?: '',
'terms' => $invoice->terms ?: '', 'terms' => $invoice->terms ?: '',

View File

@ -5,6 +5,7 @@ return [
'web_url' => 'https://www.invoiceninja.com', 'web_url' => 'https://www.invoiceninja.com',
'admin_token' => env('NINJA_ADMIN_TOKEN', ''), 'admin_token' => env('NINJA_ADMIN_TOKEN', ''),
'license_url' => 'https://app.invoiceninja.com', 'license_url' => 'https://app.invoiceninja.com',
'react_url' => 'https://app.invoicing.co',
'production' => env('NINJA_PROD', false), 'production' => env('NINJA_PROD', false),
'license' => env('NINJA_LICENSE', ''), 'license' => env('NINJA_LICENSE', ''),
'version_url' => 'https://pdf.invoicing.co/api/version', 'version_url' => 'https://pdf.invoicing.co/api/version',

View File

@ -5054,6 +5054,14 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'here' => 'ici', 'here' => 'ici',
'industry_Restaurant & Catering' => 'Restauration et traiteur', 'industry_Restaurant & Catering' => 'Restauration et traiteur',
'show_credits_table' => 'Arricher la liste des crédits', 'show_credits_table' => 'Arricher la liste des crédits',
'manual_payment' => 'Paiement manuel',
'tax_summary_report' => 'Rapport sommaire de taxes',
'tax_category' => 'Catégorie de taxe',
'physical_goods' => 'Produits physiques',
'digital_products' => 'Produits numériques',
'services' => 'Services',
'shipping' => 'Livraison',
'tax_exempt' => 'Exemption de taxes',
); );

View File

@ -250,8 +250,8 @@ $LANG = array(
חשבונית :חשבנוית של :סכום', חשבונית :חשבנוית של :סכום',
'notification_invoice_viewed' => 'העמית :עמית ראה את החשבנוית 'notification_invoice_viewed' => 'העמית :עמית ראה את החשבנוית
:חשבונית של :כמות.', :חשבונית של :כמות.',
'stripe_payment_text' => 'Invoice :invoicenumber for :amount for client :client', 'stripe_payment_text' => 'חשבונית :invoicenumber עבור :amount עבור לקוח :client',
'stripe_payment_text_without_invoice' => 'Payment with no invoice for amount :amount for client :client', 'stripe_payment_text_without_invoice' => 'תשלום ללא חשבונית עבור סכום :amount עבור לקוח :client',
'reset_password' => 'אפשר לשחזר סיסמתך לחשבון בלחיצה הכפתור זה:', 'reset_password' => 'אפשר לשחזר סיסמתך לחשבון בלחיצה הכפתור זה:',
'secure_payment' => 'תשלום מובטח', 'secure_payment' => 'תשלום מובטח',
'card_number' => 'מספר כרטיס', 'card_number' => 'מספר כרטיס',
@ -787,13 +787,13 @@ $LANG = array(
'activity_45' => ':user deleted task :task', 'activity_45' => ':user deleted task :task',
'activity_46' => ':user restored task :task', 'activity_46' => ':user restored task :task',
'activity_47' => ':user updated expense :expense', 'activity_47' => ':user updated expense :expense',
'activity_48' => ':user created user :user', 'activity_48' => ':user יצר את משתמש :user',
'activity_49' => ':user updated user :user', 'activity_49' => ':user עדכן את משתמש :user',
'activity_50' => ':user archived user :user', 'activity_50' => ':user הוסיף את משתמש :user לארכיון',
'activity_51' => ':user deleted user :user', 'activity_51' => ':user מחק את משתמש :user',
'activity_52' => ':user restored user :user', 'activity_52' => ':user שחזר את משתמש :user',
'activity_53' => ':user marked sent :invoice', 'activity_53' => ':user סימן את חשבונית :invoice כ-נשלחה',
'activity_54' => ':user paid invoice :invoice', 'activity_54' => ':user שילם את חשבונית :invoice',
'activity_55' => ':contact replied ticket :ticket', 'activity_55' => ':contact replied ticket :ticket',
'activity_56' => ':user viewed ticket :ticket', 'activity_56' => ':user viewed ticket :ticket',
@ -881,7 +881,7 @@ $LANG = array(
'custom_invoice_charges_helps' => 'הוסף שדה בעת יצירת חשבונית וכלול את החיוב בסיכומי הביניים של החשבונית.', 'custom_invoice_charges_helps' => 'הוסף שדה בעת יצירת חשבונית וכלול את החיוב בסיכומי הביניים של החשבונית.',
'token_expired' => 'פג תוקפו של אסימון האימות. בבקשה נסה שוב.', 'token_expired' => 'פג תוקפו של אסימון האימות. בבקשה נסה שוב.',
'invoice_link' => 'קישור לחשבונית', 'invoice_link' => 'קישור לחשבונית',
'button_confirmation_message' => 'Confirm your email.', 'button_confirmation_message' => 'תאמת את כתובת הדוא"ל שלך.',
'confirm' => 'אשר', 'confirm' => 'אשר',
'email_preferences' => 'העדפות דוא"ל', 'email_preferences' => 'העדפות דוא"ל',
'created_invoices' => 'נוצר בהצלחה :count invoice(s)', 'created_invoices' => 'נוצר בהצלחה :count invoice(s)',
@ -995,7 +995,7 @@ $LANG = array(
'status_approved' => 'מאושר', 'status_approved' => 'מאושר',
'quote_settings' => 'הגדרות הצעת מחיר', 'quote_settings' => 'הגדרות הצעת מחיר',
'auto_convert_quote' => 'המרה אוטומטית', 'auto_convert_quote' => 'המרה אוטומטית',
'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved.', 'auto_convert_quote_help' => 'המר הצעת מחיר לחשבונית באופן אוטומטי בעת אישור לקוח.',
'validate' => 'אמת', 'validate' => 'אמת',
'info' => 'פרטים', 'info' => 'פרטים',
'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)', 'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)',
@ -1180,7 +1180,7 @@ $LANG = array(
'plan_started' => 'Plan Started', 'plan_started' => 'Plan Started',
'plan_expires' => 'Plan Expires', 'plan_expires' => 'Plan Expires',
'white_label_button' => 'Purchase White Label', 'white_label_button' => 'קנה מיתוג "White Label"',
'pro_plan_year_description' => 'One year enrollment in the Invoice Ninja Pro Plan.', 'pro_plan_year_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
'pro_plan_month_description' => 'One month enrollment in the Invoice Ninja Pro Plan.', 'pro_plan_month_description' => 'One month enrollment in the Invoice Ninja Pro Plan.',
@ -2205,7 +2205,7 @@ $LANG = array(
'invalid_file' => 'סוג קובץ לא נתמך', 'invalid_file' => 'סוג קובץ לא נתמך',
'add_documents_to_invoice' => 'הוסף מסמכים לחשבונית', 'add_documents_to_invoice' => 'הוסף מסמכים לחשבונית',
'mark_expense_paid' => 'סמן כשולם', 'mark_expense_paid' => 'סמן כשולם',
'white_label_license_error' => 'Failed to validate the license, either expired or excessive activations. Email contact@invoiceninja.com for more information.', 'white_label_license_error' => 'אימות הרשיון נכשל בגלל שפג התוקף או בשל כמות הפעלות חורגת. ניתן ליצור קשר עם contact@invoiceninja.com עבור עוד אינפורמציה.',
'plan_price' => 'Plan Price', 'plan_price' => 'Plan Price',
'wrong_confirmation' => 'Incorrect confirmation code', 'wrong_confirmation' => 'Incorrect confirmation code',
'oauth_taken' => 'The account is already registered', 'oauth_taken' => 'The account is already registered',
@ -2404,7 +2404,7 @@ $LANG = array(
'currency_vanuatu_vatu' => 'Vanuatu Vatu', 'currency_vanuatu_vatu' => 'Vanuatu Vatu',
'currency_cuban_peso' => 'Cuban Peso', 'currency_cuban_peso' => 'Cuban Peso',
'currency_bz_dollar' => 'BZ Dollar', 'currency_bz_dollar' => 'דולר בליזי',
'review_app_help' => 'We hope you\'re enjoying using the app.<br/>If you\'d consider :link we\'d greatly appreciate it!', 'review_app_help' => 'We hope you\'re enjoying using the app.<br/>If you\'d consider :link we\'d greatly appreciate it!',
'writing_a_review' => 'writing a review', 'writing_a_review' => 'writing a review',
@ -2458,7 +2458,7 @@ $LANG = array(
'alipay' => 'Alipay', 'alipay' => 'Alipay',
'sofort' => 'Sofort', 'sofort' => 'Sofort',
'sepa' => 'SEPA Direct Debit', 'sepa' => 'SEPA Direct Debit',
'name_without_special_characters' => 'Please enter a name with only the letters a-z and whitespaces', 'name_without_special_characters' => 'נא להזין רק אותיות לועזיות a עד z ותווי רווח.',
'enable_alipay' => 'Accept Alipay', 'enable_alipay' => 'Accept Alipay',
'enable_sofort' => 'Accept EU bank transfers', 'enable_sofort' => 'Accept EU bank transfers',
'stripe_alipay_help' => 'These gateways also need to be activated in :link.', 'stripe_alipay_help' => 'These gateways also need to be activated in :link.',
@ -2562,92 +2562,92 @@ $LANG = array(
'created_scheduled_report' => 'דוח תוזמן בהצלחה', 'created_scheduled_report' => 'דוח תוזמן בהצלחה',
'deleted_scheduled_report' => 'דוח מתוזמן בוטל בהצלחה', 'deleted_scheduled_report' => 'דוח מתוזמן בוטל בהצלחה',
'scheduled_report_attached' => 'Your scheduled :type report is attached.', 'scheduled_report_attached' => 'Your scheduled :type report is attached.',
'scheduled_report_error' => 'Failed to create schedule report', 'scheduled_report_error' => 'יצירת דו"ח לוח זמנים נכשל',
'invalid_one_time_password' => 'Invalid one time password', 'invalid_one_time_password' => 'סיסמה חד-פעמית שגויה',
'apple_pay' => 'Apple/Google Pay', 'apple_pay' => 'Apple/Google Pay',
'enable_apple_pay' => 'Accept Apple Pay and Pay with Google', 'enable_apple_pay' => 'Accept Apple Pay and Pay with Google',
'requires_subdomain' => 'This payment type requires that a :link.', 'requires_subdomain' => 'This payment type requires that a :link.',
'subdomain_is_set' => 'subdomain is set', 'subdomain_is_set' => 'תת-שם המתחם הושם',
'verification_file' => 'Verification File', 'verification_file' => 'קובץ אימות',
'verification_file_missing' => 'The verification file is needed to accept payments.', 'verification_file_missing' => 'נדרש קובץ אימות על מנת לקבל תשלומים.',
'apple_pay_domain' => 'Use <code>:domain</code> as the domain in :link.', 'apple_pay_domain' => 'Use <code>:domain</code> as the domain in :link.',
'apple_pay_not_supported' => 'Sorry, Apple/Google Pay isn\'t supported by your browser', 'apple_pay_not_supported' => 'Sorry, Apple/Google Pay isn\'t supported by your browser',
'optional_payment_methods' => 'Optional Payment Methods', 'optional_payment_methods' => 'שיטות תשלום אופציונליות',
'add_subscription' => 'הוסף מנוי', 'add_subscription' => 'הוסף מנוי',
'target_url' => 'Target', 'target_url' => 'מטרה',
'target_url_help' => 'When the selected event occurs the app will post the entity to the target URL.', 'target_url_help' => 'האפליקציה תשלח את המידע אל target URL כשהאירוע הנבחר יקרה.',
'event' => 'Event', 'event' => 'אירוע',
'subscription_event_1' => 'Created Client', 'subscription_event_1' => 'לקוח נוצר',
'subscription_event_2' => 'חשבונית נוצרה', 'subscription_event_2' => 'חשבונית נוצרה',
'subscription_event_3' => 'Created Quote', 'subscription_event_3' => 'הצעת מחיר נוצרה',
'subscription_event_4' => 'Created Payment', 'subscription_event_4' => 'תשלום נוצר',
'subscription_event_5' => 'Created Vendor', 'subscription_event_5' => 'ספק נוצר',
'subscription_event_6' => 'Updated Quote', 'subscription_event_6' => 'הצעת מחיר עודכנה',
'subscription_event_7' => 'Deleted Quote', 'subscription_event_7' => 'הצעת מחיר נמחקה',
'subscription_event_8' => 'חשבונית עודכנה', 'subscription_event_8' => 'חשבונית עודכנה',
'subscription_event_9' => 'חשבונית נמחקה', 'subscription_event_9' => 'חשבונית נמחקה',
'subscription_event_10' => 'Updated Client', 'subscription_event_10' => 'עדכן לקוח',
'subscription_event_11' => 'Deleted Client', 'subscription_event_11' => 'מחק לקוח',
'subscription_event_12' => 'Deleted Payment', 'subscription_event_12' => 'מחק תשלום',
'subscription_event_13' => 'Updated Vendor', 'subscription_event_13' => 'עדכן ספק',
'subscription_event_14' => 'Deleted Vendor', 'subscription_event_14' => 'מחק ספק',
'subscription_event_15' => 'Created Expense', 'subscription_event_15' => 'צור הוצאה',
'subscription_event_16' => 'Updated Expense', 'subscription_event_16' => 'עדכן הוצאה',
'subscription_event_17' => 'Deleted Expense', 'subscription_event_17' => 'מחק הוצאה',
'subscription_event_18' => 'צור משימה', 'subscription_event_18' => 'צור משימה',
'subscription_event_19' => 'עדכן משימה', 'subscription_event_19' => 'עדכן משימה',
'subscription_event_20' => 'מחק משימה', 'subscription_event_20' => 'מחק משימה',
'subscription_event_21' => 'Approved Quote', 'subscription_event_21' => 'אישור הצעת מחיר',
'subscriptions' => 'Subscriptions', 'subscriptions' => 'מנויים',
'updated_subscription' => 'Successfully updated subscription', 'updated_subscription' => 'מנוי עודכן בהצלחה',
'created_subscription' => 'Successfully created subscription', 'created_subscription' => 'מנוי נוצר בהצלחה',
'edit_subscription' => 'Edit Subscription', 'edit_subscription' => 'ערוך מנוי',
'archive_subscription' => 'Archive Subscription', 'archive_subscription' => 'מנויים פעילים',
'archived_subscription' => 'Successfully archived subscription', 'archived_subscription' => 'מנוי הועבר לארכיון בהצלחה',
'project_error_multiple_clients' => 'The projects can\'t belong to different clients', 'project_error_multiple_clients' => 'הפרויקט אינו יכול להיות משויך ללקוח שונה',
'invoice_project' => 'פרויקט חשבונית', 'invoice_project' => 'פרויקט חשבונית',
'module_recurring_invoice' => 'חשבוניות מחזוריות', 'module_recurring_invoice' => 'חשבוניות מחזוריות',
'module_credit' => 'Credits', 'module_credit' => 'אשראי / יתרה',
'module_quote' => 'Quotes & Proposals', 'module_quote' => 'הצעות מחיר',
'module_task' => 'משימות ופרויקטים', 'module_task' => 'משימות ופרויקטים',
'module_expense' => 'Expenses & Vendors', 'module_expense' => 'הוצאות וספקים',
'module_ticket' => 'Tickets', 'module_ticket' => 'כרטיסיות',
'reminders' => 'Reminders', 'reminders' => 'תזכורות',
'send_client_reminders' => 'Send email reminders', 'send_client_reminders' => 'שלח תזכורות בדוא"ל',
'can_view_tasks' => 'משימות מוצגות בפורטל', 'can_view_tasks' => 'משימות מוצגות בפורטל',
'is_not_sent_reminders' => 'Reminders are not sent', 'is_not_sent_reminders' => 'תזכורות לא נשלחו',
'promotion_footer' => 'Your promotion will expire soon, :link to upgrade now.', 'promotion_footer' => 'Your promotion will expire soon, :link to upgrade now.',
'unable_to_delete_primary' => 'Note: to delete this company first delete all linked companies.', 'unable_to_delete_primary' => 'Note: to delete this company first delete all linked companies.',
'please_register' => 'Please register your account', 'please_register' => 'נא להירשם',
'processing_request' => 'Processing request', 'processing_request' => 'מעבד בקשה',
'mcrypt_warning' => 'Warning: Mcrypt is deprecated, run :command to update your cipher.', 'mcrypt_warning' => 'Warning: Mcrypt is deprecated, run :command to update your cipher.',
'edit_times' => 'Edit Times', 'edit_times' => 'Edit Times',
'inclusive_taxes_help' => 'Include <b>taxes in the cost</b>', 'inclusive_taxes_help' => 'Include <b>taxes in the cost</b>',
'inclusive_taxes_notice' => 'לא ניתן לשנות הגדרה זו לאחר יצירת חשבונית.', 'inclusive_taxes_notice' => 'לא ניתן לשנות הגדרה זו לאחר יצירת חשבונית.',
'inclusive_taxes_warning' => 'אזהרה: יהיה צורך לשמור מחדש חשבוניות קיימות', 'inclusive_taxes_warning' => 'אזהרה: יהיה צורך לשמור מחדש חשבוניות קיימות',
'copy_shipping' => 'Copy Shipping', 'copy_shipping' => 'העתק פרטי משלוח',
'copy_billing' => 'Copy Billing', 'copy_billing' => 'העתק פרטי חשבון',
'quote_has_expired' => 'The quote has expired, please contact the merchant.', 'quote_has_expired' => 'פג תוקף הצעת המחיר, אנא צור קשר עם התמיכה.',
'empty_table_footer' => 'Showing 0 to 0 of 0 entries', 'empty_table_footer' => 'Showing 0 to 0 of 0 entries',
'do_not_trust' => 'Do not remember this device', 'do_not_trust' => 'לא לזכור את מכשיר זה',
'trust_for_30_days' => 'Trust for 30 days', 'trust_for_30_days' => 'זכור מכשיר זה ל-30 יום',
'trust_forever' => 'Trust forever', 'trust_forever' => 'זכור מכשיר זה',
'kanban' => 'Kanban', 'kanban' => 'Kanban',
'backlog' => 'Backlog', 'backlog' => 'פיגורים',
'ready_to_do' => 'Ready to do', 'ready_to_do' => 'מוכן לביצוע',
'in_progress' => 'בתהליך', 'in_progress' => 'בתהליך',
'add_status' => 'Add status', 'add_status' => 'הוסף סטטוס',
'archive_status' => 'Archive Status', 'archive_status' => 'Archive Status',
'new_status' => 'New Status', 'new_status' => 'סטטוס חדש',
'convert_products' => 'Convert Products', 'convert_products' => 'המר מוצר',
'convert_products_help' => 'Automatically convert product prices to the client\'s currency', 'convert_products_help' => 'המר אוטומטית את מחירי המוצרים למטבע הלקוח',
'improve_client_portal_link' => 'Set a subdomain to shorten the client portal link.', 'improve_client_portal_link' => 'Set a subdomain to shorten the client portal link.',
'budgeted_hours' => 'Budgeted Hours', 'budgeted_hours' => 'שעות בתקציב',
'progress' => 'Progress', 'progress' => 'התקדמות',
'view_project' => 'צפה בפרוייקט', 'view_project' => 'צפה בפרוייקט',
'summary' => 'סיכום', 'summary' => 'סיכום',
'endless_reminder' => 'Endless Reminder', 'endless_reminder' => 'תזכורת קבועה',
'signature_on_invoice_help' => 'Add the following code to show your client\'s signature on the PDF.', 'signature_on_invoice_help' => 'הוסף את הקוד הבא כדי להציג את החתימה של הלקוח שלך ב-PDF.',
'signature_on_pdf' => 'פתח בPDF', 'signature_on_pdf' => 'פתח בPDF',
'signature_on_pdf_help' => 'הצג את חתימת הלקוח ב-PDF של החשבונית/הצעת המחיר.', 'signature_on_pdf_help' => 'הצג את חתימת הלקוח ב-PDF של החשבונית/הצעת המחיר.',
'expired_white_label' => 'The white label license has expired', 'expired_white_label' => 'The white label license has expired',
@ -2657,42 +2657,42 @@ $LANG = array(
'custom_fields_tip' => 'Use <code>Label|Option1,Option2</code> to show a select box.', 'custom_fields_tip' => 'Use <code>Label|Option1,Option2</code> to show a select box.',
'client_information' => 'פרטי לקוח', 'client_information' => 'פרטי לקוח',
'updated_client_details' => 'פרטי לקוח עודכנו בהצלחה', 'updated_client_details' => 'פרטי לקוח עודכנו בהצלחה',
'auto' => 'Auto', 'auto' => 'אוטומטי',
'tax_amount' => 'סכום מס', 'tax_amount' => 'סכום מס',
'tax_paid' => 'מס ששולם', 'tax_paid' => 'מס ששולם',
'none' => 'None', 'none' => 'ללא',
'proposal_message_button' => 'To view your proposal for :amount, click the button below.', 'proposal_message_button' => 'To view your proposal for :amount, click the button below.',
'proposal' => 'הצעה', 'proposal' => 'הצעה',
'proposals' => 'הצעות', 'proposals' => 'הצעות',
'list_proposals' => 'List Proposals', 'list_proposals' => 'הצג רשימת הצעות',
'new_proposal' => 'הצעה חדשה', 'new_proposal' => 'הצעה חדשה',
'edit_proposal' => 'ערוך הצעה', 'edit_proposal' => 'ערוך הצעה',
'archive_proposal' => 'העבר פרויקט לארכיון', 'archive_proposal' => 'העבר פרויקט לארכיון',
'delete_proposal' => 'מחר הצעה', 'delete_proposal' => 'מחר הצעה',
'created_proposal' => 'Successfully created proposal', 'created_proposal' => 'הצעת נוצרה בהצלחה',
'updated_proposal' => 'Successfully updated proposal', 'updated_proposal' => 'הצעת עודכנה בהצלחה',
'archived_proposal' => 'Successfully archived proposal', 'archived_proposal' => 'הצעה הועברה לארכיון בהצלחה',
'deleted_proposal' => 'Successfully archived proposal', 'deleted_proposal' => 'הצעה הועברה לארכיון בהצלחה',
'archived_proposals' => 'Successfully archived :count proposals', 'archived_proposals' => 'Successfully archived :count proposals',
'deleted_proposals' => 'Successfully archived :count proposals', 'deleted_proposals' => 'Successfully archived :count proposals',
'restored_proposal' => 'Successfully restored proposal', 'restored_proposal' => 'הצעת שוחזרה בהצלחה',
'restore_proposal' => 'Restore Proposal', 'restore_proposal' => 'שחזר הצעה',
'snippet' => 'Snippet', 'snippet' => 'מקטע',
'snippets' => 'Snippets', 'snippets' => 'מקטעים',
'proposal_snippet' => 'Snippet', 'proposal_snippet' => 'מקטע',
'proposal_snippets' => 'Snippets', 'proposal_snippets' => 'מקטעים',
'new_proposal_snippet' => 'New Snippet', 'new_proposal_snippet' => 'מקטע חדש',
'edit_proposal_snippet' => 'Edit Snippet', 'edit_proposal_snippet' => 'ערוך מקטע',
'archive_proposal_snippet' => 'Archive Snippet', 'archive_proposal_snippet' => 'העברת מקטע לארכיון',
'delete_proposal_snippet' => 'Delete Snippet', 'delete_proposal_snippet' => 'מחיקת מקטע',
'created_proposal_snippet' => 'Successfully created snippet', 'created_proposal_snippet' => 'מקטע נוצר בהצלחה',
'updated_proposal_snippet' => 'Successfully updated snippet', 'updated_proposal_snippet' => 'מקטע עודכן בהצלחה',
'archived_proposal_snippet' => 'Successfully archived snippet', 'archived_proposal_snippet' => 'מקטע הועבר לארכיון',
'deleted_proposal_snippet' => 'Successfully archived snippet', 'deleted_proposal_snippet' => 'מקטע הועבר לארכיון',
'archived_proposal_snippets' => 'Successfully archived :count snippets', 'archived_proposal_snippets' => 'Successfully archived :count snippets',
'deleted_proposal_snippets' => 'Successfully archived :count snippets', 'deleted_proposal_snippets' => 'Successfully archived :count snippets',
'restored_proposal_snippet' => 'Successfully restored snippet', 'restored_proposal_snippet' => 'מקטע שוחזר',
'restore_proposal_snippet' => 'Restore Snippet', 'restore_proposal_snippet' => 'שחזר מקטע',
'template' => 'Template', 'template' => 'Template',
'templates' => 'Templates', 'templates' => 'Templates',
'proposal_template' => 'Template', 'proposal_template' => 'Template',
@ -2709,12 +2709,12 @@ $LANG = array(
'deleted_proposal_templates' => 'Successfully archived :count templates', 'deleted_proposal_templates' => 'Successfully archived :count templates',
'restored_proposal_template' => 'Successfully restored template', 'restored_proposal_template' => 'Successfully restored template',
'restore_proposal_template' => 'Restore Template', 'restore_proposal_template' => 'Restore Template',
'proposal_category' => 'Category', 'proposal_category' => 'קטגוריה',
'proposal_categories' => 'Categories', 'proposal_categories' => 'קטגוריות',
'new_proposal_category' => 'New Category', 'new_proposal_category' => 'קטגוריה חדשה',
'edit_proposal_category' => 'Edit Category', 'edit_proposal_category' => 'ערוך קטגוריה',
'archive_proposal_category' => 'Archive Category', 'archive_proposal_category' => 'העבר קטגוריה לארכיון',
'delete_proposal_category' => 'Delete Category', 'delete_proposal_category' => 'מחיקת קטגוריה',
'created_proposal_category' => 'Successfully created category', 'created_proposal_category' => 'Successfully created category',
'updated_proposal_category' => 'Successfully updated category', 'updated_proposal_category' => 'Successfully updated category',
'archived_proposal_category' => 'Successfully archived category', 'archived_proposal_category' => 'Successfully archived category',
@ -2722,42 +2722,42 @@ $LANG = array(
'archived_proposal_categories' => 'Successfully archived :count categories', 'archived_proposal_categories' => 'Successfully archived :count categories',
'deleted_proposal_categories' => 'Successfully archived :count categories', 'deleted_proposal_categories' => 'Successfully archived :count categories',
'restored_proposal_category' => 'Successfully restored category', 'restored_proposal_category' => 'Successfully restored category',
'restore_proposal_category' => 'Restore Category', 'restore_proposal_category' => 'שחזר קטגוריה',
'delete_status' => 'Delete Status', 'delete_status' => 'מחק סטטוס',
'standard' => 'Standard', 'standard' => 'רגיל',
'icon' => 'Icon', 'icon' => 'אייקון',
'proposal_not_found' => 'The requested proposal is not available', 'proposal_not_found' => 'ההצעה המבוקשת לא נמצאה',
'create_proposal_category' => 'Create category', 'create_proposal_category' => 'יצירת קטגוריה',
'clone_proposal_template' => 'Clone Template', 'clone_proposal_template' => 'שכפול טמפלט',
'proposal_email' => 'Proposal Email', 'proposal_email' => 'דוא"ל להצעה',
'proposal_subject' => 'New proposal :number from :account', 'proposal_subject' => 'New proposal :number from :account',
'proposal_message' => 'To view your proposal for :amount, click the link below.', 'proposal_message' => 'To view your proposal for :amount, click the link below.',
'emailed_proposal' => 'Successfully emailed proposal', 'emailed_proposal' => 'הצעה נשלחה בדוא"ל',
'load_template' => 'Load Template', 'load_template' => 'שימוש בתבנית',
'no_assets' => 'No images, drag to upload', 'no_assets' => 'אין תמונה, גרור תמונות להעלאה ',
'add_image' => 'Add Image', 'add_image' => 'הוספת תמונה',
'select_image' => 'Select Image', 'select_image' => 'בחירת תמונה',
'upgrade_to_upload_images' => 'Upgrade to the enterprise plan to upload images', 'upgrade_to_upload_images' => 'Upgrade to the enterprise plan to upload images',
'delete_image' => 'Delete Image', 'delete_image' => 'מחיקת תמונה',
'delete_image_help' => 'Warning: deleting the image will remove it from all proposals.', 'delete_image_help' => 'אזהרה: מחיקת התמונה תסיר אותה מכל ההצעות.',
'amount_variable_help' => 'Note: the invoice $amount field will use the partial/deposit field if set otherwise it will use the invoice balance.', 'amount_variable_help' => 'Note: the invoice $amount field will use the partial/deposit field if set otherwise it will use the invoice balance.',
'taxes_are_included_help' => 'Note: Inclusive taxes have been enabled.', 'taxes_are_included_help' => 'הערה: הופעלו מסים כוללים.',
'taxes_are_not_included_help' => 'Note: Inclusive taxes are not enabled.', 'taxes_are_not_included_help' => 'הערה: מסים כוללים לא הופעלו.',
'change_requires_purge' => 'Changing this setting requires :link the account data.', 'change_requires_purge' => 'Changing this setting requires :link the account data.',
'purging' => 'purging', 'purging' => 'purging',
'warning_local_refund' => 'The refund will be recorded in the app but will NOT be processed by the payment gateway.', 'warning_local_refund' => 'The refund will be recorded in the app but will NOT be processed by the payment gateway.',
'email_address_changed' => 'Email address has been changed', 'email_address_changed' => 'כתובת דוא"ל שונתה',
'email_address_changed_message' => 'The email address for your account has been changed from :old_email to :new_email.', 'email_address_changed_message' => 'The email address for your account has been changed from :old_email to :new_email.',
'test' => 'Test', 'test' => 'ניסוי',
'beta' => 'Beta', 'beta' => 'בטא',
'gmp_required' => 'Exporting to ZIP requires the GMP extension', 'gmp_required' => 'Exporting to ZIP requires the GMP extension',
'email_history' => 'Email History', 'email_history' => 'היסטוריית דוא"ל',
'loading' => 'טוען', 'loading' => 'טוען',
'no_messages_found' => 'No messages found', 'no_messages_found' => 'לא נמצאו הודעות',
'processing' => 'מעבד', 'processing' => 'מעבד',
'reactivate' => 'Reactivate', 'reactivate' => 'הפעל שוב',
'reactivated_email' => 'The email address has been reactivated', 'reactivated_email' => 'כתובת הדוא"ל הופעלה מחדש',
'emails' => 'Emails', 'emails' => 'דואר אלקטרוני',
'opened' => 'Opened', 'opened' => 'Opened',
'bounced' => 'Bounced', 'bounced' => 'Bounced',
'total_sent' => 'Total Sent', 'total_sent' => 'Total Sent',
@ -5054,6 +5054,14 @@ $LANG = array(
'here' => 'here', 'here' => 'here',
'industry_Restaurant & Catering' => 'Restaurant & Catering', 'industry_Restaurant & Catering' => 'Restaurant & Catering',
'show_credits_table' => 'Show Credits Table', 'show_credits_table' => 'Show Credits Table',
'manual_payment' => 'Payment Manual',
'tax_summary_report' => 'Tax Summary Report',
'tax_category' => 'Tax Category',
'physical_goods' => 'Physical Goods',
'digital_products' => 'Digital Products',
'services' => 'Services',
'shipping' => 'Shipping',
'tax_exempt' => 'Tax Exempt',
); );

View File

@ -142,14 +142,14 @@
style="border: 1px solid #c2c2c2;" class="dark-bg-base"> style="border: 1px solid #c2c2c2;" class="dark-bg-base">
<!--[if mso]> <!--[if mso]>
<tr class="dark-bg" style="margin-top:0px; border: none;"> <tr class="dark-bg" style="margin-top:10px; border: none;">
<td style="border: none;"></td> <td style="border: none;"></td>
</tr> </tr>
<![endif]--> <![endif]-->
<tr> <tr>
<td align="center" cellpadding="20"> <td align="center" cellpadding="20">
<div style="border: 1px solid #c2c2c2; border-bottom: none; padding-bottom: 10px; border-top-left-radius: 3px; border-top-right-radius: 3px;"> <div style="border: 1px solid #c2c2c2; border-bottom: none; padding-bottom: 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; padding-top:10px;">
@if($logo && strpos($logo, 'blank.png') === false) @if($logo && strpos($logo, 'blank.png') === false)
<img class="" src="{{ $logo ?? '' }}" width="50%" height="" alt=" " border="0" style="width: 50%; max-width: 570px; display: block;"> <img class="" src="{{ $logo ?? '' }}" width="50%" height="" alt=" " border="0" style="width: 50%; max-width: 570px; display: block;">
@endif @endif

View File

@ -1,5 +1,5 @@
@extends('portal.ninja2020.layout.error') @extends('portal.ninja2020.layout.error')
@section('title', __($title) ?: 'Server Error') @section('title', __($title) ?? 'Server Error')
@section('code', __($code) ?: '500') @section('code', __($code) ?? '500')
@section('message', __($message) ?: 'System Error') @section('message', __($message) ?? 'System Error')

View File

@ -0,0 +1,7 @@
@extends('portal.ninja2020.layout.payments', ['gateway_title' => ctrans('texts.payment_type_gocardless'), 'card_title' => ctrans('texts.complete_verification')])
@section('gateway_content')
@component('portal.ninja2020.components.general.card-element-single')
This payment method is still in a pending state and has not yet been verified. Please contact your vendor for more information.
@endcomponent
@endsection