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;
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\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\TruthSource;
use Google_Client;
use Illuminate\Database\Eloquent\Builder;
use App\Transformers\CompanyUserTransformer;
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
{
@ -610,6 +611,9 @@ class LoginController extends BaseController
$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')) {
return $this->handleProviderCallback($provider);
} else {
@ -649,16 +653,27 @@ class LoginController extends BaseController
'email' => $socialite_user->getEmail(),
'oauth_user_id' => $socialite_user->getId(),
'oauth_provider_id' => $provider,
'oauth_user_token' => $oauth_user_token,
'oauth_user_refresh_token' => $socialite_user->refreshToken,
// 'oauth_user_token' => $oauth_user_token,
// 'oauth_user_refresh_token' => $socialite_user->refreshToken,
];
$user->update($update_user);
$user->oauth_user_token = $oauth_user_token;
$user->oauth_user_refresh_token = $socialite_user->refreshToken;
$user->save();
} else {
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')
@ -679,12 +694,16 @@ class LoginController extends BaseController
'email' => $socialite_user->getEmail(),
'oauth_user_id' => $socialite_user->getId(),
'oauth_provider_id' => $provider,
'oauth_user_token' => $oauth_user_token,
'oauth_user_refresh_token' => $socialite_user->accessTokenResponseBody['refresh_token'],
// 'oauth_user_token' => $oauth_user_token,
// 'oauth_user_refresh_token' => $socialite_user->accessTokenResponseBody['refresh_token'],
'oauth_user_token_expiry' => $oauth_expiry,
];
$user->update($update_user);
$user->oauth_user_refresh_token = $socialite_user->accessTokenResponseBody['refresh_token'];
$user->oauth_user_token = $oauth_user_token;
$user->save();
} else {
nlog('user not found for oauth');
}

View File

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

View File

@ -30,7 +30,10 @@ class TokenAuth
*/
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;
$error = [
@ -51,7 +54,6 @@ class TokenAuth
return response()->json($error, 403);
}
/*
|
| 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.
|
*/
$truth = app()->make(TruthSource::class);
$truth->setCompanyUser($company_token->cu);

View File

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

View File

@ -257,7 +257,8 @@ class User extends Authenticatable implements MustVerifyEmail
'custom_value3',
'custom_value4',
'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.
*
* @param Exception $exception
* @param \Exception $exception
* @throws PaymentFailed
* @return void
*/

View File

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

View File

