1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-09-20 16:31:33 +02:00

Merge pull request #7139 from turbo124/v5-develop

Fixes for custom designs
This commit is contained in:
David Bomba 2022-01-19 14:03:14 +11:00 committed by GitHub
commit bff0f4b3a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 4897 additions and 24 deletions

View File

@ -190,9 +190,7 @@ abstract class QueryFilters
return $this->builder;
}
$this->builder->where('client_id', $this->decodePrimaryKey($client_id));
return $this->builder;
return $this->builder->where('client_id', $this->decodePrimaryKey($client_id));
}

View File

@ -357,6 +357,57 @@ class DesignController extends BaseController
$design->fill($request->all());
$design->save();
/*
This is required as the base template does not know to inject the table elements
*/
$properties = ['includes','header','body','footer'];
$d = $design->design;
$old_header = '<div class="repeating-header" id="header"></div>';
$new_header = '<table style="min-width: 100%">
<thead>
<tr>
<td>
<div class="repeating-header-space">&nbsp;</div>
</td>
</tr>
</thead>
<tbody>
<tr>
<td>';
$old_footer = '<div class="repeating-footer" id="footer">';
$new_footer = '</td>
</tr>
</tbody>
<tfoot>
<tr>
<td>
<div class="repeating-footer-space">&nbsp;</div>
</td>
</tr>
</tfoot>
</table>
<div class="repeating-header" id="header"></div>
<div class="repeating-footer" id="footer">';
foreach($properties as $property){
$d->{$property} = str_replace($old_header, $new_header, $d->{$property});
$d->{$property} = str_replace($old_footer, $new_footer, $d->{$property});
}
$design->design = $d;
$design->save();
/*
This is required as the base template does not know to inject the table elements
*/
return $this->itemResponse($design->fresh());
}

View File

@ -82,10 +82,10 @@ class BaseTransformer
if ( $contacts->count() >= 1 ) {
return $contacts->first()->client_id;
nlog("found via contact");
nlog("found via contact");
}
}
nlog("did not find client");
nlog("did not find client");
return null;
}

View File

