mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-09-20 00:11:35 +02:00
Working on invoice fields
This commit is contained in:
parent
03cc5035c5
commit
d14cf5f9ed
@ -543,6 +543,8 @@ class AccountController extends BaseController
|
||||
$invoice->terms = trim($account->invoice_terms);
|
||||
$invoice->invoice_footer = trim($account->invoice_footer);
|
||||
|
||||
$contact->first_name = 'Test';
|
||||
$contact->last_name = 'Contact';
|
||||
$contact->email = 'contact@gmail.com';
|
||||
$client->contacts = [$contact];
|
||||
|
||||
@ -1026,7 +1028,7 @@ class AccountController extends BaseController
|
||||
$labels[$field] = Input::get("labels_{$field}");
|
||||
}
|
||||
$account->invoice_labels = json_encode($labels);
|
||||
$account->invoice_fields = Input::get('invoice_fields');
|
||||
$account->invoice_fields = Input::get('invoice_fields_json');
|
||||
|
||||
$account->save();
|
||||
|
||||
|
@ -825,7 +825,7 @@ if (!defined('CONTACT_EMAIL')) {
|
||||
|
||||
define('INVOICE_FIELDS_CLIENT', 'client_fields');
|
||||
define('INVOICE_FIELDS_INVOICE', 'invoice_fields');
|
||||
define('INVOICE_FIELDS_COMPANY', 'company_fields');
|
||||
define('INVOICE_FIELDS_ACCOUNT', 'account_fields');
|
||||
|
||||
$creditCards = [
|
||||
1 => ['card' => 'images/credit_cards/Test-Visa-Icon.png', 'text' => 'Visa'],
|
||||
|
@ -721,6 +721,7 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
'invoice_embed_documents',
|
||||
'page_size',
|
||||
'include_item_taxes_inline',
|
||||
'invoice_fields',
|
||||
]);
|
||||
|
||||
foreach ($this->invoice_items as $invoiceItem) {
|
||||
|
@ -9,63 +9,69 @@ trait PresentsInvoice
|
||||
{
|
||||
if ($this->invoice_fields) {
|
||||
$fields = json_decode($this->invoice_fields, true);
|
||||
return $this->applyLabels($fields);
|
||||
} else {
|
||||
$fields = [
|
||||
INVOICE_FIELDS_INVOICE => [
|
||||
'invoice_number',
|
||||
'po_number',
|
||||
'invoice_date',
|
||||
'due_date',
|
||||
'balance_due',
|
||||
'partial_due',
|
||||
],
|
||||
INVOICE_FIELDS_CLIENT => [
|
||||
'client_name',
|
||||
'id_number',
|
||||
'vat_number',
|
||||
'address1',
|
||||
'address2',
|
||||
'city_state_postal',
|
||||
'country',
|
||||
'email',
|
||||
],
|
||||
'company_fields1' => [
|
||||
'company_name',
|
||||
'id_number',
|
||||
'vat_number',
|
||||
'website',
|
||||
'email',
|
||||
'phone',
|
||||
|
||||
],
|
||||
'company_fields2' => [
|
||||
'address1',
|
||||
'address2',
|
||||
'city_state_postal',
|
||||
'country',
|
||||
],
|
||||
];
|
||||
|
||||
if ($this->custom_invoice_text_label1) {
|
||||
$fields[INVOICE_FIELDS_INVOICE][] = 'custom_invoice_text_label1';
|
||||
}
|
||||
if ($this->custom_invoice_text_label2) {
|
||||
$fields[INVOICE_FIELDS_INVOICE][] = 'custom_invoice_text_label2';
|
||||
}
|
||||
if ($this->custom_client_label1) {
|
||||
$fields[INVOICE_FIELDS_CLIENT][] = 'custom_client_label1';
|
||||
}
|
||||
if ($this->custom_client_label2) {
|
||||
$fields[INVOICE_FIELDS_CLIENT][] = 'custom_client_label2';
|
||||
}
|
||||
if ($this->custom_label1) {
|
||||
$fields['company_fields2'][] = 'custom_label1';
|
||||
}
|
||||
if ($this->custom_label2) {
|
||||
$fields['company_fields2'][] = 'custom_label2';
|
||||
}
|
||||
return $this->getDefaultInvoiceFields();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function getDefaultInvoiceFields()
|
||||
{
|
||||
$fields = [
|
||||
INVOICE_FIELDS_INVOICE => [
|
||||
'invoice.invoice_number',
|
||||
'invoice.po_number',
|
||||
'invoice.invoice_date',
|
||||
'invoice.due_date',
|
||||
'invoice.balance_due',
|
||||
'invoice.partial_due',
|
||||
],
|
||||
INVOICE_FIELDS_CLIENT => [
|
||||
'client.client_name',
|
||||
'client.id_number',
|
||||
'client.vat_number',
|
||||
'client.address1',
|
||||
'client.address2',
|
||||
'client.city_state_postal',
|
||||
'client.country',
|
||||
'client.email',
|
||||
],
|
||||
'account_fields1' => [
|
||||
'account.company_name',
|
||||
'account.id_number',
|
||||
'account.vat_number',
|
||||
'account.website',
|
||||
'account.email',
|
||||
'account.phone',
|
||||
|
||||
],
|
||||
'account_fields2' => [
|
||||
'account.address1',
|
||||
'account.address2',
|
||||
'account.city_state_postal',
|
||||
'account.country',
|
||||
],
|
||||
];
|
||||
|
||||
if ($this->custom_invoice_text_label1) {
|
||||
$fields[INVOICE_FIELDS_INVOICE][] = 'invoice.custom_text_value1';
|
||||
}
|
||||
if ($this->custom_invoice_text_label2) {
|
||||
$fields[INVOICE_FIELDS_INVOICE][] = 'invoice.custom_text_value2';
|
||||
}
|
||||
if ($this->custom_client_label1) {
|
||||
$fields[INVOICE_FIELDS_CLIENT][] = 'client.custom_value1';
|
||||
}
|
||||
if ($this->custom_client_label2) {
|
||||
$fields[INVOICE_FIELDS_CLIENT][] = 'client.custom_value2';
|
||||
}
|
||||
if ($this->custom_label1) {
|
||||
$fields['account_fields2'][] = 'account.custom_value1';
|
||||
}
|
||||
if ($this->custom_label2) {
|
||||
$fields['account_fields2'][] = 'account.custom_value2';
|
||||
}
|
||||
|
||||
return $this->applyLabels($fields);
|
||||
}
|
||||
|
||||
@ -73,41 +79,41 @@ trait PresentsInvoice
|
||||
{
|
||||
$fields = [
|
||||
INVOICE_FIELDS_INVOICE => [
|
||||
'invoice_number',
|
||||
'po_number',
|
||||
'invoice_date',
|
||||
'due_date',
|
||||
'balance_due',
|
||||
'partial_due',
|
||||
'custom_invoice_text_label1',
|
||||
'custom_invoice_text_label2',
|
||||
'invoice.invoice_number',
|
||||
'invoice.po_number',
|
||||
'invoice.invoice_date',
|
||||
'invoice.due_date',
|
||||
'invoice.balance_due',
|
||||
'invoice.partial_due',
|
||||
'invoice.custom_text_value1',
|
||||
'invoice.custom_text_value2',
|
||||
],
|
||||
INVOICE_FIELDS_CLIENT => [
|
||||
'client_name',
|
||||
'id_number',
|
||||
'vat_number',
|
||||
'address1',
|
||||
'address2',
|
||||
'city_state_postal',
|
||||
'country',
|
||||
'email',
|
||||
'contact_name',
|
||||
'custom_client_label1',
|
||||
'custom_client_label2',
|
||||
'client.client_name',
|
||||
'client.id_number',
|
||||
'client.vat_number',
|
||||
'client.address1',
|
||||
'client.address2',
|
||||
'client.city_state_postal',
|
||||
'client.country',
|
||||
'client.email',
|
||||
'client.contact_name',
|
||||
'client.custom_value1',
|
||||
'client.custom_value2',
|
||||
],
|
||||
INVOICE_FIELDS_COMPANY => [
|
||||
'company_name',
|
||||
'id_number',
|
||||
'vat_number',
|
||||
'website',
|
||||
'email',
|
||||
'phone',
|
||||
'address1',
|
||||
'address2',
|
||||
'city_state_postal',
|
||||
'country',
|
||||
'custom_label1',
|
||||
'custom_label2',
|
||||
INVOICE_FIELDS_ACCOUNT => [
|
||||
'account.company_name',
|
||||
'account.id_number',
|
||||
'account.vat_number',
|
||||
'account.website',
|
||||
'account.email',
|
||||
'account.phone',
|
||||
'account.address1',
|
||||
'account.address2',
|
||||
'account.city_state_postal',
|
||||
'account.country',
|
||||
'account.custom_value1',
|
||||
'account.custom_value2',
|
||||
]
|
||||
];
|
||||
|
||||
@ -120,7 +126,12 @@ trait PresentsInvoice
|
||||
|
||||
foreach ($fields as $section => $sectionFields) {
|
||||
foreach ($sectionFields as $index => $field) {
|
||||
$fields[$section][$field] = $labels[$field];
|
||||
list($entityType, $fieldName) = explode('.', $field);
|
||||
if (substr($fieldName, 0, 6) == 'custom') {
|
||||
$fields[$section][$field] = $labels[$field];
|
||||
} else {
|
||||
$fields[$section][$field] = $labels[$fieldName];
|
||||
}
|
||||
unset($fields[$section][$index]);
|
||||
}
|
||||
}
|
||||
@ -200,14 +211,14 @@ trait PresentsInvoice
|
||||
}
|
||||
|
||||
foreach ([
|
||||
'custom_label1',
|
||||
'custom_label2',
|
||||
'custom_client_label1',
|
||||
'custom_client_label2',
|
||||
'custom_invoice_text_label1',
|
||||
'custom_invoice_text_label2',
|
||||
] as $field) {
|
||||
$data[$field] = $this->$field ?: trans('texts.custom_field');
|
||||
'invoice.custom_text_value1' => 'custom_invoice_text_label1',
|
||||
'invoice.custom_text_value2' => 'custom_invoice_text_label2',
|
||||
'client.custom_value1' => 'custom_client_label1',
|
||||
'client.custom_value2' => 'custom_client_label2',
|
||||
'account.custom_value1' => 'custom_label1',
|
||||
'account.custom_value2' => 'custom_label2'
|
||||
] as $field => $property) {
|
||||
$data[$field] = $this->$property ?: trans('texts.custom_field');
|
||||
}
|
||||
|
||||
return $data;
|
||||
|
@ -204,6 +204,7 @@ class AccountRepository
|
||||
['custom_fields', '/settings/invoice_settings'],
|
||||
['invoice_number', '/settings/invoice_settings'],
|
||||
['buy_now_buttons', '/settings/client_portal#buyNow'],
|
||||
['invoice_fields', '/settings/invoice_design#invoice_fields'],
|
||||
]);
|
||||
|
||||
$settings = array_merge(Account::$basicSettings, Account::$advancedSettings);
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -563,122 +563,254 @@ NINJA.subtotalsBalance = function(invoice) {
|
||||
|
||||
NINJA.accountDetails = function(invoice) {
|
||||
var account = invoice.account;
|
||||
var data = [
|
||||
{text:account.name, style: ['accountName']},
|
||||
{text:account.id_number, style: ['idNumber']},
|
||||
{text:account.vat_number, style: ['vatNumber']},
|
||||
{text:account.website, style: ['website']},
|
||||
{text:account.work_email, style: ['email']},
|
||||
{text:account.work_phone, style: ['phone']}
|
||||
];
|
||||
if (invoice.features.invoice_settings && account.invoice_fields) {
|
||||
var fields = JSON.parse(account.invoice_fields);
|
||||
} else {
|
||||
var fields = [
|
||||
'account.company_name',
|
||||
'account.id_number',
|
||||
'account.vat_number',
|
||||
'account.website',
|
||||
'account.email',
|
||||
'account.phone',
|
||||
];
|
||||
}
|
||||
|
||||
var data = [];
|
||||
|
||||
for (var i=0; i < fields.account_fields1.length; i++) {
|
||||
var field = fields.account_fields1[i];
|
||||
var value = NINJA.renderClientOrAccountField(invoice, field);
|
||||
if (value) {
|
||||
data.push(value);
|
||||
}
|
||||
}
|
||||
|
||||
return NINJA.prepareDataList(data, 'accountDetails');
|
||||
}
|
||||
|
||||
NINJA.accountAddress = function(invoice) {
|
||||
var account = invoice.account;
|
||||
var cityStatePostal = '';
|
||||
if (account.city || account.state || account.postal_code) {
|
||||
var swap = account.country && account.country.swap_postal_code;
|
||||
cityStatePostal = formatAddress(account.city, account.state, account.postal_code, swap);
|
||||
if (invoice.features.invoice_settings && account.invoice_fields) {
|
||||
var fields = JSON.parse(account.invoice_fields);
|
||||
} else {
|
||||
var fields = [
|
||||
'account.address1',
|
||||
'account.address2',
|
||||
'account.city_state_postal',
|
||||
'account.country',
|
||||
'account.custom_value1',
|
||||
'account.custom_value2',
|
||||
]
|
||||
}
|
||||
var data = [
|
||||
{text: account.address1},
|
||||
{text: account.address2},
|
||||
{text: cityStatePostal},
|
||||
{text: account.country ? account.country.name : ''},
|
||||
];
|
||||
|
||||
if (invoice.features.invoice_settings) {
|
||||
data.push({text: invoice.account.custom_value1 ? invoice.account.custom_label1 + ' ' + invoice.account.custom_value1 : false});
|
||||
data.push({text: invoice.account.custom_value2 ? invoice.account.custom_label2 + ' ' + invoice.account.custom_value2 : false});
|
||||
var data = [];
|
||||
|
||||
for (var i=0; i < fields.account_fields2.length; i++) {
|
||||
var field = fields.account_fields2[i];
|
||||
var value = NINJA.renderClientOrAccountField(invoice, field);
|
||||
if (value) {
|
||||
data.push(value);
|
||||
}
|
||||
}
|
||||
|
||||
return NINJA.prepareDataList(data, 'accountAddress');
|
||||
}
|
||||
|
||||
NINJA.renderInvoiceField = function(invoice, field) {
|
||||
|
||||
var account = invoice.account;
|
||||
|
||||
if (field == 'invoice.invoice_number') {
|
||||
return [
|
||||
{text: (invoice.is_quote ? invoiceLabels.quote_number : invoiceLabels.invoice_number), style: ['invoiceNumberLabel']},
|
||||
{text: invoice.invoice_number, style: ['invoiceNumber']}
|
||||
];
|
||||
} else if (field == 'invoice.po_number') {
|
||||
return [
|
||||
{text: invoiceLabels.po_number},
|
||||
{text: invoice.po_number}
|
||||
];
|
||||
} else if (field == 'invoice.invoice_date') {
|
||||
return [
|
||||
{text: (invoice.is_quote ? invoiceLabels.quote_date : invoiceLabels.invoice_date)},
|
||||
{text: invoice.invoice_date}
|
||||
];
|
||||
} else if (field == 'invoice.due_date') {
|
||||
return [
|
||||
{text: (invoice.is_quote ? invoiceLabels.valid_until : invoiceLabels.due_date)},
|
||||
{text: invoice.is_recurring ? false : invoice.due_date}
|
||||
];
|
||||
} else if (field == 'invoice.custom_text_value1') {
|
||||
if (invoice.custom_text_value1 && account.custom_invoice_text_label1) {
|
||||
return [
|
||||
{text: invoice.account.custom_invoice_text_label1},
|
||||
{text: invoice.is_recurring ? processVariables(invoice.custom_text_value1) : invoice.custom_text_value1}
|
||||
];
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else if (field == 'invoice.custom_text_value2') {
|
||||
if (invoice.custom_text_value2 && account.custom_invoice_text_label2) {
|
||||
return [
|
||||
{text: invoice.account.custom_invoice_text_label2},
|
||||
{text: invoice.is_recurring ? processVariables(invoice.custom_text_value2) : invoice.custom_text_value2}
|
||||
];
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else if (field == 'invoice.balance_due') {
|
||||
return [
|
||||
{text: invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
|
||||
{text: formatMoneyInvoice(invoice.total_amount, invoice), style: ['invoiceDetailBalanceDue']}
|
||||
];
|
||||
} else if (field == invoice.partial_due) {
|
||||
if (NINJA.parseFloat(invoice.partial)) {
|
||||
return [
|
||||
{text: invoiceLabels.partial_due, style: ['invoiceDetailBalanceDueLabel']},
|
||||
{text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['invoiceDetailBalanceDue']}
|
||||
];
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NINJA.invoiceDetails = function(invoice) {
|
||||
|
||||
var data = [
|
||||
[
|
||||
{text: (invoice.is_quote ? invoiceLabels.quote_number : invoiceLabels.invoice_number), style: ['invoiceNumberLabel']},
|
||||
{text: invoice.invoice_number, style: ['invoiceNumber']}
|
||||
],
|
||||
[
|
||||
{text: invoiceLabels.po_number},
|
||||
{text: invoice.po_number}
|
||||
],
|
||||
[
|
||||
{text: (invoice.is_quote ? invoiceLabels.quote_date : invoiceLabels.invoice_date)},
|
||||
{text: invoice.invoice_date}
|
||||
],
|
||||
[
|
||||
{text: (invoice.is_quote ? invoiceLabels.valid_until : invoiceLabels.due_date)},
|
||||
{text: invoice.is_recurring ? false : invoice.due_date}
|
||||
]
|
||||
];
|
||||
|
||||
if (invoice.custom_text_value1) {
|
||||
data.push([
|
||||
{text: invoice.account.custom_invoice_text_label1},
|
||||
{text: invoice.is_recurring ? processVariables(invoice.custom_text_value1) : invoice.custom_text_value1}
|
||||
])
|
||||
}
|
||||
if (invoice.custom_text_value2) {
|
||||
data.push([
|
||||
{text: invoice.account.custom_invoice_text_label2},
|
||||
{text: invoice.is_recurring ? processVariables(invoice.custom_text_value2) : invoice.custom_text_value2}
|
||||
])
|
||||
var account = invoice.account;
|
||||
if (invoice.features.invoice_settings && account.invoice_fields) {
|
||||
var fields = JSON.parse(account.invoice_fields);
|
||||
} else {
|
||||
var fields = [
|
||||
'invoice.invoice_number',
|
||||
'invoice.po_number',
|
||||
'invoice.invoice_date',
|
||||
'invoice.due_date',
|
||||
'invoice.balance_due',
|
||||
'invoice.partial_due',
|
||||
'invoice.custom_text_value1',
|
||||
'invoice.custom_text_value2',
|
||||
];
|
||||
}
|
||||
var data = [];
|
||||
|
||||
data.push([
|
||||
{text: invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
|
||||
{text: formatMoneyInvoice(invoice.total_amount, invoice), style: ['invoiceDetailBalanceDue']}
|
||||
])
|
||||
|
||||
if (NINJA.parseFloat(invoice.partial)) {
|
||||
data.push([
|
||||
{text: invoiceLabels.partial_due, style: ['invoiceDetailBalanceDueLabel']},
|
||||
{text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['invoiceDetailBalanceDue']}
|
||||
])
|
||||
for (var i=0; i < fields.invoice_fields.length; i++) {
|
||||
var field = fields.invoice_fields[i];
|
||||
var value = NINJA.renderInvoiceField(invoice, field);
|
||||
if (value) {
|
||||
data.push(value);
|
||||
}
|
||||
}
|
||||
|
||||
return NINJA.prepareDataPairs(data, 'invoiceDetails');
|
||||
}
|
||||
|
||||
NINJA.clientDetails = function(invoice) {
|
||||
|
||||
NINJA.renderClientOrAccountField = function(invoice, field) {
|
||||
var client = invoice.client;
|
||||
var data;
|
||||
if (!client) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
var account = invoice.account;
|
||||
var contact = client.contacts[0];
|
||||
var clientName = client.name || (contact.first_name || contact.last_name ? (contact.first_name + ' ' + contact.last_name) : contact.email);
|
||||
var clientEmail = client.contacts[0].email == clientName ? '' : client.contacts[0].email;
|
||||
|
||||
var cityStatePostal = '';
|
||||
if (client.city || client.state || client.postal_code) {
|
||||
var swap = client.country && client.country.swap_postal_code;
|
||||
cityStatePostal = formatAddress(client.city, client.state, client.postal_code, swap);
|
||||
if (field == 'client.client_name') {
|
||||
var clientName = client.name || (contact.first_name || contact.last_name ? (contact.first_name + ' ' + contact.last_name) : contact.email);
|
||||
return {text:clientName || ' ', style: ['clientName']};
|
||||
} else if (field == 'client.contact_name') {
|
||||
return (contact.first_name || contact.last_name) ? {text:contact.first_name + ' ' + contact.last_name} : false;
|
||||
} else if (field == 'client.id_number') {
|
||||
return {text:client.id_number};
|
||||
} else if (field == 'client.vat_number') {
|
||||
return {text:client.vat_number};
|
||||
} else if (field == 'client.address1') {
|
||||
return {text:client.address1};
|
||||
} else if (field == 'client.address2') {
|
||||
return {text:client.address2};
|
||||
} else if (field == 'client.city_state_postal') {
|
||||
var cityStatePostal = '';
|
||||
if (client.city || client.state || client.postal_code) {
|
||||
var swap = client.country && client.country.swap_postal_code;
|
||||
cityStatePostal = formatAddress(client.city, client.state, client.postal_code, swap);
|
||||
}
|
||||
return {text:cityStatePostal};
|
||||
} else if (field == 'client.country') {
|
||||
return {text:client.country ? client.country.name : ''};
|
||||
} else if (field == 'client.email') {
|
||||
var clientEmail = contact.email == clientName ? '' : contact.email;
|
||||
return {text:clientEmail};
|
||||
} else if (field == 'client.custom_value1') {
|
||||
return {text: account.custom_client_label1 && client.custom_value1 ? account.custom_client_label1 + ' ' + client.custom_value1 : false};
|
||||
} else if (field == 'client.custom_value2') {
|
||||
return {text: account.custom_client_label2 && client.custom_value2 ? account.custom_client_label2 + ' ' + client.custom_value2 : false};
|
||||
}
|
||||
|
||||
// if a custom field is used in the invoice/quote number then we'll hide it from the PDF
|
||||
var pattern = invoice.is_quote ? account.quote_number_pattern : account.invoice_number_pattern;
|
||||
var custom1InPattern = (pattern && pattern.indexOf('{$custom1}') >= 0);
|
||||
var custom2InPattern = (pattern && pattern.indexOf('{$custom2}') >= 0);
|
||||
if (field == 'account.company_name') {
|
||||
return {text:account.name, style: ['accountName']};
|
||||
} else if (field == 'account.id_number') {
|
||||
return {text:account.id_number, style: ['idNumber']};
|
||||
} else if (field == 'account.vat_number') {
|
||||
return {text:account.vat_number, style: ['vatNumber']};
|
||||
} else if (field == 'account.website') {
|
||||
return {text:account.website, style: ['website']};
|
||||
} else if (field == 'account.email') {
|
||||
return {text:account.work_email, style: ['email']};
|
||||
} else if (field == 'account.phone') {
|
||||
return {text:account.work_phone, style: ['phone']};
|
||||
} else if (field == 'account.address1') {
|
||||
return {text: account.address1};
|
||||
} else if (field == 'account.address2') {
|
||||
return {text: account.address2};
|
||||
} else if (field == 'account.city_state_postal') {
|
||||
var cityStatePostal = '';
|
||||
if (account.city || account.state || account.postal_code) {
|
||||
var swap = account.country && account.country.swap_postal_code;
|
||||
cityStatePostal = formatAddress(account.city, account.state, account.postal_code, swap);
|
||||
}
|
||||
return {text: cityStatePostal};
|
||||
} else if (field == 'account.country') {
|
||||
return account.country ? {text: account.country.name} : false;
|
||||
} else if (field == 'account.custom_value1') {
|
||||
if (invoice.features.invoice_settings) {
|
||||
return invoice.account.custom_label1 && invoice.account.custom_value1 ? {text: invoice.account.custom_label1 + ' ' + invoice.account.custom_value1} : false;
|
||||
}
|
||||
} else if (field == 'account.custom_value2') {
|
||||
if (invoice.features.invoice_settings) {
|
||||
return invoice.account.custom_label2 && invoice.account.custom_value2 ? {text: invoice.account.custom_label2 + ' ' + invoice.account.custom_value2} : false;
|
||||
}
|
||||
}
|
||||
|
||||
data = [
|
||||
{text:clientName || ' ', style: ['clientName']},
|
||||
{text:client.id_number},
|
||||
{text:client.vat_number},
|
||||
{text:client.address1},
|
||||
{text:client.address2},
|
||||
{text:cityStatePostal},
|
||||
{text:client.country ? client.country.name : ''},
|
||||
{text:clientEmail},
|
||||
{text: client.custom_value1 && !custom1InPattern ? account.custom_client_label1 + ' ' + client.custom_value1 : false},
|
||||
{text: client.custom_value2 && !custom2InPattern ? account.custom_client_label2 + ' ' + client.custom_value2 : false}
|
||||
];
|
||||
return false;
|
||||
}
|
||||
|
||||
NINJA.clientDetails = function(invoice) {
|
||||
var account = invoice.account;
|
||||
if (invoice.features.invoice_settings && account.invoice_fields) {
|
||||
var fields = JSON.parse(account.invoice_fields);
|
||||
} else {
|
||||
var fields = [
|
||||
'client.client_name',
|
||||
'client.id_number',
|
||||
'client.vat_number',
|
||||
'client.address1',
|
||||
'client.address2',
|
||||
'client.city_state_postal',
|
||||
'client.country',
|
||||
'client.email',
|
||||
'client.custom_value1',
|
||||
'client.custom_value2',
|
||||
];
|
||||
}
|
||||
var data = [];
|
||||
|
||||
for (var i=0; i < fields.client_fields.length; i++) {
|
||||
var field = fields.client_fields[i];
|
||||
var value = NINJA.renderClientOrAccountField(invoice, field);
|
||||
if (value) {
|
||||
data.push(value);
|
||||
}
|
||||
}
|
||||
|
||||
return NINJA.prepareDataList(data, 'clientDetails');
|
||||
}
|
||||
|
@ -2094,6 +2094,7 @@ $LANG = array(
|
||||
'contact_name' => 'Contact Name',
|
||||
'city_state_postal' => 'City/State/Postal',
|
||||
'custom_field' => 'Custom Field',
|
||||
'account_fields' => 'Company Fields',
|
||||
|
||||
);
|
||||
|
||||
|
@ -58,6 +58,7 @@
|
||||
invoice.account.hide_paid_to_date = $('#hide_paid_to_date').is(":checked");
|
||||
invoice.invoice_design_id = $('#invoice_design_id').val();
|
||||
invoice.account.page_size = $('#page_size option:selected').text();
|
||||
invoice.account.invoice_fields = ko.mapping.toJSON(model);
|
||||
|
||||
NINJA.primaryColor = $('#primary_color').val();
|
||||
NINJA.secondaryColor = $('#secondary_color').val();
|
||||
@ -105,7 +106,6 @@
|
||||
$('#header_font_id').change(function(){loadFont($('#header_font_id').val())});
|
||||
$('#body_font_id').change(function(){loadFont($('#body_font_id').val())});
|
||||
|
||||
|
||||
refreshPDF();
|
||||
});
|
||||
|
||||
@ -136,7 +136,7 @@
|
||||
@endforeach
|
||||
|
||||
<div style="display:none">
|
||||
{!! Former::text('invoice_fields')->data_bind('value: ko.mapping.toJSON(model)') !!}
|
||||
{!! Former::text('invoice_fields_json')->data_bind('value: ko.mapping.toJSON(model)') !!}
|
||||
</div>
|
||||
|
||||
|
||||
@ -145,18 +145,18 @@
|
||||
<h3 class="panel-title">{!! trans('texts.invoice_design') !!}</h3>
|
||||
</div>
|
||||
|
||||
<div class="panel-body form-padding-right">
|
||||
<div class="panel-body">
|
||||
<div role="tabpanel">
|
||||
<ul class="nav nav-tabs" role="tablist" style="border: none">
|
||||
<li role="presentation" class="active"><a href="#generalSettings" aria-controls="generalSettings" role="tab" data-toggle="tab">{{ trans('texts.general_settings') }}</a></li>
|
||||
<li role="presentation"><a href="#invoiceLabels" aria-controls="invoiceLabels" role="tab" data-toggle="tab">{{ trans('texts.invoice_labels') }}</a></li>
|
||||
<li role="presentation"><a href="#invoiceFields" aria-controls="invoiceFields" role="tab" data-toggle="tab">{{ trans('texts.invoice_fields') }}</a></li>
|
||||
<li role="presentation"><a href="#invoiceOptions" aria-controls="invoiceOptions" role="tab" data-toggle="tab">{{ trans('texts.invoice_options') }}</a></li>
|
||||
<li role="presentation"><a href="#headerFooter" aria-controls="headerFooter" role="tab" data-toggle="tab">{{ trans('texts.header_footer') }}</a></li>
|
||||
<li role="presentation" class="active"><a href="#general_settings" aria-controls="general_settings" role="tab" data-toggle="tab">{{ trans('texts.general_settings') }}</a></li>
|
||||
<li role="presentation"><a href="#invoice_labels" aria-controls="invoice_labels" role="tab" data-toggle="tab">{{ trans('texts.invoice_labels') }}</a></li>
|
||||
<li role="presentation"><a href="#invoice_fields" aria-controls="invoice_fields" role="tab" data-toggle="tab">{{ trans('texts.invoice_fields') }}</a></li>
|
||||
<li role="presentation"><a href="#invoice_options" aria-controls="invoice_options" role="tab" data-toggle="tab">{{ trans('texts.invoice_options') }}</a></li>
|
||||
<li role="presentation"><a href="#header_footer" aria-controls="header_footer" role="tab" data-toggle="tab">{{ trans('texts.header_footer') }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane active" id="generalSettings">
|
||||
<div role="tabpanel" class="tab-pane active" id="general_settings">
|
||||
<div class="panel-body">
|
||||
|
||||
<div class="row">
|
||||
@ -207,7 +207,7 @@
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="invoiceLabels">
|
||||
<div role="tabpanel" class="tab-pane" id="invoice_labels">
|
||||
<div class="panel-body">
|
||||
|
||||
<div class="row">
|
||||
@ -231,17 +231,26 @@
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="invoiceFields">
|
||||
<div role="tabpanel" class="tab-pane" id="invoice_fields">
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
@include('accounts.partials.invoice_fields_selector', ['section' => 'invoice_fields', 'fields' => INVOICE_FIELDS_INVOICE])
|
||||
@include('accounts.partials.invoice_fields_selector', ['section' => 'client_fields', 'fields' => INVOICE_FIELDS_CLIENT])
|
||||
@include('accounts.partials.invoice_fields_selector', ['section' => 'company_fields1', 'fields' => INVOICE_FIELDS_COMPANY])
|
||||
@include('accounts.partials.invoice_fields_selector', ['section' => 'company_fields2', 'fields' => INVOICE_FIELDS_COMPANY])
|
||||
@include('accounts.partials.invoice_fields_selector', ['section' => 'account_fields1', 'fields' => INVOICE_FIELDS_ACCOUNT])
|
||||
@include('accounts.partials.invoice_fields_selector', ['section' => 'account_fields2', 'fields' => INVOICE_FIELDS_ACCOUNT])
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="pull-right" style="padding-top:18px;padding-right:14px">
|
||||
{!! Button::normal(trans('texts.reset'))
|
||||
->withAttributes(['onclick' => 'sweetConfirm(function() {
|
||||
resetFields();
|
||||
})'])
|
||||
->small() !!}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="invoiceOptions">
|
||||
<div role="tabpanel" class="tab-pane" id="invoice_options">
|
||||
<div class="panel-body">
|
||||
|
||||
{!! Former::checkbox('hide_quantity')->text(trans('texts.hide_quantity_help')) !!}
|
||||
@ -250,7 +259,7 @@
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="headerFooter">
|
||||
<div role="tabpanel" class="tab-pane" id="header_footer">
|
||||
<div class="panel-body">
|
||||
|
||||
{!! Former::inline_radios('all_pages_header')
|
||||
|
@ -5,26 +5,43 @@ function ViewModel(data) {
|
||||
|
||||
self.invoice_fields = ko.observableArray();
|
||||
self.client_fields = ko.observableArray();
|
||||
self.company_fields1 = ko.observableArray();
|
||||
self.company_fields2 = ko.observableArray();
|
||||
self.account_fields1 = ko.observableArray();
|
||||
self.account_fields2 = ko.observableArray();
|
||||
window.field_map = [];
|
||||
|
||||
self.addField = function(section, field, label) {
|
||||
self[section].push(field);
|
||||
window.field_map[field] = label;
|
||||
if (self[section].indexOf(field) < 0) {
|
||||
self[section].push(field);
|
||||
}
|
||||
}
|
||||
|
||||
self.resetFields = function() {
|
||||
console.log('herey');
|
||||
self.invoice_fields.removeAll();
|
||||
self.client_fields.removeAll();
|
||||
self.account_fields1.removeAll();
|
||||
self.account_fields2.removeAll();
|
||||
}
|
||||
|
||||
self.onDragged = function() {
|
||||
refreshPDF();
|
||||
}
|
||||
|
||||
self.removeInvoiceFields = function(item) {
|
||||
self.invoice_fields.remove(item);
|
||||
refreshPDF();
|
||||
}
|
||||
self.removeClientFields = function(item) {
|
||||
self.client_fields.remove(item);
|
||||
refreshPDF();
|
||||
}
|
||||
self.removeCompanyFields1 = function(item) {
|
||||
self.company_fields1.remove(item);
|
||||
self.removeAccountFields1 = function(item) {
|
||||
self.account_fields1.remove(item);
|
||||
refreshPDF();
|
||||
}
|
||||
self.removeCompanyFields2 = function(item) {
|
||||
self.company_fields2.remove(item);
|
||||
self.removeAccountFields2 = function(item) {
|
||||
self.account_fields2.remove(item);
|
||||
refreshPDF();
|
||||
}
|
||||
}
|
||||
|
||||
@ -40,6 +57,38 @@ $(function() {
|
||||
window.model = new ViewModel();
|
||||
|
||||
var selectedFields = {!! json_encode($account->getInvoiceFields()) !!};
|
||||
var allFields = {!! json_encode($account->getAllInvoiceFields()) !!};
|
||||
|
||||
loadFields(selectedFields);
|
||||
loadMap(allFields);
|
||||
|
||||
ko.applyBindings(model);
|
||||
})
|
||||
|
||||
function resetFields() {
|
||||
var defaultFields = {!! json_encode($account->getDefaultInvoiceFields()) !!};
|
||||
window.model.resetFields();
|
||||
loadFields(defaultFields);
|
||||
}
|
||||
|
||||
function loadMap(allFields) {
|
||||
for (var section in allFields) {
|
||||
if ( ! allFields.hasOwnProperty(section)) {
|
||||
continue;
|
||||
}
|
||||
var fields = allFields[section];
|
||||
for (var field in fields) {
|
||||
if ( ! fields.hasOwnProperty(field)) {
|
||||
continue;
|
||||
}
|
||||
var label = fields[field];
|
||||
window.field_map[field] = label;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function loadFields(selectedFields)
|
||||
{
|
||||
for (var section in selectedFields) {
|
||||
if ( ! selectedFields.hasOwnProperty(section)) {
|
||||
continue;
|
||||
@ -53,12 +102,7 @@ $(function() {
|
||||
model.addField(section, field, label);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(selectedFields);
|
||||
|
||||
|
||||
ko.applyBindings(model);
|
||||
})
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
@ -89,7 +133,8 @@ $(function() {
|
||||
|
||||
.field-list td div {
|
||||
float: left;
|
||||
width: 146px;
|
||||
xwidth: 146px;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
@ -103,7 +148,6 @@ $(function() {
|
||||
width: 120px;
|
||||
}
|
||||
|
||||
|
||||
.field-list .fa {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
<div class="col-md-3">
|
||||
<div class="col-lg-3 col-md-6">
|
||||
|
||||
{!! Former::select("{$section}_select")
|
||||
->placeholder(trans("texts.{$fields}"))
|
||||
@ -7,11 +7,11 @@
|
||||
->raw() !!}
|
||||
|
||||
<table class="field-list">
|
||||
<tbody data-bind="sortable: { data: {{ $section }}, as: 'field' }">
|
||||
<tbody data-bind="sortable: { data: {{ $section }}, as: 'field', afterMove: onDragged }">
|
||||
<tr>
|
||||
<td>
|
||||
<i class="fa fa-close" data-bind="click: $root.{{ Utils::toCamelCase('remove' . ucwords($section)) }}"></i>
|
||||
<div data-bind="text: window.field_map[field]"></div>
|
||||
<span data-bind="text: window.field_map[field]"></span>
|
||||
<i class="fa fa-bars"></i>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -489,6 +489,13 @@ thead th {
|
||||
$.get('{{ url('save_sidebar_state') }}?show_right=' + toggled);
|
||||
});
|
||||
|
||||
if (window.location.hash) {
|
||||
setTimeout(function() {
|
||||
$('.nav-tabs a[href="' + window.location.hash + '"]').tab('show');
|
||||
}, 1);
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
Loading…
Reference in New Issue
Block a user