Merge branch 'develop' of github.com:invoiceninja/invoiceninja into develop

This commit is contained in:
Hillel Coren 2019-04-29 15:34:41 +03:00
commit 17b72a8d95
18 changed files with 418 additions and 35 deletions

View File

@ -141,8 +141,14 @@ class SendReminders extends Command
$account->loadLocalizationSettings($invoice->client); // support trans to add fee line item $account->loadLocalizationSettings($invoice->client); // support trans to add fee line item
$number = preg_replace('/[^0-9]/', '', $reminder); $number = preg_replace('/[^0-9]/', '', $reminder);
$amount = $account->account_email_settings->{"late_fee{$number}_amount"}; if ($invoice->isQuote()) {
$percent = $account->account_email_settings->{"late_fee{$number}_percent"}; $amount = $account->account_email_settings->{"late_fee_quote{$number}_amount"};
$percent = $account->account_email_settings->{"late_fee_quote{$number}_percent"};
} else {
$amount = $account->account_email_settings->{"late_fee{$number}_amount"};
$percent = $account->account_email_settings->{"late_fee{$number}_percent"};
}
$this->invoiceRepo->setLateFee($invoice, $amount, $percent); $this->invoiceRepo->setLateFee($invoice, $amount, $percent);
} }
} }
@ -184,6 +190,18 @@ class SendReminders extends Command
$this->info(date('r') . ' Send email: ' . $invoice->id); $this->info(date('r') . ' Send email: ' . $invoice->id);
dispatch(new SendInvoiceEmail($invoice, $invoice->user_id, 'reminder4')); dispatch(new SendInvoiceEmail($invoice, $invoice->user_id, 'reminder4'));
} }
// endless quote reminders
$invoices = $this->invoiceRepo->findNeedingEndlessReminding($account, true);
$this->info(date('r ') . $account->name . ': ' . $invoices->count() . ' endless quotes found');
foreach ($invoices as $invoice) {
if ($invoice->last_sent_date == date('Y-m-d')) {
continue;
}
$this->info(date('r') . ' Send email: ' . $invoice->id);
dispatch(new SendInvoiceEmail($invoice, $invoice->user_id, 'quote_reminder4'));
}
} }
} }

View File

@ -513,6 +513,10 @@ if (! defined('APP_NAME')) {
define('TEMPLATE_REMINDER2', 'reminder2'); define('TEMPLATE_REMINDER2', 'reminder2');
define('TEMPLATE_REMINDER3', 'reminder3'); define('TEMPLATE_REMINDER3', 'reminder3');
define('TEMPLATE_REMINDER4', 'reminder4'); define('TEMPLATE_REMINDER4', 'reminder4');
define('TEMPLATE_QUOTE_REMINDER1', 'quote_reminder1');
define('TEMPLATE_QUOTE_REMINDER2', 'quote_reminder2');
define('TEMPLATE_QUOTE_REMINDER3', 'quote_reminder3');
define('TEMPLATE_QUOTE_REMINDER4', 'quote_reminder4');
define('CUSTOM_MESSAGE_DASHBOARD', 'dashboard'); define('CUSTOM_MESSAGE_DASHBOARD', 'dashboard');
define('CUSTOM_MESSAGE_UNPAID_INVOICE', 'unpaid_invoice'); define('CUSTOM_MESSAGE_UNPAID_INVOICE', 'unpaid_invoice');

View File

@ -940,7 +940,7 @@ class AccountController extends BaseController
$account->account_email_settings->$bodyField = ($body == $account->getDefaultEmailTemplate($type) ? null : $body); $account->account_email_settings->$bodyField = ($body == $account->getDefaultEmailTemplate($type) ? null : $body);
} }
foreach ([TEMPLATE_REMINDER1, TEMPLATE_REMINDER2, TEMPLATE_REMINDER3] as $type) { foreach ([TEMPLATE_REMINDER1, TEMPLATE_REMINDER2, TEMPLATE_REMINDER3, TEMPLATE_QUOTE_REMINDER1, TEMPLATE_QUOTE_REMINDER2, TEMPLATE_QUOTE_REMINDER3] as $type) {
$enableField = "enable_{$type}"; $enableField = "enable_{$type}";
$account->account_email_settings->$enableField = Input::get($enableField) ? true : false; $account->account_email_settings->$enableField = Input::get($enableField) ? true : false;
$account->account_email_settings->{"num_days_{$type}"} = Input::get("num_days_{$type}"); $account->account_email_settings->{"num_days_{$type}"} = Input::get("num_days_{$type}");
@ -948,13 +948,21 @@ class AccountController extends BaseController
$account->account_email_settings->{"direction_{$type}"} = Input::get("field_{$type}") == REMINDER_FIELD_INVOICE_DATE ? REMINDER_DIRECTION_AFTER : Input::get("direction_{$type}"); $account->account_email_settings->{"direction_{$type}"} = Input::get("field_{$type}") == REMINDER_FIELD_INVOICE_DATE ? REMINDER_DIRECTION_AFTER : Input::get("direction_{$type}");
$number = preg_replace('/[^0-9]/', '', $type); $number = preg_replace('/[^0-9]/', '', $type);
$account->account_email_settings->{"late_fee{$number}_amount"} = Input::get("late_fee{$number}_amount"); if (strpos($type, 'quote') !== false) {
$account->account_email_settings->{"late_fee{$number}_percent"} = Input::get("late_fee{$number}_percent"); $account->account_email_settings->{"late_fee_quote{$number}_amount"} = Input::get("late_fee_quote{$number}_amount");
$account->account_email_settings->{"late_fee_quote{$number}_percent"} = Input::get("late_fee_quote{$number}_percent");
} else {
$account->account_email_settings->{"late_fee{$number}_amount"} = Input::get("late_fee{$number}_amount");
$account->account_email_settings->{"late_fee{$number}_percent"} = Input::get("late_fee{$number}_percent");
}
} }
$account->account_email_settings->enable_reminder4 = Input::get('enable_reminder4') ? true : false; $account->account_email_settings->enable_reminder4 = Input::get('enable_reminder4') ? true : false;
$account->account_email_settings->frequency_id_reminder4 = Input::get('frequency_id_reminder4'); $account->account_email_settings->frequency_id_reminder4 = Input::get('frequency_id_reminder4');
$account->account_email_settings->enable_quote_reminder4 = Input::get('enable_quote_reminder4') ? true : false;
$account->account_email_settings->frequency_id_quote_reminder4 = Input::get('frequency_id_quote_reminder4');
$account->save(); $account->save();
$account->account_email_settings->save(); $account->account_email_settings->save();