@ -123,13 +123,18 @@ class PayPalExpressPaymentDriver extends BaseDriver
{
$this->initializeOmnipayGateway();
dd('here');
$response = $this->omnipay_gateway
->completePurchase(['amount' => $this->payment_hash->data->amount, 'currency' => $this->client->getCurrencyCode()])
->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'));
}
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()) {
$data = [
@ -195,7 +200,7 @@ class PayPalExpressPaymentDriver extends BaseDriver
'payment_hash' => $this->payment_hash->hash,
'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)
->map(function ($invoice) {
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 ?: '',
'date' => $invoice->date ?: '',
'last_sent_date' => $invoice->last_sent_date ?: '',
// 'next_send_date' => $invoice->next_send_date ?: '',
'next_send_date' => $invoice->next_send_date_client ?: '',
'due_date' => $invoice->due_date ?: '',
'terms' => $invoice->terms ?: '',

View File

@ -5,6 +5,7 @@ return [
'web_url' => 'https://www.invoiceninja.com',
'admin_token' => env('NINJA_ADMIN_TOKEN', ''),
'license_url' => 'https://app.invoiceninja.com',
'react_url' => 'https://app.invoicing.co',
'production' => env('NINJA_PROD', false),
'license' => env('NINJA_LICENSE', ''),
'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',
'industry_Restaurant & Catering' => 'Restauration et traiteur',
'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' => 'העמית :עמית ראה את החשבנוית
:חשבונית של :כמות.',
'stripe_payment_text' => 'Invoice :invoicenumber for :amount for client :client',
'stripe_payment_text_without_invoice' => 'Payment with no invoice for amount :amount for client :client',
'stripe_payment_text' => 'חשבונית :invoicenumber עבור :amount עבור לקוח :client',
'stripe_payment_text_without_invoice' => 'תשלום ללא חשבונית עבור סכום :amount עבור לקוח :client',
'reset_password' => 'אפשר לשחזר סיסמתך לחשבון בלחיצה הכפתור זה:',
'secure_payment' => 'תשלום מובטח',
'card_number' => 'מספר כרטיס',
@ -787,13 +787,13 @@ $LANG = array(
'activity_45' => ':user deleted task :task',
'activity_46' => ':user restored task :task',
'activity_47' => ':user updated expense :expense',
'activity_48' => ':user created user :user',
'activity_49' => ':user updated user :user',
'activity_50' => ':user archived user :user',
'activity_51' => ':user deleted user :user',
'activity_52' => ':user restored user :user',
'activity_53' => ':user marked sent :invoice',
'activity_54' => ':user paid invoice :invoice',
'activity_48' => ':user יצר את משתמש :user',
'activity_49' => ':user עדכן את משתמש :user',
'activity_50' => ':user הוסיף את משתמש :user לארכיון',
'activity_51' => ':user מחק את משתמש :user',
'activity_52' => ':user שחזר את משתמש :user',
'activity_53' => ':user סימן את חשבונית :invoice כ-נשלחה',
'activity_54' => ':user שילם את חשבונית :invoice',
'activity_55' => ':contact replied ticket :ticket',
'activity_56' => ':user viewed ticket :ticket',
@ -881,7 +881,7 @@ $LANG = array(
'custom_invoice_charges_helps' => 'הוסף שדה בעת יצירת חשבונית וכלול את החיוב בסיכומי הביניים של החשבונית.',
'token_expired' => 'פג תוקפו של אסימון האימות. בבקשה נסה שוב.',
'invoice_link' => 'קישור לחשבונית',
'button_confirmation_message' => 'Confirm your email.',
'button_confirmation_message' => 'תאמת את כתובת הדוא"ל שלך.',
'confirm' => 'אשר',
'email_preferences' => 'העדפות דוא"ל',
'created_invoices' => 'נוצר בהצלחה :count invoice(s)',
@ -995,7 +995,7 @@ $LANG = array(
'status_approved' => 'מאושר',
'quote_settings' => 'הגדרות הצעת מחיר',
'auto_convert_quote' => 'המרה אוטומטית',
'auto_convert_quote_help' => 'Automatically convert a quote to an invoice when approved.',
'auto_convert_quote_help' => 'המר הצעת מחיר לחשבונית באופן אוטומטי בעת אישור לקוח.',
'validate' => 'אמת',
'info' => 'פרטים',
'imported_expenses' => 'Successfully created :count_vendors vendor(s) and :count_expenses expense(s)',
@ -1180,7 +1180,7 @@ $LANG = array(
'plan_started' => 'Plan Started',
'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_month_description' => 'One month enrollment in the Invoice Ninja Pro Plan.',
@ -2205,7 +2205,7 @@ $LANG = array(
'invalid_file' => 'סוג קובץ לא נתמך',
'add_documents_to_invoice' => 'הוסף מסמכים לחשבונית',
'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',
'wrong_confirmation' => 'Incorrect confirmation code',
'oauth_taken' => 'The account is already registered',
@ -2404,7 +2404,7 @@ $LANG = array(
'currency_vanuatu_vatu' => 'Vanuatu Vatu',
'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!',
'writing_a_review' => 'writing a review',
@ -2458,7 +2458,7 @@ $LANG = array(
'alipay' => 'Alipay',
'sofort' => 'Sofort',
'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_sofort' => 'Accept EU bank transfers',
'stripe_alipay_help' => 'These gateways also need to be activated in :link.',
@ -2562,92 +2562,92 @@ $LANG = array(
'created_scheduled_report' => 'דוח תוזמן בהצלחה',
'deleted_scheduled_report' => 'דוח מתוזמן בוטל בהצלחה',
'scheduled_report_attached' => 'Your scheduled :type report is attached.',
'scheduled_report_error' => 'Failed to create schedule report',
'invalid_one_time_password' => 'Invalid one time password',
'scheduled_report_error' => 'יצירת דו"ח לוח זמנים נכשל',
'invalid_one_time_password' => 'סיסמה חד-פעמית שגויה',
'apple_pay' => 'Apple/Google Pay',
'enable_apple_pay' => 'Accept Apple Pay and Pay with Google',
'requires_subdomain' => 'This payment type requires that a :link.',
'subdomain_is_set' => 'subdomain is set',
'verification_file' => 'Verification File',
'verification_file_missing' => 'The verification file is needed to accept payments.',
'subdomain_is_set' => 'תת-שם המתחם הושם',
'verification_file' => 'קובץ אימות',
'verification_file_missing' => 'נדרש קובץ אימות על מנת לקבל תשלומים.',
'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',
'optional_payment_methods' => 'Optional Payment Methods',
'optional_payment_methods' => 'שיטות תשלום אופציונליות',
'add_subscription' => 'הוסף מנוי',
'target_url' => 'Target',
'target_url_help' => 'When the selected event occurs the app will post the entity to the target URL.',
'event' => 'Event',
'subscription_event_1' => 'Created Client',
'target_url' => 'מטרה',
'target_url_help' => 'האפליקציה תשלח את המידע אל target URL כשהאירוע הנבחר יקרה.',
'event' => 'אירוע',
'subscription_event_1' => 'לקוח נוצר',
'subscription_event_2' => 'חשבונית נוצרה',
'subscription_event_3' => 'Created Quote',
'subscription_event_4' => 'Created Payment',
'subscription_event_5' => 'Created Vendor',
'subscription_event_6' => 'Updated Quote',
'subscription_event_7' => 'Deleted Quote',
'subscription_event_3' => 'הצעת מחיר נוצרה',
'subscription_event_4' => 'תשלום נוצר',
'subscription_event_5' => 'ספק נוצר',
'subscription_event_6' => 'הצעת מחיר עודכנה',
'subscription_event_7' => 'הצעת מחיר נמחקה',
'subscription_event_8' => 'חשבונית עודכנה',
'subscription_event_9' => 'חשבונית נמחקה',
'subscription_event_10' => 'Updated Client',
'subscription_event_11' => 'Deleted Client',
'subscription_event_12' => 'Deleted Payment',
'subscription_event_13' => 'Updated Vendor',
'subscription_event_14' => 'Deleted Vendor',
'subscription_event_15' => 'Created Expense',
'subscription_event_16' => 'Updated Expense',
'subscription_event_17' => 'Deleted Expense',
'subscription_event_10' => 'עדכן לקוח',
'subscription_event_11' => 'מחק לקוח',
'subscription_event_12' => 'מחק תשלום',
'subscription_event_13' => 'עדכן ספק',
'subscription_event_14' => 'מחק ספק',
'subscription_event_15' => 'צור הוצאה',
'subscription_event_16' => 'עדכן הוצאה',
'subscription_event_17' => 'מחק הוצאה',
'subscription_event_18' => 'צור משימה',
'subscription_event_19' => 'עדכן משימה',
'subscription_event_20' => 'מחק משימה',
'subscription_event_21' => 'Approved Quote',
'subscriptions' => 'Subscriptions',
'updated_subscription' => 'Successfully updated subscription',
'created_subscription' => 'Successfully created subscription',
'edit_subscription' => 'Edit Subscription',
'archive_subscription' => 'Archive Subscription',
'archived_subscription' => 'Successfully archived subscription',
'project_error_multiple_clients' => 'The projects can\'t belong to different clients',
'subscription_event_21' => 'אישור הצעת מחיר',
'subscriptions' => 'מנויים',
'updated_subscription' => 'מנוי עודכן בהצלחה',
'created_subscription' => 'מנוי נוצר בהצלחה',
'edit_subscription' => 'ערוך מנוי',
'archive_subscription' => 'מנויים פעילים',
'archived_subscription' => 'מנוי הועבר לארכיון בהצלחה',
'project_error_multiple_clients' => 'הפרויקט אינו יכול להיות משויך ללקוח שונה',
'invoice_project' => 'פרויקט חשבונית',
'module_recurring_invoice' => 'חשבוניות מחזוריות',
'module_credit' => 'Credits',
'module_quote' => 'Quotes & Proposals',
'module_credit' => 'אשראי / יתרה',
'module_quote' => 'הצעות מחיר',
'module_task' => 'משימות ופרויקטים',
'module_expense' => 'Expenses & Vendors',
'module_ticket' => 'Tickets',
'reminders' => 'Reminders',
'send_client_reminders' => 'Send email reminders',
'module_expense' => 'הוצאות וספקים',
'module_ticket' => 'כרטיסיות',
'reminders' => 'תזכורות',
'send_client_reminders' => 'שלח תזכורות בדוא"ל',
'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.',
'unable_to_delete_primary' => 'Note: to delete this company first delete all linked companies.',
'please_register' => 'Please register your account',
'processing_request' => 'Processing request',
'please_register' => 'נא להירשם',
'processing_request' => 'מעבד בקשה',
'mcrypt_warning' => 'Warning: Mcrypt is deprecated, run :command to update your cipher.',
'edit_times' => 'Edit Times',
'inclusive_taxes_help' => 'Include <b>taxes in the cost</b>',
'inclusive_taxes_notice' => 'לא ניתן לשנות הגדרה זו לאחר יצירת חשבונית.',
'inclusive_taxes_warning' => 'אזהרה: יהיה צורך לשמור מחדש חשבוניות קיימות',
'copy_shipping' => 'Copy Shipping',
'copy_billing' => 'Copy Billing',
'quote_has_expired' => 'The quote has expired, please contact the merchant.',
'copy_shipping' => 'העתק פרטי משלוח',
'copy_billing' => 'העתק פרטי חשבון',
'quote_has_expired' => 'פג תוקף הצעת המחיר, אנא צור קשר עם התמיכה.',
'empty_table_footer' => 'Showing 0 to 0 of 0 entries',
'do_not_trust' => 'Do not remember this device',
'trust_for_30_days' => 'Trust for 30 days',
'trust_forever' => 'Trust forever',
'do_not_trust' => 'לא לזכור את מכשיר זה',
'trust_for_30_days' => 'זכור מכשיר זה ל-30 יום',
'trust_forever' => 'זכור מכשיר זה',
'kanban' => 'Kanban',
'backlog' => 'Backlog',
'ready_to_do' => 'Ready to do',
'backlog' => 'פיגורים',
'ready_to_do' => 'מוכן לביצוע',
'in_progress' => 'בתהליך',
'add_status' => 'Add status',
'add_status' => 'הוסף סטטוס',
'archive_status' => 'Archive Status',
'new_status' => 'New Status',
'convert_products' => 'Convert Products',
'convert_products_help' => 'Automatically convert product prices to the client\'s currency',
'new_status' => 'סטטוס חדש',
'convert_products' => 'המר מוצר',
'convert_products_help' => 'המר אוטומטית את מחירי המוצרים למטבע הלקוח',
'improve_client_portal_link' => 'Set a subdomain to shorten the client portal link.',
'budgeted_hours' => 'Budgeted Hours',
'progress' => 'Progress',
'budgeted_hours' => 'שעות בתקציב',
'progress' => 'התקדמות',
'view_project' => 'צפה בפרוייקט',
'summary' => 'סיכום',
'endless_reminder' => 'Endless Reminder',
'signature_on_invoice_help' => 'Add the following code to show your client\'s signature on the PDF.',
'endless_reminder' => 'תזכורת קבועה',
'signature_on_invoice_help' => 'הוסף את הקוד הבא כדי להציג את החתימה של הלקוח שלך ב-PDF.',
'signature_on_pdf' => 'פתח בPDF',
'signature_on_pdf_help' => 'הצג את חתימת הלקוח ב-PDF של החשבונית/הצעת המחיר.',
'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.',
'client_information' => 'פרטי לקוח',
'updated_client_details' => 'פרטי לקוח עודכנו בהצלחה',
'auto' => 'Auto',
'auto' => 'אוטומטי',
'tax_amount' => 'סכום מס',
'tax_paid' => 'מס ששולם',
'none' => 'None',
'none' => 'ללא',
'proposal_message_button' => 'To view your proposal for :amount, click the button below.',
'proposal' => 'הצעה',
'proposals' => 'הצעות',
'list_proposals' => 'List Proposals',
'list_proposals' => 'הצג רשימת הצעות',
'new_proposal' => 'הצעה חדשה',
'edit_proposal' => 'ערוך הצעה',
'archive_proposal' => 'העבר פרויקט לארכיון',
'delete_proposal' => 'מחר הצעה',
'created_proposal' => 'Successfully created proposal',
'updated_proposal' => 'Successfully updated proposal',
'archived_proposal' => 'Successfully archived proposal',
'deleted_proposal' => 'Successfully archived proposal',
'created_proposal' => 'הצעת נוצרה בהצלחה',
'updated_proposal' => 'הצעת עודכנה בהצלחה',
'archived_proposal' => 'הצעה הועברה לארכיון בהצלחה',
'deleted_proposal' => 'הצעה הועברה לארכיון בהצלחה',
'archived_proposals' => 'Successfully archived :count proposals',
'deleted_proposals' => 'Successfully archived :count proposals',
'restored_proposal' => 'Successfully restored proposal',
'restore_proposal' => 'Restore Proposal',
'snippet' => 'Snippet',
'snippets' => 'Snippets',
'proposal_snippet' => 'Snippet',
'proposal_snippets' => 'Snippets',
'new_proposal_snippet' => 'New Snippet',
'edit_proposal_snippet' => 'Edit Snippet',
'archive_proposal_snippet' => 'Archive Snippet',
'delete_proposal_snippet' => 'Delete Snippet',
'created_proposal_snippet' => 'Successfully created snippet',
'updated_proposal_snippet' => 'Successfully updated snippet',
'archived_proposal_snippet' => 'Successfully archived snippet',
'deleted_proposal_snippet' => 'Successfully archived snippet',
'restored_proposal' => 'הצעת שוחזרה בהצלחה',
'restore_proposal' => 'שחזר הצעה',
'snippet' => 'מקטע',
'snippets' => 'מקטעים',
'proposal_snippet' => 'מקטע',
'proposal_snippets' => 'מקטעים',
'new_proposal_snippet' => 'מקטע חדש',
'edit_proposal_snippet' => 'ערוך מקטע',
'archive_proposal_snippet' => 'העברת מקטע לארכיון',
'delete_proposal_snippet' => 'מחיקת מקטע',
'created_proposal_snippet' => 'מקטע נוצר בהצלחה',
'updated_proposal_snippet' => 'מקטע עודכן בהצלחה',
'archived_proposal_snippet' => 'מקטע הועבר לארכיון',
'deleted_proposal_snippet' => 'מקטע הועבר לארכיון',
'archived_proposal_snippets' => 'Successfully archived :count snippets',
'deleted_proposal_snippets' => 'Successfully archived :count snippets',
'restored_proposal_snippet' => 'Successfully restored snippet',
'restore_proposal_snippet' => 'Restore Snippet',
'restored_proposal_snippet' => 'מקטע שוחזר',
'restore_proposal_snippet' => 'שחזר מקטע',
'template' => 'Template',
'templates' => 'Templates',
'proposal_template' => 'Template',
@ -2709,12 +2709,12 @@ $LANG = array(
'deleted_proposal_templates' => 'Successfully archived :count templates',
'restored_proposal_template' => 'Successfully restored template',
'restore_proposal_template' => 'Restore Template',
'proposal_category' => 'Category',
'proposal_categories' => 'Categories',
'new_proposal_category' => 'New Category',
'edit_proposal_category' => 'Edit Category',
'archive_proposal_category' => 'Archive Category',
'delete_proposal_category' => 'Delete Category',
'proposal_category' => 'קטגוריה',
'proposal_categories' => 'קטגוריות',
'new_proposal_category' => 'קטגוריה חדשה',
'edit_proposal_category' => 'ערוך קטגוריה',
'archive_proposal_category' => 'העבר קטגוריה לארכיון',
'delete_proposal_category' => 'מחיקת קטגוריה',
'created_proposal_category' => 'Successfully created category',
'updated_proposal_category' => 'Successfully updated category',
'archived_proposal_category' => 'Successfully archived category',
@ -2722,42 +2722,42 @@ $LANG = array(
'archived_proposal_categories' => 'Successfully archived :count categories',
'deleted_proposal_categories' => 'Successfully archived :count categories',
'restored_proposal_category' => 'Successfully restored category',
'restore_proposal_category' => 'Restore Category',
'delete_status' => 'Delete Status',
'standard' => 'Standard',
'icon' => 'Icon',
'proposal_not_found' => 'The requested proposal is not available',
'create_proposal_category' => 'Create category',
'clone_proposal_template' => 'Clone Template',
'proposal_email' => 'Proposal Email',
'restore_proposal_category' => 'שחזר קטגוריה',
'delete_status' => 'מחק סטטוס',
'standard' => 'רגיל',
'icon' => 'אייקון',
'proposal_not_found' => 'ההצעה המבוקשת לא נמצאה',
'create_proposal_category' => 'יצירת קטגוריה',
'clone_proposal_template' => 'שכפול טמפלט',
'proposal_email' => 'דוא"ל להצעה',
'proposal_subject' => 'New proposal :number from :account',
'proposal_message' => 'To view your proposal for :amount, click the link below.',
'emailed_proposal' => 'Successfully emailed proposal',
'load_template' => 'Load Template',
'no_assets' => 'No images, drag to upload',
'add_image' => 'Add Image',
'select_image' => 'Select Image',
'emailed_proposal' => 'הצעה נשלחה בדוא"ל',
'load_template' => 'שימוש בתבנית',
'no_assets' => 'אין תמונה, גרור תמונות להעלאה ',
'add_image' => 'הוספת תמונה',
'select_image' => 'בחירת תמונה',
'upgrade_to_upload_images' => 'Upgrade to the enterprise plan to upload images',
'delete_image' => 'Delete Image',
'delete_image_help' => 'Warning: deleting the image will remove it from all proposals.',
'delete_image' => 'מחיקת תמונה',
'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.',
'taxes_are_included_help' => 'Note: Inclusive taxes have been enabled.',
'taxes_are_not_included_help' => 'Note: Inclusive taxes are not enabled.',
'taxes_are_included_help' => 'הערה: הופעלו מסים כוללים.',
'taxes_are_not_included_help' => 'הערה: מסים כוללים לא הופעלו.',
'change_requires_purge' => 'Changing this setting requires :link the account data.',
'purging' => 'purging',
'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.',
'test' => 'Test',
'beta' => 'Beta',
'test' => 'ניסוי',
'beta' => 'בטא',
'gmp_required' => 'Exporting to ZIP requires the GMP extension',
'email_history' => 'Email History',
'email_history' => 'היסטוריית דוא"ל',
'loading' => 'טוען',
'no_messages_found' => 'No messages found',
'no_messages_found' => 'לא נמצאו הודעות',
'processing' => 'מעבד',
'reactivate' => 'Reactivate',
'reactivated_email' => 'The email address has been reactivated',
'emails' => 'Emails',
'reactivate' => 'הפעל שוב',
'reactivated_email' => 'כתובת הדוא"ל הופעלה מחדש',
'emails' => 'דואר אלקטרוני',
'opened' => 'Opened',
'bounced' => 'Bounced',
'total_sent' => 'Total Sent',
@ -5054,6 +5054,14 @@ $LANG = array(
'here' => 'here',
'industry_Restaurant & Catering' => 'Restaurant & Catering',
'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">
<!--[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>
</tr>
<![endif]-->
<tr>
<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)
<img class="" src="{{ $logo ?? '' }}" width="50%" height="" alt=" " border="0" style="width: 50%; max-width: 570px; display: block;">
@endif

View File

@ -1,5 +1,5 @@
@extends('portal.ninja2020.layout.error')
@section('title', __($title) ?: 'Server Error')
@section('code', __($code) ?: '500')
@section('message', __($message) ?: 'System Error')
@section('title', __($title) ?? 'Server Error')
@section('code', __($code) ?? '500')
@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