From 1f98257db81bfb3b50e2edb0f6a84ea0bb47f9f5 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 20 Jun 2025 08:30:08 +1000 Subject: [PATCH] v5.12.4 --- VERSION.txt | 2 +- app/Jobs/Report/SendToAdmin.php | 3 ++ app/Utils/Traits/Pdf/PDF.php | 18 ++++++-- config/ninja.php | 6 +-- lang/de/texts.php | 14 ++++-- lang/es_ES/texts.php | 82 ++++++++++++++++++--------------- lang/fr_CA/texts.php | 6 +++ lang/vi/texts.php | 6 +++ 8 files changed, 87 insertions(+), 50 deletions(-) diff --git a/VERSION.txt b/VERSION.txt index 4db6f59d76..ed9340484a 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.12.3 \ No newline at end of file +5.12.4 \ No newline at end of file diff --git a/app/Jobs/Report/SendToAdmin.php b/app/Jobs/Report/SendToAdmin.php index 6e2430a17f..8306112a8a 100644 --- a/app/Jobs/Report/SendToAdmin.php +++ b/app/Jobs/Report/SendToAdmin.php @@ -64,6 +64,9 @@ class SendToAdmin implements ShouldQueue $export = new $this->report_class($this->company, $this->request); $csv = base64_encode($export->run()); + $size_mb = round(strlen($csv) / (1024 * 1024), 2); // Size in MB + nlog("Report Size: MB " . $size_mb); + $files = []; $files[] = ['file' => $csv, 'file_name' => "{$this->file_name}", 'mime' => 'text/csv']; diff --git a/app/Utils/Traits/Pdf/PDF.php b/app/Utils/Traits/Pdf/PDF.php index c31e582bf1..b2cb08f146 100644 --- a/app/Utils/Traits/Pdf/PDF.php +++ b/app/Utils/Traits/Pdf/PDF.php @@ -20,10 +20,7 @@ class PDF extends FPDI public function Footer() { - $this->SetXY(config('ninja.pdf_page_numbering_x_alignment'), config('ninja.pdf_page_numbering_y_alignment')); - $this->SetFont('Arial', 'I', 9); - $this->SetTextColor(135, 135, 135); $trans = ctrans('texts.pdf_page_info', ['current' => $this->PageNo(), 'total' => '{nb}']); @@ -33,7 +30,20 @@ class PDF extends FPDI } catch (\Exception $e) { } - $this->Cell(0, 5, $trans, 0, 0, $this->text_alignment); + // Set Y position + $this->SetY(config('ninja.pdf_page_numbering_y_alignment')); + + // Set X position based on alignment + if ($this->text_alignment == 'L') { + $this->SetX(config('ninja.pdf_page_numbering_y_alignment')); // 10mm from left edge + $this->Cell($this->GetPageWidth() - 10, 5, $trans, 0, 0, 'L'); + } elseif ($this->text_alignment == 'R') { + $this->SetX(0); + $this->Cell($this->GetPageWidth(), 5, $trans, 0, 0, 'R'); + } else { + $this->SetX(0); + $this->Cell($this->GetPageWidth(), 5, $trans, 0, 0, 'C'); + } } public function setAlignment($alignment) diff --git a/config/ninja.php b/config/ninja.php index d0bd997649..1b50b563e5 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -17,8 +17,8 @@ return [ 'require_https' => env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'), - 'app_version' => env('APP_VERSION', '5.12.3'), - 'app_tag' => env('APP_TAG', '5.12.3'), + 'app_version' => env('APP_VERSION', '5.12.4'), + 'app_tag' => env('APP_TAG', '5.12.4'), 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', false), @@ -257,7 +257,7 @@ return [ 'storecove_email_catchall' => env('STORECOVE_CATCHALL_EMAIL',false), 'qvalia_api_key' => env('QVALIA_API_KEY', false), 'qvalia_partner_number' => env('QVALIA_PARTNER_NUMBER', false), - 'pdf_page_numbering_x_alignment' => env('PDF_PAGE_NUMBER_X', 0), + 'pdf_page_numbering_x_alignment' => env('PDF_PAGE_NUMBER_X', 5), 'pdf_page_numbering_y_alignment' => env('PDF_PAGE_NUMBER_Y', -6), 'hosted_einvoice_secret' => env('HOSTED_EINVOICE_SECRET', null), 'e_invoice_quota_warning' => env('E_INVOICE_QUOTA_WARNING', 15), diff --git a/lang/de/texts.php b/lang/de/texts.php index 8c271602bc..5d304881d0 100644 --- a/lang/de/texts.php +++ b/lang/de/texts.php @@ -144,7 +144,7 @@ $lang = array( 'payment_amount' => 'Zahlungsbetrag', 'payment_date' => 'Zahlungsdatum', 'credit_amount' => 'Gutschriftsbetrag', - 'credit_balance' => 'Gutschrifsstand', + 'credit_balance' => 'Gutschriftsstand', 'credit_date' => 'Gutschriftsdatum', 'empty_table' => 'Es sind keine Daten vorhanden', 'select' => 'Wählen', @@ -739,7 +739,7 @@ $lang = array( 'activity_7' => ':contact hat Rechnung :invoice für :client angesehen', 'activity_8' => ':user archivierte Rechnung :invoice', 'activity_9' => ':user löschte Rechnung :invoice', - 'activity_10' => ':user hat die Zahlung :payment über :payment_amount der Rechnung :invoice für Kunde :client eingegeben.', + 'activity_10' => ':user hat die Zahlung :payment über :payment_amount der Rechnung :invoice für Kunde :client eingegeben', 'activity_11' => ':user aktualisierte Zahlung :payment', 'activity_12' => ':user archivierte Zahlung :payment', 'activity_13' => ':user löschte Zahlung :payment', @@ -4877,7 +4877,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'number_of_payments' => 'Anzahl der Zahlungen', 'number_of_payments_helper' => 'Die Häufigkeit, mit der diese Zahlung erfolgt', 'pre_payment_indefinitely' => 'Fortfahren bis auf Widerruf', - 'notification_payment_emailed' => 'Zahlung :payment wurde per E-Mail an den Kunden gesendet', + 'notification_payment_emailed' => 'Zahlung :payment wurde per E-Mail an den Kunden :client gesendet', 'notification_payment_emailed_subject' => 'Zahlung :payment wurde per E-Mail gesendet', 'record_not_found' => 'Aufnahme nicht gefunden', 'minimum_payment_amount' => 'Mindestzahlungsbetrag', @@ -4887,7 +4887,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'cc_email' => 'CC-E-Mail', 'payment_balance' => 'Zahlungsbilanz', 'view_report_permission' => 'Benutzern Zugriff auf die Berichte gewähren, Daten sind auf verfügbare Berechtigungen beschränkt', - 'activity_138' => 'Zahlung :payment wurde per E-Mail an den Kunden :client', + 'activity_138' => 'Zahlung :payment wurde per E-Mail an den Kunden :client gesendet', 'one_time_products' => 'Einmalige Produkte', 'optional_one_time_products' => 'Optionale einmalige Produkte', 'required' => 'Erforderlich', @@ -5589,6 +5589,12 @@ Leistungsempfängers', 'activity_150' => 'Account deleted :notes', 'docuninja' => 'DocuNinja', 'pro_rata' => 'Pro Rata', + 'change_docuninja_plan' => 'Change DocuNinja Plan', + 'downgrade_end_of_cycle' => 'Your plan will automatically downgrade at the end of the current billing cycle.', + 'docuninja_change_users' => 'New DocuNinja user limit', + 'docuninja_disable_warning' => 'This will remove all access to your DocuNinja account.', + 'docuninja_downgrade_info' => 'Your user limit will automatically be reduced at the end of the current billing cycle.', + 'recurring_invoice_item' => 'Recurring Invoice Item', ); return $lang; diff --git a/lang/es_ES/texts.php b/lang/es_ES/texts.php index a1c8cb92a4..7ce55496d6 100644 --- a/lang/es_ES/texts.php +++ b/lang/es_ES/texts.php @@ -104,7 +104,7 @@ $lang = array(
  • ":YEAR+1 suscripción anual" >> "2015 suscripción anual"
  • "Pago retenido para :QUARTER+1" >> "Pago retenido para T2"
  • ', - 'recurring_quotes' => 'Presupuestos Recurrentes', + 'recurring_quotes' => 'Cotizaciones Recurrentes', 'in_total_revenue' => 'Ingreso Total', 'billed_client' => 'Cliente Facturado', 'billed_clients' => 'Clientes Facturados', @@ -303,37 +303,37 @@ $lang = array( 'chart_builder' => 'Constructor de Gráficas', 'ninja_email_footer' => 'Creado por :site | Crea. Envia. Recibe tus Pagos.', 'go_pro' => 'Hazte Pro', - 'quote' => 'Presupuesto', - 'quotes' => 'Presupuestos', - 'quote_number' => 'Número de Presupuesto', - 'quote_number_short' => 'Presupuesto Nº ', - 'quote_date' => 'Fecha de Presupuesto', - 'quote_total' => 'Total Presupuestado', - 'your_quote' => 'Su Presupuesto', + 'quote' => 'Cotización', + 'quotes' => 'Cotizaciones', + 'quote_number' => 'Número de Cotización', + 'quote_number_short' => 'Cotización Nº ', + 'quote_date' => 'Fecha de Cotización', + 'quote_total' => 'Total Cotizado', + 'your_quote' => 'Su Cotización', 'total' => 'Total', 'clone' => 'Clonar', - 'new_quote' => 'Nuevo Presupuesto', - 'create_quote' => 'Crear Presupuesto', - 'edit_quote' => 'Editar Presupuesto', - 'archive_quote' => 'Archivar Presupuesto', - 'delete_quote' => 'Eliminar Presupuesto', - 'save_quote' => 'Guardar Presupuesto', - 'email_quote' => 'Enviar Presupuesto', - 'clone_quote' => 'Clonar Presupuesto', + 'new_quote' => 'Nueva Cotización', + 'create_quote' => 'Crear Cotización', + 'edit_quote' => 'Editar Cotización', + 'archive_quote' => 'Archivar Cotización', + 'delete_quote' => 'Eliminar Cotización', + 'save_quote' => 'Guardar Cotización', + 'email_quote' => 'Enviar Cotización', + 'clone_quote' => 'Clonar Cotización', 'convert_to_invoice' => 'Convertir a Factura', 'view_invoice' => 'Ver Factura', 'view_client' => 'Ver Cliente', - 'view_quote' => 'Ver Presupuesto', - 'updated_quote' => 'Presupuesto actualizado correctamente', - 'created_quote' => 'Presupuesto creado correctamente', - 'cloned_quote' => 'Presupuesto clonado correctamente', - 'emailed_quote' => 'Presupuesto enviado correctamente', - 'archived_quote' => 'Presupuesto archivado correctamente', - 'archived_quotes' => ':count Presupuestos archivados correctamente', - 'deleted_quote' => 'Presupuesto eliminado correctamente', - 'deleted_quotes' => ':count Presupuestos eliminados correctamente', - 'converted_to_invoice' => 'Presupuesto convertido a factura correctamente', - 'quote_subject' => 'Nueva presupuesto :number de :account', + 'view_quote' => 'Ver Cotización', + 'updated_quote' => 'Cotización actualizada correctamente', + 'created_quote' => 'Cotización creada correctamente', + 'cloned_quote' => 'Cotización clonada correctamente', + 'emailed_quote' => 'Cotización enviada correctamente', + 'archived_quote' => 'Cotización archivada correctamente', + 'archived_quotes' => ':count Cotizaciones archivadas correctamente', + 'deleted_quote' => 'Cotización eliminada correctamente', + 'deleted_quotes' => ':count Cotizaciones eliminadas correctamente', + 'converted_to_invoice' => 'Cotizaciones convertidas a factura correctamente', + 'quote_subject' => 'Nueva Cotización :number de :account', 'quote_message' => 'Para ver el presupuesto por un importe de :amount, haga click en el enlace de abajo.', 'quote_link_message' => 'Para ver su presupuesto haga click en el enlace de abajo:', 'notification_quote_sent_subject' => 'El presupuesto :invoice se ha enviada al cliente :client', @@ -1865,7 +1865,7 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'upgrade_for_features' => 'Actualizate para más características', 'pay_annually_discount' => '¡Pague anualmente por 10 meses + 2 gratis!', 'pro_upgrade_title' => 'Ninja Pro', - 'pro_upgrade_feature1' => 'YourBrand.invoicing.co', + 'pro_upgrade_feature1' => 'SuMarcaFactura.com', 'pro_upgrade_feature2' => '¡Personaliza cada detalle de tu factura!', 'enterprise_upgrade_feature1' => 'Establecer permisos para múltiples usuarios', 'enterprise_upgrade_feature2' => 'Adjuntar archivos de terceros a facturas y gastos', @@ -5527,7 +5527,7 @@ De lo contrario, este campo deberá dejarse en blanco.', 'premium_business_plus_label' => 'Premium Business+', 'pro_plan_feature_1' => 'Clientes y facturas ilimitados', 'pro_plan_feature_2' => 'Eliminar "Creado por Invoice Ninja"', - 'pro_plan_feature_3' => 'Email Invoices via Gmail & Microsoft', + 'pro_plan_feature_3' => 'Enviar facturas a través de gMail & Microsoft', 'pro_plan_feature_4' => 'Facturas por correo electrónico a través de su SMTP personalizado', 'pro_plan_feature_5' => 'URL de marca: "YourSite".Invoicing.co', 'pro_plan_feature_6' => '11 plantillas de facturas profesionales', @@ -5543,10 +5543,10 @@ De lo contrario, este campo deberá dejarse en blanco.', 'pro_plan_feature_16' => 'Interlink 10 Empresas con 1 Login', 'pro_plan_feature_17' => 'Crear configuraciones únicas de "Grupo de clientes"', 'pro_plan_feature_18' => 'Cálculo del impuesto sobre las ventas de automóviles (estados de EE. UU.)', - 'enterprise_plan_feature_1' => 'Additional Account Users & Permissions', - 'enterprise_plan_feature_2' => 'Upload & Attach Files', - 'enterprise_plan_feature_3' => 'Custom Portal Domain', - 'enterprise_plan_feature_4' => 'Bank account sync', + 'enterprise_plan_feature_1' => 'Usuarios Adicionales de la Cuenta & Permisos', + 'enterprise_plan_feature_2' => 'Subir y Adjuntar Documentos', + 'enterprise_plan_feature_3' => 'Dominio Personalizado del Portal', + 'enterprise_plan_feature_4' => 'Sync de Cuenta Bancaria', 'premium_business_plus_feature_1' => 'Conserje para desarrolladores', 'premium_business_plus_feature_2' => 'Apoyo prioritario directo', 'premium_business_plus_feature_3' => 'Servicio de diseño de facturas', @@ -5573,15 +5573,21 @@ De lo contrario, este campo deberá dejarse en blanco.', 'deleted_location' => 'Ubicación eliminada', 'currency_caribbean_guilder' => 'Caribbean Guilder', 'is_shipping' => 'Is Shipping', - 'added_location' => 'Successfully added location', - 'send_emails' => 'Send Emails', - 'send_emails_permission' => 'Allow user to send emails', - 'cancel_trial' => 'Cancel Trial', + 'added_location' => 'Exitosamente se añadió localidad', + 'send_emails' => 'Enviar Correos Electrónicos', + 'send_emails_permission' => 'Permitir al usuario enviar correos electrónicos', + 'cancel_trial' => 'Cancelar Prueba', 'cancel_trial_description' => 'This will cancel your trial and remove all paid features from your account.', 'existing_gateway' => 'Gateway already exists', - 'activity_150' => 'Account deleted :notes', + 'activity_150' => 'Cuenta borrada', 'docuninja' => 'DocuNinja', 'pro_rata' => 'Pro Rata', + 'change_docuninja_plan' => 'Change DocuNinja Plan', + 'downgrade_end_of_cycle' => 'Your plan will automatically downgrade at the end of the current billing cycle.', + 'docuninja_change_users' => 'New DocuNinja user limit', + 'docuninja_disable_warning' => 'This will remove all access to your DocuNinja account.', + 'docuninja_downgrade_info' => 'Your user limit will automatically be reduced at the end of the current billing cycle.', + 'recurring_invoice_item' => 'Recurring Invoice Item', ); return $lang; diff --git a/lang/fr_CA/texts.php b/lang/fr_CA/texts.php index a8c9077394..f4d06e220e 100644 --- a/lang/fr_CA/texts.php +++ b/lang/fr_CA/texts.php @@ -5583,6 +5583,12 @@ Développe automatiquement la section des notes dans le tableau de produits pour 'activity_150' => 'Compte supprimé :notes', 'docuninja' => 'DocuNinja', 'pro_rata' => 'Pro Rata', + 'change_docuninja_plan' => 'Changez de plan DocuNinja', + 'downgrade_end_of_cycle' => 'Votre plan sera automatiquement ajusté à la fin de votre cycle de paiement.', + 'docuninja_change_users' => 'Nouvelle limite d\'utilisateur DocuNinja', + 'docuninja_disable_warning' => 'Retirer les accès à votre compte DocuNinja', + 'docuninja_downgrade_info' => 'Votre limite d\'utilisateur sera automatiquement ajusté à la fin de votre cycle de paiement.', + 'recurring_invoice_item' => 'Article de facture récurrente', ); return $lang; diff --git a/lang/vi/texts.php b/lang/vi/texts.php index 295b119d50..5adc9de03a 100644 --- a/lang/vi/texts.php +++ b/lang/vi/texts.php @@ -5585,6 +5585,12 @@ $lang = array( 'activity_150' => 'tài khoản đã xóa :notes', 'docuninja' => 'DocuNinja', 'pro_rata' => 'Tỷ lệ', + 'change_docuninja_plan' => 'Thay đổi gói DocuNinja', + 'downgrade_end_of_cycle' => 'Gói cước của bạn sẽ tự động hạ cấp vào cuối chu kỳ thanh toán hiện tại.', + 'docuninja_change_users' => 'Giới hạn Người dùng DocuNinja mới', + 'docuninja_disable_warning' => 'Thao tác này sẽ xóa tất cả quyền truy cập đến tài khoản DocuNinja của bạn.', + 'docuninja_downgrade_info' => 'Hạn mức Người dùng của bạn sẽ tự động giảm vào cuối chu kỳ thanh toán hiện tại.', + 'recurring_invoice_item' => 'Định kỳ Hóa đơn Item', ); return $lang;