mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-10 13:12:50 +01:00
Merge pull request #7139 from turbo124/v5-develop
Fixes for custom designs
This commit is contained in:
commit
bff0f4b3a3
@ -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));
|
||||
|
||||
}
|
||||
|
||||
|
@ -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"> </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"> </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());
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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>';
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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' => [],
|
||||
],
|
||||
],
|
||||
|
||||
|
@ -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()
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
@ -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',
|
||||
|
||||
);
|
||||
|
||||
|
19
resources/lang/et/auth.php
Normal file
19
resources/lang/et/auth.php
Normal 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.',
|
||||
|
||||
];
|
13
resources/lang/et/help.php
Normal file
13
resources/lang/et/help.php
Normal 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;
|
19
resources/lang/et/pagination.php
Normal file
19
resources/lang/et/pagination.php
Normal 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 »',
|
||||
|
||||
];
|
23
resources/lang/et/passwords.php
Normal file
23
resources/lang/et/passwords.php
Normal 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
7
resources/lang/et/t.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
$lang = [
|
||||
'client_settings' => 'Client Settings',
|
||||
];
|
||||
|
||||
return $lang;
|
4535
resources/lang/et/texts.php
Normal file
4535
resources/lang/et/texts.php
Normal file
File diff suppressed because it is too large
Load Diff
146
resources/lang/et/validation.php
Normal file
146
resources/lang/et/validation.php
Normal 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' => [],
|
||||
|
||||
];
|
Loading…
Reference in New Issue
Block a user