View File

@ -46,6 +46,14 @@ class RunReport extends Job
$startDate = Carbon::now()->subMonth()->firstOfMonth()->toDateString(); $startDate = Carbon::now()->subMonth()->firstOfMonth()->toDateString();
$endDate = Carbon::now()->subMonth()->lastOfMonth()->toDateString(); $endDate = Carbon::now()->subMonth()->lastOfMonth()->toDateString();
break; break;
case 'this_quarter':
$startDate = Carbon::now()->firstOfQuarter()->toDateString();
$endDate = Carbon::now()->lastOfQuarter()->toDateString();
break;
case 'last_quarter':
$startDate = Carbon::now()->subMonth(3)->firstOfQuarter()->toDateString();
$endDate = Carbon::now()->subMonth(3)->lastOfQuarter()->toDateString();
break;
case 'this_year': case 'this_year':
$startDate = Carbon::now()->firstOfYear()->toDateString(); $startDate = Carbon::now()->firstOfYear()->toDateString();
$endDate = Carbon::now()->lastOfYear()->toDateString(); $endDate = Carbon::now()->lastOfYear()->toDateString();

View File

@ -46,6 +46,31 @@ class AccountEmailSettings extends Eloquent
'field_reminder1', 'field_reminder1',
'field_reminder2', 'field_reminder2',
'field_reminder3', 'field_reminder3',
'email_subject_quote_reminder1',
'email_subject_quote_reminder2',
'email_subject_quote_reminder3',
'email_template_quote_reminder1',
'email_template_quote_reminder2',
'email_template_quote_reminder3',
'late_fee_quote1_amount',
'late_fee_quote1_percent',
'late_fee_quote2_amount',
'late_fee_quote2_percent',
'late_fee_quote3_amount',
'late_fee_quote3_percent',
'enable_quote_reminder1',
'enable_quote_reminder2',
'enable_quote_reminder3',
'enable_quote_reminder4',
'num_days_quote_reminder1',
'num_days_quote_reminder2',
'num_days_quote_reminder3',
'direction_quote_reminder1',
'direction_quote_reminder2',
'direction_quote_reminder3',
'field_quote_reminder1',
'field_quote_reminder2',
'field_quote_reminder3',
'email_design_id', 'email_design_id',
'enable_email_markup', 'enable_email_markup',
'email_footer', 'email_footer',
@ -61,6 +86,10 @@ class AccountEmailSettings extends Eloquent
TEMPLATE_REMINDER2, TEMPLATE_REMINDER2,
TEMPLATE_REMINDER3, TEMPLATE_REMINDER3,
TEMPLATE_REMINDER4, TEMPLATE_REMINDER4,
TEMPLATE_QUOTE_REMINDER1,
TEMPLATE_QUOTE_REMINDER2,
TEMPLATE_QUOTE_REMINDER3,
TEMPLATE_QUOTE_REMINDER4,
]; ];
} }

View File

