mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-09 12:42:36 +01:00
Bug fixes
This commit is contained in:
parent
bdb9fe4324
commit
fcbec2617b
@ -14,7 +14,10 @@ use stdClass;
|
|||||||
use Cache;
|
use Cache;
|
||||||
use Response;
|
use Response;
|
||||||
use parseCSV;
|
use parseCSV;
|
||||||
|
use Request;
|
||||||
|
|
||||||
|
use App\Models\Affiliate;
|
||||||
|
use App\Models\License;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use App\Models\Client;
|
use App\Models\Client;
|
||||||
use App\Models\Contact;
|
use App\Models\Contact;
|
||||||
@ -572,7 +575,7 @@ class AccountController extends BaseController
|
|||||||
}
|
}
|
||||||
|
|
||||||
$subdomain = preg_replace('/[^a-zA-Z0-9_\-]/', '', substr(strtolower(Input::get('subdomain')), 0, MAX_SUBDOMAIN_LENGTH));
|
$subdomain = preg_replace('/[^a-zA-Z0-9_\-]/', '', substr(strtolower(Input::get('subdomain')), 0, MAX_SUBDOMAIN_LENGTH));
|
||||||
if (!$subdomain || in_array($subdomain, ['www', 'app', 'mail', 'admin', 'blog'])) {
|
if (!$subdomain || in_array($subdomain, ['www', 'app', 'mail', 'admin', 'blog', 'user', 'contact', 'payment', 'payments', 'billing', 'invoice', 'business', 'owner'])) {
|
||||||
$subdomain = null;
|
$subdomain = null;
|
||||||
}
|
}
|
||||||
if ($subdomain) {
|
if ($subdomain) {
|
||||||
|
@ -613,7 +613,7 @@ class PaymentController extends BaseController
|
|||||||
|
|
||||||
if ($invoice->account->account_key == NINJA_ACCOUNT_KEY) {
|
if ($invoice->account->account_key == NINJA_ACCOUNT_KEY) {
|
||||||
$account = Account::find($invoice->client->public_id);
|
$account = Account::find($invoice->client->public_id);
|
||||||
if ($account->pro_plan_paid) {
|
if ($account->pro_plan_paid && $account->pro_plan_paid != '0000-00-00') {
|
||||||
$date = DateTime::createFromFormat('Y-m-d', $account->pro_plan_paid);
|
$date = DateTime::createFromFormat('Y-m-d', $account->pro_plan_paid);
|
||||||
$account->pro_plan_paid = $date->modify('+1 year')->format('Y-m-d');
|
$account->pro_plan_paid = $date->modify('+1 year')->format('Y-m-d');
|
||||||
} else {
|
} else {
|
||||||
|
@ -6,11 +6,13 @@ use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
|
|||||||
class VerifyCsrfToken extends BaseVerifier {
|
class VerifyCsrfToken extends BaseVerifier {
|
||||||
|
|
||||||
private $openRoutes = [
|
private $openRoutes = [
|
||||||
|
'signup/register',
|
||||||
'api/v1/clients',
|
'api/v1/clients',
|
||||||
'api/v1/invoices',
|
'api/v1/invoices',
|
||||||
'api/v1/quotes',
|
'api/v1/quotes',
|
||||||
'api/v1/payments',
|
'api/v1/payments',
|
||||||
'api/v1/email_invoice',
|
'api/v1/email_invoice',
|
||||||
|
'api/v1/hooks',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -34,7 +34,7 @@ class HandleInvoiceViewed {
|
|||||||
{
|
{
|
||||||
if ($user->{'notify_viewed'})
|
if ($user->{'notify_viewed'})
|
||||||
{
|
{
|
||||||
$this->userMailer->sendNotification($user, $invoice, 'viewed', $payment);
|
$this->userMailer->sendNotification($user, $invoice, 'viewed');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -291,7 +291,9 @@ class Activity extends Eloquent
|
|||||||
$invoice = $payment->invoice;
|
$invoice = $payment->invoice;
|
||||||
$invoice->balance = $invoice->balance - $payment->amount;
|
$invoice->balance = $invoice->balance - $payment->amount;
|
||||||
$invoice->invoice_status_id = ($invoice->balance > 0) ? INVOICE_STATUS_PARTIAL : INVOICE_STATUS_PAID;
|
$invoice->invoice_status_id = ($invoice->balance > 0) ? INVOICE_STATUS_PARTIAL : INVOICE_STATUS_PAID;
|
||||||
$invoice->partial = max(0, $invoice->partial - $payment->amount);
|
if ($invoice->partial > 0) {
|
||||||
|
$invoice->partial = max(0, $invoice->partial - $payment->amount);
|
||||||
|
}
|
||||||
$invoice->save();
|
$invoice->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<?php namespace App\Models;
|
<?php namespace App\Models;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
|
||||||
class Invoice extends EntityModel
|
class Invoice extends EntityModel
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
"jquery": "~1.11",
|
"jquery": "~1.11",
|
||||||
"bootstrap": "~3.*",
|
"bootstrap": "~3.*",
|
||||||
"jquery-ui": "~1.*",
|
"jquery-ui": "~1.*",
|
||||||
"datatables": "1.10.5",
|
"datatables": "1.10.4",
|
||||||
"datatables-bootstrap3": "*",
|
"datatables-bootstrap3": "*",
|
||||||
"knockout.js": "~3.*",
|
"knockout.js": "~3.*",
|
||||||
"knockout-mapping": "*",
|
"knockout-mapping": "*",
|
||||||
|
File diff suppressed because one or more lines are too long
@ -35,7 +35,7 @@
|
|||||||
|
|
||||||
{!! Former::text('name') !!}
|
{!! Former::text('name') !!}
|
||||||
|
|
||||||
@if (Auth::user()->isPro() && !Utils::isNinja())
|
@if (Auth::user()->isPro() && Utils::isNinja())
|
||||||
{{ Former::setOption('capitalize_translations', false) }}
|
{{ Former::setOption('capitalize_translations', false) }}
|
||||||
{!! Former::text('subdomain')->placeholder('texts.www')->onchange('onSubdomainChange()') !!}
|
{!! Former::text('subdomain')->placeholder('texts.www')->onchange('onSubdomainChange()') !!}
|
||||||
@endif
|
@endif
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<table class="table table-striped {{ $class = str_random(8) }}">
|
<table class="table table-striped data-table {{ $class = str_random(8) }}">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
@for ($i = 0; $i < count($columns); $i++)
|
@for ($i = 0; $i < count($columns); $i++)
|
||||||
<col class="con{{ $i }}" />
|
<col class="con{{ $i }}" />
|
||||||
@ -43,7 +43,7 @@
|
|||||||
$(row).addClass('entityArchived');
|
$(row).addClass('entityArchived');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bAutoWidth": false,
|
"bAutoWidth": false,
|
||||||
@if (isset($hasCheckboxes) && $hasCheckboxes)
|
@if (isset($hasCheckboxes) && $hasCheckboxes)
|
||||||
'aaSorting': [['1', 'asc']],
|
'aaSorting': [['1', 'asc']],
|
||||||
// Disable sorting on the first column
|
// Disable sorting on the first column
|
||||||
|
@ -85,77 +85,74 @@
|
|||||||
window.location = '{{ URL::to('view_archive/' . $entityType) }}' + (checked ? '/true' : '/false');
|
window.location = '{{ URL::to('view_archive/' . $entityType) }}' + (checked ? '/true' : '/false');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
var tableFilter = '';
|
||||||
|
var searchTimeout = false;
|
||||||
|
|
||||||
|
var oTable0 = $('#DataTables_Table_0').dataTable();
|
||||||
|
var oTable1 = $('#DataTables_Table_1').dataTable();
|
||||||
|
function filterTable(val) {
|
||||||
|
if (val == tableFilter) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tableFilter = val;
|
||||||
|
oTable0.fnFilter(val);
|
||||||
|
@if (isset($secEntityType))
|
||||||
|
oTable1.fnFilter(val);
|
||||||
|
@endif
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#tableFilter').on('keyup', function(){
|
||||||
|
if (searchTimeout) {
|
||||||
|
window.clearTimeout(searchTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
searchTimeout = setTimeout(function() {
|
||||||
|
filterTable($('#tableFilter').val());
|
||||||
|
}, 500);
|
||||||
|
})
|
||||||
|
|
||||||
|
window.onDatatableReady = function() {
|
||||||
|
$(':checkbox').click(function() {
|
||||||
|
setArchiveEnabled();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('tbody tr').click(function(event) {
|
||||||
|
if (event.target.type !== 'checkbox' && event.target.type !== 'button' && event.target.tagName.toLowerCase() !== 'a') {
|
||||||
|
$checkbox = $(this).closest('tr').find(':checkbox:not(:disabled)');
|
||||||
|
var checked = $checkbox.prop('checked');
|
||||||
|
$checkbox.prop('checked', !checked);
|
||||||
|
setArchiveEnabled();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('tbody tr').mouseover(function() {
|
||||||
|
$(this).closest('tr').find('.tr-action').css('visibility','visible');
|
||||||
|
}).mouseout(function() {
|
||||||
|
$dropdown = $(this).closest('tr').find('.tr-action');
|
||||||
|
if (!$dropdown.hasClass('open')) {
|
||||||
|
$dropdown.css('visibility','hidden');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$('.archive').prop('disabled', true);
|
||||||
|
$('.archive:not(.dropdown-toggle)').click(function() {
|
||||||
|
submitForm('archive');
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.selectAll').click(function() {
|
||||||
|
$(this).closest('table').find(':checkbox:not(:disabled)').prop('checked', this.checked);
|
||||||
|
});
|
||||||
|
|
||||||
|
function setArchiveEnabled() {
|
||||||
|
var checked = $('tbody :checkbox:checked').length > 0;
|
||||||
|
$('button.archive').prop('disabled', !checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@stop
|
|
||||||
|
|
||||||
@section('onReady')
|
|
||||||
|
|
||||||
var tableFilter = '';
|
|
||||||
var searchTimeout = false;
|
|
||||||
|
|
||||||
var oTable0 = $('#DataTables_Table_0').dataTable();
|
|
||||||
var oTable1 = $('#DataTables_Table_1').dataTable();
|
|
||||||
function filterTable(val) {
|
|
||||||
if (val == tableFilter) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
tableFilter = val;
|
|
||||||
oTable0.fnFilter(val);
|
|
||||||
@if (isset($secEntityType))
|
|
||||||
oTable1.fnFilter(val);
|
|
||||||
@endif
|
|
||||||
}
|
|
||||||
|
|
||||||
$('#tableFilter').on('keyup', function(){
|
|
||||||
if (searchTimeout) {
|
|
||||||
window.clearTimeout(searchTimeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
searchTimeout = setTimeout(function() {
|
|
||||||
filterTable($('#tableFilter').val());
|
|
||||||
}, 1000);
|
|
||||||
})
|
|
||||||
|
|
||||||
window.onDatatableReady = function() {
|
|
||||||
$(':checkbox').click(function() {
|
|
||||||
setArchiveEnabled();
|
|
||||||
});
|
|
||||||
|
|
||||||
$('tbody tr').click(function(event) {
|
|
||||||
if (event.target.type !== 'checkbox' && event.target.type !== 'button' && event.target.tagName.toLowerCase() !== 'a') {
|
|
||||||
$checkbox = $(this).closest('tr').find(':checkbox:not(:disabled)');
|
|
||||||
var checked = $checkbox.prop('checked');
|
|
||||||
$checkbox.prop('checked', !checked);
|
|
||||||
setArchiveEnabled();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$('tbody tr').mouseover(function() {
|
|
||||||
$(this).closest('tr').find('.tr-action').css('visibility','visible');
|
|
||||||
}).mouseout(function() {
|
|
||||||
$dropdown = $(this).closest('tr').find('.tr-action');
|
|
||||||
if (!$dropdown.hasClass('open')) {
|
|
||||||
$dropdown.css('visibility','hidden');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
$('.archive').prop('disabled', true);
|
|
||||||
$('.archive:not(.dropdown-toggle)').click(function() {
|
|
||||||
submitForm('archive');
|
|
||||||
});
|
|
||||||
|
|
||||||
$('.selectAll').click(function() {
|
|
||||||
$(this).closest('table').find(':checkbox:not(:disabled)').prop('checked', this.checked);
|
|
||||||
});
|
|
||||||
|
|
||||||
function setArchiveEnabled() {
|
|
||||||
var checked = $('tbody :checkbox:checked').length > 0;
|
|
||||||
$('button.archive').prop('disabled', !checked);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@stop
|
@stop
|
@ -60,9 +60,9 @@
|
|||||||
|
|
||||||
$('#payment_type_id').combobox();
|
$('#payment_type_id').combobox();
|
||||||
|
|
||||||
@if (!$clientPublicId)
|
@if (!$payment && !$clientPublicId)
|
||||||
$('.client-select input.form-control').focus();
|
$('.client-select input.form-control').focus();
|
||||||
@elseif (!$invoicePublicId)
|
@elseif (!$payment && !$invoicePublicId)
|
||||||
$('.invoice-select input.form-control').focus();
|
$('.invoice-select input.form-control').focus();
|
||||||
@elseif (!$payment)
|
@elseif (!$payment)
|
||||||
$('#amount').focus();
|
$('#amount').focus();
|
||||||
|
Loading…
Reference in New Issue
Block a user