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;