@ -136,12 +136,12 @@ trait SendsEmails
*/ */
public function getReminderDate($reminder, $filterEnabled = true) public function getReminderDate($reminder, $filterEnabled = true)
{ {
if ($filterEnabled && ! $this->account_email_settings->{"enable_reminder{$reminder}"}) { if ($filterEnabled && ! $this->account_email_settings->{"enable_{$reminder}"}) {
return false; return false;
} }
$numDays = $this->account_email_settings->{"num_days_reminder{$reminder}"}; $numDays = $this->account_email_settings->{"num_days_{$reminder}"};
$plusMinus = $this->account_email_settings->{"direction_reminder{$reminder}"} == REMINDER_DIRECTION_AFTER ? '-' : '+'; $plusMinus = $this->account_email_settings->{"direction_{$reminder}"} == REMINDER_DIRECTION_AFTER ? '-' : '+';
return date('Y-m-d', strtotime("$plusMinus $numDays days")); return date('Y-m-d', strtotime("$plusMinus $numDays days"));
} }
@ -153,16 +153,18 @@ trait SendsEmails
*/ */
public function getInvoiceReminder($invoice, $filterEnabled = true) public function getInvoiceReminder($invoice, $filterEnabled = true)
{ {
$reminder = $invoice->isQuote() ? 'quote_reminder' : 'reminder';
for ($i = 1; $i <= 3; $i++) { for ($i = 1; $i <= 3; $i++) {
if ($date = $this->getReminderDate($i, $filterEnabled)) { if ($date = $this->getReminderDate($reminder.$i, $filterEnabled)) {
if ($this->account_email_settings->{"field_reminder{$i}"} == REMINDER_FIELD_DUE_DATE) { if ($this->account_email_settings->{'field_'.$reminder.$i} == REMINDER_FIELD_DUE_DATE) {
if (($invoice->partial && $invoice->partial_due_date == $date) if (($invoice->partial && $invoice->partial_due_date == $date)
|| $invoice->due_date == $date) { || $invoice->due_date == $date) {
return "reminder{$i}"; return $reminder.$i;
} }
} else { } else {
if ($invoice->invoice_date == $date) { if ($invoice->invoice_date == $date) {
return "reminder{$i}"; return $reminder.$i;
} }
} }
} }

View File

@ -169,6 +169,8 @@ class AccountPresenter extends Presenter
"' . trans('texts.last_30_days') . '": [moment().subtract(29, "days"), moment()], "' . trans('texts.last_30_days') . '": [moment().subtract(29, "days"), moment()],
"' . trans('texts.this_month') . '": [moment().startOf("month"), moment().endOf("month")], "' . trans('texts.this_month') . '": [moment().startOf("month"), moment().endOf("month")],
"' . trans('texts.last_month') . '": [moment().subtract(1, "month").startOf("month"), moment().subtract(1, "month").endOf("month")], "' . trans('texts.last_month') . '": [moment().subtract(1, "month").startOf("month"), moment().subtract(1, "month").endOf("month")],
"' . trans('texts.current_quarter') . '": [moment().quarter(chartQuarter).startOf("quarter"), moment().quarter(chartQuarter).endOf("quarter")],
"' . trans('texts.last_quarter') . '": [moment().subtract(1, "quarter").startOf("quarter"), moment().subtract(1, "quarter").endOf("quarter")],
"' . trans('texts.this_year') . '": [moment().date(1).month(' . $month . ').year(' . $year . '), moment()], "' . trans('texts.this_year') . '": [moment().date(1).month(' . $month . ').year(' . $year . '), moment()],
"' . trans('texts.last_year') . '": [moment().date(1).month(' . $month . ').year(' . $lastYear . '), moment().date(1).month(' . $month . ').year(' . $year . ').subtract(1, "day")], "' . trans('texts.last_year') . '": [moment().date(1).month(' . $month . ').year(' . $lastYear . '), moment().date(1).month(' . $month . ').year(' . $year . ').subtract(1, "day")],
}'; }';

View File

@ -767,7 +767,7 @@ class AccountRepository
public function findWithReminders() public function findWithReminders()
{ {
return Account::whereHas('account_email_settings', function($query) { return Account::whereHas('account_email_settings', function($query) {
$query->whereRaw('enable_reminder1 = 1 OR enable_reminder2 = 1 OR enable_reminder3 = 1 OR enable_reminder4 = 1'); $query->whereRaw('enable_reminder1 = 1 OR enable_reminder2 = 1 OR enable_reminder3 = 1 OR enable_reminder4 = 1 OR enable_quote_reminder1 = 1 OR enable_quote_reminder2 = 1 OR enable_quote_reminder3 = 1 OR enable_quote_reminder4 = 1');
})->get(); })->get();
} }
@ -779,7 +779,13 @@ class AccountRepository
->orWhere('late_fee2_amount', '>', 0) ->orWhere('late_fee2_amount', '>', 0)
->orWhere('late_fee2_percent', '>', 0) ->orWhere('late_fee2_percent', '>', 0)
->orWhere('late_fee3_amount', '>', 0) ->orWhere('late_fee3_amount', '>', 0)
->orWhere('late_fee3_percent', '>', 0); ->orWhere('late_fee3_percent', '>', 0)
->orWhere('late_fee_quote1_amount', '>', 0)
->orWhere('late_fee_quote1_percent', '>', 0)
->orWhere('late_fee_quote2_amount', '>', 0)
->orWhere('late_fee_quote2_percent', '>', 0)
->orWhere('late_fee_quote3_amount', '>', 0)
->orWhere('late_fee_quote3_percent', '>', 0);
})->get(); })->get();
} }