@ -240,6 +240,9 @@ class PaymentEmailEngine extends BaseEmailEngine
$data['$invoices'] = ['value' => $this->formatInvoices(), 'label' => ctrans('texts.invoices')];
$data['$invoice_references'] = ['value' => $this->formatInvoiceReferences(), 'label' => ctrans('texts.invoices')];
$data['$invoice'] = ['value' => $this->formatInvoice(), 'label' => ctrans('texts.invoices')];
$data['$invoice.po_number'] = ['value' => $this->formatPoNumber(), 'label' => ctrans('texts.po_number')];
$data['$poNumber'] = &$data['$invoice.po_number'];
return $data;
}
@ -253,6 +256,16 @@ class PaymentEmailEngine extends BaseEmailEngine
return $invoice;
}
private function formatPoNumber()
{
$invoice = '';
if($this->payment->invoices()->exists())
$invoice = ctrans('texts.po_number_short') . implode(",", $this->payment->invoices->pluck('po_number')->toArray());
return $invoice;
}
private function formatInvoices()
{
$invoice_list = '<br><br>';

View File

@ -109,7 +109,7 @@ class TemplateEmail extends Mailable
'settings' => $settings,
'company' => $company,
'whitelabel' => $this->client->user->account->isPaid() ? true : false,
'logo' => $this->company->present()->logo(),
'logo' => $this->company->present()->logo($settings),
])
->withSwiftMessage(function ($message) use($company){
$message->getHeaders()->addTextHeader('Tag', $company->company_key);

View File

@ -532,42 +532,46 @@ trait GeneratesCounter
switch ($reset_counter_frequency) {
case RecurringInvoice::FREQUENCY_DAILY:
now()->addDay();
$new_reset_date = now()->addDay();
break;
case RecurringInvoice::FREQUENCY_WEEKLY:
now()->addWeek();
$new_reset_date = now()->addWeek();
break;
case RecurringInvoice::FREQUENCY_TWO_WEEKS:
now()->addWeeks(2);
$new_reset_date = now()->addWeeks(2);
break;
case RecurringInvoice::FREQUENCY_FOUR_WEEKS:
now()->addWeeks(4);
$new_reset_date = now()->addWeeks(4);
break;
case RecurringInvoice::FREQUENCY_MONTHLY:
now()->addMonth();
$new_reset_date = now()->addMonth();
break;
case RecurringInvoice::FREQUENCY_TWO_MONTHS:
now()->addMonths(2);
$new_reset_date = now()->addMonths(2);
break;
case RecurringInvoice::FREQUENCY_THREE_MONTHS:
now()->addMonths(3);
$new_reset_date = now()->addMonths(3);
break;
case RecurringInvoice::FREQUENCY_FOUR_MONTHS:
now()->addMonths(4);
$new_reset_date = now()->addMonths(4);
break;
case RecurringInvoice::FREQUENCY_SIX_MONTHS:
now()->addMonths(6);
$new_reset_date = now()->addMonths(6);
break;
case RecurringInvoice::FREQUENCY_ANNUALLY:
now()->addYear();
$new_reset_date = now()->addYear();
break;
case RecurringInvoice::FREQUENCY_TWO_YEARS:
now()->addYears(2);
$new_reset_date = now()->addYears(2);
break;
default:
$new_reset_date = now()->addYear();
break;
}
$settings = $client->company->settings;
$settings->reset_counter_date = $reset_date->format('Y-m-d');
$settings->reset_counter_date = $new_reset_date->format('Y-m-d');
$settings->invoice_number_counter = 1;
$settings->quote_number_counter = 1;
$settings->credit_number_counter = 1;

View File

@ -1,7 +1,5 @@
<?php
use App\Utils\Ninja;
return [
/*
@ -96,7 +94,7 @@ return [
'prefix_indexes' => true,
'strict' => env('DB_STRICT', false),
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
// 'options' => Ninja::isHosted() ? config('ninja.db_options') : [],
'options' => [],
// 'options' => [
// PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
// PDO::MYSQL_ATTR_SSL_KEY => env("DB_CLIENT_KEY", ''),
@ -118,7 +116,7 @@ return [
'prefix_indexes' => true,
'strict' => env('DB_STRICT', false),
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
// 'options' => Ninja::isHosted() ? config('ninja.db_options') : [],
'options' => [],
],
'db-ninja-02' => [
@ -134,7 +132,7 @@ return [
'prefix_indexes' => true,
'strict' => env('DB_STRICT', false),
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
// 'options' => Ninja::isHosted() ? config('ninja.db_options') : [],
'options' => [],
],
'db-ninja-02a' => [
@ -150,7 +148,7 @@ return [
'prefix_indexes' => true,
'strict' => env('DB_STRICT', false),
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
// 'options' => Ninja::isHosted() ? config('ninja.db_options') : [],
'options' => [],
],
],

View File

@ -0,0 +1,34 @@
<?php
use App\Models\Language;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddEstonianLanguage extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$estonia = ['id' => 35, 'name' => 'Estonian', 'locale' => 'et'];
Language::unguard();
Language::create($estonia);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

View File

@ -4530,6 +4530,19 @@ $LANG = array(
'html_mode_help' => 'Preview updates faster but is less accurate',
'status_color_theme' => 'Status Color Theme',
'load_color_theme' => 'Load Color Theme',
'lang_Estonian' => 'Estonian',
'marked_credit_as_paid' => 'Successfully marked credit as paid',
'marked_credits_as_paid' => 'Successfully marked credits as paid',
'wait_for_loading' => 'Data loading - please wait for it to complete',
'wait_for_saving' => 'Data saving - please wait for it to complete',
'html_preview_warning' => 'Note: changes made here are only previewed, they must be applied in the tabs above to be saved',
'remaining' => 'Remaining',
'invoice_paid' => 'Invoice Paid',
'activity_120' => ':user created recurring expense :recurring_expense',
'activity_121' => ':user updated recurring expense :recurring_expense',
'activity_122' => ':user archived recurring expense :recurring_expense',
'activity_123' => ':user deleted recurring expense :recurring_expense',
'activity_124' => ':user restored recurring expense :recurring_expense',
);

View File

@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used during authentication for various
| messages that we need to display to the user. You are free to modify
| these language lines according to your application's requirements.
|
*/
'failed' => 'These credentials do not match our records.',
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
];

View File

@ -0,0 +1,13 @@
<?php
$lang = [
'client_dashboard' => 'Message to be displayed on clients dashboard',
'client_currency' => 'The client currency.',
'client_language' => 'The client language.',
'client_payment_terms' => 'The client payment terms.',
'client_paid_invoice' => 'Message to be displayed on a clients paid invoice screen',
'client_unpaid_invoice' => 'Message to be displayed on a clients unpaid invoice screen',
'client_unapproved_quote' => 'Message to be displayed on a clients unapproved quote screen',
];
return $lang;

View File

@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '« Previous',
'next' => 'Next »',
];

View File

@ -0,0 +1,23 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => 'Passwords must be at least six characters and match the confirmation.',
'reset' => 'Your password has been reset!',
'sent' => 'We have e-mailed your password reset link!',
'token' => 'This password reset token is invalid.',
'user' => "We can't find a user with that e-mail address.",
'throttled' => "You have requested password reset recently, please check your email.",
];