View File

@ -1198,13 +1198,20 @@ class InvoiceRepository extends BaseRepository
$dates = []; $dates = [];
for ($i = 1; $i <= 3; $i++) { for ($i = 1; $i <= 3; $i++) {
if ($date = $account->getReminderDate($i, $filterEnabled)) { if ($date = $account->getReminderDate('reminder'.$i, $filterEnabled)) {
if ($account->account_email_settings->{"field_reminder{$i}"} == REMINDER_FIELD_DUE_DATE) { if ($account->account_email_settings->{"field_reminder{$i}"} == REMINDER_FIELD_DUE_DATE) {
$dates[] = "(due_date = '$date' OR partial_due_date = '$date')"; $dates[] = "(due_date = '$date' OR partial_due_date = '$date')";
} else { } else {
$dates[] = "invoice_date = '$date'"; $dates[] = "invoice_date = '$date'";
} }
} }
if ($date = $account->getReminderDate('quote_reminder'.$i, $filterEnabled)) {
if ($account->account_email_settings->{"field_quote_reminder{$i}"} == REMINDER_FIELD_DUE_DATE) {
$dates[] = "(due_date = '$date' OR partial_due_date = '$date')";
} else {
$dates[] = "invoice_date = '$date'";
}
}
} }
if (! count($dates)) { if (! count($dates)) {
@ -1212,8 +1219,7 @@ class InvoiceRepository extends BaseRepository
} }
$sql = implode(' OR ', $dates); $sql = implode(' OR ', $dates);
$invoices = Invoice::invoiceType(INVOICE_TYPE_STANDARD) $invoices = Invoice::with('client', 'invoice_items')
->with('client', 'invoice_items')
->whereHas('client', function ($query) { ->whereHas('client', function ($query) {
$query->whereSendReminders(true); $query->whereSendReminders(true);
}) })
@ -1227,12 +1233,19 @@ class InvoiceRepository extends BaseRepository
return $invoices; return $invoices;
} }
public function findNeedingEndlessReminding(Account $account) public function findNeedingEndlessReminding(Account $account, $quote = false)
{ {
$settings = $account->account_email_settings; $invoiceType = INVOICE_TYPE_STANDARD;
$frequencyId = $settings->frequency_id_reminder4; $reminder = 'reminder';
if ($quote) {
$reminder = 'quote_reminder';
$invoiceType = INVOICE_TYPE_QUOTE;
}
if (! $frequencyId || ! $account->account_email_settings->enable_reminder4) { $settings = $account->account_email_settings;
$frequencyId = $settings->{"frequency_id_{$reminder}4"};
if (! $frequencyId || ! $account->account_email_settings->{"enable_{$reminder}4"}) {
return collect(); return collect();
} }
@ -1240,7 +1253,7 @@ class InvoiceRepository extends BaseRepository
$lastSentDate = date_create(); $lastSentDate = date_create();
$lastSentDate->sub(date_interval_create_from_date_string($frequency->date_interval)); $lastSentDate->sub(date_interval_create_from_date_string($frequency->date_interval));
$invoices = Invoice::invoiceType(INVOICE_TYPE_STANDARD) $invoices = Invoice::invoiceType($invoiceType)
->with('client', 'invoice_items') ->with('client', 'invoice_items')
->whereHas('client', function ($query) { ->whereHas('client', function ($query) {
$query->whereSendReminders(true); $query->whereSendReminders(true);
@ -1252,13 +1265,13 @@ class InvoiceRepository extends BaseRepository
->where('last_sent_date', '<', $lastSentDate); ->where('last_sent_date', '<', $lastSentDate);
for ($i=1; $i<=3; $i++) { for ($i=1; $i<=3; $i++) {
if (!$account->account_email_settings->{"enable_reminder{$i}"}) { if (!$account->account_email_settings->{"enable_{$reminder}{$i}"}) {
continue; continue;
} }
$field = $account->account_email_settings->{"field_reminder{$i}"} == REMINDER_FIELD_DUE_DATE ? 'due_date' : 'invoice_date'; $field = $account->account_email_settings->{"field_{$reminder}{$i}"} == REMINDER_FIELD_DUE_DATE ? 'due_date' : 'invoice_date';
$date = date_create(); $date = date_create();
if ($account->account_email_settings->{"direction_reminder{$i}"} == REMINDER_DIRECTION_AFTER) { if ($account->account_email_settings->{"direction_{$reminder}{$i}"} == REMINDER_DIRECTION_AFTER) {
$date->sub(date_interval_create_from_date_string($account->account_email_settings->{"num_days_reminder{$i}"} . ' days')); $date->sub(date_interval_create_from_date_string($account->account_email_settings->{"num_days_{$reminder}{$i}"} . ' days'));
} }
$invoices->where($field, '<', $date); $invoices->where($field, '<', $date);
} }

View File

@ -0,0 +1,100 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddQuoteReminders extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('account_email_settings', function ($table) {
$table->string('email_subject_quote_reminder1');
$table->string('email_subject_quote_reminder2');
$table->string('email_subject_quote_reminder3');
$table->string('email_subject_quote_reminder4');
$table->text('email_template_quote_reminder1');
$table->text('email_template_quote_reminder2');
$table->text('email_template_quote_reminder3');
$table->text('email_template_quote_reminder4');
$table->boolean('enable_quote_reminder1')->default(false);
$table->boolean('enable_quote_reminder2')->default(false);
$table->boolean('enable_quote_reminder3')->default(false);
$table->boolean('enable_quote_reminder4')->default(false);
$table->smallInteger('num_days_quote_reminder1')->default(7);
$table->smallInteger('num_days_quote_reminder2')->default(14);
$table->smallInteger('num_days_quote_reminder3')->default(30);
$table->smallInteger('direction_quote_reminder1')->default(1);
$table->smallInteger('direction_quote_reminder2')->default(1);
$table->smallInteger('direction_quote_reminder3')->default(1);
$table->smallInteger('field_quote_reminder1')->default(1);
$table->smallInteger('field_quote_reminder2')->default(1);
$table->smallInteger('field_quote_reminder3')->default(1);
$table->unsignedInteger('frequency_id_quote_reminder4')->nullable();
$table->decimal('late_fee_quote1_amount', 13, 2)->nullable();
$table->decimal('late_fee_quote1_percent', 13, 3)->nullable();
$table->decimal('late_fee_quote2_amount', 13, 2)->nullable();
$table->decimal('late_fee_quote2_percent', 13, 3)->nullable();
$table->decimal('late_fee_quote3_amount', 13, 2)->nullable();
$table->decimal('late_fee_quote3_percent', 13, 3)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('account_email_settings', function ($table) {
$table->dropColumn('email_subject_quote_reminder1');
$table->dropColumn('email_subject_quote_reminder2');
$table->dropColumn('email_subject_quote_reminder3');
$table->dropColumn('email_subject_quote_reminder4');
$table->dropColumn('email_template_quote_reminder1');
$table->dropColumn('email_template_quote_reminder2');
$table->dropColumn('email_template_quote_reminder3');
$table->dropColumn('email_template_quote_reminder4');
$table->dropColumn('enable_quote_reminder1');
$table->dropColumn('enable_quote_reminder2');
$table->dropColumn('enable_quote_reminder3');
$table->dropColumn('enable_quote_reminder4');
$table->dropColumn('num_days_quote_reminder1');
$table->dropColumn('num_days_quote_reminder2');
$table->dropColumn('num_days_quote_reminder3');
$table->dropColumn('direction_quote_reminder1');
$table->dropColumn('direction_quote_reminder2');
$table->dropColumn('direction_quote_reminder3');
$table->dropColumn('field_quote_reminder1');
$table->dropColumn('field_quote_reminder2');
$table->dropColumn('field_quote_reminder3');
$table->dropColumn('frequency_id_quote_reminder4');
$table->dropColumn('late_fee_quote1_amount');
$table->dropColumn('late_fee_quote1_percent');
$table->dropColumn('late_fee_quote2_amount');
$table->dropColumn('late_fee_quote2_percent');
$table->dropColumn('late_fee_quote3_amount');
$table->dropColumn('late_fee_quote3_percent');
});
}
}

View File

@ -689,6 +689,7 @@ $LANG = array(
'military_time' => '24 hodinový čas', 'military_time' => '24 hodinový čas',
'last_sent' => 'Poslední odeslány', 'last_sent' => 'Poslední odeslány',
'reminder_emails' => 'Připomínky emailem', 'reminder_emails' => 'Připomínky emailem',
'quote_reminder_emails' => 'Připomínky emailem (nabídky)',
'templates_and_reminders' => 'Šablony & Připomínky', 'templates_and_reminders' => 'Šablony & Připomínky',
'subject' => 'Předmět', 'subject' => 'Předmět',
'body' => 'Tělo', 'body' => 'Tělo',
@ -2067,6 +2068,8 @@ $LANG = array(
'last_30_days' => 'Poslední měsíc', 'last_30_days' => 'Poslední měsíc',
'this_month' => 'Tento měsíc', 'this_month' => 'Tento měsíc',
'last_month' => 'Last Month', 'last_month' => 'Last Month',
'current_quarter' => 'Aktuální čtvrtletí',
'last_quarter' => 'Poslední čtvrtletí',
'last_year' => 'Last Year', 'last_year' => 'Last Year',
'custom_range' => 'Custom Range', 'custom_range' => 'Custom Range',
'url' => 'URL', 'url' => 'URL',

View File

@ -135,6 +135,7 @@ $LANG = array(
'status' => 'Status', 'status' => 'Status',
'invoice_total' => 'Invoice Total', 'invoice_total' => 'Invoice Total',
'frequency' => 'Frequency', 'frequency' => 'Frequency',
'range' => 'Range',
'start_date' => 'Start Date', 'start_date' => 'Start Date',
'end_date' => 'End Date', 'end_date' => 'End Date',
'transaction_reference' => 'Transaction Reference', 'transaction_reference' => 'Transaction Reference',
@ -688,6 +689,7 @@ $LANG = array(
'military_time' => '24 Hour Time', 'military_time' => '24 Hour Time',
'last_sent' => 'Last Sent', 'last_sent' => 'Last Sent',
'reminder_emails' => 'Reminder Emails', 'reminder_emails' => 'Reminder Emails',
'quote_reminder_emails' => 'Quote Reminder Emails',
'templates_and_reminders' => 'Templates & Reminders', 'templates_and_reminders' => 'Templates & Reminders',
'subject' => 'Subject', 'subject' => 'Subject',
'body' => 'Body', 'body' => 'Body',
@ -2065,6 +2067,8 @@ $LANG = array(
'last_30_days' => 'Last 30 Days', 'last_30_days' => 'Last 30 Days',
'this_month' => 'This Month', 'this_month' => 'This Month',
'last_month' => 'Last Month', 'last_month' => 'Last Month',
'current_quarter' => 'Current Quarter',
'last_quarter' => 'Last Quarter',
'last_year' => 'Last Year', 'last_year' => 'Last Year',
'custom_range' => 'Custom Range', 'custom_range' => 'Custom Range',
'url' => 'URL', 'url' => 'URL',

View File

@ -0,0 +1,150 @@
<div role="tabpanel" class="tab-pane {{ isset($active) && $active ? 'active' : '' }}" id="{{ $field }}">
<div class="panel-body" style="padding-bottom: 0px">
@if (isset($isReminder) && $isReminder)
{!! Former::populateField('enable_' . $field, intval($account->{'enable_' . $field})) !!}
@if (floatval($fee = $account->account_email_settings->{"late_fee_quote{$number}_amount"}))
{!! Former::populateField('late_fee_quote' . $number . '_amount', $fee) !!}
@endif
@if (floatval($fee = $account->account_email_settings->{"late_fee_quote{$number}_percent"}))
{!! Former::populateField('late_fee_quote' . $number . '_percent', $fee) !!}
@endif
<div class="well" style="padding-bottom:20px">
<div class="row">
<div class="col-md-6">
@if ($field == 'quote_reminder4')
{!! Former::populateField('frequency_id_quote_reminder4', $account->account_email_settings->frequency_id_quote_reminder4) !!}
{!! Former::plaintext('frequency')
->value(
Former::select('frequency_id_quote_reminder4')
->options(\App\Models\Frequency::selectOptions())
->style('float:left;')
->raw()
) !!}
@else
{!! Former::populateField('num_days_' . $field, $account->account_email_settings->{'num_days_' . $field}) !!}
{!! Former::populateField('direction_' . $field, $account->account_email_settings->{'direction_' . $field}) !!}
{!! Former::populateField('field_' . $field, $account->account_email_settings->{'field_' . $field}) !!}
{!! Former::plaintext('schedule')
->value(
Former::input('num_days_' . $field)
->style('float:left;width:20%')
->raw() .
Former::select('direction_' . $field)
->addOption(trans('texts.days_before'), REMINDER_DIRECTION_BEFORE)
->addOption(trans('texts.days_after'), REMINDER_DIRECTION_AFTER)
->style('float:left;width:40%')
->raw() .
'<div id="days_after_'. $field .'" style="float:left;width:40%;display:none;padding-top:8px;padding-left:16px;font-size:16px;">' . trans('texts.days_after') . '</div>' .
Former::select('field_' . $field)
->addOption(trans('texts.field_due_date'), REMINDER_FIELD_DUE_DATE)
->addOption(trans('texts.field_invoice_date'), REMINDER_FIELD_INVOICE_DATE)
->style('float:left;width:40%')
->raw()
) !!}
@endif
</div>
<div class="col-md-6">
{!! Former::populateField('enable_' . $field, $account->account_email_settings->{'enable_' . $field}) !!}
{!! Former::checkbox('enable_' . $field)
->text('enable')
->label('send_email')
->value(1) !!}
</div>
</div>
@if ($field != 'quote_reminder4')
<div class="row" style="padding-top:30px">
<div class="col-md-6">
{!! Former::text('late_fee_quote' . $number . '_amount')
->label('late_fee_amount')
->type('number')
->step('any') !!}
</div>
<div class="col-md-6">
{!! Former::text('late_fee_quote' . $number . '_percent')
->label('late_fee_percent')
->type('number')
->step('any')
->append('%') !!}
</div>
</div>
@endif
</div>
<br/>
@endif
<div class="row">
<div class="col-md-6">
<div class="pull-right"><a href="#" onclick="return resetText('{{ 'subject' }}', '{{ $field }}')">{{ trans("texts.reset") }}</a></div>
{!! Former::text('email_subject_' . $field)
->label(trans('texts.subject'))
->appendIcon('question-sign')
->addGroupClass('email-subject') !!}
</div>
<div class="col-md-6">
<p>&nbsp;<p/>
<div id="{{ $field }}_subject_preview"></div>
</div>
</div>
<div class="row">
<br/>
<div class="col-md-6">
<div class="pull-right"><a href="#" onclick="return resetText('{{ 'template' }}', '{{ $field }}')">{{ trans("texts.reset") }}</a></div>
{!! Former::textarea('email_template_' . $field)
->label(trans('texts.body'))
->style('display:none') !!}
<div id="{{ $field }}Editor" class="form-control" style="min-height:160px">
</div>
</div>
<div class="col-md-6">
<p>&nbsp;<p/>
<div id="{{ $field }}_template_preview"></div>
</div>
</div>
<p>&nbsp;<p/>
<div class="row">
<div class="pull-left show-when-ready" style="display:none">
@include('partials/quill_toolbar', ['name' => $field])
</div>
<div class="pull-right" style="padding-top:13px;text-align:right">
{!! Button::normal(trans('texts.raw'))->withAttributes(['onclick' => 'showRaw("'.$field.'")'])->small() !!}
{!! Button::primary(trans('texts.preview'))->withAttributes(['onclick' => 'serverPreview("'.$field.'")'])->small() !!}
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(function() {
var editor = new Quill('#{{ $field }}Editor', {
modules: {
'toolbar': { container: '#{{ $field }}Toolbar' },
'link-tooltip': true
},
theme: 'snow'
});
editor.setHTML($('#email_template_{{ $field }}').val());
editor.on('text-change', function(delta, source) {
if (source == 'api') {
return;
}
var html = editors['{{ $field }}'].getHTML();
$('#email_template_{{ $field }}').val(html);
refreshPreview();
NINJA.formIsChanged = true;
});
editors['{{ $field }}'] = editor;
$('#field_{{ $field }}').change(function() {
setDirectionShown('{{ $field }}');
})
setDirectionShown('{{ $field }}');
$('.email-subject .input-group-addon').click(function() {
$('#templateHelpModal').modal('show');
});
});
</script>

View File

@ -88,6 +88,30 @@
</div> </div>
</div> </div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{!! trans('texts.quote_reminder_emails') !!}</h3>
</div>
<div class="panel-body">
<div class="row">
<div role="tabpanel">
<ul class="nav nav-tabs" role="tablist" style="border: none">
<li role="presentation" class="active"><a href="#quote_reminder1" aria-controls="notes" role="tab" data-toggle="tab">{{ trans('texts.first_reminder') }}</a></li>
<li role="presentation"><a href="#quote_reminder2" aria-controls="terms" role="tab" data-toggle="tab">{{ trans('texts.second_reminder') }}</a></li>
<li role="presentation"><a href="#quote_reminder3" aria-controls="footer" role="tab" data-toggle="tab">{{ trans('texts.third_reminder') }}</a></li>
<li role="presentation"><a href="#quote_reminder4" aria-controls="footer" role="tab" data-toggle="tab">{{ trans('texts.endless_reminder') }}</a></li>
</ul>
<div class="tab-content">
@include('accounts.quote_template', ['field' => 'quote_reminder1', 'number' => 1, 'isReminder' => true, 'active' => true])
@include('accounts.quote_template', ['field' => 'quote_reminder2', 'number' => 2, 'isReminder' => true])
@include('accounts.quote_template', ['field' => 'quote_reminder3', 'number' => 3, 'isReminder' => true])
@include('accounts.quote_template', ['field' => 'quote_reminder4', 'number' => 4, 'isReminder' => true])
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="templatePreviewModal" tabindex="-1" role="dialog" aria-labelledby="templatePreviewModalLabel" aria-hidden="true"> <div class="modal fade" id="templatePreviewModal" tabindex="-1" role="dialog" aria-labelledby="templatePreviewModalLabel" aria-hidden="true">
<div class="modal-dialog" style="width:800px"> <div class="modal-dialog" style="width:800px">

View File

@ -22,6 +22,7 @@
var statementStartDate = moment("{{ $startDate }}"); var statementStartDate = moment("{{ $startDate }}");
var statementEndDate = moment("{{ $endDate }}"); var statementEndDate = moment("{{ $endDate }}");
var chartQuarter = moment().quarter();
var dateRanges = {!! $account->present()->dateRangeOptions !!}; var dateRanges = {!! $account->present()->dateRangeOptions !!};
function getPDFString(cb) { function getPDFString(cb) {

View File

@ -49,7 +49,7 @@
var label = " {!! trans('texts.expenses') !!}: "; var label = " {!! trans('texts.expenses') !!}: ";
} }
return label + formatMoney(item.yLabel, chartCurrencyId, account.country_id); return label + formatMoney(item.yLabel, realCurrencyId, account.country_id);
} }
} }
}, },
@ -73,7 +73,7 @@
ticks: { ticks: {
beginAtZero: true, beginAtZero: true,
callback: function(label, index, labels) { callback: function(label, index, labels) {
return formatMoney(label, chartCurrencyId, account.country_id); return formatMoney(label, realCurrencyId, account.country_id);
} }
}, },
}] }]
@ -85,7 +85,9 @@
var account = {!! $account !!}; var account = {!! $account !!};
var chartGroupBy = 'day'; var chartGroupBy = 'day';
var realCurrencyId = {{ $account->getCurrencyId() }};
var chartCurrencyId = {{ $account->getCurrencyId() }}; var chartCurrencyId = {{ $account->getCurrencyId() }};
var chartQuarter = moment().quarter();
var dateRanges = {!! $account->present()->dateRangeOptions !!}; var dateRanges = {!! $account->present()->dateRangeOptions !!};
var chartStartDate; var chartStartDate;
var chartEndDate; var chartEndDate;
@ -160,10 +162,11 @@
t.addClass("active").siblings().removeClass("active"); t.addClass("active").siblings().removeClass("active");
if(t.attr("data-button") === "totals"){ if(t.attr("data-button") === "totals"){
realCurrencyId = account.currency.id;
chartCurrencyId = 'totals'; chartCurrencyId = "totals";
}else { }else {
chartCurrencyId = currencyMap[t.text()].id; realCurrencyId = currencyMap[t.text()].id;
chartCurrencyId = realCurrencyId;
} }
displayTotalsNote(); displayTotalsNote();
@ -190,10 +193,6 @@
response = JSON.parse(response); response = JSON.parse(response);
loadChart(response.data); loadChart(response.data);
var realCurrencyId = chartCurrencyId;
if(chartCurrencyId === "totals") realCurrencyId = account.currency.id;
var totals = response.totals; var totals = response.totals;
$('.revenue-div').text(formatMoney(totals.revenue, realCurrencyId, account.country_id)); $('.revenue-div').text(formatMoney(totals.revenue, realCurrencyId, account.country_id));
$('.outstanding-div').text(formatMoney(totals.balance, realCurrencyId, account.country_id)); $('.outstanding-div').text(formatMoney(totals.balance, realCurrencyId, account.country_id));

View File

@ -92,6 +92,7 @@
} }
var account = {!! $account !!}; var account = {!! $account !!};
var chartQuarter = moment().quarter();
var dateRanges = {!! $account->present()->dateRangeOptions !!}; var dateRanges = {!! $account->present()->dateRangeOptions !!};
var chartStartDate; var chartStartDate;
var chartEndDate; var chartEndDate;

View File

@ -63,6 +63,7 @@
var chartStartDate = moment("{{ $startDate }}"); var chartStartDate = moment("{{ $startDate }}");
var chartEndDate = moment("{{ $endDate }}"); var chartEndDate = moment("{{ $endDate }}");
var chartQuarter = moment().quarter();
var dateRanges = {!! $account->present()->dateRangeOptions !!}; var dateRanges = {!! $account->present()->dateRangeOptions !!};
function resolveRange(range) { function resolveRange(range) {
@ -358,6 +359,16 @@
<div id="scheduleHelp"></div> <div id="scheduleHelp"></div>
</center> </center>
{!! Former::select('range')
->addOption(trans('texts.none'), '')
->addOption(trans('texts.this_month'), 'this_month')
->addOption(trans('texts.last_month'), 'last_month')
->addOption(trans('texts.current_quarter'), 'this_quarter')
->addOption(trans('texts.last_quarter'), 'last_quarter')
->addOption(trans('texts.this_year'), 'this_year')
->addOption(trans('texts.last_year'), 'last_year')
->value('') !!}
{!! Former::select('frequency') {!! Former::select('frequency')
->addOption(trans('texts.freq_daily'), REPORT_FREQUENCY_DAILY) ->addOption(trans('texts.freq_daily'), REPORT_FREQUENCY_DAILY)
->addOption(trans('texts.freq_weekly'), REPORT_FREQUENCY_WEEKLY) ->addOption(trans('texts.freq_weekly'), REPORT_FREQUENCY_WEEKLY)