7
resources/lang/et/t.php Normal file
View File

@ -0,0 +1,7 @@
<?php
$lang = [
'client_settings' => 'Client Settings',
];
return $lang;

4535
resources/lang/et/texts.php Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,146 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => 'The :attribute must be accepted.',
'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.',
'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
'alpha' => 'The :attribute may only contain letters.',
'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.',
'alpha_num' => 'The :attribute may only contain letters and numbers.',
'array' => 'The :attribute must be an array.',
'before' => 'The :attribute must be a date before :date.',
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
'between' => [
'numeric' => 'The :attribute must be between :min and :max.',
'file' => 'The :attribute must be between :min and :max kilobytes.',
'string' => 'The :attribute must be between :min and :max characters.',
'array' => 'The :attribute must have between :min and :max items.',
],
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute confirmation does not match.',
'date' => 'The :attribute is not a valid date.',
'date_format' => 'The :attribute does not match the format :format.',
'different' => 'The :attribute and :other must be different.',
'digits' => 'The :attribute must be :digits digits.',
'digits_between' => 'The :attribute must be between :min and :max digits.',
'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'email' => 'The :attribute must be a valid email address.',
'exists' => 'The selected :attribute is invalid.',
'file' => 'The :attribute must be a file.',
'filled' => 'The :attribute field must have a value.',
'gt' => [
'numeric' => 'The :attribute must be greater than :value.',
'file' => 'The :attribute must be greater than :value kilobytes.',
'string' => 'The :attribute must be greater than :value characters.',
'array' => 'The :attribute must have more than :value items.',
],
'gte' => [
'numeric' => 'The :attribute must be greater than or equal :value.',
'file' => 'The :attribute must be greater than or equal :value kilobytes.',
'string' => 'The :attribute must be greater than or equal :value characters.',
'array' => 'The :attribute must have :value items or more.',
],
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field does not exist in :other.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
'ipv4' => 'The :attribute must be a valid IPv4 address.',
'ipv6' => 'The :attribute must be a valid IPv6 address.',
'json' => 'The :attribute must be a valid JSON string.',
'lt' => [
'numeric' => 'The :attribute must be less than :value.',
'file' => 'The :attribute must be less than :value kilobytes.',
'string' => 'The :attribute must be less than :value characters.',
'array' => 'The :attribute must have less than :value items.',
],
'lte' => [
'numeric' => 'The :attribute must be less than or equal :value.',
'file' => 'The :attribute must be less than or equal :value kilobytes.',
'string' => 'The :attribute must be less than or equal :value characters.',
'array' => 'The :attribute must not have more than :value items.',
],
'max' => [
'numeric' => 'The :attribute may not be greater than :max.',
'file' => 'The :attribute may not be greater than :max kilobytes.',
'string' => 'The :attribute may not be greater than :max characters.',
'array' => 'The :attribute may not have more than :max items.',
],
'mimes' => 'The :attribute must be a file of type: :values.',
'mimetypes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => 'The :attribute must be at least :min.',
'file' => 'The :attribute must be at least :min kilobytes.',
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
],
'not_in' => 'The selected :attribute is invalid.',
'not_regex' => 'The :attribute format is invalid.',
'numeric' => 'The :attribute must be a number.',
'present' => 'The :attribute field must be present.',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute and :other must match.',
'size' => [
'numeric' => 'The :attribute must be :size.',
'file' => 'The :attribute must be :size kilobytes.',
'string' => 'The :attribute must be :size characters.',
'array' => 'The :attribute must contain :size items.',
],
'string' => 'The :attribute must be a string.',
'timezone' => 'The :attribute must be a valid zone.',
'unique' => 'The :attribute has already been taken.',
'uploaded' => 'The :attribute failed to upload.',
'url' => 'The :attribute format is invalid.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];